MACS 容器化示例
概述
MACS 容器化(MACS Container Toolkit)利用容器运行时库和实用工具集构建运行模型和应用服务。我们提供高效稳定的镜像,内置了基础环境依赖和模型示例,帮助用户快速完成模型开发和应用部署,开箱即用,灵活高效,更方便快捷的利用墨芯 AI 计算卡的算力资源。
前提条件
已安装Docker,且安装的Docker版本不低于Docker 18.03。
$ docker --version $ docker info
启动 Docker 服务。启动命令如下:
$ systemctl status docker $ systemctl start docker
在物理服务器上已安装 SOLA,安装的详细步骤请参见《SOLA Toolkit 安装指南》。
需要注意的是:
我们已经在镜像内集成 SOLA 稳定版本,您无需在容器中再次安装 SOLA。
容器内和物理服务器安装的 SOLA 版本需保持一致。您可通过以下命令确认版本信息:
#查询 sola版本信息 $ ls -al /usr/local/
使用镜像服务
为方便用户,我们提供了在线版镜像和离线版镜像。
使用离线版镜像,请在下载镜像包后将其导入到本地 Docker 环境。
使用在线版镜像,请确保测试服务器可访问互联网及 Dockerhub。
使用基础镜像
基础镜像基于主流操作系统构建,包括一些基础环境环境依赖,具备运行基本应用的能力。
获取镜像
下载离线版镜像
$ wget http://moffett-oss-bucket01.oss-cn-shenzhen.aliyuncs.com/images/macs/macs-sola-3.7.2.tar
下载在线版版镜像
$ docker pull moffett/macs:sola-3.7.2
导入镜像(离线版)
如果您下载的是离线版镜像,请执行以下命令将镜像导入到本地 Docker 环境。否则,您可跳过该步骤。
导入命令格式如下:
$ docker load -i moffettai-macs-<version>-<arch>-<os>.tar
导入命令示例:
#请以您实际下载的文件名为准
$ docker load -i macs-sola-3.7.2.tar
创建容器
基于基础镜像,为测试环境创建一个容器实例。
$ docker run -itd --privileged -name $(CONTAINER_NAME) $(IMAGE_REPO) /$(IMAGE_NAME):$(IMAGE_TAG) /bin/bash
#sample
$ docker images |grep macs
$ docker run -itd --privileged --name macs-1.3.2 macs:sola-3.7.2 /bin/bash
创建容器参数选项如下:
说明:命令启动参数可根据需要灵活调整,根据业务需要动态删减,简要说明如下表,详情请参见 Docker 官方文档。
参数 | 是否必选 | 说明 |
---|---|---|
$(CONTAINER_NAME) | 否 | 容器名称。建议您定义一个容器名。 |
$(IMAGE_REPO)/$(IMAGE_NAME):$(IMAGE_TAG) | 是 | 镜像仓库地址/镜像名:镜像 tag 或镜像 ID |
/bin/bash | 是 | 指定进入容器 shell 环境为 bash。 |
-itd | 是 | 交互方式后台运行容器。 |
-v | 否 | --volume,声明将宿主机目录挂载到容器内对应的目录。方便宿主机和容器间文件共享。 |
--privileged | 否 | (推荐启用)使用特权模式。 |
--net=host | 否 | 容器网络默认为 bridge 模式,容器网络与宿主机网络隔离; 设置该参数为 host 后,容器网络为主机模式,可方便共享宿主机网络环境。 |
--pid=host | 否 | 在容器中直接看到宿主机的进程信息。 |
--restart always | 否 | 容器退出时应用的重新启动策略为 always,默认为 no。 |
--device /dev/mf-ctl:/dev/mf-ctl --device /dev/mf-remap-pfn:/dev/mf-remap-pfn --device /dev/mf-pci-endpoint.0:/dev/mf-pci-endpoint.0 |
否 | 如您不启用特权模式(--privileged),则必须指定该参数,将安装在宿主机上的墨芯计算卡设备节点挂载进容器中。若使用本参数,则需指定--device /dev/mf-ctl:/dev/mf-ctl --device /dev/mf-remap-pfn:/dev/mf-remap-pfn ,参数后面的部分您可以根据实际情况灵活调整。endpoint 后指定设备 index ID。 |
示例如下:
# sample: 将宿主机设备节点 device0 挂载到容器中对应的设备节点device0
docker run -it --rm --device /dev/mf-ctl:/dev/mf-ctl --device /dev/mf-remap-pfn:/dev/mf-remap-pfn --device /dev/mf-pci-endpoint.0:/dev/mf-pci-endpoint.0 --name test moffett/macs:3.7.2 /bin/bash
# sample: 将宿主机设备节点device12 挂载到容器中的设备节点 device1
docker run -it --rm --device /dev/mf-ctl:/dev/mf-ctl --device /dev/mf-remap-pfn:/dev/mf-remap-pfn --device /dev/mf-pci-endpoint.0:/dev/mf-pci-endpoint.0 --device /dev/mf-pci-endpoint.12:/dev/mf-pci-endpoint.1 --name test moffett/macs:3.7.2 /bin/bash
验证使用
镜像中已集成稳定版本驱动程序和 sola-toolkit,您无需安装,可在容器内直接执行 sola 相关命令选项:
使用 mx-smi ,使用方式请参见《mx-smi 使用说明》。
使用 mx-qual,使用方式请参见《mx-qual 使用说明》。
基本示例如下:
$ docker exec -it macs-1.3.2 /bin/bash
# 在容器中查看系统中墨芯AI计算卡信息
$ mx-smi list
# 在容器中使用mx-qual
$ mx-qual list -i 0
使用业务镜像
业务镜像主要为应用或模型提供运行环境。 本文仅以 sola-demo 为例,说明业务镜像的使用。
sola-demo 以镜像和数据分离的形式发布,其中镜像只包括模型运行的依赖环境,模型数据文件单独打包。创建容器时,需将模型数据挂载到容器中指定的目录。
获取镜像
下载离线版镜像
$ wget http://moffett-oss-bucket01.oss-cn-shenzhen.aliyuncs.com/images/Ubuntu/business/sola-demo-3.7.2.tar
下载在线版镜像
$ docker pull moffett/sola-demo:3.7.2 $ docker images |grep sola-demo
导入镜像(离线版)
如果您下载的是离线版镜像,请执行以下命令导入镜像。否则,您可跳过该步骤。
$ docker load -i sola-demo-3.7.2.tar
准备数据
# 下载数据包
$ wget https://moffett-oss-bucket01.oss-cn-shenzhen.aliyuncs.com/sola-demo/sola-demo-3.7.2-data-offline.tar.gz
# 解压:标准解压
$ tar -zxvf sola-demo-3.7.2-data-offline.tar.gz
# 解压: 多线程解压(推荐)
$ tar --use-compress-program=pigz -xvpf sola-demo-3.7.2-data-offline.tar.gz
创建容器并验证模型
创建容器
注意:创建容器前请注意所在位置,$PWD
为当前目录,查看当前目录下是否有解压的模型数据。
$ docker run -itd --privileged -v $PWD/sola-demo-3.7.2-data-offline:/home/moffett/workspace/sola-demo-3.7.2 --name sola-demo-3.7.2 moffett/sola-demo:3.7.2 /bin/bash
$ docker ps -a |grep sola-demo-3.7.2
ResNet50
注意:如果您想在容器中直接执行SOLA示例,可执行以下命令创建sola-demo容器。创建容器前请注意所在位置,$PWD
为当前目录。
进入容器内运行模型
$ docker exec -it sola-demo-3.7.2 /bin/bash $ sola-demo-3.7.2/models/resnet50/run.sh && sola-demo-3.7.2/models/resnet50/verify.sh
创建临时容器并运行模型
$ docker run -it --rm --privileged -v $PWD/sola-demo-3.7.2-data-offline:/home/moffett/workspace/sola-demo-3.7.2 moffett/sola-demo:3.7.2 /bin/bash -c "sola-demo-3.7.2/models/resnet50/run.sh && sola-demo-3.7.2/models/resnet50/verify.sh"
Bert
进入容器内运行模型
$ docker exec -it sola-demo-3.7.2 /bin/bash $ sudo sola-demo-3.7.2/models/bert/run.sh && sola-demo-3.7.2/models/bert/verify.sh
创建临时容器并运行模型
$ docker run -it --rm --privileged -v $PWD/sola-demo-3.7.2-data-offline:/home/moffett/workspace/sola-demo-3.7.2 moffett/sola-demo:3.7.2 /bin/bash -c "sudo sola-demo-3.7.2/models/bert/run.sh && sola-demo-3.7.2/models/bert/verify.sh"
Bloom7b
进入容器内运行模型
$ docker exec -it sola-demo-3.7.2 /bin/bash $ sola-demo-3.7.2/models/bloom-7b/run.sh && sola-demo-3.7.2/models/bloom-7b/verify.sh
创建临时容器并运行模型
$ docker run -it --rm --privileged -v $PWD/sola-demo-3.7.2-data-offline:/home/moffett/workspace/sola-demo-3.7.2 moffett/sola-demo:3.7.2 /bin/bash -c "sola-demo-3.7.2/models/bloom-7b/build/bloom --module_path sola-demo-3.7.2/sola_demo_assets/models/bloom/v1/bloom7b_demo -f sola-demo-3.7.2/models/bloom-7b/data/questions.txt"
Bloom176b
进入容器内运行模型
$ docker exec -it sola-demo-3.7.2 /bin/bash $ sola-demo-3.7.2/models/bloom-176b/run.sh && sola-demo-3.7.2/models/bloom-7b/verify.sh
创建临时容器并运行模型
$ docker run -it --rm --privileged -v $PWD/sola-demo-3.7.2-data-offline:/home/moffett/workspace/sola-demo-3.7.2 moffett/sola-demo:3.7.2 /bin/bash -c "sola-demo-3.7.2/models/bloom-176b/build/bloom --module_path sola-demo-3.7.2/sola_demo_assets/models/bloom/v1/bloom176b_demo -f sola-demo-3.7.2/models/bloom-176b/data/questions.txt"
ChatGLMv2 6B
进入容器内运行模型
$ docker exec -it sola-demo-3.7.2 /bin/bash $ cd sola-demo-3.7.2/models/chatglm2-6b/ $ ./run.sh # 问答模式,输入 exit 退出程序 $ export PYTHONPATH="$PYTHONPATH:$PWD/test" $ python3 test/chat_chatglmv26b.py --mode="qa" # 自动问答模式,问题可以手动指定,默认使用`data/questions.txt` $ python3 test/chat_chatglmv26b.py --mode="auto-qa" --questions="data/questions.txt"
环境清理
注意:
以下操作请在物理机上执行。
$(CONTAINER_NAME/CONTAINER_ID)请替换为实际的容器名/容器 ID
$(IMAGE_NAME:TAG/IMAGE_ID)请替换为实际的镜像名/镜像 ID
停止并删除容器
$ docker stop $(CONTAINER_NAME/CONTAINER_ID) && docker rm $(CONTAINER_NAME/CONTAINER_ID)
删除镜像
$ docker rmi $(IMAGE_NAME:TAG/IMAGE_ID)
删除指定容器/镜像
$ export container_name="your container name"
$ export image_name="your images name:tag or images id"
$ docker rm -f $(docker ps -a -q | grep -E "^($container_name)")
$ docker rmi -f $(docker images -a -q | grep -E "^($image_name:tag)")