如何高效安装MindSpore的GPU版本

MindSpore的GPU版本以前的安装指南,只写清楚了安装依赖,但没有明确指出安装具体执行的命令,缺乏实操性,比较依赖开发者自身的能力去完成安装,导致开发者在安装过程中会出现一些影响安装效率的问题。在新版本中,安装方面进行了优化,提供了自动化的脚本以及step by step的安装指南来帮助开发者完成Ubuntu+GPU版本的安装。

基于自动化脚本完成Ubuntu18.04 + GPU版本的安装

新的安装指南给出了自动化以及step by step安装方式,包括pip方式、Conda方式和源码编译方式。如果环境是全新的,可以使用自动化脚本安装,如果已经安装了一部分软件,也可以考虑跟随指南中后面的step by step的安装方式来完成安装。

在安装前,用户需要先执行nvidia-smi来查看是否安装驱动,或者驱动是否匹配CUDA10.1/11.1。没有安装或者没有达到最低要求的驱动,需要按照指南先把驱动安装好。

sudo apt-get update
sudo apt-get install ubuntu-drivers-common
sudo ubuntu-drivers autoinstall

接下来只需要执行自动化脚本即可,假设我们需要用安装Python 3.9并使用pip完成1.6.1的MindSpore版本安装,那么可以运行以下的脚本:

wget https://gitee.com/mindspore/mindspore/raw/master/scripts/install/ubuntu-gpu-pip.sh
# 安装MindSpore 1.6.1,Python 3.9和CUDA 11.1。
PYTHON_VERSION=3.9 MINDSPORE_VERSION=1.6.1 bash -i ./ubuntu-gpu-pip.sh

如果你的网络条件比较好,那么在10-15分钟就能完成安装,自动化脚本在执行的结尾还会自动做run check检查以及运行简单的代码验证,最终你看到的结果应该是这样的:

MindSpore version:  1.6.1
The result of multiplication calculation is correct, MindSpore has been installed successfully!
[[[[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.]]]]

自动化脚本解释

以pip方式安装脚本为例,我们来看下脚本的实现,理解脚本可以帮助大家更好的修改和扩展脚本。脚本整体可以分为四个部分:

  1. 参数设置及检查;
  2. 三方依赖安装;
  3. CUDA及CUDNN安装;
  4. MindSpore安装及验证;

其中三方依赖安装和MindSpore比较简单,下面着重介绍下参数设置检查和CUDA安装,对于理解脚本使用以及扩展功能会有所帮助。

影响脚本的运行的参数

脚本的第一段提供了三个可调整的参数,Python版本(3.7,3.8,3.9)、MindSpore的版本(>=1.6.0)以及Cuda的版本(10.1,11.1),用户通过环境变量控制需要配置的环境,如PYTHON_VERSION=3.9 MINDSPORE_VERSION=1.6.1 CUDA_VERSION=10.1 bash -i ./ubuntu-gpu-pip.sh 可以完成Python3.9、Cuda10.1以及MindSpore 1.6.1的版本安装。

PYTHON_VERSION=${PYTHON_VERSION:-3.7}
MINDSPORE_VERSION=${MINDSPORE_VERSION:EMPTY}
CUDA_VERSION=${CUDA_VERSION:-11.1}

这里脚本用到点shell的小技巧,PYTHON_VERSION=${PYTHON_VERSION:-3.7}PYTHON_VERSION缺省为3.7,但如果用户在脚本执行前设置了新值,则使用新的值。

CUDA和CUDDN的安装

Nvidia自身其实提供了cuda相关软件包的国内镜像源,基于镜像源,可以快速下载cuda的run包,使用静默方式完成cuda的安装。然后用同样的方式用apt-get的方式安装cudnn和libcudnn-dev。如果想安装其它的小版本,可以打开https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/https://developer.download.nvidia.cn/compute/machine-learning/repos/ubuntu1804/x86_64/地址来查找小版本号然后替换后执行脚本完成安装。

