【板卡AI】昇腾atlas300 docker开发环境搭建

​  遵循 驱动 -> 固件的安装顺序。


容器内npu驱动安装

  有两种方式:

  • 1、宿主机内已经安装好了驱动,容器内调用宿主机的驱动;

  • 2、管你宿主机有没有装驱动,我在容器里自己装;


1、宿主机目录挂载容器 方式

环境准备
  • 1、宿主机已经安装好了驱动;

  • 2、安装 docker,docker 版本要求 大于等于 18.03;

  • 3、重启 docker 服务:

    systemctl daemon-reload
    systemctl restart docker
    
  • 4、拉取ubuntu镜像:

    docker pull ubuntu:18.04
    
挂载宿主机目录方式安装容器
  • 1、在宿主机使用 id HwHiAiUser 查看宿主机 HwHiAiUser 的 gid,并记录下该 gid 的值,如下,则记录gid值为1001

  • 2、在宿主机创建并启动docker容器

    docker run -it --net=host --cap-add LINUX_IMMUTABLE --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /lib64:/lib64 -v /var/log/npu/slog/slogd:/var/log/npu/slog -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ -v /usr/local/Ascend/driver/tools/:/usr/local/Ascend/driver/tools/ -v /lib/modules:/lib/modules --name container_name docker_image_id /bin/bash
    

    ​ 上述参数详解:

    参数 说明
    –net 表示网络映射。可选,该参数支持两种模式配置,用户根据实际情况进行选择。
    - host:该场景下容器不会映射出自己的网卡、IP地址等,直接使用宿主机的IP和端口,该场景下在容器中使用ifconfig -a命令,可以查到device的虚拟网口。如果配置该参数,则可以在容器内部通过ssh方式登录device。
    - bridge:该场景下会为容器配置IP地址,并将容器连接到一个docker0的虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 该场景下在容器中使用ifconfig -a命令,不会显示device虚拟网口。如果配置为该参数,则启动容器之前,需要先在宿主机执行如下命令,禁止容器转发虚拟网口网段192.168.1.xx的数据,然后再启动容器:
    iptables -I FORWARD -s 192.168.1.0/24 -j DROP
    –cap -add LINUX_IMMUTABLE 表示可以修改容器内的文件属性。可选
    –device 表示映射的设备,davinci0需要根据实际设备名称修改。其他保持不变
    -v /usr/local/dcmi:/usr/local/dcmi 将宿主机dcmi的.so和接口文件目录“/usr/local/dcmi”挂载到容器中,请根据实际情况修改
    -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi 将宿主机npu-smi工具“/usr/local/sbin/npu-smi”挂载到容器中,请根据实际情况修改
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi 将宿主机npu-smi工具“/usr/local/bin/npu-smi”挂载到容器中,请根据实际情况修改
    -v /lib64:/lib64 将宿主机目录“/lib64”挂载到容器
    -v /var/log/npu/slog/slogd:/var/log/npu/slog 将宿主机日志路径“/var/log/npu/slog/container/container_name”挂载到容器中。请根据实际情况修改
    -v /usr/local/Ascend/driver/lib64/ :/usr/local/Ascend/driver/lib64/ 将宿主机目录“/usr/local/Ascend/driver/lib64/ ”挂载到容器,请根据drive的驱动.so所在路径修改
    -v /usr/local/Ascend/driver/tools/:/usr/local/Ascend/driver/tools/ 将宿主机目录“/usr/local/Ascend/driver/tools/”挂载到容器,请根据slogd所在路径修改
    –name container_name 容器的命名,请替换为实际容器名称
    docker_image_id 容器镜像ID,请替换为实际容器镜像ID
  • 3、启动容器后,执行如下命令查看当前容器中可以使用的davinci设备:

    ls /dev/ | grep davinci*
    


    ​ 其中:
    ​   davinci_manager 为管理模块的字符设备节点;
    ​   davinci0、davinci1、davinci2、davinci3 为该容器使用的davinci设备。

  • 4、在容器内创建 HwHiAiUser 用户,用于启动相关进程:

    groupadd -g gid HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok
    

    ​   上述命令中的 gid 为第1步查询出的 gid 值,执行命令返回 “ok”,则说明创建成功。

  • 5、系统环境变量创建

    vim ~/.bashrc
    

    ​   在文件末尾加入以下内容:

    export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64:$LD_LIBRARY_PATH
    
  • 6、查看驱动信息,显示如下就说明ok了。

    npu-smi info
    

    【板卡AI】昇腾atlas300 docker开发环境搭建_第1张图片


2、宿主机目录不挂载容器方式

环境准备
  • 1、安装 docker,docker 版本要求 大于等于 18.03;

  • 2、重启 docker 服务:

    systemctl daemon-reload
    systemctl restart docker
    
  • 3、拉取ubuntu镜像:

    docker pull ubuntu:18.04
    
