常用操作
调度配置
Volcano组件支持K8s原生调度,可以使用nodeAffinity进行调度。以下示例使用强制的节点亲和性进行调度,更多关于nodeAffinity字段的说明请参见Kubernetes官方文档。
-
Volcano Job的任务YAML中,需要添加如下加粗字段。
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: mindx-test labels: ... spec: ... maxRetry: 3 queue: default tasks: - name: "default-test" replicas: 1 template: metadata: labels: ... spec: affinity: # 新增以下加粗字段 nodeAffinity: # 节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: # 节点选择列表 - matchExpressions: - key: aaa # 匹配标签的key为aaa的节点,并且value是yyy的节点 operator: In values: - yyy podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: ... nodeSelector: host-arch: huawei-arm ... -
Ascend Job的任务YAML中,需要添加如下加粗字段。
apiVersion: mindxdl.gitee.com/v1 kind: AscendJob metadata: name: test-2 ... spec: schedulerName: volcano runPolicy: schedulingPolicy: minAvailable: 2 queue: default successPolicy: AllWorkers replicaSpecs: Master: replicas: 1 restartPolicy: Never template: metadata: labels: ... spec: affinity: # 新增字段 nodeAffinity: # 节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: # 节点选择列表 - matchExpressions: - key: aaa # 匹配标签的key为aaa的节点,并且value是yyy的节点 operator: In values: - yyy nodeSelector: host-arch: huawei-arm ...Note
可通过执行kubectl get node --show-labels命令,查询节点的标签。在LABELS字段下,等号前的值为标签的key值,等号后的值为标签的value值,如aaa=yyy。
安装NFS
Ubuntu操作系统
NFS(Network File System)网络文件系统,它允许网络中的计算机之间共享资源。在集群调度场景下,需要依赖NFS环境实现训练任务或推理任务的正常运行。NFS可以安装在服务器端或者客户端,用户可以根据需要进行选择。
-
使用管理员账号登录存储节点,执行以下命令安装NFS服务端。
apt install -y nfs-kernel-server -
根据实际情况固定NFS相关端口并配置相关端口的防火墙。
-
执行以下命令,创建一个共享目录(如“/data/atlas_dls”)并修改目录权限。
mkdir -p /data/atlas_dls chmod 750 /data/atlas_dls/ -
在“/etc/exports”文件末尾追加以下内容,根据需要配置允许的IP地址并加固相关权限设置。
/data/atlas_dls 业务IP地址(配置必要的权限) -
执行以下命令,启动rpcbind。
systemctl restart rpcbind.service systemctl enable rpcbind.service -
执行以下命令,查看rpcbind是否已启动。
systemctl status rpcbind.service出现以下回显,说明服务正常。
● rpcbind.service - RPC bind portmap service Loaded: loaded (/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2024-01-08 16:39:03 CST; 6 days ago Docs: man:rpcbind(8) Main PID: 2952 (rpcbind) Tasks: 1 (limit: 29491) CGroup: /system.slice/rpcbind.service └─2952 /sbin/rpcbind -f -w Jan 08 16:39:03 ubuntu-211 systemd[1]: Starting RPC bind portmap service... Jan 08 16:39:03 ubuntu-211 systemd[1]: Started RPC bind portmap service. -
rpcbind启动后,执行以下命令,启动NFS服务。
systemctl restart nfs-server.service systemctl enable nfs-server.service -
执行以下命令,查看NFS服务是否已启动。
systemctl status nfs-server.service出现以下回显,说明服务正常。若NFS服务启动失败,可以参见df -h执行失败,NFS启动失败章节进行处理。
● nfs-server.service - NFS server and services Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2024-01-08 16:39:03 CST; 6 days ago Main PID: 3220 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 29491) CGroup: /system.slice/nfs-server.service Jan 08 16:39:03 ubuntu-211 systemd[1]: Starting NFS server and services... Jan 08 16:39:03 ubuntu-211 exportfs[3181]: exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/atlas_dls". Jan 08 16:39:03 ubuntu-211 exportfs[3181]: Assuming default behaviour ('no_subtree_check'). Jan 08 16:39:03 ubuntu-211 exportfs[3181]: NOTE: this default has changed since nfs-utils version 1.0.x Jan 08 16:39:03 ubuntu-211 systemd[1]: Started NFS server and services. -
执行以下命令,查看共享目录(如“/data/atlas_dls”)挂载权限。
cat /var/lib/nfs/etab出现以下回显,说明服务正常。
/data/atlas_dls *(rw,...会显示配置的对应权限)
使用管理员账号登录其他服务器,执行以下命令安装NFS客户端。
apt install -y nfs-common
CentOS操作系统
NFS网络文件系统,它允许网络中的计算机之间共享资源。在集群调度场景下,需要依赖NFS环境实现训练任务或推理任务的正常运行。NFS可以安装在服务器端或者客户端,用户可以根据需要进行选择。
-
使用管理员账号登录存储节点,执行以下命令安装NFS服务端。
yum install nfs-utils -y -
根据实际情况固定NFS相关端口并配置相关端口的防火墙。
-
执行以下命令,创建一个共享目录(如“/data/atlas_dls”)并修改目录权限。
mkdir -p /data/atlas_dls chmod 750 /data/atlas_dls/ -
执行vi /etc/exports命令,在文件末尾追加以下内容,根据需要配置允许的IP地址并加固相关权限设置。
/data/atlas_dls 业务IP地址(配置必要的权限) -
执行以下命令,启动rpcbind。
systemctl restart rpcbind.service systemctl enable rpcbind.service -
执行以下命令,查看rpcbind是否已启动。
systemctl status rpcbind.service出现以下回显,说明服务正常。
● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2024-01-15 15:54:44 CST; 28s ago Main PID: 63008 (rpcbind) CGroup: /system.slice/rpcbind.service └─63008 /sbin/rpcbind -w Jan 15 15:54:44 centos39 systemd[1]: Starting RPC bind service... Jan 15 15:54:44 centos39 systemd[1]: Started RPC bind service. -
rpcbind启动后,执行以下命令,启动NFS服务。
systemctl restart nfs-server.service systemctl enable nfs-server.service -
执行以下命令,查看NFS服务是否已启动。
systemctl status nfs-server.service出现以下回显,说明服务正常。若NFS服务启动失败,可以参见df -h执行失败,NFS启动失败章节进行处理。
● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled) Drop-In: /run/systemd/generator/nfs-server.service.d └─order-with-mounts.conf Active: active (exited) since Fri 2024-01-15 15:56:15 CST; 8s ago Main PID: 67145 (code=exited, status=0/SUCCESS) CGroup: /system.slice/nfs-server.service Jan 15 15:56:15 centos39 systemd[1]: Starting NFS server and services... Jan 15 15:56:15 centos39 systemd[1]: Started NFS server and services. -
执行以下命令,查看共享目录(如“/data/atlas_dls”)挂载权限。
cat /var/lib/nfs/etab出现以下回显,说明服务正常。
/data/atlas_dls *(rw,...会显示配置的对应权限)
-
使用管理员账号登录其他服务器,执行以下命令安装NFS客户端。
yum install nfs-utils -y -
执行以下命令,启动rpcbind。
systemctl restart rpcbind.service systemctl enable rpcbind.service -
执行以下命令,查看rpcbind是否启动。
systemctl status rpcbind.service出现以下回显,说明服务正常。
● rpcbind.service - RPC Bind Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2024-03-14 04:59:22 EDT; 8s ago Docs: man:rpcbind(8) Main PID: 1681425 (rpcbind) Tasks: 1 (limit: 3355442) Memory: 956.0K CGroup: /system.slice/rpcbind.service └─1681425 /usr/bin/rpcbind -w -f Mar 14 04:59:22 localhost.localdomain systemd[1]: Starting RPC Bind... Mar 14 04:59:22 localhost.localdomain systemd[1]: Started RPC Bind. -
rpcbind启动后,执行以下命令,启动NFS服务。
systemctl restart nfs-server.service systemctl enable nfs-server.service -
执行以下命令,查看NFS服务是否启动。
systemctl status nfs-server.service出现以下回显,说明服务正常。
● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled) Drop-In: /run/systemd/generator/nfs-server.service.d └─order-with-mounts.conf Active: active (exited) since Thu 2024-03-14 04:59:40 EDT; 8s ago Main PID: 1681567 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 3355442) Memory: 0B CGroup: /system.slice/nfs-server.service Mar 14 04:59:39 localhost.localdomain systemd[1]: Starting NFS server and services... Mar 14 04:59:39 localhost.localdomain exportfs[1681536]: exportfs: Failed to stat /data/atlas_dls: No such file or directory Mar 14 04:59:40 localhost.localdomain systemd[1]: Started NFS server and services. -
(可选)NFS需要使用mount和umount命令,一般情况下,系统自带mount命令。若当前客户端没有此命令,可执行以下步骤进行安装。
yum install -y util-linux
查询上报的故障信息
Volcano
Volcano收集了内部的芯片故障、参数面网络故障和节点故障信息,将其作为对外的信息放在K8s的ConfigMap中,以供外部查询和使用。
查询命令为kubectl describe cm -n volcano-system vcjob-fault-npu-cm,命令回显示例如下,关键参数说明请参见表1。
Name: vcjob-fault-npu-cm
Namespace: volcano-system
Labels: <none>
Annotations: <none>
Data
====
fault-node:
----
[{"FaultDeviceList":[{"fault_type":"CardNetworkUnhealthy","npu_name":"Ascend910-0","fault_level":"PreSeparateNPU","fault_handling":"PreSeparateNPU","large_model_fault_level":"PreSeparateNPU","fault_code":"81078603"},{"fault_type":"CardUnhealthy","npu_name":"Ascend910-4","fault_level":"SeparateNPU","fault_handling":"SeparateNPU","large_model_fault_level":"SeparateNPU","fault_code":"A8028801,A4028801,80E18402,80E18401"}],"NodeName":"node133","UnhealthyNPU":["Ascend910-4"],"NetworkUnhealthyNPU":["Ascend910-0"],"NodeDEnable":true,"NodeHealthState":"CardUnhealthy","UpdateTime":1744182212}]
remain-retry-times:
----
BinaryData
====
Events: <none>
表 1 vcjob-fault-npu-cm字段说明
|
|||
Ascend Device Plugin
故障信息
Ascend Device Plugin收集了内部的芯片故障、参数面网络故障和节点故障,将其作为对外的信息放在了K8s的ConfigMap中,一个ConfigMap放置一个节点的信息,以供外部查询和使用。
查询命令:kubectl describe cm -n kube-system mindx-dl-deviceinfo-${node_name}
以Atlas A3 训练系列产品为例,回显示例如下;不同设备的回显参数可能不同,以实际为准。关键参数说明请参见表1。
{"DeviceInfo":{"DeviceList":{"huawei.com/Ascend910":"Ascend910-0,Ascend910-1,Ascend910-2,Ascend910-3,Ascend910-5,Ascend910-6,Ascend910-7","huawei.com/Ascend910-Fault":"[{\"fault_type\":\"CardNetworkUnhealthy\",\"npu_name\":\"Ascend910-0\",\"large_model_fault_level\":\"PreSeparateNPU\",\"fault_level\":\"PreSeparateNPU\",\"fault_handling\":\"PreSeparateNPU\",\"fault_code\":\"81078603\",\"fault_time_and_level_map\":{\"81078603\":{\"fault_time\":1744168468259,\"fault_level\":\"PreSeparateNPU\"}}},{\"fault_type\":\"CardUnhealthy\",\"npu_name\":\"Ascend910-4\",\"large_model_fault_level\":\"SeparateNPU\",\"fault_level\":\"SeparateNPU\",\"fault_handling\":\"SeparateNPU\",\"fault_code\":\"A8028801,A4028801,80E18402,80E18401\",\"fault_time_and_level_map\":{\"80E18401\":{\"fault_time\":1744167455784,\"fault_level\":\"NotHandleFault\"},\"80E18402\":{\"fault_time\":1744167455784,\"fault_level\":\"SeparateNPU\"},\"A4028801\":{\"fault_time\":1744167455784,\"fault_level\":\"NotHandleFault\"},\"A8028801\":{\"fault_time\":1744167455784,\"fault_level\":\"SeparateNPU\"}}}]","huawei.com/Ascend910-NetworkUnhealthy":"Ascend910-0","huawei.com/Ascend910-Recovering":"","huawei.com/Ascend910-Unhealthy":"Ascend910-4"},"UpdateTime":1744182144},"SuperPodID":-2,"ServerIndex":-2,"CheckCode":"a550811fdfafb5717555526816af2ca4ac6c3e102f5907574048578e0c8fcc73"}
表 1 参数说明
|
当前节点网络不健康的芯片名称信息,存在多个时用英文逗号拼接。
[!NOTE] 说明
Atlas 350 标卡、Atlas 850 系列硬件产品、Atlas 950 SuperPoD使用huawei.com/npu-NetworkUnhealthy作为参数名称。 |
|
|
[!NOTE] 说明
Atlas 350 标卡、Atlas 850 系列硬件产品、Atlas 950 SuperPoD使用huawei.com/npu-Unhealthy作为参数名称。 |
|
|
[!NOTE] 说明
Atlas 350 标卡、Atlas 850 系列硬件产品、Atlas 950 SuperPoD使用huawei.com/npu-Recovering作为参数名称。 |
|
|
数组对象,对象包含fault_type、npu_name、large_model_fault_level、 fault_level、fault_handling、fault_code和fault_time_and_level_map这7个字段。
[!NOTE] 说明
Atlas 350 标卡、Atlas 850 系列硬件产品、Atlas 950 SuperPoD使用huawei.com/npu-Fault作为参数名称。 |
|
|
|
|
|
故障码,英文逗号拼接的字符串。芯片故障码的详细说明,请参见芯片故障码参考文档章节。 |
|
故障事件信息
Ascend Device Plugin收集到的故障事件可以通过K8s的event事件进行上报,查询命令为kubectl get events -n kube-system。以Atlas 训练系列产品为例,回显示例如下,参数说明请参见表1。
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
kube-system 8s Warning Occur pod/ascend-device-plugin-daemonset-910-dlpmv device fault, nodeName:k8smaster, assertion:Occur, cardID:2, deviceID:0, faultCodes:8C084E00, faultLevelName:RestartBusiness, alarmRaisedTime:2023-11-21 05:36:53
表 1 参数说明
| 参数名 | 描述 |
|---|---|
| NAMESPACE | 命名空间名称,取值为kube-system。 |
| LAST SEEN | 事件产生时间。 |
| TYPE | 事件的类型,取值为“Normal”和“Warning”。 |
| REASON | 事件产生原因。取值说明如下:
|
| OBJECT | 事件对象,取值规范为pod/Ascend Device Plugin的Pod名称,如pod/ascend-device-plugin-daemonset-910-dlpmv。 |
| MESSAGE | 事件信息内容描述。事件内容的字段说明如下:
|
ClusterD
ClusterD收集了内部的节点故障、芯片故障和灵衢总线设备故障,将其作为对外的信息放在了K8s的ConfigMap中,以供外部查询和使用。
查询命令:kubectl describe cm -n mindx-dl cluster-info-node-cm
以Atlas A3 训练系列产品为例,回显示例如下;不同设备的回显参数可能不同,以实际为准。关键参数说明请参见表1。
{"mindx-dl-nodeinfo-kwok-node-0":{"FaultDevList":[],"NodeStatus":"Healthy","CmName":"mindx-dl-nodeinfo-kwok-node-0"},"mindx-dl-deviceinfo-kwok-node-1001":{"FaultDevList":[],"NodeStatus":"Healthy","CmName":"mindx-dl-nodeinfo-kwok-node-1001"}}
表 1 节点故障参数说明
| 参数 | 说明 |
|---|---|
| mindx-dl-nodeinfo-<kwok-node-0> | 前缀为固定的mindx-dl-nodeinfo,kwok-node-0是节点名称,方便定位故障的具体节点。 |
| NodeInfo | 节点维度的故障信息。 |
| FaultDevList | 节点故障设备列表。 |
| - DeviceType | 故障设备类型。 |
| - DeviceId | 故障设备ID。 |
| - FaultCode | 故障码,由英文和数组拼接而成的字符串,字符串表示故障码的十六进制。 |
| - FaultLevel | 故障处理等级。
|
| NodeStatus | 节点健康状态,由本节点故障处理等级最严重的设备决定。
|
查询命令:kubectl describe cm -n mindx-dl cluster-info-device-${m}
m为从0开始递增的整数。集群规模每增加1000个节点,则会新增一个ConfigMap文件cluster-info-device-${m}。
以Atlas A3 训练系列产品为例,回显示例如下;不同设备的回显参数可能不同,以实际为准,关键参数说明请参见表2。
{"mindx-dl-deviceinfo-kwok-node-0":{"DeviceList":{"huawei.com/Ascend910":"Ascend910-0,Ascend910-1,Ascend910-2,Ascend910-3,Ascend910-4,Ascend910-5,Ascend910-6,Ascend910-7","huawei.com/Ascend910-NetworkUnhealthy":"","huawei.com/Ascend910-Unhealthy":""},"UpdateTime":1693899390,"CmName":"mindx-dl-deviceinfo-kwok-node-0","SuperPodID":0,"ServerIndex":0},"mindx-dl-deviceinfo-kwok-node-1001":{"DeviceList":{"huawei.com/Ascend910":"Ascend910-0,Ascend910-1,Ascend910-2,Ascend910-3,Ascend910-4,Ascend910-5,Ascend910-6,Ascend910-7","huawei.com/Ascend910-NetworkUnhealthy":"","huawei.com/Ascend910-Unhealthy":""},"UpdateTime":1693899390,"CmName":"mindx-dl-deviceinfo-kwok-node-1001","SuperPodID":0,"ServerIndex":0}}
表 2 cluster-info-device-${m}
查询命令:kubectl describe cm -n mindx-dl cluster-info-switch-${m}
m为从0开始递增的整数。集群规模每增加2000个节点,则会新增一个ConfigMap文件cluster-info-switch-${m}。
以Atlas A3 训练系列产品为例,回显示例如下;不同设备的回显参数可能不同,以实际为准。关键参数说明请参见表3。
{"FaultCode":[000001c1],"FaultLevel":"NotHandle","UpdateTime":1722845555,"NodeStatus":"Healthy"}
表 3 灵衢总线设备故障参数说明
| 参数 | 说明 |
|---|---|
| FaultCode | 故障码,由英文和数组拼接而成的字符串,字符串表示故障码的十六进制。 |
| FaultLevel | 当前故障中等级最高的故障所对应的处理策略。
|
| UpdateTime | ConfigMap更新时间。 |
| NodeStatus | 当前节点状态。
|
NodeD
NodeD收集了节点故障信息和节点健康状态信息,将其作为对外的信息放在K8s的ConfigMap中,以供外部查询和使用。
查询命令为kubectl describe cm mindx-dl-nodeinfo-<nodename> -n mindx-dl,命令回显示例如下,关键参数说明请参见表1。
Name: mindx-dl-nodeinfo-<nodename>
Namespace: mindx-dl
Labels: <none>
Annotations: <none>
Data
====
NodeInfo:
----
{"NodeInfo":{"FaultDevList":[{"DeviceType":"CPU","DeviceId":1,"FaultCode":["00000011"],"FaultLevel":"SeparateFault"}],"NodeStatus":"UnHealthy"},"CheckCode":"3a2934c3cb875f2256c770c75a6fdf24594fcf64481ac6cd0d0f74b8fea88855"}
Events: <none>
表 1 回显参数说明
| 参数 | 说明 |
|---|---|
| NodeInfo | 节点维度的故障信息。 |
| FaultDevList | 节点故障设备列表。 |
| - DeviceType | 故障设备类型。 |
| - DeviceId | 故障设备ID。 |
| - FaultCode | 故障码,由英文和数组拼接而成的字符串,字符串表示故障码的十六进制。 |
| - FaultLevel | 故障处理等级。
|
| NodeStatus | 节点健康状态,由本节点故障处理等级最严重的设备决定。
|
| CheckCode | 校验码。 |
制作镜像
使用Dockerfile构建容器镜像(TensorFlow)
请按照表1所示,获取对应操作系统的软件包与打包镜像所需Dockerfile文件与脚本文件。
软件包名称中{version}表示版本号、{arch}表示架构。配套的CANN软件包在6.3.RC3、6.2.RC3及以上版本增加了“您是否接受EULA来安装CANN(Y/N)”的安装提示;在Dockerfile编写示例中的安装命令包含“--quiet”参数的默认同意EULA,用户可自行修改。
表 1 所需软件
| 软件包 | 说明 | 获取方法 |
|---|---|---|
| Ascend-cann-toolkit_{version}_linux-{arch}.run | CANN Toolkit开发套件包。 | 需使用CANN 8.5.0之前版本。 |
| TF Adapter | 框架插件包。 | 获取链接 |
|
TensorFlow框架whl包。 | 获取链接
|
| Dockerfile | 制作镜像需要。 | 参考Dockerfile编写示例。 |
| ascend_install.info | 驱动安装信息文件。 | 从host拷贝“/etc/ascend_install.info”文件。 |
| version.info | 驱动版本信息文件。 | 从host拷贝“/usr/local/Ascend/driver/version.info”文件。 |
| prebuild.sh | 执行训练运行环境安装准备工作,例如配置代理等。 | 参考步骤3。 |
| install_ascend_pkgs.sh | 昇腾软件包安装脚本。 | 参考步骤4。 |
| postbuild.sh | 清除不需要保留在容器中的安装包、脚本、代理配置等。 | 参考步骤5。 |
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
Note
本章节以Ubuntu 18.04操作系统为例来介绍使用Dockerfile构建容器镜像的详细过程,使用过程中需根据实际情况修改相关步骤。
-
将准备的软件包、深度学习框架、host侧驱动安装信息文件及驱动版本信息文件上传到服务器同一目录(如“/home/test”)。
- Ascend-cann-toolkit_{version}_linux-{arch}.run
- npu_bridge-{version}-py3-none-manylinux2014_<arch>.whl
- tensorflow-*_{arch}.whl
- ascend_install.info
- version.info
-
以root用户登录服务器。
-
-
进入软件包所在目录,执行以下命令创建prebuild.sh文件。
vi prebuild.sh -
写入内容参见prebuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备install_ascend_pkgs.sh文件。
-
进入软件包所在目录,执行以下命令创建install_ascend_pkgs.sh文件。
vi install_ascend_pkgs.sh -
写入内容参见install_ascend_pkgs.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
-
进入软件包所在目录,执行以下命令创建postbuild.sh文件。
vi postbuild.sh -
写入内容参见postbuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备Dockerfile文件。
-
进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile -
写入内容参见Dockerfile编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
Note
为获取镜像“ubuntu:18.04”,用户也可以通过执行docker pull ubuntu:18.04命令从Docker Hub拉取。
-
-
进入软件包所在目录,执行以下命令,构建容器镜像,注意不要遗漏命令结尾的“.”。
docker build -t 镜像名_系统架构:镜像tag .在以上命令中,各参数说明如下表所示。
表 2 命令参数说明
参数 说明 -t 指定镜像名称。 镜像名_系统架构:镜像tag 镜像名称与标签,请用户根据实际情况写入。 例如:
docker build -t test_train_arm64:v1.0 .当出现“Successfully built xxx”表示镜像构建成功。
-
构建完成后,执行以下命令查看镜像信息。
docker images回显示例如下。
REPOSITORY TAG IMAGE ID CREATED SIZE test_train_arm64 v1.0 d82746acd7f0 27 minutes ago 749MB -
执行以下命令,进入容器。
docker run -it 镜像名_系统架构:镜像tag bash例如:
docker run -it test_train_arm64:v1.0 bash -
执行以下命令获取文件。
find /usr/local/ -name "freeze_graph.py"回显示例如下:
/usr/local/lib/python3.7/dist-packages/tensorflow_core/python/tools/freeze_graph.py -
执行以下命令修改镜像中的文件。
vi /usr/local/lib/python3.7/dist-packages/tensorflow_core/python/tools/freeze_graph.py增加以下内容。
from npu_bridge.estimator import npu_ops from npu_bridge.estimator.npu.npu_config import NPURunConfig from npu_bridge.estimator.npu.npu_estimator import NPUEstimator from npu_bridge.estimator.npu.npu_optimizer import allreduce from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer from npu_bridge.hccl import hccl_ops执行:wq保存并退出编辑。
-
执行exit命令,退出Docker容器。
-
执行以下命令,保存当前镜像。
docker commit containerid 镜像名_系统架构:镜像tag例如:
docker commit 032953231d61 test_train_arm64:v2.0Note
上述例子中,containerid为032953231d61。
-
-
Ubuntu ARM系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # DNS设置,如果不需要,请删除 tee /etc/resolv.conf <<- EOF nameserver xxx.xxx.xxx.xxx #DNS服务器IP,可填写多个,根据实际配置。 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口。 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口。 EOF chmod 777 -R /tmp rm /var/lib/apt/lists/* #apt源设置(以Ubuntu 18.04 arm源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse EOF -
Ubuntu x86_64系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口 EOF #apt源设置(以Ubuntu 18.04 x86_64源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe EOF
-
-
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,安装昇腾软件包 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # 构建之前把host上的/etc/ascend_install.info拷贝一份到当前目录 cp ascend_install.info /etc/ # 构建之前把host的/usr/local/Ascend/driver/version.info拷贝一份到当前目录 mkdir -p /usr/local/Ascend/driver/ cp version.info /usr/local/Ascend/driver/ # Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-toolkit_{version}_linux-{arch}.run ./Ascend-cann-toolkit_{version}_linux-{arch}.run --install --quiet # npu_bridge-{version}-py3-none-manylinux2014_<arch>.whl chmod +x npu_bridge-{version}-py3-none-manylinux2014_<arch>.whl ./npu_bridge-{version}-py3-none-manylinux2014_<arch>.whl --install --quiet # 只为了安装toolkit包,所以需要清理,容器启动时通过Ascend Docker Runtime挂载进来 rm -f version.info rm -rf /usr/local/Ascend/driver/如果在制作镜像时出现如下提示信息,则需要删除Ascend-cann-xxx.run后的--install-path参数(安装的第一个Ascend-cann-xxx.run除外)。
-
提示信息示例如下。
[toolkit] [20210316-02:39:37] [ERROR] /etc/Ascend/ascend_cann_install.info exists ! 'install-path' parameter are not supported. -
出现原因如下。
安装第一个CANN软件包后,会将安装路径记录到/etc/Ascend/ascend_cann_install.info文件中。若该文件存在,则在安装其他CANN软件包时会自动安装到该文件中记录的路径下,同时不支持使用“--install-path”参数。
-
-
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,清除不需要保留在容器中的安装包、脚本、代理配置等 # 本脚本将会在正式构建过程结束后被执行 # # 注:本脚本运行结束后会被自动清除,不会残留在镜像中;脚本所在位置和Working Dir位置为/root #-------------------------------------------------------------------------------- rm -f ascend_install.info rm -f prebuild.sh rm -f install_ascend_pkgs.sh rm -f Dockerfile rm -f Ascend-cann-toolkit_{version}_linux-{arch}.run rm -f npu_bridge-{version}-py3-none-manylinux2014_<arch>.whl # ARM环境 rm -f tensorflow-1.15.0-cp3x-cp3xm-linux_{arch}.whl # x86_64环境如果使用的是离线包安装,注释上一行,取消下一行注释 # rm -f tensorflow_cpu-1.15.0-cp3x-cp3xm-manylinux2010_x86_64.whl rm -f /etc/apt/apt.conf.d/80proxy # 如果不需要,请删除 tee /etc/resolv.conf <<- EOF # This file is managed by man:systemd-resolved(8). Do not edit. # # This is a dynamic resolv.conf file for connecting local clients to the # internal DNS stub resolver of systemd-resolved. This file lists all # configured search domains. # # Run "systemd-resolve --status" to see details about the uplink DNS servers # currently in use. # # Third party programs must not access this file directly, but only through the # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way, # replace this symlink by a static file or a different symlink. # # See man:systemd-resolved.service(8) for details about the supported modes of # operation for /etc/resolv.conf. options edns0 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF -
-
Ubuntu ARM系统,配套Python 3.7的Dockerfile示例。
FROM Ubuntu:18.04 ARG TF_PKG=tensorflow-1.15.0-cp3x-cp3xm-linux_aarch64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/toolkit/latest ARG TF_Adapter_PATH=/usr/local/Ascend/tfadapter/latest ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install --no-install-recommends \ python3.7 python3.7-dev \ curl g++ pkg-config unzip \ libblas3 liblapack3 liblapack-dev \ libblas-dev gfortran libhdf5-dev \ libffi-dev libicu60 libxml2 -y # 建立python软链接 RUN ln -s /usr/bin/python3.7 /usr/bin/python # 配置python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf # pip3.7 RUN curl -k https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ cd /tmp && \ apt-get download python3-distutils && \ dpkg-deb -x python3-distutils_*.deb / && \ rm python3-distutils_*.deb && \ cd - && \ python3.7 get-pip.py && \ rm get-pip.py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # 用户需根据实际情况修改PYTHONPATH的路径 ENV PYTHONPATH=/usr/local/python3.7.5/lib/python3.7/site-packages:$PYTHONPATH # Python包 RUN pip3.7 install numpy && \ pip3.7 install decorator && \ pip3.7 install sympy==1.4 && \ pip3.7 install cffi && \ pip3.7 install pyyaml && \ pip3.7 install pathlib2 && \ pip3.7 install grpcio && \ pip3.7 install grpcio-tools && \ pip3.7 install protobuf && \ pip3.7 install scipy && \ pip3.7 install requests && \ pip3.7 install attrs && \ pip3.7 install psutil && \ pip3.7 install absl-py # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH RUN umask 0022 && pip3.7 install $TF_PKG # 创建/lib64/ld-linux-aarch64.so.1 RUN umask 0022 && \ if [ ! -d "/lib64" ]; \ then \ mkdir /lib64 && ln -sf /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1; \ fi ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH -
Ubuntu x86_64系统Dockerfile示例。
FROM Ubuntu:18.04 # 编译镜像时在线下载安装使用下面行,与下面的whl配置互斥 ARG TF_PKG=tensorflow-cpu==1.15.0 # 使用离线的x86_64的TensorFlow包,注释上面行,取消下面行的注释 #ARG TF_PKG=tensorflow_cpu-1.15.0-cp3x-cp3xm-manylinux2010_x86_64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/toolkit/latest ARG TF_PLUGIN_PATH=/usr/local/Ascend/tfadapter/latest ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install --no-install-recommends \ python3.7 python3.7-dev \ curl g++ pkg-config unzip \ libblas3 liblapack3 liblapack-dev \ libblas-dev gfortran libhdf5-dev \ libffi-dev libicu60 libxml2 -y # 建立Python软链接 RUN ln -s /usr/bin/python3.7 /usr/bin/python # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf # pip3.7 RUN curl -k https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ cd /tmp && \ apt-get download python3-distutils && \ dpkg-deb -x python3-distutils_*.deb / && \ rm python3-distutils_*.deb && \ cd - && \ python3.7 get-pip.py && \ rm get-pip.py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # 用户需根据实际情况修改PYTHONPATH的路径 ENV PYTHONPATH=/usr/local/python3.7.5/lib/python3.7/site-packages:$PYTHONPATH # Python包 RUN pip3.7 install numpy && \ pip3.7 install decorator && \ pip3.7 install sympy==1.4 && \ pip3.7 install cffi==1.12.3 && \ pip3.7 install pyyaml && \ pip3.7 install pathlib2 && \ pip3.7 install grpcio && \ pip3.7 install grpcio-tools && \ pip3.7 install protobuf && \ pip3.7 install scipy && \ pip3.7 install requests && \ pip3.7 install attrs && \ pip3.7 install psutil && \ pip3.7 install absl-py # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH RUN pip3.7 install $TF_PKG ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH
-
使用Dockerfile构建容器镜像(PyTorch)
请按照表1所示,获取对应操作系统的软件包与打包镜像所需Dockerfile文件与脚本文件。
软件包名称中{version}表示版本号、{arch}表示架构、{chip_type}表示芯片类型。配套的CANN软件包在6.3.RC3、6.2.RC3及以上版本增加了“您是否接受EULA来安装CANN(Y/N)”的安装提示;在Dockerfile编写示例中的安装命令包含“--quiet”参数的默认同意EULA,用户可自行修改。
表 1 所需软件
| 软件包 | 说明 | 获取方法 |
|---|---|---|
| Ascend-cann-toolkit_{version}_linux-{arch}.run | CANN Toolkit开发套件包。 | |
Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run |
CANN算子包。 CANN 8.5.0之前版本该包名为Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run |
获取链接 |
| apex-0.1+ascend-cp3x-cp3x-linux_{arch}.whl | 混合精度模块。 软件包中的cp3x表示Python版本号,例如x为10表示Python 3.10。 |
请参见《Ascend Extension for PyTorch 软件安装指南》中的“安装APEX模块”章节,根据实际情况编译APEX软件包。 |
|
官方PyTorch包。 软件包中的cp3x表示Python版本号,例如x为10表示Python 3.10。 {version}表示PyTorch版本号,当前可支持PyTorch 2.1.0~2.7.1。 |
请根据实际情况选择要安装的PyTorch版本。 |
torch_npu-v{version}.post{version}-cp3x-cp3x-manylinux_2_17_{arch}.manylinux2014_{arch}.whl |
Ascend Extension for PyTorch插件。 软件包中的cp3x表示Python版本号,例如x为10表示Python 3.10。 |
|
| Dockerfile | 制作镜像需要。 | 参考Dockerfile编写示例 |
| dllogger-master | PyTorch日志工具。 | 获取链接 |
| ascend_install.info | 驱动安装信息文件。 | 从host拷贝“/etc/ascend_install.info”文件。 |
| version.info | 驱动版本信息文件。 | 从host拷贝“/usr/local/Ascend/driver/version.info”文件。 |
| prebuild.sh | 执行训练运行环境安装准备工作,例如配置代理等。 | 参考步骤3 |
| install_ascend_pkgs.sh | 昇腾软件包安装脚本。 | 参考步骤4 |
| postbuild.sh | 清除不需要保留在容器中的安装包、脚本、代理配置等。 | 参考步骤5 |
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
Note
本章节以Ubuntu操作系统,配套Python 3.10,CANN 8.5.0为例来介绍使用Dockerfile构建容器镜像的详细过程,使用过程中需根据实际情况修改相关步骤。
-
将准备的软件包、深度学习框架相关包、host侧驱动安装信息文件及驱动版本信息文件上传到服务器同一目录(如“/home/test”)。
- Ascend-cann-toolkit_{version}_linux-{arch}.run
- Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run
- apex-0.1+ascend-cp310-cp310-linux_{arch}.whl
- torch-v{version}+cpu.cxx11.abi-cp310-cp310-linux_{arch}.whl或torch-v{version}-cp3x-cp3x-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- torch_npu-v{version}.post{version}-cp310-cp310-manylinux_2_17_{arch}.manylinux2014_{arch}.whl
- dllogger-master
- ascend_install.info
- version.info
-
以root用户登录服务器。
-
-
进入软件包所在目录,执行以下命令创建prebuild.sh文件。
vi prebuild.sh -
写入内容参见prebuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备install_ascend_pkgs.sh文件。
-
进入软件包所在目录,执行以下命令创建install_ascend_pkgs.sh文件。
vi install_ascend_pkgs.sh -
写入内容参见install_ascend_pkgs.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
-
进入软件包所在目录,执行以下命令创建postbuild.sh文件。
vi postbuild.sh -
写入内容参见postbuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备Dockerfile文件。
-
进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile -
写入内容参见Dockerfile编写示例,然后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
进入软件包所在目录,执行以下命令,构建容器镜像,注意不要遗漏命令结尾的“.”。
docker build -t 镜像名_系统架构:镜像tag .在以上命令中,各参数说明如下表所示。
表 2 命令参数说明
参数 说明 -t 指定镜像名称。 镜像名_系统架构:镜像tag 镜像名称与标签,请用户根据实际情况写入。 例如:
docker build -t test_train_arm64:v1.0 .当出现“Successfully built xxx”表示镜像构建成功。
-
构建完成后,执行以下命令查看镜像信息。
docker images回显示例如下。
REPOSITORY TAG IMAGE ID CREATED SIZE test_train_arm64 v1.0 d82746acd7f0 27 minutes ago 749MB
-
Ubuntu ARM系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # DNS设置 tee /etc/resolv.conf <<- EOF nameserver xxx.xxx.xxx.xxx #DNS服务器IP,可填写多个,根据实际配置 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口 EOF chmod 777 -R /tmp rm /var/lib/apt/lists/* #apt源设置(以Ubuntu 18.04 ARM源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse EOFUbuntu x86_64系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口 EOF #apt源设置(以Ubuntu 18.04 x86_64源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe EOF -
#-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,安装昇腾软件包 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- umask 0022 cp ascend_install.info /etc/ # 构建之前把host的/usr/local/Ascend/driver/version.info拷贝一份到当前目录 mkdir -p /usr/local/Ascend/driver/ cp version.info /usr/local/Ascend/driver/ # Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run ./Ascend-cann-toolkit_{version}_linux-{arch}.run --install-path=/usr/local/Ascend/ --install --quiet echo y | ./Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run --install # 只为了安装toolkit包,所以需要清理,容器启动时通过ascend docker挂载进来 rm -f version.info rm -rf /usr/local/Ascend/driver/ -
#-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,清除不需要保留在容器中的安装包、脚本、代理配置等 # 本脚本将会在正式构建过程结束后被执行 # # 注:本脚本运行结束后会被自动清除,不会残留在镜像中;脚本所在位置和Working Dir位置为/tmp #-------------------------------------------------------------------------------- rm -f ascend_install.info rm -f prebuild.sh rm -f install_ascend_pkgs.sh rm -f Dockerfile rm -f Ascend-cann-toolkit_{version}_linux-{arch}.run rm -f Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run rm -f apex-0.1+ascend-cp310-cp310-linux_{arch}.whl rm -f torch-v{version}+cpu.cxx11.abi-cp310-cp310-linux_{arch}.whl rm -f torch_npu-v{version}.post7-cp310-cp310-manylinux_2_17_{arch}.manylinux2014_{arch}.whl rm -f /etc/apt/apt.conf.d/80proxy -
-
Ubuntu ARM系统,配套Python 3.10的Dockerfile示例。
FROM ubuntu:18.04 ARG PYTORCH_PKG=torch-v{version}+cpu.cxx11.abi-cp310-cp310-linux_aarch64.whl ARG PYTORCH_NPU_PKG=torch_npu-v{version}.post{version}-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ARG APEX_PKG=apex-0.1_ascend-cp310-cp310-linux_aarch64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/cann ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install -y --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 \ patch libbz2-dev llvm libncursesw5-dev xz-utils liblzma-dev m4 dos2unix libopenblas-dev libsqlite3-dev RUN wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz RUN tar -zxvf Python-3.10.5.tgz && cd Python-3.10.5 && ./configure --prefix=/usr/local/python3.10.5 --enable-shared && make && make install RUN ln -s /usr/local/python3.10.5/bin/python3.10 /usr/local/python3.10.5/bin/python && \ ln -s /usr/local/python3.10.5/bin/pip3.10 /usr/local/python3.10.5/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf ENV LD_LIBRARY_PATH=/usr/local/python3.10.5/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.10.5/bin:$PATH ENV PYTHONPATH=/usr/local/python3.10.5/lib/python3.10/site-packages:$PYTHONPATH # Python包 RUN pip3 install decorator && \ pip3 install sympy && \ pip3 install cffi && \ pip3 install pyyaml && \ pip3 install pathlib2 && \ pip3 install grpcio && \ pip3 install grpcio-tools && \ pip3 install protobuf && \ pip3 install scipy && \ pip3 install requests && \ pip3 install attrs && \ pip3 install Pillow==9.1.0 && \ pip3 install torchvision==0.16.0 && \ pip3 install numpy==1.23.5 && \ pip3 install psutil && \ pip3 install absl-py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH RUN umask 0022 && pip3 install $APEX_PKG RUN umask 0022 && pip3 install $PYTORCH_PKG RUN umask 0022 && pip3 install $PYTORCH_NPU_PKG RUN cd /tmp/dllogger-master/ && \ python3 setup.py build && \ python3 setup.py install # 环境变量 ENV HCCL_WHITELIST_DISABLE=1 ENV PYTHONPATH=/tmp/dllogger-master # 创建/lib64/ld-linux-aarch64.so.1 RUN umask 0022 && \ if [ ! -d "/lib64" ]; \ then \ mkdir /lib64 && ln -sf /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1; \ fi ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH -
Ubuntu x86_64系统,配套Python 3.10的Dockerfile示例
FROM ubuntu:18.04 ARG PYTORCH_PKG=torch-v{version}+cpu.cxx11.abi-cp310-cp310-linux_x86_64.whl ARG PYTORCH_NPU_PKG=torch_npu-v{version}.post{version}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ARG APEX_PKG=apex-0.1_ascend-cp310-cp310-linux_x86_64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/cann ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install -y --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 \ patch libbz2-dev llvm libncursesw5-dev xz-utils liblzma-dev m4 dos2unix libopenblas-dev libsqlite3-dev RUN wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz RUN tar -zxvf Python-3.10.5.tgz && cd Python-3.10.5 && ./configure --prefix=/usr/local/python3.10.5 --enable-shared && make && make install RUN ln -s /usr/local/python3.10.5/bin/python3.10 /usr/local/python3.10.5/bin/python && \ ln -s /usr/local/python3.10.5/bin/pip3.10 /usr/local/python3.10.5/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf ENV LD_LIBRARY_PATH=/usr/local/python3.10.5/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.10.5/bin:$PATH ENV PYTHONPATH=/usr/local/python3.10.5/lib/python3.10/site-packages:$PYTHONPATH # Python包 RUN pip3 install decorator && \ pip3 install sympy && \ pip3 install cffi && \ pip3 install pyyaml && \ pip3 install pathlib2 && \ pip3 install grpcio && \ pip3 install grpcio-tools && \ pip3 install protobuf && \ pip3 install scipy && \ pip3 install requests && \ pip3 install attrs && \ pip3 install Pillow==9.1.0 && \ pip3 install torchvision==0.16.0 && \ pip3 install numpy==1.23.5 && \ pip3 install psutil && \ pip3 install absl-py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # Ascend包 RUN bash $INSTALL_ASCEND_PKGS_SH RUN pip3 install $APEX_PKG RUN pip3 install $PYTORCH_PKG RUN pip3 install $PYTORCH_NPU_PKG RUN cd /tmp/dllogger-master/ && \ python3 setup.py build && \ python3 setup.py install # 环境变量 ENV HCCL_WHITELIST_DISABLE=1 ENV PYTHONPATH=/tmp/dllogger-master ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH
-
使用Dockerfile构建容器镜像(MindSpore)
请按照表1所示,获取对应操作系统的软件包与打包镜像所需Dockerfile文件与脚本文件。
软件包名称中{version}表示版本号、{arch}表示架构、{chip_type}表示芯片类型。配套的CANN软件包在6.3.RC3、6.2.RC3及以上版本增加了“您是否接受EULA来安装CANN(Y/N)”的安装提示;在Dockerfile编写示例中的安装命令包含“--quiet”参数的默认同意EULA,用户可自行修改。
Note
MindSpore软件包与Atlas 训练系列产品软件配套需满足对应关系,请参见MindSpore安装指南查看对应关系。
表 1 所需软件
| 软件包 | 说明 | 获取方法 |
|---|---|---|
| Ascend-cann-toolkit_{version}_linux-{arch}.run | CANN Toolkit开发套件包。 | 需使用CANN 8.5.0之前版本。 |
| Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run | CANN算子包。 | 需使用CANN 8.5.0之前版本。 |
| mindspore-{version}-cp3x-cp3x-linux_{arch}.whl | MindSpore框架whl包。 当前可支持Python 3.9~3.11,软件包名中x表示9、10或11,请根据实际情况选择对应软件包。 MindSpore 2.0.0版本前的软件包名由mindspore修改为mindspore-ascend。 |
获取链接 |
| Dockerfile | 制作镜像需要。 | 参考Dockerfile编写示例。 |
| ascend_install.info | 驱动安装信息文件。 | 从host拷贝“/etc/ascend_install.info”文件。 |
| version.info | 驱动版本信息文件。 | 从host拷贝“/usr/local/Ascend/driver/version.info”文件。 |
| prebuild.sh | 执行训练运行环境安装准备工作,例如配置代理等。 | 参考步骤3。 |
| install_ascend_pkgs.sh | 昇腾软件包安装脚本。 | 参考步骤4。 |
| postbuild.sh | 清除不需要保留在容器中的安装包、脚本、代理配置等。 | 参考步骤5。 |
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
Note
- 本章节以Ubuntu 18.04、配套Python 3.9为例来介绍使用Dockerfile构建容器镜像的详细过程,使用过程中需根据实际情况修改相关步骤。
- 如使用MindSpore 2.0.3及以上版本,需要配套使用ubuntu:20.04。
-
将准备的软件包、深度学习框架、host侧驱动安装信息文件及驱动版本信息文件上传到服务器同一目录(如“/home/test“)。
- Ascend-cann-toolkit_{version}_linux-{arch}.run
- Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run
- mindspore-{version}-cp3x-cp3x-linux_{arch}.whl
- ascend_install.info
- version.info
-
以root用户登录服务器。
-
-
进入软件包所在目录,执行以下命令创建prebuild.sh文件。
vi prebuild.sh -
写入内容参见prebuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备install_ascend_pkgs.sh文件。
-
进入软件包所在目录,执行以下命令创建install_ascend_pkgs.sh文件。
vi install_ascend_pkgs.sh -
写入内容参见install_ascend_pkgs.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
-
进入软件包所在目录,执行以下命令创建postbuild.sh文件。
vi postbuild.sh -
写入内容参见postbuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
执行以下步骤准备Dockerfile文件。
-
进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile -
写入内容参见Dockerfile编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
-
-
进入软件包所在目录,执行以下命令,构建容器镜像,注意不要遗漏命令结尾的“.”。
docker build -t 镜像名_系统架构:镜像tag .在以上命令中,各参数说明如下表所示。
表 2 命令参数说明
参数 说明 -t 指定镜像名称。 镜像名_系统架构:镜像tag 镜像名称与标签,请用户根据实际情况写入。 例如: docker build -t test_train_arm64:v1.0 .当出现“Successfully built xxx”表示镜像构建成功。
-
构建完成后,执行以下命令查看镜像信息。
docker images回显示例如下。
REPOSITORY TAG IMAGE ID CREATED SIZE test_train_arm64 v1.0 d82746acd7f0 27 minutes ago 749MB -
(可选)验证基础镜像是否可用。
-
执行以下命令,使用Ascend Docker Runtime在基础镜像中挂载驱动,以基础镜像test_train_arm64:v1.0为例。
docker run -it --privileged -e ASCEND_VISIBLE_DEVICES=0 test_train_arm64:v1.0 /bin/bash -
执行以下命令,查看基础镜像中MindSpore软件是否安装成功。
python -c "import mindspore;mindspore.set_context(device_target='Ascend');mindspore.run_check()"回显示例如下,表示MindSpore软件安装成功。
MindSpore version: 版本号 The result of multiplication calculation is correct, MindSpore has been installed on platform [Ascend] successfully!
-
-
-
Ubuntu ARM系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # DNS设置 tee /etc/resolv.conf <<- EOF nameserver xxx.xxx.xxx.xxx #DNS服务器IP,可填写多个,根据实际配置。 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口。 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口。 EOF chmod 777 -R /tmp rm /var/lib/apt/lists/* #apt源设置(以Ubuntu 18.04 ARM源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse EOF -
Ubuntu x86_64系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTP代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #HTTPS代理服务器IP地址及端口 EOF #apt源设置(以Ubuntu 18.04 x86_64源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe EOF
-
-
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,安装昇腾软件包 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # 构建之前把host上的/etc/ascend_install.info拷贝一份到当前目录 cp ascend_install.info /etc/ mkdir -p /usr/local/Ascend/driver/ cp version.info /usr/local/Ascend/driver/ # Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-toolkit_{version}_linux-{arch}.run ./Ascend-cann-toolkit_{version}_linux-{arch}.run --install-path=/usr/local/Ascend/ --install --quiet chmod +x Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run ./Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run --install --quiet # 只安装toolkit包,需要清理,容器启动时通过ascend docker挂载进来 rm -f version.info rm -rf /usr/local/Ascend/driver/ -
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,清除不需要保留在容器中的安装包、脚本、代理配置等 # 本脚本将会在正式构建过程结束后被执行 # # 注:本脚本运行结束后会被自动清除,不会残留在镜像中;脚本所在位置和Working Dir位置为/root #-------------------------------------------------------------------------------- rm -f ascend_install.info rm -f prebuild.sh rm -f install_ascend_pkgs.sh rm -f Dockerfile rm -f version.info rm -f Ascend-cann-toolkit_{version}_linux-{arch}.run rm -f Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run # 请根据实际安装的版本选择需要删除的包 rm -f mindspore-{version}-cp3x-cp3x-linux_{arch}.whl rm -f /etc/apt/apt.conf.d/80proxy tee /etc/resolv.conf <<- EOF # This file is managed by man:systemd-resolved(8). Do not edit. # # This is a dynamic resolv.conf file for connecting local clients to the # internal DNS stub resolver of systemd-resolved. This file lists all # configured search domains. # # Run "systemd-resolve --status" to see details about the uplink DNS servers # currently in use. # # Third party programs must not access this file directly, but only through the # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way, # replace this symlink by a static file or a different symlink. # # See man:systemd-resolved.service(8) for details about the supported modes of # operation for /etc/resolv.conf. options edns0 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF -
-
Ubuntu ARM系统,配套Python 3.9的Dockerfile示例。
FROM ubuntu:18.04 ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG TOOLKIT_PATH=/usr/local/Ascend/ascend-toolkit/latest ARG MINDSPORE_PKG=mindspore-{version}-cp39-cp39-linux_aarch64.whl ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH" ENV http_proxy http://xxx ENV https_proxy http://xxx # 系统包 RUN apt update && \ apt install --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 -y RUN wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz RUN tar -zxvf Python-3.9.2.tgz && cd Python-3.9.2 && ./configure --prefix=/usr/local/python3.9.2 --enable-shared && make && make install RUN ln -s /usr/local/python3.9.2/bin/python3.9 /usr/local/python3.9.2/bin/python && \ ln -s /usr/local/python3.9.2/bin/pip3.9 /usr/local/python3.9.2/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf # 用户需根据实际情况修改PYTHONPATH的路径 ENV LD_LIBRARY_PATH=/usr/local/python3.9.2/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.9.2/bin:$PATH ENV PYTHONPATH=/usr/local/python3.9.2/lib/python3.9/site-packages:$PYTHONPATH # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # 安装Python3.9。若安装其他版本,请根据实际情况修改以下命令 RUN pip install numpy && \ pip install decorator && \ pip install sympy==1.4 && \ pip install cffi==1.12.3 && \ pip install pyyaml && \ pip install pathlib2 && \ pip install grpcio && \ pip install grpcio-tools && \ pip install protobuf && \ pip install scipy && \ pip install requests && \ pip install kubernetes && \ pip install attrs && \ pip install psutil && \ pip install absl-py # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH # MindSpore安装 RUN pip install $MINDSPORE_PKG ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH" && \ rm $POSTBUILD_SH -
Ubuntu x86_64系统,配套Python 3.9的Dockerfile示例。
FROM ubuntu:18.04 ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG TOOLKIT_PATH=/usr/local/Ascend/ascend-toolkit/latest ARG MINDSPORE_PKG=mindspore-{version}-cp39-cp39-linux_x86_64.whl ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH" ENV http_proxy http://xxx ENV https_proxy http://xxx # 系统包 RUN apt update && \ apt install --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 -y RUN wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz RUN tar -zxvf Python-3.9.2.tgz && cd Python-3.9.2 && ./configure --prefix=/usr/local/python3.9.2 --enable-shared && make && make install RUN ln -s /usr/local/python3.9.2/bin/python3.9 /usr/local/python3.9.2/bin/python && \ ln -s /usr/local/python3.9.2/bin/pip3.9 /usr/local/python3.9.2/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf # 用户需根据实际情况修改PYTHONPATH的路径 ENV LD_LIBRARY_PATH=/usr/local/python3.9.2/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.9.2/bin:$PATH ENV PYTHONPATH=/usr/local/python3.9.2/lib/python3.9/site-packages:$PYTHONPATH # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # 安装Python3.9。若安装其他版本,请根据实际情况修改以下命令 RUN pip install numpy && \ pip install decorator && \ pip install sympy==1.4 && \ pip install cffi==1.12.3 && \ pip install pyyaml && \ pip install pathlib2 && \ pip install grpcio && \ pip install grpcio-tools && \ pip install protobuf && \ pip install scipy && \ pip install requests && \ pip install kubernetes && \ pip install attrs && \ pip install psutil && \ pip install absl-py # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH # MindSpore安装 RUN pip install $MINDSPORE_PKG ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH" && \ rm $POSTBUILD_SH
-
使用Dockerfile构建推理镜像
请按照表1所示,获取对应操作系统的软件包与打包镜像所需Dockerfile文件与脚本文件。
软件包名称中{version}表示版本号、{arch}表示架构、{chip_type}表示芯片类型。配套的CANN软件包在6.3.RC3、6.2.RC3及以上版本增加了“您是否接受EULA来安装CANN(Y/N)”的安装提示;在Dockerfile编写示例中的安装命令包含“--quiet”参数的默认同意EULA,用户可自行修改。
表 1 所需软件
| 软件包 | 说明 | 获取方法 |
|---|---|---|
| Ascend-cann-toolkit_{version}_linux-{arch}.run | CANN Toolkit开发套件包。 | 获取链接 |
| Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run | CANN算子包。 CANN 8.5.0之前版本该包名为Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run |
获取链接 |
| Dockerfile | 制作镜像需要。 | 参考Dockerfile编写示例。 |
| install.sh | 安装推理业务的脚本。 | 推理模型的制作可以参考ResNet50推理指导。 |
| XXX.tar | 推理业务代码包名称,用户根据推理业务准备。本章以dvpp_resnet.tar为例说明。 | 推理模型的制作可以参考ResNet50推理指导。 |
| run.sh | 启动推理服务的脚本。 | 推理模型的制作可以参考ResNet50推理指导。 |
Note
推理需要的其他软件包和代码请用户自行准备。
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
本章节以Ubuntu x86_64操作系统为例,以下操作步骤中的代码为示例代码,用户可参考示例进行定制化修改,并且建议用户对示例代码和镜像做安全加固,可参考容器安全加固。
-
将准备的软件包及文件上传到服务器同一目录(如“/home/infer”)。
- Ascend-cann-toolkit_{version}_linux-{arch}.run
- Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run
- Dockerfile
- install.sh
- run.sh
- XXX.tar(自行准备的推理代码或脚本)
-
以root用户登录服务器。
-
执行以下步骤准备install.sh文件。
-
进入软件包所在目录,执行以下命令创建install.sh文件。
vi install.sh -
参见install.sh编写示例,请根据业务实际编写,写入后执行:wq命令保存内容。
-
-
执行以下步骤准备run.sh文件。
-
进入软件包所在目录,执行以下命令创建run.sh文件。
vi run.sh -
参见run.sh编写示例,请根据业务实际编写,写入后执行:wq命令保存内容。
-
-
执行以下步骤准备Dockerfile文件。
-
进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile -
参见Dockerfile编写示例,请根据业务实际编写,写入后执行:wq命令保存内容。
-
-
进入软件包所在目录,执行以下命令,构建容器镜像,注意不要遗漏命令结尾的“.”。
docker build --build-arg TOOLKIT_VERSION={version} --build-arg TOOLKIT_ARCH={arch} --build-arg DIST_PKG=XXX.tar -t 镜像名_系统架构:镜像tag .在以上命令中,各参数说明如下表所示。
表 2 命令参数说明
参数 说明 --build-arg 指定Dockerfile文件内的参数。 {version} Toolkit包版本号,请用户根据实际情况写入。 {arch} Toolkit包架构,请用户根据实际情况写入。 XXX.tar 推理业务代码包名称,用户根据实际情况写入。 -t 指定镜像名称。 镜像名_系统架构:镜像tag 镜像名称与标签,请用户根据实际情况写入。 示例如下。
docker build --build-arg TOOLKIT_VERSION=20.1.rc3 --build-arg TOOLKIT_ARCH=x86_64 --build-arg DIST_PKG=dvpp_resnet.tar -t ubuntu-infer:v1 .当出现“Successfully built xxx”表示镜像构建成功。
-
构建完成后,执行以下命令查看镜像信息。
docker images回显示例如下:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-infer v1 fffbd83be42a 2 minutes ago 293MB
-
#!/bin/bash #-------------------------------------------------------------------------------- # 安装推理业务脚本,此处以推理业务包dvpp_resnet.tar为例说明,用户可自行修改业务包名 #------------------------------------- tar -xvf dvpp_resnet.tar # 同时建议修改解压后文件的权限和属主 -
#!/bin/bash # 运行业务代码 cd /home/out numbers=`ls /dev/| grep davinci | grep -v davinci_manager | wc -l` # 每5分钟更新日志 #./main $numbers|grep -nE '.*\[.*[[:digit:]]{2}:[[:digit:]]{1}[05]:00\]' >./log.txt # 加载离线推理环境变量 export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} source /usr/local/Ascend/cann/set_env.sh ./main $numbersNote
LD_LIBRARY_PATH中配置了驱动相关路径,在执行推理作业时,会使用到其中的文件。建议推理作业的运行用户和驱动安装时指定的运行用户保持一致,避免用户不一致带来的提权风险。
-
Dockerfile编写示例,请根据实际情况进行定制化修改。
#基础镜像ubuntu:18.04不包含Toolkit包,可参考Dockerfile示例中的部分步骤进行安装,需提前准备好Toolkit包。 #推荐从昇腾镜像仓库拉取推理基础镜像,此时的镜像中已安装Toolkit包。同时请确认Toolkit包是否与物理机上的驱动版本匹配 FROM ubuntu:18.04 # 设置Toolkit包、OPS包参数 ARG TOOLKIT_VERSION ARG TOOLKIT_ARCH ARG TOOLKIT_PKG=Ascend-cann-toolkit_{version}_linux-{arch}.run ARG OPS_PKG=Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run # 设置环境变量 ARG ASCEND_BASE=/usr/local/Ascend # 设置进入启动后的容器的目录 WORKDIR /home #拷贝Toolkit包和OPS包 COPY $TOOLKIT_PKG . COPY $OPS_PKG . # 安装Toolkit包和OPS包 RUN umask 0022 && \ groupadd xxx(自定义用户,需要与驱动安装指定的一致) && \ useradd -g xxx(自定义用户,需要与驱动安装指定的一致) -s /usr/sbin/nologin(禁止用户登录,示例为Ubuntu系统) -m -d /home/xxx xxx(自定义用户,需要与驱动安装指定的一致) && \ chmod +x ${TOOLKIT_PKG} &&\ ./${TOOLKIT_PKG} --quiet --install --install-for-all --whitelist=nnrt --force &&\ rm ${TOOLKIT_PKG} chmod +x ${OPS_PKG} &&\ ./${OPS_PKG} --install --install-for-all --quiet --force &&\ rm ${OPS_PKG} # 拷贝业务推理程序压缩包、安装脚本与运行脚本 ARG DIST_PKG COPY $DIST_PKG . COPY install.sh . COPY run.sh . # 运行安装脚本 RUN mkdir -p /usr/slog && \ mkdir -p /var/log/npu/slog/slogd && \ chmod u+x run.sh install.sh && \ sh install.sh && \ rm $DIST_PKG && \ rm install.sh CMD bash run.shNote
CANN软件包版本为6.2.RC1、6.3.RC1及其之后的版本,在安装软件包时新增--force参数。上述Dockerfile编写示例已经加上该参数。若用户使用6.2.RC1、6.3.RC1之前版本的软件包,需要去除Dockerfile编写示例中该参数。
获取集群内当前可用设备信息
-
查询ConfigMap。
kubectl get cm -A | grep cluster-info回显示例如下:
kube-public cluster-info 1 19d mindx-dl cluster-info-device-0 1 19h mindx-dl cluster-info-node-cm 1 19h mindx-dl cluster-info-switch-0 1 19h -
查询ConfigMap的详细信息,获取可用设备信息。下面以节点名为localhost.localdomain为例。
-
查询与device相关的ConfigMap的详细信息,获取节点可用芯片信息。
kubectl describe cm -n mindx-dl cluster-info-device-0回显示例如下:
Name: cluster-info-device-0 Namespace: mindx-dl Labels: mx-consumer-volcano=true Annotations: <none> Data ==== cluster-info-device-0: ---- {"mindx-dl-deviceinfo-localhost.localdomain":{"DeviceList":{"huawei.com/Ascend910":"Ascend910-3,Ascend910-4,Ascend910-5,Ascend910-6,Ascend910-7","huawei.com/Ascend910-Fault":"[{\"fault_type\":\"PublicFault\",\"npu_name\":\"Ascend910-0\",\"large_model_fault_level\":\"SeparateNPU\",\"fault_level\":\"SeparateNPU\",\"fault_handling\":\"SeparateNPU\",\"fault_code\":\"220001001\",\"fault_time_and_level_map\":{\"220001001\":{\"fault_time\":1736926605,\"fault_level\":\"SeparateNPU\"}}},{\"fault_type\":\"PublicFault\",\"npu_name\":\"Ascend910-1\",\"large_model_fault_level\":\"SeparateNPU\",\"fault_level\":\"SeparateNPU\",\"fault_handling\":\"SeparateNPU\",\"fault_code\":\"220001001\",\"fault_time_and_level_map\":{\"220001001\":{\"fault_time\":1736926605,\"fault_level\":\"SeparateNPU\"}}},{\"fault_type\":\"PublicFault\",\"npu_name\":\"Ascend910-2\",\"large_model_fault_level\":\"SeparateNPU\",\"fault_level\":\"SeparateNPU\",\"fault_handling\":\"SeparateNPU\",\"fault_code\":\"220001001\",\"fault_time_and_level_map\":{\"220001001\":{\"fault_time\":1736926605,\"fault_level\":\"SeparateNPU\"}}}]","huawei.com/Ascend910-NetworkUnhealthy":"","huawei.com/Ascend910-Recovering":"","huawei.com/Ascend910-Unhealthy":"Ascend910-0,Ascend910-1,Ascend910-2"},"UpdateTime":1759214666,"CmName":"mindx-dl-deviceinfo-localhost.localdomain","SuperPodID":-2,"ServerIndex":-2},"mindx-dl-deviceinfo-node173":{"DeviceList":{"huawei.com/Ascend910":"Ascend910-2,Ascend910-3,Ascend910-4,Ascend910-5,Ascend910-6,Ascend910-7","huawei.com/Ascend910-Fault":"[]","huawei.com/Ascend910-NetworkUnhealthy":"","huawei.com/Ascend910-Recovering":"","huawei.com/Ascend910-Unhealthy":""},"UpdateTime":1759202968,"CmName":"mindx-dl-deviceinfo-node173","SuperPodID":-2,"ServerIndex":-2}} Events: <none>从以上回显信息可以看到,该节点的可用芯片为Ascend910-3、Ascend910-4、Ascend910-5、Ascend910-6、Ascend910-7。
-
查询与node相关的ConfigMap的详细信息,获取节点状态信息。
kubectl describe cm -n mindx-dl cluster-info-node-cm回显示例如下:
Name: cluster-info-node-cm Namespace: mindx-dl Labels: mx-consumer-volcano=true Annotations: <none> Data ==== cluster-info-node-cm: ---- {"mindx-dl-nodeinfo- localhost.localdomain":{"FaultDevList":[{"DeviceType":"PSU","DeviceId":4,"FaultCode":["0300000D"],"FaultLevel":"NotHandleFault"}],"NodeStatus":"Healthy","CmName":"mindx-dl-nodeinfo-localhost.localdomain "}} BinaryData ==== Events: <none>从以上回显信息可以看到,该节点的NodeStatus为Healthy,表示当前节点健康。
-
查询与Switch相关的ConfigMap的详细信息,获取节点状态信息。
kubectl describe cm -n mindx-dl cluster-info-switch-0回显示例如下:
Name: cluster-info-switch-0 Namespace: mindx-dl Labels: mx-consumer-volcano=true Annotations: <none> Data ==== cluster-info-switch-0: ---- {"mindx-dl-switchinfo-localhost.localdomain ":{"FaultCode":[],"FaultLevel":"","UpdateTime":1763544679,"NodeStatus":"Healthy","FaultTimeAndLevelMap":{},"CmName":"mindx-dl-switchinfo-localhost.localdomain "}} BinaryData ==== Events: <none>从以上回显信息可以看到,该节点的NodeStatus为Healthy,表示当前节点健康。
综合以上查询结果可知,该节点的可用芯片为Ascend910-3、Ascend910-4、Ascend910-5、Ascend910-6、Ascend910-7。
若步骤2或步骤3的回显信息中NodeStatus为UnHealthy,则说明当前节点上的设备均不可用。结合步骤1的查询结果可知,该节点的可用芯片为空。
Note
当集群规模超过1000节点时,cluster-info-device-和mindx-dl-switchinfo-对应的ConfigMap会进行分片。每个cluster-info-device-或mindx-dl-switchinfo-最多包含1000个节点的设备信息。针对此种场景,需要对所有cluster-info-device-的ConfigMap都执行步骤1和步骤3的查询操作,找到目标节点的详细信息,才能确认该节点的可用芯片信息。
-