Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 docker-compose 搭建 npu 环境的容器 #28

Open
MengqingCao opened this issue May 7, 2024 · 2 comments
Open

使用 docker-compose 搭建 npu 环境的容器 #28

MengqingCao opened this issue May 7, 2024 · 2 comments
Labels
Ascend Something isn't working publish New feature or request

Comments

@MengqingCao
Copy link

MengqingCao commented May 7, 2024

目标

在团队公用的昇腾裸机上清晰、高效地创建和管理昇腾 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 -D

2. docker compose

docker compose 简介

来自官方文档的简介:Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它是解锁精简高效的开发和部署体验的关键。Compose 简化了对整个应用程序堆栈的控制,使您可以在一个 YAML 配置文件中轻松管理服务、网络和存储。然后,使用一条命令,可以从该配置文件创建并启动所有服务。

它还具有用于管理应用程序整个生命周期的命令:

  • 启动、停止和重建服务

  • 查看正在运行的服务的状态

  • 流式传输正在运行的服务的日志输出

  • 在服务上运行一次性命令

    优点:yaml 配置文件中配置项清晰灵活,再也不用担心忘记容器启动的配置了

安装 docker compose 插件

裸机环境中已安装 docker-compose,可直接使用 docker-compose 命令,安装部分供大家参考

使用手动安装 compose cli 插件

  1. 下载 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

  2. 赋予可执行权限

    chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

YAML 配置文件

compose 支持 compose.yamlcompose.ymldocker-compose.yamldocker-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 相关指令请参考官方文档

@MengqingCao MengqingCao added the Ascend Something isn't working label May 7, 2024
@hipudding
Copy link

感谢梦晴总结,有几个建议可以修改下:

  1. 在dockerfile和脚本里,把需要修改的userid,groupid,usename,passwd之类的,可以改成变量放到最上面,或者直接使用环境变量,这样使用起来修改不会遗漏。
  2. docker-compose是一个程序,可以共用,可以放到bin目录下,就不用大家复制或者下载了。

@MengqingCao
Copy link
Author

感谢梦晴总结,有几个建议可以修改下:

  1. 在dockerfile和脚本里,把需要修改的userid,groupid,usename,passwd之类的,可以改成变量放到最上面,或者直接使用环境变量,这样使用起来修改不会遗漏。
  2. docker-compose是一个程序,可以共用,可以放到bin目录下,就不用大家复制或者下载了。

done

@MengqingCao MengqingCao added the publish New feature or request label Jun 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Ascend Something isn't working publish New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants