-
Notifications
You must be signed in to change notification settings - Fork 2
Description
目标
在团队公用的昇腾裸机上清晰、高效地创建和管理昇腾 NPU 环境的 docker 容器,方便大家在隔离环境中开发。
dockerfile、docker-compose.yaml 等文件来自 @hipudding 感谢!
前置条件:昇腾裸机已安装 docker 及 npu 驱动
1. docker镜像
编写 docker file
FROM ubuntu:20.04
# define your var
ARG YOUR_USER_NAME="your_user_name"
ARG YOUR_GROUP_ID="XXXX"
ARG YOUR_USER_ID="XXXX"
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ="Asia/shanghai"
RUN sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && \
yes | unminimize && \
apt-get install -y adduser sudo vim gcc g++ cmake make gdb git tmux openssh-server \
net-tools iputils-ping python3-distutils python3-setuptools \
python3-wheel python3-yaml python3-dbg python3-pip libmpich-dev
# Config user. User must join group HwHiAiUser(1000) to use npu.
# Identify user id and group id to match user out of docker. (optional)
RUN groupadd -g $YOUR_GROUP_ID $YOUR_USER_NAME && \
useradd -u $YOUR_USER_ID -g $YOUR_USER_NAME -ms /bin/bash $YOUR_USER_NAME && \
sed -i "/root\tALL=(ALL:ALL) ALL/a"${YOUR_USER_NAME}"\tALL=(ALL:ALL) ALL" /etc/sudoers && \
echo "source /home/${YOUR_USER_NAME}/Ascend/ascend-toolkit/set_env.sh" >> /home/"$YOUR_USER_NAME"/.bashrc && \
echo "export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:${LD_LIBRARY_PATH}" >> /home/"$YOUR_USER_NAME"/.bashrc && \
ssh-keygen -A
CMD ["/bin/bash", "/home/"${YOUR_USER_NAME}"/bin/entrypoint.sh"]通过 dockerfile 创建镜像
在 dockerfile 所在目录下执行以下命令,即可创建镜像
docker build -t your_image_name:your_image_tag .准备容器入口脚本
创建容器启动的入口脚本 entrypoint.sh 并映射到容器内 ~/bin/ 目录下
# /bin/bash
# define your var
your_user_name="XXX"
your_password="XXX"
# Create passwd
echo "${your_user_name}:${your_password}" | chpasswd
# Add to group 1000(HwHiAiUser) to use npu
cat /etc/passwd | awk -F ":" '{print $4}' | grep 1000
if [ $? -ne 0 ]
then
groupadd -g 1000 HwHiAiUser
useradd -u 1000 -g HwHiAiUser -ms /bin/bash HwHiAiUser
fi
usermod -a -G 1000 ${your_user_name}
# For jumper
if [ $(grep -c "HostkeyAlgorithms +ssh-rsa" /etc/ssh/sshd_config) -eq 0 ]
then
echo "HostkeyAlgorithms +ssh-rsa" >> /etc/ssh/sshd_config
fi
if [ ! -d /run/sshd ]
then
mkdir /run/sshd
fi
/usr/sbin/sshd -D2. docker compose
docker compose 简介
来自官方文档的简介:Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它是解锁精简高效的开发和部署体验的关键。Compose 简化了对整个应用程序堆栈的控制,使您可以在一个 YAML 配置文件中轻松管理服务、网络和存储。然后,使用一条命令,可以从该配置文件创建并启动所有服务。
它还具有用于管理应用程序整个生命周期的命令:
-
启动、停止和重建服务
-
查看正在运行的服务的状态
-
流式传输正在运行的服务的日志输出
-
在服务上运行一次性命令
优点:yaml 配置文件中配置项清晰灵活,再也不用担心忘记容器启动的配置了
安装 docker compose 插件
裸机环境中已安装 docker-compose,可直接使用 docker-compose 命令,安装部分供大家参考
使用手动安装 compose cli 插件
-
下载 compose cli 插件
# 选择一个合适的路径存放 compose DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins # 更多不同框架/版本的 docker compose 地址:https://github.com/docker/compose/releases curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-aarch64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
Note
此命令下载 Docker Compose 的最新版本并为
$HOME目录下的活动用户安装 Compose -
赋予可执行权限
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
YAML 配置文件
compose 支持 compose.yaml, compose.yml,docker-compose.yaml,docker-compose.yml
配置项与 docker run 的参数含义一致,但 yaml 方式更适合管理
需更改变量 list:
- your_service_name
- your_image_name
- your_container_name
- your_local_volume
- your_docker_volume
- your_port
- your_host_name
- 可用npu卡号 /dev/davinci1
services:
your_service_name:
image: your_image_name
container_name: your_container_name
volumes:
# 挂载宿主机某目录到容器内用户home目录,以同步容器内更改
# 保证 ~/bin/entrypoint.sh 文件的映射路径正确
- /your_local_volume:/your_docker_volume
# ----- 此处保持不变 ----- #
- /usr/local/dcmi:/usr/local/dcmi
- /usr/local/bin/npu-smi:/usr/local/bin/npu-smi
- /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64
- /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info
- /etc/ascend_install.info:/etc/ascend_install.info
# ---------------------- #
ports:
# 映射22端口,方便 ssh 远程连接容器
- your_port:22
# 可添加更多端口映射
- 8008:8008
restart: unless-stopped
hostname: your_host_name
tty: true
devices:
# 此处更改为可用的 NPU 卡号,可通过 npu-list 查询卡的占用状态
- /dev/davinci1
- /dev/davinci_manager
- /dev/devmm_svm
- /dev/hisi_hdc
cap_add:
- SYS_PTRACE
shm_size: 20gb
启动容器
- docker-compose 的操作均在其 yaml 配置文件所在目录下执行
临时启动(运行一次)
docker-compose -p <project-name> up后台运行(非 down 或强制 rm 一直保持运行)
docker-compose -p <project-name> up -d关闭容器
docker-compose -p <project-name> down为什么需要指定 project-name ?
project-name 默认的是 yaml 配置文件上一级目录的名称,为防止公用裸机上有使用的目录名称一致,导致 project 名称重复,从而带来不同 project 启动的容器互抢的问题,最好指定 project-name。
进入容器
docker exec -it your_container_name /bin/bash进入容器后,再在自己的用户目录下安装 CANN toolkit 等包,即可使用 npu 开发了。
安装 CANN toolkit 请参考昇腾虚拟机固件与驱动安装,忽略其中驱动的安装。
更多 docker compose 相关指令请参考官方文档