作者:飞翔的企鹅

在Linux上体验源码编译安装MindSpore GPU版本

接触到MindSpore深度学习框架快一年了,作为一名AI框架深度业余爱好者,经常使用开源社区主流的框架来进行一些简单的图像识别、自然语言处理。第一次接触到MindSpore深度学习框架还是在去年5月份,偶然打开了MindSpore官网教程主页,发现官网提供了大量的使用案例,跟着这些案例循序渐进的学习,现在已经基本掌握使用MindSpore用于训练和推理。最近学习到使用MindSpore自定义GPU算子,正好手上收获一台带GPU的主机,本着物尽其用的原则,尝试着根据官方安装指南进行了编译安装MindSpore GPU版本,期间笔者历经数难,总算最后编译好了。官方提供的安装指南中针对第三方库的安装描述不够详细,幸好笔者有随手记的好习惯,将整个编译和安装过程记录了下来,希望能帮到更多的朋友。

确认系统环境信息

首先要注意的是,需要具有sudo权限的用户进行编译安装全流程。

安装Ubuntu 18.04是64位操作系统

确认系统版本号,在终端输入命令lsb_release -a:

$ lsb_release -a
 No LSB modules are available.
 Distributor ID: Ubuntu
 Description:    Ubuntu 18.04.5 LTS
 Release:        18.04
 Codename:       bionic
  1. 确认系统位数,在终端中输入命令uname -a:
$ uname -a
 Linux ms-gpu 5.4.0-56-generic #62~18.04.1-Ubuntu SMP Tue Nov 24 10:07:50 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

可以知道我的主机系统是满足要求的,接下来安装gcc。

安装GCC 7.3.0版本

首先执行以下命令,安装所需基础依赖包:

sudo apt-get install -y build-essential m4 libgmp-dev libmpfr-dev libmpc-dev
  1. 查看本机gcc版本,执行命令gcc --version:
$ gcc --version
 gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
 Copyright (C) 2017 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

由输出可知,安装的gcc版本为7.5.0。

若没有安装gcc,则执行以下命令安装gcc:

sudo apt install gcc

由于gcc在本机上是7.5.0版本,官方指南要求是7.3.0版本,我需要编译安装gcc 7.3.0版本。

  1. 下载gcc 7.3.0版本安装包,执行以下命令:
wget http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
  1. 执行tar -xzf gcc-7.3.0.tar.gz解压源码包。
  2. 执行编译安装。查看解压后的gcc源码包:
$ ls gcc-7.3.0
 ABOUT-NLS           config.log    COPYING          gcc         LAST_UPDATED  libdecnumber  libiberty      libssp           lt~obsolete.m4      Makefile.def   move-if-change
 ChangeLog           config-ml.in  COPYING3         gnattools   libada        libffi        libitm         libstdc++-v3     lto-plugin          Makefile.in    NEWS
 ChangeLog.jit       config.rpath  COPYING3.LIB     gotools     libatomic     libgcc        libmpx         libtool-ldflags  ltoptions.m4        Makefile.tpl   README
 ChangeLog.tree-ssa  config.sub    COPYING.LIB      include     libbacktrace  libgfortran   libobjc        libtool.m4       ltsugar.m4          MD5SUMS        symlink-tree
 compile             configure     COPYING.RUNTIME  INSTALL     libcc1        libgo         liboffloadmic  libvtv           ltversion.m4        missing        ylwrap
 config              configure.ac  depcomp          install-sh  libcilkrts    libgomp       libquadmath    ltgcc.m4         MAINTAINERS         mkdep          zlib
 config.guess        contrib       fixincludes      intl        libcpp        libhsail-rt   libsanitizer   ltmain.sh        maintainer-scripts  mkinstalldirs

执行cd gcc-7.3.0,进入到源码包目录。

  1. 运行以下命令,进行安装前的配置。
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

其中:

  • enable-checking=release为增加一些检查
  • enable-languages=c,c++为gcc支持的编程语言
  • disable-multilib为取消多目标库编译(取消32位库编译)
  1. 运行以下命令进行编译安装gcc 7.3.0。
make -j 12 && sudo make install -j 12

其中,参数-j 12表示开启12线程进行编译和安装,后续步骤同理,你可以根据自己的cpu性能设置合适的数值。

  1. 执行以下命令,将gcc 7.3.0链接为默认gcc版本:
sudo ln -sf /usr/local/gcc/bin/gcc /usr/bin/gcc
  1. 执行gcc --version,若输出结果为以下内容,则成功安装gcc 7.3.0
$ gcc --version
 gcc (GCC) 7.3.0
 Copyright © 2017 Free Software Foundation, Inc.
 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
 包括没有适销性和某一专用目的下的适用性担保。

