美文网首页MindSpore
如何高效安装MindSpore的GPU版本

如何高效安装MindSpore的GPU版本

作者: iambowen | 来源:发表于2022-04-20 16:25 被阅读0次

    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版本

        本文链接:https://www.haomeiwen.com/subject/azmvertx.html