手动挂载方式制作容器镜像
前提条件
- 宿主机已经安装过驱动和固件,详情请参见安装NPU驱动固件。
- 用户在宿主机自行安装docker。当硬件产品为A800-9000/A800-9010/A300T-9000/Atlas 300T Pro且宿主机版本为Ubuntu 22.04时,docker版本要求大于等于21.10。
- 运行环境中的一个Device只能被一个容器使用,只有当使用该Device的容器退出后,该Device才可以被其他容器使用。
- 执行如下命令,重启服务与容器。
systemctl daemon-reload systemctl restart docker
- 用户自行获取所需OS镜像后,执行如下命令,查看镜像。
docker images
安装步骤
- Atlas 200I SoC A1产品的容器镜像制作请参见《Atlas 200I SoC A1 核心板 24.1.RC3 NPU驱动和固件安装指南》的“容器内运行”章节。
- 本章节提供手动挂载宿主机固件驱动目录至容器的方式制作镜像,其他更多内容请参考表1。
- 在宿主机使用id HwHiAiUser命令查看宿主机HwHiAiUser的gid,并记录该gid的取值,如图1所示,则记录gid为1001。
- 在宿主机创建并启动docker容器。可参考如下示例命令启动容器,具体挂载信息需根据产品类型和实际路径进行修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
docker run -it \ --ipc=host \ --device=/dev/davinci0:ro \ --device=/dev/davinci_manager:ro \ --device=/dev/devmm_svm:ro \ --device=/dev/hisi_hdc:ro \ -v /usr/local/dcmi:/usr/local/dcmi:ro \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi:ro \ -v /usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/common:ro \ -v /usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/driver:ro \ -v /etc/ascend_install.info:/etc/ascend_install.info:ro \ -v /etc/vnpu.cfg:/etc/vnpu.cfg:ro \ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info:ro \ -v /var/queue_schedule:/var/queue_schedule:ro \ docker_image_id /bin/bash
- --ipc=host:可能存在容器中共享内存不足的情况,启动容器时需要添加该参数以配置和host宿主机共享内存。
- /var/queue_schedule:用于管理FlowGW调度框架,推理场景使用LLM Datadist框架作PD分离和使用Dataflow时必须挂载。
- docker_image_id:镜像ID,用户需自行替换,可以使用docker images命令查看镜像信息。
以上挂载目录仅为示例,各个产品型号需要挂载的目录参见操作指导。
- 挂载/var/queue_schedule时,Ascend HDK的版本需≥24.1.RC2。
- 多容器场景下,为了防止某个容器的恶意代码大量申请甚至耗尽内核态内存,从而对其它容器造成影响。需要用户根据实际情况通过“--kernel-memory”参数指定容器能够占用的最大内核态内存。此功能依赖客户主机侧内核开启kmem accounting功能。
- 训练场景下,当host宿主机系统为CentOS和BC-linux时,docker内的线程数最大为4092,无法满足训练要求,启动容器时需要添加--pids-limit 409600参数,以配置CentOS/BC-linux下docker的最大线程。
- 可能存在容器中共享内存不足的情况,启动容器时需要添加--ipc=host参数,以配置和host宿主机共享内存。
容器启动后,执行如下命令查看当前docker容器中可以使用的davinci设备。ls /dev/ | grep davinci*
命令执行情况参见图2,其中davinci_manager为管理模块的字符设备节点,davinci0为该容器使用的davinci设备。
- 在容器内创建HwHiAiUser用户用于启动相关进程。如果用户创建了其他非root用户,请确保该用户所属的属组必须和Driver运行用户所属属组相同,如果不同,请用户自行添加到Driver运行用户属组。命令如下所示,注意请将其中的gid替换为步骤1中查出的gid值。若返回“ok”,则说明创建成功。
groupadd -g gid HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok
- 设置如下环境变量,用于在容器中加载驱动so。
export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:${LD_LIBRARY_PATH}
其中“/usr/local/Ascend”为默认安装路径,请根据实际情况修改。通过export方式设置环境变量,只在当前窗口有效,设置完成后立即生效。
- 使用exit命令退出容器,在宿主机CANN软件包所在路径,执行如下命令将软件包复制到容器内部。
docker cp /home/HwHiAiUser/Ascend-cann-nnrt_<version>_linux-<arch>.run container_id:/home/HwHiAiUser/software
所有路径请根据实际情况进行修改:
- “/home/HwHiAiUser”为宿主机上软件包的存放路径。
- Ascend-cann-nnrt_<version>_linux-<arch>.run请替换为具体CANN软件包名。
- container_id为容器ID,可以使用docker ps -a命令查看所使用容器的ID。
- “/home/HwHiAiUser/software”为容器内软件包的存放路径,如果没有该路径,请先手动创建。
- 使用如下命令重新进入容器。
docker start container_id docker attach container_id
- 进入CANN软件包所在目录,参考宿主机的安装方式安装依赖和安装CANN软件包自行安装所需CANN软件。
操作指导
请根据产品型号,参考表1进行宿主机目录挂载至容器的操作。
父主题: 附录B:常用操作