至此,已经完成gcc 7.3.0的安装,接下来继续安装gmp。

安装gmp 6.1.2

  1. 下载gmp 6.1.2源码包:
wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz
  1. 运行命令tar -JXf gmp-6.1.2.tar.xz解压gmp源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装gmp。
make -j 12 && sudo make install -j 12

完成了gmp安装后要继续安装NVIDA驱动了。

安装NVIDIA驱动

首先看一下显卡驱动列表,执行sudo apt-get install ubuntu-drivers-common安装ubuntu-driver,安装完后执行ubuntu-drivers devices,查看显卡所支持的驱动:

linux 并行GPU訓練_Python

由输出结果可知,需安装驱动版本为nvidia-driver-450,执行以下命令安装:

sudo apt-get install -y nvidia-driver-450

执行nvdia-smi验证,成功安装后显示如下结果:

linux 并行GPU訓練_Python_02

此时,GPU驱动已经安装完成了,接下来需要安装openssl。

安装OpenSSL 1.1.1

我选择安装openssl 1.1.1版本。

  1. 下载openssl 1.1.1源码包:
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz
  1. 运行命令tar -xzf penSSL_1_1_1g.tar.gz解压gmp源码包。
  2. 进入到解压后的目录,执行命令./config --prefix=/usr/local/openssl进行配置:
  3. 执行以下命令安装openssl。
make -j 12 && sudo make install -j 12
  1. 安装完成后设置环境变量export OPENSSL_ROOT_DIR=/usr/local/openssl,并添加到~/.bashrc文件的末尾。

安装完openssl后继续安装Python 3.7.5。由于MindSpore只支持Python 3.7.5,我选择用源码进行编译安装。

安装Python 3.7.5版本

编译安装Python前需要先安装必要的基础依赖,首先执行以下命令,安装所需的依赖包:

sudo apt-get install -y libssl-dev zlib1g-dev libbz2-dev \
                        libreadline-dev libsqlite3-dev wget \
                        curl llvm libncurses5-dev libncursesw5-dev \
                        xz-utils tk-dev libffi-dev liblzma-dev python-openssl

编译安装Python步骤如下:

  1. 下载Python 3.7.5源码包:
wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
  1. 执行命令tar -xzf Python-3.7.5.tgz解压源码包。
  2. 进入解压后的源码包目录,执行以下命令进行安装配置:
./configure --prefix=/usr/local/python3.7.5 --with-openssl=/usr/local/openssl --enable-shared

其中:

  • --prefix=/usr/local/python3.7.5为安装路径可执行文件放在/usr/local/python3.7.5/bin下。库文件放在/usr/local/python3.7.5/lib。配置文件放在/usr/local/python3.7.1/include。其他资源文件放在/usr/local/python3.7.5下。
  • --with-openssl为确保pip安装库时能找到SSL,配置为上步中openssl安装目录/usr/local/openssl。
  1. 执行命令make -j 12 && sudo make install -j 12编译安装Python 3.7.5。
  2. 将Python 3.7.5添加到环境变量中:
  • 执行命令vim ~/.bashrc编辑~/.bashrc文件,将以下命令追加到末尾处:
export PATH=/usr/local/python3.7.5/bin:{user_home_path}/.local/bin:$PATH

其中,{user_home_path}替换为当前登录用户的主目录。

  • 执行以下命令使python默认指向Python3.7.5:
ln -sf /usr/local/python3.7.5/bin/python3 /usr/bin/python
  ln -sf /usr/local/python3.7.5/bin/python3 /usr/bin/python3
  1. 执行source ~/.bashrc,刷新环境变量,执行python3.7 --version验证安装,输出如下结果则成功安装python 3.7.5。
$ python --version
 Python 3.7.5
  1. 替换pip源。新建~/.pip/pip.conf文件,添加以下内容:
