用于构建多平台/架构的 MindiE 镜像的脚本。用户可以根据需要准备好所需的软件包,修改相关配置并构建镜像。
本仓库仅包含必须的脚本文件,不包含任何软件包,以下展示的目录结构是自行获取软件包之后的情况。
目前Ascend-mindie-atb-models_*.tar.gz软件包属于定向开源,请按照官方指南获取。
其中各变量对应构建脚本docker_build.sh中的参数,须在脚本中设定好对应的参数才可开始构建。
.
├── Ascend-cann-kernels-${DEVICE}_${CANN_VERSION}_linux-${ARCH}.run
├── Ascend-cann-nnal_${CANN_VERSION}_linux-${ARCH}.run
├── Ascend-cann-toolkit_${CANN_VERSION}_linux-${ARCH}.run
├── Ascend-mindie_${MINDIE_VERSION}_linux-${ARCH}.run
├── Ascend-mindie-atb-models_${MINDIE_VERSION}_linux-${ARCH}_py${PYTHON_SHORT_VERSION}_torch${TORCH_VERSION}-abi0.tar.gz
├── docker_build.sh
├── README.md
├── requirements-${TORCH_VERSION}.txt
├── server.js
├── torch-${TORCH_VERSION}+cpu-cp${PYTHON_SHORT_VERSION}-cp${PYTHON_SHORT_VERSION}-linux_${ARCH}.whl
├── torch_npu-${TORCH_VERSION}.post10*-cp${PYTHON_SHORT_VERSION}-cp${PYTHON_SHORT_VERSION}-manylinux_2_17_${ARCH}.manylinux2014_${ARCH}.whl
├── aarch64
│ ├── Dockerfile.openEuler
│ └── Dockerfile.Ubuntu
└── x86_64
├── Dockerfile.openEuler
└── Dockerfile.Ubuntu
例如针对以下的构建脚本 docker_build.sh:
docker build \
-f aarch64/Dockerfile.Ubuntu \
--build-arg http_proxy=$http_proxy \
--build-arg https_proxy=$https_proxy \
--build-arg no_proxy=127.0.0.1,*.huawei.com,localhost,local,.local,172.17.0.1 \
--build-arg DEVICE=910b \
--build-arg ARCH=aarch64 \
--build-arg PYTHON_VERSION=3.11.10 \
--build-arg PYTHON_MAJOR_VERSION=3.11 \
--build-arg PYTHON_SHORT_VERSION=311 \
--build-arg PYTHON_MD5=af59e243df4c7019f941ae51891c10bc \
--build-arg CANN_VERSION=8.0.0 \
--build-arg TORCH_VERSION=2.1.0 \
--build-arg MINDIE_VERSION=1.0.0 \
-t mindie:1.0.0-py3.11-800I-A2-aarch64-Ubuntu22.04 \
.
正确的目录结构是:
.
├── Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run
├── Ascend-cann-nnal_8.0.0_linux-aarch64.run
├── Ascend-cann-toolkit_8.0.0_linux-aarch64.run
├── Ascend-mindie_1.0.0_linux-aarch64.run
├── Ascend-mindie-atb-models_1.0.0_linux-aarch64_py311_torch2.1.0-abi0.tar.gz
├── docker_build.sh
├── README.md
├── requirements-2.1.0.txt
├── server.js
├── torch_npu-2.1.0.post10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
├── aarch64
│ ├── Dockerfile.openEuler
│ └── Dockerfile.Ubuntu
└── x86_64
├── Dockerfile.openEuler
└── Dockerfile.Ubuntu
为确保构建过程的顺利进行,建议宿主机与目标镜像中的系统版本保持一致。一般来说,宿主机和镜像系统版本相同将避免潜在的兼容性问题和不必要的构建麻烦。
跨架构构建(如在 x86_64 宿主机上构建 aarch64镜像)较为复杂且对环境有额外要求,通常情况下并不推荐。如果必须进行跨架构构建,请参考官方文档,确保宿主机上已正确配置相关工具和模拟环境,在此不展开指导。
在按照前文所述准备好软件包之后,可按以下步骤开始构建:
node server.js
[2025-01-01T00:00:00.000Z] Server started and listening at http://localhost:3000
[2025-01-01T00:00:00.000Z] Serving files from directory: /mindie-images
[2025-01-01T00:00:00.000Z] Please open another window to execute docker_build.sh
[2025-01-01T00:00:00.000Z] Incoming request: GET /Ascend-mindie_1.0.0_linux-aarch64.run from ::ffff:172.17.0.3
[2025-01-01T00:00:00.000Z] Successfully served file: Ascend-mindie_1.0.0_linux-aarch64.run (128794074 bytes)
...
若出现文件获取报错,请检查参数配置是否正确,软件包是否齐全,以及两者名称是否可对应上。
启动本地服务的目的是为了确保在构建过程中,镜像能够从本地服务器获取到对应的软件包。具体而言,Dockerfile 中的 wget 命令将从本地服务(而非外部网络)下载之前准备好的软件包。
启动本地服务的核心作用是通过本地网络为构建过程提供所需的软件包,而不是通过 COPY 命令将它们直接包含在镜像中。这种方式的优势体现在:
在 Dockerfile 中,您将看到类似以下的 wget 命令:
RUN wget -q http://172.17.0.1:3000/Ascend-cann-toolkit_${CANN_VERSION}_linux-${ARCH}.run -P /home/mindieuser/package
其中,172.17.0.1:3000 为本地服务器的地址,wget 命令会从该地址获取对应的软件包并将其存放在指定路径中。
当前仅有Ubuntu镜像支持更换Python版本,openEuler镜像由于其中的系统工具依赖于默认的Python,暂不推荐更换默认的Python
3.11.6。
bash docker_build.sh
根据 Docker 版本不同,将看到不同的回显信息。
若构建中出错,请考虑参考官方 Docker build 文档,进行问题定位,例如可以使用 --no-cache 与 --progress
plain (新版本特有)参数,修改 docker_build.sh 来帮助查明报错原因。
如果您使用的是root用户镜像(例如从Ascend Hub上取得),并且可以使用特权容器,请使用以下命令启动容器:
docker run -it -d --net=host --shm-size=1g \
--privileged \
--name <container-name> \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
-v /usr/local/sbin:/usr/local/sbin:ro \
-v /path-to-weights:/path-to-weights:ro \
mindie:1.0.0-800I-A2-py311-openeuler24.03-lts bash
如果您希望使用自行构建的普通用户镜像,并且规避容器相关权限风险,可以使用以下命令指定用户与设备:
docker run -it -d --net=host --shm-size=1g \
--user mindieuser:<HDK-user-group> \
--name <container-name> \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
-v /usr/local/sbin:/usr/local/sbin:ro \
-v /path-to-weights:/path-to-weights:ro \
mindie:1.0.0-800I-A2-py311-openeuler24.03-lts bash
注意,以上启动命令仅供参考,请根据需求自行修改再启动容器,尤其需要注意:
- –user,如果您的环境中HDK是通过普通用户安装(例如默认的HwHiAiUser,可以通过id HwHiAiUser命令查看该用户组ID),请设置好对应的用户组,例如用户组1001可以使用HDK,则–user
mindieuser:1001,镜像中默认使用的是用户组1000。如果您的HDK是由root用户安装,且指定了–install-for-all参数,则无需指定–user参数。- 设定容器名称–name与镜像名称,例如mindie:1.0.0-800I-A2-py311-openeuler24.03-lts。
- 如果不使用–priviliged参数,则需要设置各设备,包括设置想要使用的卡号–device: …
–name
–device=/dev/davinci_manager
–device=/dev/hisi_hdc
–device=/dev/davinci0 \ …- 设定权重挂载的路径,-v /path-to-weights:/path-to-weights:ro,注意,权重路径权限应当设置为750。如果使用普通用户镜像,权重路径所属应为镜像内默认的1000用户。可参考以下命令进行修改:
chmod -R 755 /path-to-weights chown -R 1000:1000 /path-to-weights- 在普通用户镜像中,注意所有文件均在 /home/mindieuser 下,请勿直接挂载 /home 目录,以免宿主机上存在相同目录,将容器内文件覆盖清除。
docker exec -it <container-name> bash
输入以下命令,应当正确显示设备信息:
npu-smi info
如果出现以下信息:
bash: npu-smi: command not found
说明宿主机上的 npu-smi 工具不在 /usr/local/sbin 路径中,可能是由于HDK版本过旧或其他原因导致,可以使用以下命令找到该工具,并在启动容器时将其挂载到容器内:
find / -name npu-smi
一般来说,可能出现在 /usr/local/bin/npu-smi 路径下。
启动Python,并输入以下命令:
import torch
import torch_npu
若无报错信息,则说明Torch组件正常。
输入以下命令:
pip list | grep mindie
应出现类似如下输出:
mindie_llm 1.0.0
mindiebenchmark 1.0.0
mindieclient 1.0.0
mindiesd 1.0.0
mindietorch 1.0.0+torch2.1.0.abi0
或者输入以下命令:
cat /home/mindieuser/Ascend/mindie/latest/version.info
应出现类似如下输出:
Ascend-mindie : MindIE 1.0.0
mindie-rt: 1.0.0
mindie-torch: 1.0.0
mindie-service: 1.0.0
mindie-llm: 1.0.0
mindie-sd:1.0.0
Platform : aarch64
说明各组件正常。
以Llama 3系列模型为例,具体可参考容器中$ATB_SPEED_HOME_PATH/examples/models/llama3/README.md中的说明
cd $ATB_SPEED_HOME_PATH
python examples/run_pa.py --model_path /path-to-weights
请修改权重路径/path-to-weights,另外$ATB_SPEED_HOME_PATH已默认设置好,无需自行设置。
启动后会执行推理,显示默认问题Question和推理结果Answer,若用户想要自定义输入问题,可使用–input_texts参数设置,如:
python examples/run_pa.py --model_path /path-to-weights --input_texts "What is deep learning?"
MindIE Service是面向通用模型场景的推理服务化框架,通过开放、可扩展的推理服务化平台架构提供推理服务化能力,支持对接业界主流推理框架接口,满足大语言模型的高性能推理需求。请参考MindIE Service开发指南。
以下给出最为简单的启动方法;
cd $MIES_INSTALL_PATH
nohup ./bin/mindieservice_daemon > output.log 2>&1 &
Daemon start success!
$MIES_INSTALL_PATH已默认设置好,无需自行设置。