ModelArts自定义训推镜像构建指南
我们维护了一个预构建好的ModelArts镜像列表,可以先看一下有没有你需要的。
自定义镜像构建的难点
- 窄版本:比如
pytorch-npu 2.5.1依赖cann 8.2.rc1,pytorch-npu 2.7.1依赖cann 8.3.rc1,底层的numpy只能是1.x; - 场景多:
- 传统训练场景:传统的CV、预测场景,包括基于Transformer架构的传统模型,比如yolo等;
- 大模型训练场景:依赖(nnal等大模型训练加速包);
- 传统推理场景:直接使用pytorch或transformers推理
- 大模型推理场景:使用vllm-ascend等推理框架
- cpu训练推理场景
- 其他框架训推场景
- 依赖arm环境,且构建中不能验证镜像是否可用。
解决方案
如果构建一个大而全的镜像,试图覆盖所有的基础依赖,场景依赖是行不通的,这样会导致dockerfile会很大,很难维护,镜像也会很大,而且可能会有依赖版本冲突。那怎么解决这种问题呢?
镜像分级构建
将镜像分为如下几个层级:
- 基础镜像:包括基础库、常用工具、python环境、cann镜像,包括训练推理中可能用到包,包括toolkits(和nnae二选一),kernels,nnal(大模型场景)等;
- 训练框架镜像:比如pytorch镜像,包括pytorch和npu扩展包pytorch-npu,或者mindspore等其他训练镜像;
- 场景/应用镜像:面向不同的模型的训推场景都使用自己的镜像,安装所需依赖,保证镜像简洁可维护。
flowchart TD
ubuntu["ubuntu:22.04"]
python["python:3.10\n基础库 + Python 环境"]
cann["cann:8.3rc1-910b\nCANN toolkit/nnae + kernels + nnal"]
pytorch["pytorch:2.7.1-npu-910b\nPyTorch + torch_npu"]
scene1["训练场景镜像\n如 YOLO、MiniMind"]
scene2["大模型训练镜像\n如 LLaMA Fine-tune"]
scene3["推理场景镜像\n如 vLLM、Transformers"]
ubuntu --> python
python --> cann
cann --> pytorch
pytorch --> scene1
pytorch --> scene2
pytorch --> scene3
classDef base fill:#e1f5fe,stroke:#0288d1
classDef framework fill:#f3e5f5,stroke:#7b1fa2
classDef scene fill:#e8f5e9,stroke:#388e3c
class ubuntu,python base
class cann,pytorch framework
class scene1,scene2,scene3 scene
通过分层的方式完成镜像构建
构建环境
镜像构建需要基于ARM架构的主机进行,可以在云内申请arm虚拟机,也可使用M系列芯片的Mac,使用有互联网访问权限的主机。
X86的主机虽然可以借助QEMU通过指令集转译的方式执行构建,但是速度很慢,且指令支持不完善导致构建不成功。
flowchart LR
subgraph arm["✅ ARM 构建环境(推荐)"]
mac["Apple M 系列 Mac| arm64 原生"]
vm["华为云 ARM 虚拟机 | kCP 920 / 鲲鹏"]
npu["昇腾 910B 服务器 | 带 NPU 驱动"]
end
subgraph x86["⚠️ x86 构建环境(受限)"]
qemu["x86 主机 + QEMU\n指令转译,速度慢 | 部分包可能构建失败"]
win["Windows | 支持基于官方 vLLM 镜像 | 添加 ma-user 场景"]
end
subgraph output["构建产物"]
img["linux/arm64 镜像 | 可推送至 SWR"]
end
mac -->|docker build| img
vm -->|docker build| img
npu -->|docker build| img
qemu -.->|有限支持| img
win -.->|有限支持| img
classDef ok fill:#e8f5e9,stroke:#388e3c
classDef warn fill:#fff8e1,stroke:#f9a825
classDef out fill:#e3f2fd,stroke:#1565c0
class mac,vm,npu ok
class qemu,win warn
class img out
当前Windows可以支持基于vLLM-Ascend官方镜像,往镜像里面增加
ma-user用户,这个镜像可以构建成功,其他的需要安装依赖的目前看还不太行。
构建基础python镜像
Python基础镜像中指定了基础镜像(比如ubuntu),基础库,也可以带一些调测工具,还有面向ModelArts适配加入的ma-user用户。
docker build \
-f dockerfiles/python.dockerfile \
--build-arg BASE_IMAGE=ubuntu:22.04 \
--build-arg PYTHON_VERSION=3.10 \
--build-arg PIP_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple \
--build-arg INCLUDE_DEBUG_TOOLS=true \
-t python:3.10 .
构建CANN镜像
CANN镜像基于上述python镜像构建,还需要提前下载CANN组件CANN资源下载,并放到 packages/<CANN_VERSION>/ 目录下。
docker build \
-f dockerfiles/cann.dockerfile \
--build-arg BASE_IMAGE=python:3.10 \
--build-arg CANN_VERSION=8.3.RC1 \
--build-arg CHIP_TYPE=910b \
--build-arg DRIVER_VERSION=24.1.1 \
--build-arg INSTALL_COMPONENTS=toolkit,nnal,kernels \
-t cann:83rc1-python310 .
构建pytorch镜像
docker build \
-f dockerfiles/pytorch-npu.dockerfile \
--build-arg BASE_IMAGE=cann:83rc1-python310 \
--build-arg TORCH_VERSION=2.7.1 \
--build-arg TORCH_NPU_VERSION=2.7.1 \
--build-arg TORCHVISION_VERSION=0.20.1 \
-t pytorch:2.7.1-npu-910b .
构建应用镜像(以msmodelslim为例)
msmodelslim是一个面向昇腾的模型权重量化工具。
docker build \
-f dockerfiles/msmodelslim.dockerfile \
--build-arg BASE_IMAGE=pytorch:2.7.1-npu-910b \
-t msmodelslim:latest .
构建完成后,将镜像推送到 SWR:
# 从 SWR 控制台获取登录命令
docker login -u <用户名> -p <密码> swr.cn-global-1.myhuaweicloud.com
# 打 tag
docker tag msmodelslim:latest swr.cn-global-1.myhuaweicloud.com/<组织>/msmodelslim:latest
# 推送
docker push swr.cn-global-1.myhuaweicloud.com/<组织>/msmodelslim:latest
提供两种快速构建的方案
上面分层构建的方式提供了一种体系化的构建方案,可以支持更丰富的场景,依赖及版本可以按需指定,但是整体构建流程会过于复杂。
参考如上的思路,这里提供两种快速构建的方案供大家参考:
使用Dockerfile 生成器快速获取常用Dockerfile
这种方式提供了一个可视化的页面,可以根据使用场景生成对应的一体化Dockerfile。
- 访问Dockerfile 生成器,根据实际需求生成对应的Dockerfile和构建命令;
- 下载CANN组件:CANN资源下载,注意选择匹配的版本,CPU架构选择AArch64, 软件包格式选择run,组件包参考ascend-cann体系组成下载所需的安装包;并把下载的包放到packages/8.x.x(根据实际的版本确定)目录下;
- 完成构建。
比如下载vllm构建示例:
docker build -t swr.cloud.com/organization/vllm:latest .
使用 ascend-docker-factory 自定义构建
上述基于Dockerfile 生成器的方案可以快速针对常用的镜像完成构建,这里提供了一个工具可以用来适配更丰富的场景。
可以更灵活的指定构建依赖的版本,可以支持更宽的版本配套关系。
下载
git clone https://github.com/ascend-docker-factory.git
定义文件参考
项目中默认有常用场景示例,可以参考示例添加自己的配置。
images:
python-3.10: # 镜像的id,其他镜像通过这个id引用
build:
context: .
dockerfile: dockerfiles/python.dockerfile # 当前镜像构建所需的dockerfile
args:
PYTHON_VERSION: "3.10" # 指定python版本
BASE_IMAGE: "ubuntu:22.04"
tags:
- "python:3.10" # 构建镜像的tag
cann-8.2rc1-910b:
depends_on: # 指定依赖的基础镜像
- python-3.10
build:
...
tags:
- "cann:8.2rc1-910b"
...
使用
# python build.py -h
usage: build.py [-h] [--target TARGET] [--list] [--graph]
Build Docker images using dockerfile-compose
options:
-h, --help show this help message and exit
--target TARGET Build specific image and its dependencies
--list List all available images
--graph Generate Mermaid dependency graph
列举所有可构建的镜像
python build.py --list
Available images:
python-3.10: python:3.10
cann-8.3rc1-910b: cann:8.3rc1-910b (depends on: python-3.10)
pytorch-npu-910b: pytorch:2.5.1-npu-910b (depends on: cann-8.3rc1-910b)
...
当前支持的镜像树
flowchart TD
python_3.10[python-3.10]
python_3.11[python-3.11]
ml_basic[ml-basic]
pytorch_cpu[pytorch-cpu]
cann_8.0rc1_910b[cann-8.0rc1-910b]
cann_8.2rc1_910b[cann-8.2rc1-910b]
cann_8.3rc1_910b[cann-8.3rc1-910b]
cann_8.2rc1_310p[cann-8.2rc1-310p]
cann_8.3rc1[cann-8.3rc1]
pytorch_npu_910b[pytorch-npu-910b]
pytorch_npu_310p[pytorch-npu-310p]
ascend_vllm[ascend-vllm]
msmodelslim[msmodelslim]
python_3.10 --> ml_basic
python_3.10 --> pytorch_cpu
python_3.10 --> cann_8.0rc1_910b
python_3.10 --> cann_8.2rc1_910b
python_3.10 --> cann_8.3rc1_910b
python_3.10 --> cann_8.2rc1_310p
python_3.10 --> cann_8.3rc1
cann_8.3rc1_910b --> pytorch_npu_910b
cann_8.2rc1_310p --> pytorch_npu_310p
pytorch_npu_910b --> msmodelslim
%% Styling
classDef baseImage fill:#e1f5fe
classDef framework fill:#f3e5f5
classDef application fill:#e8f5e8
class python_3.10,python_3.11 baseImage
class pytorch_cpu,cann_8.0rc1_910b,cann_8.2rc1_910b,cann_8.3rc1_910b,cann_8.2rc1_310p,cann_8.3rc1,pytorch_npu_910b,pytorch_npu_310p framework
class ml_basic,ascend_vllm,msmodelslim application
详细使用介绍
基础说明和参考,可自行调整版本声明和dockerfile定义,适配自己的业务场景。
Python基础镜像
配置文件,可通过args指定基础镜像和python版本
python-3.10:
build:
context: .
dockerfile: dockerfiles/python.dockerfile
args:
PYTHON_VERSION: "3.10"
BASE_IMAGE: "ubuntu:22.04"
tags:
- "python:3.10"
操作命令
# 构建镜像
python build.py --target python-3.10 # or python-3.12
# 保存镜像
docker save -o python-3.10.tar python:3.10
# tag
docker tag python:3.10 swr.cloud.com/org1/python:3.10
# push
docker push swr.cloud.com/org1/python:3.10
构建昇腾CANN镜像
配置文件,可通过args指定基础镜像,CANN版本等。
cann-8.2rc1-910b:
depends_on:
- python-3.10
build:
context: .
dockerfile: dockerfiles/cann.dockerfile
args:
BASE_IMAGE: "python:3.10"
CANN_VERSION: "8.2.RC1"
CHIP_TYPE: "910b"
DRIVER_VERSION: "24.1.1"
INSTALL_COMPONENTS: "toolkit,kernels,nnal"
tags:
- "cann:8.2rc1-910b"
CANN相关的包(包括tookit, nnae, kernels, nnal等,具体下载哪些包,可以参考ascend-cann体系组成)需要提前下载,并将安装包放到工程根目录的packges目录下,以版本号组织。
命令
# 构建镜像
python build.py --target cann-8.3rc1-910b # or cann-8.2rc1-910b
# 保存镜像
docker save -o cann-8.3rc1-910b.tar cann:8.2rc1-910b
# tag
docker tag cann:8.2rc1-910b swr.cloud.com/org1/cann:8.2rc1-910b
# push
docker push swr.cloud.com/org1/cann:8.2rc1-910b
构建pytorch镜像
配置文件,可通过args指定pytorch版本
pytorch-npu-910b:
depends_on:
- cann-8.3rc1-910b
build:
context: .
dockerfile: dockerfiles/pytorch-npu.dockerfile
args:
BASE_IMAGE: "cann:8.3rc1-910b"
TORCH_VERSION: "2.5.1"
TORCH_NPU_VERSION: "2.5.1"
tags:
- "pytorch:2.5.1-npu-910b"
命令
# 构建镜像
python build.py --target pytorch-npu-910b
# 保存镜像
docker save -o pytorch-npu-910b-2.5.1.tar pytorch:2.5.1-npu-910b
# tag
docker tag pytorch:2.5.1-npu-910b swr.cloud.com/pytorch:2.5.1-npu-910b
# push
docker push swr.cloud.com/pytorch:2.5.1-npu-910b
构建vLLM推理框架
配置文件,vLLM作为推理框架,使用外部基础镜像
ascend-vllm:
purpose: inference
app_type: vllm
app_name: "vLLM Runtime"
description: "High-performance LLM inference framework"
standalone: true
build:
context: .
dockerfile: dockerfiles/vllm.dockerfile
args:
BASE_IMAGE: "v0.11.0rc2"
INCLUDE_DEBUG_TOOLS: "true"
tags:
- "ascend-vllm:v0.11.0rc2"
命令
# 构建镜像
python build.py --target ascend-vllm
# 保存镜像
docker save -o ascend-vllm-v0.11.0rc2.tar ascend-vllm:v0.11.0rc2
# tag
docker tag ascend-vllm:v0.11.0rc2 swr.cloud.com/org1/ascend-vllm:v0.11.0rc2
# push
docker push swr.cloud.com/org1/ascend-vllm:v0.11.0rc2
预构建镜像
镜像构建比较复杂,对环境要求比较高,这里维护一个常用的ModelArts镜像列表,随时更新,供大家下载使用。
| 镜像 | 下载地址 |
|---|---|
vllm-ascend-v0.13.0rc1 | vllm-ascend-v0.13.0rc1.tar.gz |
vllm-ascend-v0.14.0rc1 | vllm-ascend-v0.14.0rc1.tar.gz |
下载后按如下步骤(以vLLM为例)导入并推送到 SWR:
# 1. 载入镜像
docker load -i vllm-ascend-v0.14.0rc1.tar.gz
# 2. 查看载入的镜像名
docker images | grep vllm
# 3. 打 tag(替换为实际的组织和 SWR 地址)
docker tag vllm-ascend:v0.14.0rc1 swr.cn-global-1.myhuaweicloud.com/<组织>/vllm-ascend:v0.14.0rc1
# 4. 推送到 SWR
docker push swr.cn-global-1.myhuaweicloud.com/<组织>/vllm-ascend:v0.14.0rc1
附录
SWR
login
SWR服务中获取登录命令
docker login -u <u> -p <p> swr.cn-global-1.cloud.cn
tag
docker tag minimind:v2 swr.cn-global-1.cloud.cn/test-modelarts/minimind:v2
push
docker push swr.cn-global-1.cloud.cn/test-modelarts/minimind:v2
Docker基础
1. Docker是什么
Docker 是一个开源的容器化平台,可以将应用程序及其依赖打包到一个轻量级、可移植的容器中运行。
容器 vs 虚拟机
| 虚拟机 | 容器 | |
|---|---|---|
| 操作系统 | 包含完整 OS | 共享宿主 OS 内核 |
| 启动速度 | 慢 | 秒级启动 |
| 资源占用 | GB 级 | MB 级 |
2. 为什么需要 Docker?
传统部署的痛点:
- “在我机器上能跑” — 开发、测试、生产环境不一致,部署后出现各种问题
- 依赖冲突 — 不同应用需要不同版本的运行时,互相干扰
- 部署复杂 — 手动安装配置环境繁琐,难以复现和自动化
Docker 的解决方案:
- 环境一致性 — 开发 = 测试 = 生产,容器确保环境完全相同
- 快速交付 — 秒级启动,极大加速 CI/CD 流程
- 资源高效 — 比虚拟机更轻量,同一服务器运行更多应用
flowchart LR
subgraph old["❌ 传统部署"]
direction TB
dev_old["开发环境\nPython 3.8\nnumpy 1.21"]
test_old["测试环境\nPython 3.9\nnumpy 1.23"]
prod_old["生产环境\nPython 3.7\nnumpy 1.19"]
dev_old -. "版本不一致\n'在我机器上能跑'" .-> test_old
test_old -. "依赖冲突\n部署失败" .-> prod_old
end
subgraph new["✅ Docker 部署"]
direction TB
img_new["Docker 镜像\nPython 3.10 + numpy 1.26\n环境完全封装"]
dev_new["开发环境\n运行同一镜像"]
test_new["测试环境\n运行同一镜像"]
prod_new["生产环境\n运行同一镜像"]
img_new --> dev_new
img_new --> test_new
img_new --> prod_new
end
classDef bad fill:#ffebee,stroke:#c62828
classDef good fill:#e8f5e9,stroke:#388e3c
classDef img fill:#e3f2fd,stroke:#1565c0
class dev_old,test_old,prod_old bad
class dev_new,test_new,prod_new good
class img_new img
3. Docker 核心概念
| 概念 | 说明 | 类比 |
|---|---|---|
| 镜像 (Image) | 只读模板,包含运行应用所需的一切,通过 Dockerfile 构建 | ”安装光盘”或”快照” |
| 容器 (Container) | 镜像的运行实例,可读写,可启动/停止/删除/暂停 | ”用光盘安装好的程序” |
| 仓库 (Registry) | 存储和分发镜像的平台,如 Docker Hub、私有 Registry | ”应用商店” |
4. Docker 基本命令
| 命令 | 说明 |
|---|---|
docker pull <image> | 从仓库拉取镜像 |
docker run <image> | 创建并启动容器 |
docker ps | 查看运行中的容器 |
docker stop <id> | 停止容器 |
docker build -t <name> . | 从 Dockerfile 构建镜像 |
docker images | 查看本地镜像列表 |
工作流:Dockerfile → docker build → Image → docker run → Container
flowchart LR
df["📄 Dockerfile\n构建脚本"]
reg["🗄️ Registry\n镜像仓库\nDocker Hub / SWR"]
img["📦 Image\n只读镜像层"]
con["🚀 Container\n运行实例"]
df -->|"docker build"| img
reg -->|"docker pull"| img
img -->|"docker push"| reg
img -->|"docker run"| con
con -->|"docker stop"| img
classDef file fill:#fff8e1,stroke:#f9a825
classDef store fill:#e3f2fd,stroke:#1565c0
classDef artifact fill:#f3e5f5,stroke:#7b1fa2
classDef running fill:#e8f5e9,stroke:#388e3c
class df file
class reg store
class img artifact
class con running
5. Dockerfile 核心指令
Dockerfile 是构建 Docker 镜像的脚本文件,每条指令生成镜像的一个层 (Layer)。
| 指令 | 作用 | 示例 |
|---|---|---|
FROM | 指定基础镜像(必须为第一条指令) | FROM python:3.9-slim |
WORKDIR | 设置工作目录 | WORKDIR /app |
COPY | 将宿主机文件复制到镜像中 | COPY . /app |
ADD | 类似 COPY,支持 URL 和自动解压 | ADD app.tar.gz /app |
RUN | 构建时执行命令(安装依赖等) | RUN pip install flask |
ENV | 设置环境变量 | ENV PORT=8080 |
EXPOSE | 声明容器监听端口 | EXPOSE 8080 |
CMD | 容器启动时默认执行的命令 | CMD ["python","app.py"] |
示例:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./ # 先复制依赖文件,利用层缓存
RUN npm ci --production
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]
最佳实践:使用 alpine 基础镜像减小体积;合理排列 COPY 顺序利用层缓存;用 .dockerignore 排除无关文件。
6. Podman — Docker 的替代方案
由于中美贸易摩擦,大量中国企业被列入实体清单 (Entity List),无法使用 Docker Desktop 等商业产品。可以用 Podman 作为替代方案。
由 Red Hat 主导开发,完全兼容 OCI 标准,是 RHEL/CentOS 默认的容器工具。
| 对比维度 | Docker | Podman |
|---|---|---|
| 架构模式 | C/S 架构,需要 dockerd 守护进程 | 无守护进程,直接 fork/exec |
| 安全性 | 默认需要 root 权限运行 | 原生支持 Rootless,更安全 |
| 镜像兼容 | OCI 标准镜像 | 完全兼容 OCI,可直接使用 |
| 编排工具 | Docker Compose | podman-compose / 原生 Pod |
| K8s 集成 | 需借助第三方工具 | podman generate kube 原生支持 |
| 合规风险 | 实体清单企业不可用商业版 | Apache 2.0 开源,无合规风险 |
切换方式:alias docker=podman
7. Docker 与 Kubernetes 的关系
Docker 负责创建和运行容器,Kubernetes (K8s) 负责大规模编排和管理这些容器。
- Docker = 集装箱(打包应用)
- K8s = 港口调度系统(管理成百上千个集装箱)
典型协作流程:
- 开发阶段 — 用 Docker 构建镜像、本地测试
- 推送阶段 — 将镜像推送到镜像仓库 (Harbor/SWR)
- 编排阶段 — K8s 拉取镜像,自动调度到集群节点
- 运行阶段 — K8s 监控容器健康,自动重启/扩容
flowchart LR
dev["👨💻 开发阶段\ndocker build\n本地测试"]
reg["🗄️ 镜像仓库\nHarbor / SWR"]
k8s["☸️ Kubernetes\n调度 & 编排"]
node1["🖥️ 节点 A\nPod / Container"]
node2["🖥️ 节点 B\nPod / Container"]
node3["🖥️ 节点 C\nPod / Container"]
dev -->|"docker push"| reg
reg -->|"kubectl apply\n拉取镜像"| k8s
k8s -->|"调度"| node1
k8s -->|"调度"| node2
k8s -->|"调度"| node3
k8s -->|"健康检查\n自动重启/扩容"| k8s
classDef dev fill:#fff8e1,stroke:#f9a825
classDef store fill:#e3f2fd,stroke:#1565c0
classDef orch fill:#fce4ec,stroke:#c62828
classDef node fill:#e8f5e9,stroke:#388e3c
class dev dev
class reg store
class k8s orch
class node1,node2,node3 node
K8s 在 AI 场景中的应用:
| 云厂商 | K8s 服务 | AI 集成 |
|---|---|---|
| AWS | EKS | SageMaker + EKS GPU 调度 |
| 阿里云 | ACK | PAI 平台 + 异构算力调度 |
| 华为云 | CCE | ModelArts + CCE 昇腾算力调度 |
Ascend CANN体系组成
昇腾的核心CANN组件列表:
| package | size | 说明 |
|---|---|---|
| toolkit | ~2.0G | CANN开发套件包,在训练&推理&开发调试场景下安装,主要用于训练和推理业务、模型转换、算子/应用/模型的开发和编译。如果要调试需要安装这个安装包 |
| nnae | ~1.4G | CANN开发套件包,在训练&推理&开发调试场景下安装,主要用于训练和推理业务,和toolkit二选一,nnae只支持训推能力。 |
| kernels | ~1.9G | CANN二进制算子包,根据自己的卡类型选择具体的软件包,包括单算子API执行(例如aclnn类API)动态库/静态库文件,以及kernel二进制文件。可选,如果没有会在线编译,环境准备会慢一些 |
| nnal | ~511M | CANN神经网络加速库,包含ATB(Ascend Transformer Boost)加速库和SiP(Ascend SiP Boost)信号处理加速库。 |
toolkit 中的组件
- CANN-runtime-*-linux.aarch64.run
- CANN-compiler-*-linux.aarch64.run
- CANN-hccl-*-linux.aarch64.run
- CANN-opp-*-linux.aarch64.run
- Ascend-pyACL_8.1.RC1_linux-aarch64.run
- Ascend-test-ops_8.1.RC1_linux.run
下面是toolkit比nnae中多的组件:
- CANN-toolkit-*-linux.aarch64.run
- CANN-aoe-*-linux.aarch64.run
- CANN-ncs-*-linux.aarch64.run
- Ascend-mindstudio-toolkit_8.0.RC1_linux-aarch64.run
nnae中的组件
- CANN-opp-*-linux.aarch64.run
- CANN-runtime-*-linux.aarch64.run
- CANN-compiler-*-linux.aarch64.run
- CANN-hccl-*-linux.aarch64.run
- Ascend-pyACL_*_linux-aarch64.run
- Ascend-test-ops_*_linux.run
kernels组件
- Ascend910B-opp_kernel-*-linux.aarch64.run
nnal组件[optional]
LLM场景下建议安装。
- Ascend-cann-atb_*_linux-aarch64.run