[global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple
  1. 更新pip,执行:
python -m pip install --upgrade pip

执行命令pip --version,输出以下结果则完成安装。

$ pip --version
 pip 21.0.1 from /usr/local/python3.7.5/site-packages/pip (python 3.7)

自此,Python安装已经完成了,接下来进行cmake的安装,还是选择编译安装。

安装CMake 3.18.3

  1. 下载cmake 3.18.3源码包:
wget https://cmake.org/files/v3.18/cmake-3.18.3.tar.gz
  1. 运行命令tar -xzf cmake-3.18.3.tar.gz解压cmake源码包。
  2. 进入到解压后的目录,执行./bootstrap进行安装配置。
  3. 最后执行以下命令安装cmake 3.18.3。
make -j 12 && sudo make install -j 12

安装过程如下图所示:

linux 并行GPU訓練_源码包_03

安装结束时截图:

linux 并行GPU訓練_Python_04

  1. 验证安装是否成功,执行以下命令显示如下结果:
$ cmake --version
 cmake version 3.18.3

 CMake suite maintained and supported by Kitware (kitware.com/cmake).

确认完成安装cmake后接着安装patch。

安装patch 2.6

  1. 下载patch 2.6源码包:
wget http://ftp.gnu.org/gnu/patch/patch-2.6.tar.gz
  1. 运行命令tar -xzf patch-2.6.tar.gz解压patch源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装patch 2.6。
make -j 12 && sudo make install -j 12
  1. 验证安装是否成功,执行以下命令显示如下结果:
$ patch --version
 patch 2.6
 Copyright (C) 1988 Larry Wall
 Copyright (C) 2003 Free Software Foundation, Inc.

 This program comes with NO WARRANTY, to the extent permitted by law.
 You may redistribute copies of this program
 under the terms of the GNU General Public License.
 For more information about these matters, see the file named COPYING.

 written by Larry Wall and Paul Eggert

验证安装完后接着安装autoconf。

安装Autoconf 2.70

  1. 下载autoconf-2.70源码包:
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.70.tar.gz
  1. 运行命令tar -xzf autoconf-2.70.tar.gz解压autoconf源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装autoconf-2.70。
make -j 12 && sudo make install -j 12
  1. 验证安装是否成功,执行以下命令显示如下结果:
$ autoconf --version
 autoconf (GNU Autoconf) 2.70
 Copyright (C) 2020 Free Software Foundation, Inc.
 License GPLv3+/Autoconf: GNU GPL version 3 or later
 <https://gnu.org/licenses/gpl.html>, <https://gnu.org/licenses/exceptions.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.

 Written by David J. MacKenzie and Akim Demaille.

接下来是安装libtool-2.4.6。

安装Libtool 2.4.6-29.fc30

  1. 下载libtool-2.4.6源码包:
wget https://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz
  1. 运行命令tar -xzf libtool-2.4.6.tar.gz解压libtool源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装libtool-2.4.6。
make -j 12 && sudo make install -j 12
  1. 验证安装是否成功,执行以下命令显示如下结果:
$ libtool --version
 libtool (GNU libtool) 2.4.6
 Written by Gordon Matzigkeit, 1996

 Copyright (C) 2014 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

没报错,就继续安装automake。

安装Automake 1.16

  1. 下载automake-1.16源码包:
wget http://ftp.gnu.org/gnu/automake/automake-1.16.tar.gz
  1. 运行命令tar -xzf automake-1.16.tar.gz解压automake源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装automake-1.16。
make -j 12 && sudo make install -j 12
  1. 验证安装是否成功,执行以下命令显示如下结果:
$ automake --version
 automake (GNU automake) 1.16
 Copyright (C) 2018 Free Software Foundation, Inc.
 License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl-2.0.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.

 Written by Tom Tromey <tromey@redhat.com>
     and Alexandre Duret-Lutz <adl@gnu.org>.

接下来继续安装flex。

安装Flex 2.6.4

  1. 下载flex-2.6.4源码包:
wget https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
  1. 运行命令tar -xzf flex-2.6.4.tar.gz解压gmp源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装flex-2.6.4。
make -j 12 && sudo make install -j 12
  1. 验证安装是否成功,执行以下命令显示如下结果:
$ flex --version
 flex 2.6.4

安装wheel 0.32.0

执行命令pip install wheel==0.32.0安装wheel。

根据官网安装指南看到编译过程中需要使用到cuda套件和cudnn库,接下来是安装cuda和cudnn。

安装CUDA 10.1按默认配置安装

  1. 打开链接https://developer.nvidia.com/cuda-10.1-download-archive-base?,选择如下图所示的版本,下载cuda 10.1安装包:
  2. 执行sudo chmod +x ./cuda_10.1.105_418.39_linux.run赋予权限。
  3. 执行 sudo ./cuda_10.1.105_418.39_linux.run,根据提示进行安装。
  1. 此时窗口弹出安装提示,输入accept回车确认:
  2. 弹出安装选项,仅选择Install,回车确认:
  3. 若之前安装过CUDA且未完全卸载,则弹出如下提示,选择Upgrade All,回车确认:
  1. 验证安装完成:
$ nvcc -V
 nvcc: NVIDIA (R) Cuda compiler driver
 Copyright (c) 2005-2019 NVIDIA Corporation
 Built on Fri_Feb__8_19:08:17_PST_2019
 Cuda compilation tools, release 10.1, V10.1.105

完成了cuda的安装,下面安装cudnn。

安装cuDNN 7.6

  1. 下载cudnn源码包:
  1. 浏览器打开链接:https://developer.nvidia.com/zh-cn/cudnn,点击
  2. 下载之前需要登陆,点击Login登录:
  3. 根据提示进行注册或者登录.
  4. 登录之后跳转到下载链接:
  5. 获取到Linux-x86_64平台且支持cuda10.1版本的链接。
wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.5.32/Production/10.1_20191031/Ubuntu18_04-x64/libcudnn7-dev_7.6.5.32-1%2Bcuda10.1_amd64.deb
  1. 现在完成后,运行命令sudo apt-get install libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb进行安装。

此时,已经安装好了cuda和cudnn,继续安装剩下的openmpi。

安装OpenMPI 4.0.3版本

  1. 下载openmpi-4.0.3源码包:
wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.3.tar.gz
  1. 运行命令tar -xzf openmpi-4.0.3.tar.gz解压gmp源码包。
  2. 进入到解压后的目录,执行命令./configure进行配置:
  3. 执行以下命令安装openmpi-4.0.3。
make -j 12 && sudo make install -j 12
  1. 安装完成后执行whereis openmpi查看安装结果:
$ whereis openmpi
 openmpi: /usr/local/lib/openmpi

继续安装numa和git,这两个的安装过程比较简单。

安装NUMA 2.0.11

  1. 使用如下命令安装:
sudo apt-get install libnuma-dev
  1. 安装完成后执行whereis numa查看安装结果:
$ whereis numa
 numa: /usr/include/numa.h /usr/share/man/man3/numa.3.gz /usr/share/man/man7/numa.7.gz

安装git工具

  1. 使用如下命令安装:
sudo apt-get install git
  1. 安装完成后执行whereis numa查看安装结果:
$ git --version
 git version 2.17.1

此时,编译MindSpore所需用到的依赖环境已经全部准备好了,接下来就要进行编译whl包,首先将MindSpore仓库克隆到本地。

克隆MindSpore源码仓库

在用户目录下新建MindSporeRepo目录,克隆mindspore源码仓库到该目录内,执行以下命令:

git clone https://gitee.com/mindspore/mindspore.git -b r1.1

编译MindSpore

进入到上步中克隆的MindSpore源码目录,在源码根目录下执行如下命令进行编译:

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

执行的编译过程截了几张图:

linux 并行GPU訓練_源码包_05

linux 并行GPU訓練_python_06

linux 并行GPU訓練_python_07

linux 并行GPU訓練_linux 并行GPU訓練_08

linux 并行GPU訓練_Python_09

linux 并行GPU訓練_Python_10

linux 并行GPU訓練_python_11

linux 并行GPU訓練_Python_12

linux 并行GPU訓練_python_13

linux 并行GPU訓練_源码包_14

完成编译后,显示如下:

linux 并行GPU訓練_Python_15

编译完成后生成的MindSpore WHL安装包路径为build/package/mindspore_gpu-1.1.1-cp37-cp37m-linux_x86_64.whl:

$ ls package
akg  build  dist  mindspore  mindspore_gpu-1.1.1-cp37-cp37m-linux_x86_64.whl  mindspore_gpu.egg-info

至此,经过漫长的等待之后,终于完成了耗时良久的编译过程了,不过离胜利还差一步,需要验证编译的包是否可用。

安装MindSpore

执行以下命令,安装编译完成后输出的WHL包:

chmod +x build/package/mindspore_gpu-1.1.1-cp37-cp37m-linux_x86_64.whl
pip install build/package/mindspore_gpu-1.1.1-cp37-cp37m-linux_x86_64.whl

安装过程如下图所示:

linux 并行GPU訓練_python_16

成功安装后如下图所示:

linux 并行GPU訓練_Python_17

验证是否成功安装

在官网安装指南找到验证的以下所示代码,执行vim check.py,输入以下示例代码并保存:

import numpy as np
from mindspore import Tensor
import mindspore.ops as ops
import mindspore.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.tensor_add(x, y))

执行python check.py,输出如下内容:

linux 并行GPU訓練_linux 并行GPU訓練_18

根据输出可以判断,成功安装了MindSpore GPU版本,大功告成!

注意事项和总结

整个编译过程有几个地方折腾了笔者不少时间,也是容易导致编译过程报错最多的地方。经过多次尝试总结了以下3个要点,在编译过程中至关重要。

  • 编译安装Python之前必须要安装基础依赖,在编译安装Python的时候已经阐述过。
  • 如果在编译过程中出现报错,先确认gcc、Python、cmake安装是否正确,可以尝试重新安装gcc、cmake、NVIDIA驱动解决部分报错问题。
  • 最好使用runfile格式的包安装cuda,使用默认的方式安装,安装deb格式的cudnn包,这样可以确保安装正确。

在以后继续深度地学习自定义算子的过程中,肯定需要自己动手执行编译过程,经过此次编译安装MindSpore过程,为下一步的学习MindSpore高级的应用打好了基础。