源码编译方式安装Linux LuoJiaNET GPU版本

本文档介绍如何在GPU环境的Linux系统上,使用源码编译方式快速安装LuoJiaNET。下面以Ubuntu 18.04为例说明LuoJiaNET编译安装步骤。

环境准备

下表列出了编译安装LuoJiaNET GPU所需的系统环境和第三方依赖。

软件名称 版本 作用
Ubuntu 18.04 编译和运行LuoJiaNET的操作系统
CUDA 10.1/10.2/11.1 LuoJiaNET GPU使用的并行计算架构
cuDNN 7.6.x或8.0.x LuoJiaNET GPU使用的深度神经网络加速库
Python 3.7.x LuoJiaNET的使用依赖Python环境
wheel 0.32.0及以上 LuoJiaNET使用的Python打包工具
setuptools 44.0及以上 LuoJiaNET使用的Python包管理工具
GCC 7.5到9.4.0之间 用于编译LuoJiaNET的C++编译器
git - LuoJiaNET使用的源代码管理工具
CMake 3.18.3及以上 编译构建LuoJiaNET的工具
Autoconf 2.69及以上版本 编译构建LuoJiaNET的工具
Libtool 2.4.6-29.fc30及以上版本 编译构建LuoJiaNET的工具
Automake 1.15.1及以上版本 编译构建LuoJiaNET的工具
gmp 6.1.2 LuoJiaNET使用的多精度算术库
Flex 2.5.35及以上版本 LuoJiaNET使用的词法分析器
tclsh - LuoJiaNET sqlite编译依赖
patch 2.5及以上 LuoJiaNET使用的源代码补丁工具
NUMA 2.0.11及以上 LuoJiaNET使用的非一致性内存访问库
Open MPI 4.0.3 LuoJiaNET使用的高性能消息传递库(可选,单机多卡/多机多卡训练需要)
LLVM 12.0.1 LuoJiaNET使用的编译器框架(可选,图算融合以及稀疏计算需要)
TensorRT 7.2.2 LuoJiaNET使用的高性能深度学习推理SDK(可选,Serving推理需要)

下面给出第三方依赖的安装方法。

安装CUDA & cuDNN

LuoJiaNET GPU支持CUDA 10.x和CUDA 11.1。NVIDIA官方给出了多种安装方式和安装指导,详情可查看CUDA下载页面CUDA安装指南

完成CUDA的安装后,在cuDNN页面登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为cudnn.tgz,安装的CUDA版本为11.1,执行以下命令安装cuDNN。

如果安装cudnn完成,可将如下环境变量添加至系统路径中:

export CUDNN_HOME=/usr/local/cuda export CUDA_HOME=/usr/loca/cuda export CUDA_TOOLKIT_HOME=/usr/local/cuda

安装Python

可进入Anaconda集成安装包在Anaconda页面下载Anaconda并安装

安装wheel和setuptools

在安装完成Python后,使用以下命令安装。

pip install wheel
pip install -U setuptools

安装GCC、git等依赖

可以通过以下命令安装GCC,git,Autoconf,Libtool,Automake,gmp,Flex,tclsh,patch,NUMA。

sudo apt-get install gcc-7 git automake autoconf libtool libgmp-dev tcl patch libnuma-dev flex -y

如果要安装更高版本的GCC,使用以下命令安装GCC 8。

sudo apt-get install gcc-8 -y

或者安装GCC 9。

sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-9 -y

安装CMake

可以通过以下命令安装CMake

wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -
sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main"
sudo apt-get install cmake -y

安装Open MPI(可选)

可以通过以下命令编译安装Open MPI

curl -O https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.3.tar.gz
tar xzf openmpi-4.0.3.tar.gz
cd openmpi-4.0.3
./configure --prefix=/usr/local/openmpi-4.0.3
make
sudo make install
echo -e "export PATH=/usr/local/openmpi-4.0.3/bin:\$PATH" >> ~/.bashrc
echo -e "export LD_LIBRARY_PATH=/usr/local/openmpi-4.0.3/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc
cd -

