作者:王磊
更多精彩分享,欢迎访问和关注:https://www.zhihu.com/people/wldandan
MindSpore的GPU版本以前的安装指南,只写清楚了安装依赖,但没有明确指出安装具体执行的命令,缺乏实操性,比较依赖开发者自身的能力去完成安装,导致开发者在安装过程中会出现一些影响安装效率的问题。在新版本中,安装方面进行了优化,提供了自动化的脚本以及step by step的安装指南来帮助开发者完成Ubuntu+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,但如果用户在脚本执行前设置了新值,则使用新的值。
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支持)。
如果我们再看下脚本解释中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上执行到下面的脚本时会遇到一个错误。
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在多平台下的安装体验。