不挂载宿主机目录方式安装容器
  • 1、在宿主机使用 id HwHiAiUser 查看宿主机 HwHiAiUser 的 gid,并记录下该 gid 的值,如下,则记录gid值为1001

  • 2、在宿主机创建并启动docker容器

    docker run -it --net=host --pid=host --cap-add LINUX_IMMUTABLE --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 device=/dev/davinci3 --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /var/log/npu/slog/slogd:/var/log/npu/slog --name container_name docker_image_id /bin/bash
    

      参数说明可参考 “宿主机目录挂载容器方式” 中内容。

  • 3、启动容器后,执行如下命令查看当前容器中可以使用的davinci设备,可正常输出4个device。

  • 4、在容器内创建 HwHiAiUser 用户,用于启动相关进程:

    groupadd -g gid HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok
    

    ​   上述命令中的 gid 为第1步查询出的 gid 值,执行命令返回 “ok”,则说明创建成功。

  • 5、使用exit命令退出容器,在宿主机 driver 安装包 *.run 所存放路径,执行如下命令将安装包复制到容器内部(若在创建容器的时候配置了挂载目录,其实无需手动拷贝):

    docker cp /xxx/*.run container_id:/home/HwHiAiUser/software
    

      其中,

    • xxx - 为宿主机上安装包的存放路径;

    • *.run - 替换为具体软件包名字(若想拷贝整个文件夹内文件,需在指定文件夹路径外包双引号 " ");

    • container_id - 为容器ID,可以使用 docker ps -a 查看容器ID;

    • /home/HwHiUser/software - 为容器内安装包的存放路径,若没有该路径,需要先手动创建;

  • 6、使用如下命令重新进入容器, 启动xxx替换为容器ID或者容器名称:

    docker start xxx
    docker attach xxx
    
  • 7、安装驱动

    • 安装驱动依赖

      apt install -y gcc g++ make cmake zlib1g zlib1g-dev libsqlite3-dev openssl libssl-dev libffi-dev unzip pciutils net-tools
      apt install dkms
      
    • 下载驱动

        附昇腾社区固件下载链接:https://www.hiascend.com/hardware/firmware-drivers
      【板卡AI】昇腾atlas300 docker开发环境搭建_第2张图片

    • 我这里以安装 20.02版本的驱动为例:

    # 赋权限
    chmod +x ./A300-3010-npu-driver_20.2.0_ubuntu18.04-x86_64.run
    
    # 执行安装
    ./A300-3010-npu-driver_20.2.0_ubuntu18.04-x86_64.run
    
    • 配置系统环境变量
    export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64:/usr/local/Ascend/add-ons:$LD_LIBRARY_PATH
    

    ​   若无报错提示,且使用 npu-smi info 能正常输出,说明安装成功。
    【板卡AI】昇腾atlas300 docker开发环境搭建_第3张图片

​   【坑】分享一个我踩的坑:由于ubuntu内核版本不一致导致安装昇腾驱动失败,报错如下:
【板卡AI】昇腾atlas300 docker开发环境搭建_第4张图片
​   【坑分析】如上截图,可以看到我用dkms装的内核版本是 4.15.0-143-generic,但使用 uname -a 你可以看到实际的ubuntu内核版本是4.15.0-128-generic,这就导致了内核版本的不一致。

​     这个时候安装昇腾驱动,按昇腾官方它会让你去源码编译的方式按安装npu_driver(我们一般使用二进制文件直接安装),采用源码编译安装可以基于安装包驱动源码重构并安装使用,该场景不会触发内核版本升级,会基于当前内核版本编译出相应的内核驱动。软件包在安装时会自动触发驱动源码编译,编译完成后自动进行软件包安装。【听起来好像能完美解决我遇到的问题,但现实是出现上面的报错,gg~,不如靠自己】
【板卡AI】昇腾atlas300 docker开发环境搭建_第5张图片
​   【踩过坑】降低ubuntu内核,下载对应4.15.0.128内核离线安装,网址:http://archive.ubuntu.com/ubuntu/pool/main/l/linux/,根据实际选择下载,我这里选择,安装的话采用 dpkg -i ./*deb 就可以了。
【板卡AI】昇腾atlas300 docker开发环境搭建_第6张图片
    附:这个坑我在华为昇腾论坛的提问帖子:https://bbs.huaweicloud.com/forum/thread-131529-1-1.html


容器内固件安装

​   固件安装就比较简单了。

​   首先确认驱动是否安装成功,用npu-smi info 查看,然后执行如下命令安装固件:

./A300-3010-npu-driver_20.2.0_ubuntu18.04-x86_64.run --docker

​   输出如下信息,说明安装成功。
【板卡AI】昇腾atlas300 docker开发环境搭建_第7张图片

你可能感兴趣的:(板卡AI,华为,嵌入式,人工智能,docker,驱动程序)