安装LLVM(可选)

可以通过以下命令安装LLVM

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo add-apt-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main"
sudo apt-get update
sudo apt-get install llvm-12-dev -y

安装TensorRT(可选)

完成CUDA和cuDNN的安装后,在TensorRT下载页面下载配套CUDA 11.1的TensorRT 7.2.2,注意选择下载TAR格式的安装包。假设下载的文件名为TensorRT-7.2.2.3.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz。使用以下命令安装TensorRT。

tar xzf TensorRT-7.2.2.3.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz
cd TensorRT-7.2.2.3
echo -e "export TENSORRT_HOME=$PWD" >> ~/.bashrc
echo -e "export LD_LIBRARY_PATH=\$TENSORRT_HOME/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc
cd -

从代码仓下载源码

git clone https://github.com/WHULuoJiaTeam/luojianet.git

编译LuoJiaNET

进入LuoJiaNET根目录,然后执行编译脚本:

cd luojianet
bash build_gdal.sh
bash build.sh -e gpu -j 4

其中:

  • build_gdal.sh 用于从源码编译依赖库GDAL,需要较长时间请耐心等待

  • build.sh中默认的编译线程数为8,如果编译机性能较差可能会出现编译错误,可在执行中增加-j{线程数}来减少线程数量。如bash build.sh -e gpu -j4

  • 默认从gitee下载依赖源码。

  • 注意1:编译build_gdal.sh过程,出现如下错误:

  error in GDAL setup command: uset_2to3 is invalid

则需要降低setuptools的版本:

  pip install setuptools==57.5.0
  • 注意2:build.sh在CUDA 11.x环境下,输入python -c “import luojianet_ms;luojianet_ms.run_check()“ 后报错:

    首先尝试:https://bbs.huaweicloud.com/forum.php?mod=viewthread&tid=176058&extra=&ordertype=1
    中export CUDA_VISIBLE_DEVICES=0,1,2,3操作;如果失败,则检查是否以管理员权限sudo xxx 执行当前命令行窗口

安装LuoJiaNET

pip install output/luojianet_gpu-*.whl 
  • 注意:如果在Python环境下验证,出现如下错误:

  ImportError: libnccl.so.2: cannot open shared object file: No such file or directory

则进入LuoJiaNETMS目录,执行如下命令,将libnccl.so.2复制到/usr/lib目录下:

  cp ./build/luojianet_ms/.mslib/nccl_2.7.6-1_61a836137d0a4c5c98b93dfe3a7daf0d/lib/libcudnn* /usr/lib

在联网状态下,安装LuoJiaNET时会自动下载LuoJiaNET安装包的依赖项(依赖项详情参见setup.py中的required_package),其余情况需自行安装。运行模型时,常见依赖可以参考requirements.txt

验证是否成功安装

方法一:

python -c "import luojianet_ms;luojianet_ms.run_check()"

如果输出:

LuoJiaNET version: 版本号
The result of multiplication calculation is correct, LuoJiaNET has been installed successfully!

说明LuoJiaNET安装成功。

方法二:

import numpy as np
from luojianet_ms import Tensor
import luojianet_ms.ops as ops
import luojianet_ms.context as context

context.set_context(device_target="GPU")
x = Tensor(np.ones([1,3,3,4]).astype(np.float32))
y = Tensor(np.ones([1,3,3,4]).astype(np.float32))
print(ops.add(x, y))

如果输出:

[[[[2. 2. 2. 2.]
   [2. 2. 2. 2.]
   [2. 2. 2. 2.]]

  [[2. 2. 2. 2.]
   [2. 2. 2. 2.]
   [2. 2. 2. 2.]]

  [[2. 2. 2. 2.]
   [2. 2. 2. 2.]
   [2. 2. 2. 2.]]]]

说明LuoJiaNET安装成功。