板卡AI昇腾atlas300 docker开发环境搭建
Posted 极智视界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了板卡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
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
-
我这里以安装 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 能正常输出,说明安装成功。
-
【坑】分享一个我踩的坑:由于ubuntu内核版本不一致导致安装昇腾驱动失败,报错如下:
【坑分析】如上截图,可以看到我用dkms装的内核版本是 4.15.0-143-generic,但使用 uname -a 你可以看到实际的ubuntu内核版本是4.15.0-128-generic,这就导致了内核版本的不一致。
这个时候安装昇腾驱动,按昇腾官方它会让你去源码编译的方式按安装npu_driver(我们一般使用二进制文件直接安装),采用源码编译安装可以基于安装包驱动源码重构并安装使用,该场景不会触发内核版本升级,会基于当前内核版本编译出相应的内核驱动。软件包在安装时会自动触发驱动源码编译,编译完成后自动进行软件包安装。【听起来好像能完美解决我遇到的问题,但现实是出现上面的报错,gg~,不如靠自己】
【踩过坑】降低ubuntu内核,下载对应4.15.0.128内核离线安装,网址:http://archive.ubuntu.com/ubuntu/pool/main/l/linux/,根据实际选择下载,我这里选择,安装的话采用 dpkg -i ./*deb 就可以了。
附:这个坑我在华为昇腾论坛的提问帖子: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 !
以上是关于板卡AI昇腾atlas300 docker开发环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
极智AI | 昇腾开发环境搭建 CANN & MindStudio (无坑版)
昇腾ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(完整版)