# 下载并安装Cuda
echo "installing CUDA and cuDNN"
cd /tmp
declare -A cuda_url_map=()
cuda_url_map["10.1"]=https://developer.download.nvidia.cn/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
cuda_url_map["11.1"]=https://developer.download.nvidia.cn/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
cuda_url=${cuda_url_map[$CUDA_VERSION]}
wget $cuda_url
sudo sh ${cuda_url##*/} --silent --toolkit
cd -
# 添加cudnn/libcuda的镜像源
sudo apt-key adv --fetch-keys https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo add-apt-repository "deb https://developer.download.nvidia.cn/compute/machine-learning/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
declare -A cudnn_name_map=()
cudnn_name_map["10.1"]="libcudnn7=7.6.5.32-1+cuda10.1 libcudnn7-dev=7.6.5.32-1+cuda10.1"
cudnn_name_map["11.1"]="libcudnn8=8.0.4.30-1+cuda11.1 libcudnn8-dev=8.0.4.30-1+cuda11.1"
sudo apt-get install --no-install-recommends ${cudnn_name_map[$CUDA_VERSION]} -y

# 添加cuda到PATH和LD_LIBRARY_PATH中
set +e && source ~/.bashrc
set -e
add_env PATH /usr/local/cuda/bin
add_env LD_LIBRARY_PATH /usr/local/cuda/lib64
add_env LD_LIBRARY_PATH /usr/lib/x86_64-linux-gnu
set +e && source ~/.bashrc

自动化脚本存在的不足

自动化脚本在设计时,考虑到测试验证的成本问题,并没有将Ubuntu20.04和WSL加入到验收的范围,导致这两类用户在执行的时候报错,相应的问题已经转化为issue(Ubuntu 20.04支持, WSL支持)。

如何拓展脚本完成Ubuntu20.04以及WSL上的自动化安装

拓展支持Ubuntu 20.04

如果我们再看下脚本解释中cuda安装的部分,可以看到repos/ubuntu1804如果更换为repos/ubuntu2004,就可以支持Ubuntu20.04了。所以我们需要在脚本中抽取一个Ubuntu版本的变量,通过Linux命令获得Ubuntu版本号,然后填充到下载地址就可以了。
具体的修改如下,通过lsb_release -a | grep Release 获取到包含版本的字符串如"Release: 20.04",然后基于Linux字符串的魔法功能${release_info//[!0-9]/} 从字符串中抽取出数字2004。这里要增加一个额外的判断,因为Ubuntu 20.04不支持Cuda 10.1。后面的安装部分只要将硬编码的版本号改为引用变量即可。

release_info=$(lsb_release -a | grep Release)
UBUNTU_VERSION=${release_info//[!0-9]/}

[[ "$UBUNTU_VERSION" == "2004" &&  "$CUDA_VERSION" == "10.1" ]] && echo "CUDA 10.1 is not supported on Ubuntu 20.04" && exit 1
#...
sudo apt-key adv --fetch-keys https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/ /"
sudo add-apt-repository "deb https://developer.download.nvidia.cn/compute/machine-learning/repos/ubuntu${UBUNTU_VERSION}/x86_64/ /"
sudo

解决WSL上自动化安装的问题

原有的脚本在WSL上执行到下面的脚本时会遇到一个错误。

driver_version=$(modinfo nvidia | grep ^version | awk '{printf $2}')
if [[ $driver_version < ${minimum_driver_version_map[$CUDA_VERSION]} ]]; then
    echo "CUDA $CUDA_VERSION minimum required driver version is ${minimum_driver_version_map[$CUDA_VERSION]}, \
        but current nvidia driver version is $driver_version, please upgrade your driver manually."
    exit 1
fi

错误信息如下:

iambowen@LAPTOP-ESJAVHR4:~/jenkins$ MINDSPORE_VERSION=1.6.1 bash -i ubuntu-gpu-pip.sh
modinfo: ERROR: Module alias nvidia not found.
CUDA 11.1 minimum required driver version is 450.80.02,         but current nvidia driver version is , please upgrade your driver manually.

错误的原因在于获取驱动信息的命令modinfo nvidia在WSL执行会直接报modinfo: ERROR: Module alias nvidia not found.错误。解决的办法是使用nvidia-smi --query-gpu=driver_version --format=csv,noheader --id=0获取到Nvidia驱动的信息。如果驱动没有安装,命令执行返回为空,后面的检查逻辑也可以正常运行,提示安装升级驱动版本。

driver_version=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader --id=0)
if [[ $driver_version < ${minimum_driver_version_map[$CUDA_VERSION]} ]]; then
    echo "CUDA $CUDA_VERSION minimum required driver version is ${minimum_driver_version_map[$CUDA_VERSION]}, \
        but current nvidia driver version is $driver_version, please upgrade your driver manually."
    exit 1
fi

相关脚本在华为云以及WSL的Ubuntu18.04/20.04上都完成验证,应该可行,修改已发送Pull Request。

总结

当前MindSpore的Master分支中,除了GPU版本的自动化安装,针对昇腾和CPU等的版本,也提供了自动化脚本和简化安装的指南,相信这些脚本和指南可以持续提升MindSpore在多平台下的安装体验。

你可能感兴趣的:(如何高效安装MindSpore的GPU版本)