# ascend-device-plugin **Repository Path**: frankang/ascend-device-plugin ## Basic Information - **Project Name**: ascend-device-plugin - **Description**: 华为NPU设备插件,提供Kubernetes设备上报、设备监控、设备分配功能 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 52 - **Created**: 2023-02-15 - **Last Updated**: 2024-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Ascend Device Plugin.zh - [Ascend Device Plugin](#Ascend-Device-Plugin.md) - [组件介绍](#组件介绍.md) - [环境依赖](#环境依赖.md) - [编译Ascend Device Plugin](#编译Ascend-Device-Plugin.md) - [创建DaemonSet](#创建DaemonSet.md) - [创建业务容器](#创建业务容器.md) - [目录结构](#目录结构.md) - [版本更新记录](#版本更新记录.md)

Ascend Device Plugin

- **[组件介绍](#组件介绍.md)** - **[环境依赖](#环境依赖.md)** - **[编译Ascend Device Plugin](#编译Ascend-Device-Plugin.md)** - **[创建DaemonSet](#创建DaemonSet.md)** - **[创建业务容器](#创建业务容器.md)**

组件介绍

设备管理插件拥有以下功能: - 设备发现:支持从昇腾设备驱动中发现设备个数,将其发现的设备个数上报到Kubernetes系统中。支持发现拆分物理设备得到的虚拟设备,虚拟设备需要提前完成拆分。 - 健康检查:支持检测昇腾设备的健康状态,当设备处于不健康状态时,上报到Kubernetes系统中,将不健康的昇腾设备从Kubernetes系统中剔除。虚拟设备健康状态由拆分这些虚拟设备的物理设备决定。 - 设备分配:支持在Kubernetes系统中分配昇腾设备;

环境依赖

**表 1** 环境依赖

检查项

要求

dos2unix

已安装(无版本要求),执行dos2unix --version命令查看。

run包的驱动版本

大于等于1.73,进入驱动所在路径(如“/usr/local/Ascend/driver”),执行cat version.info命令查看。

Go语言环境版本

大于等于1.14.3,执行go version命令查看。

gcc版本

大于等于7.3.0,执行gcc --version命令查看。

Kubernetes版本

1.17.x,建议选择最新的bugfix版本。

执行kubectl version命令查看。

Docker环境

已安装Docker,执行docker info命令查看。

root用户

裸机拥有root用户权限。

编译Ascend Device Plugin

## 操作步骤 1. 执行以下命令,设置环境变量。 **export GO111MODULE=on** **export GOPROXY=**_代理地址_ **export GONOSUMDB=\\\*** >![](figures/icon-note.gif) **说明:** >GOPROXY代理地址请根据实际选择,可通过在“ascend-device-plugin“目录下执行**go mod download**命令进行检查。若无返回错误信息,则表示代理设置成功。 2. 进入“ascend-device-plugin“目录,执行以下命令,可根据用户需要修改yaml文件(可选)。 - 通用yaml文件 **ascendplugin-910.yaml** - MindX DL使用的yaml文件 **vim ascendplugin-volcano.yaml** ``` ...... containers: - image: ascend-k8sdeviceplugin:v2.0.2 #镜像名称及版本号。 name: device-plugin-01 resources: requests: memory: 500Mi cpu: 500m limits: memory: 500Mi cpu: 500m command: [ "/bin/bash", "-c", "--"] args: [ "ascendplugin -useAscendDocker=true -volcanoType=true -logFile=/var/log/mindx-dl/devicePlugin/devicePlugin.log -logLevel=0" ] ...... ``` 3. 设置“useAscendDocker”参数。 - 如果安装了Ascend-docker-runtime,则设置useAscendDocker=true。默认场景,推荐用户使用。 - 如果未安装Ascend-docker-runtime,则设置useAscendDocker=false。 - 开启CPU绑核功能后,无论是否安装Ascend-docker-runtime,都设置useAscendDocker=false。 4. 执行以下命令,进入构建目录,执行构建脚本,在“output“目录下生成二进制device-plugin、yaml文件和Dockerfile。 **cd **_/home/test/_**ascend-device-plugin/build/** **chmod +x build.sh** **./build.sh** 5. 执行以下命令,查看生成的软件包。 **ll **_/home/test/_**ascend-device-plugin/output** ``` drwxr-xr-x 2 root root 4096 Jun 8 18:42 ./ drwxr-xr-x 9 root root 4096 Jun 8 17:12 ../ -r-x------. 1 root root 31927176 Jul 26 14:12 device-plugin -r--------. 1 root root 2081 Jul 26 14:12 device-plugin-310-v2.0.2.yaml -r--------. 1 root root 2202 Jul 26 14:12 device-plugin-710-v2.0.2.yaml -r--------. 1 root root 1935 Jul 26 14:12 device-plugin-910-v2.0.2.yaml -r--------. 1 root root 3070 Jul 26 14:12 device-plugin-volcano-v2.0.2.yaml -r--------. 1 root root 469 Jul 26 14:12 Dockerfile ``` >![](figures/icon-note.gif) **说明:** >“ascend-device-plugin“目录下的**ascendplugin-910.yaml**文件在“ascend-device-plugin/output/“下生成的对应文件为**device-plugin-910-v2.0.2.yaml**,作用是更新版本号。 6. 执行以下命令,查看Dockerfile文件,可根据实际情况修改。 **vi** _/home/test/_**ascend-device-plugin/Dockerfile** ``` #用户根据实际选择基础镜像,可通过docker images命令查询。 FROM ubuntu:18.04 as build RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /usr/sbin/nologin HwHiAiUser #是否使用昇腾Docker,默认为true,请修改为false。 ENV USE_ASCEND_DOCKER true ENV LD_LIBRARY_PATH /usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/common ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/Ascend/driver/lib64/ #确保device-plugin二进制文件存在以进行拷贝 COPY ./output/device-plugin /usr/local/bin/ RUN chmod 550 /usr/local/bin/device-plugin &&\ echo 'umask 027' >> /etc/profile &&\ echo 'source /etc/profile' >> ~/.bashrc ```

创建DaemonSet

## 操作步骤 >![](figures/icon-note.gif) **说明:** >以下操作以ARM平台下构建并分发镜像为例。 1. 获取Ascend Device Plugin软件包。如果是自己编译得到的软件包则跳过该步骤。 1. 登录[MindX DL](https://support.huawei.com/enterprise/zh/ascend-computing/mindx-pid-252501207/software)。 2. 打开目标版本,单击软件包后面的下载,可获取软件包和数字签名文件。 3. 下载完后请进行软件包完整性校验。 2. 将软件包上传至服务器任意目录并解压(如:“/home/ascend-device-plugin“)。 3. 进入解压目录,执行以下命令构建Ascend Device Plugin的镜像。 ``` docker build -t ascend-k8sdeviceplugin:v2.0.2 . ``` 当出现“Successfully built xxx”表示镜像构建成功,注意不要遗漏命令结尾的“.”。这里的“.”代表当前目录。 使用**docker images**命令查看,可以看见名为ascend-k8sdeviceplugin,tag为v2.0.2的镜像。 4. 执行如下命令将编译好的镜像打包并压缩,便于在各个服务器之间传输。 >![](figures/icon-note.gif) **说明:** >\{arch\}表示系统架构,不同架构之间的镜像不能通用。 ``` docker save -o ascend-k8sdeviceplugin:v2.0.2 | gzip > Ascend-K8sDevicePlugin-v2.0.2-{arch}-Docker.tar.gz ``` 或者使用不带压缩功能的命令: ``` docker save -o Ascend-K8sDevicePlugin-v2.0.2-{arch}-Docker.tar ascend-k8sdeviceplugin:v2.0.2 ``` 5. (可选)集群场景下将打包好的镜像(比如存放路径为:“/home/ascend-device-plugin/”)分发到拥有昇腾系列AI处理器的计算节点上。 ``` cd /home/ascend-device-plugin scp Ascend-K8sDevicePlugin-v2.0.2-{arch}-Docker.tar.gz root@{节点IP地址}:/home/ascend-device-plugin ``` 6. 执行以下命令加载镜像。以打包压缩后的文件为例,没有选择压缩则需要修改相应的文件名。 - ARM架构 ``` docker load -i Ascend-K8sDevicePlugin-v2.0.2-arm64-Docker.tar.gz ``` - x86架构 ``` docker load -i Ascend-K8sDevicePlugin-v2.0.2-amd64-Docker.tar.gz ``` 7. 执行如下命令,给带有Ascend 910(或含有Ascend 310、Ascend 710)的节点打标签。 ``` kubectl label nodes localhost.localdomain accelerator=huawei-Ascend910 ``` localhost.localdomain为有Ascend 910(或含有Ascend 310、Ascend 710)的节点名称,可通过**kubectl get node**命令查看。 标签名称需要和软件包中yaml文件里的nodeSelector标签名称保持一致。 8. 进入“ascend-device-plugin/output“执行以下命令,部署DaemonSet。 - 昇腾310 AI处理器节点。 ``` kubectl apply -f device-plugin-310-v2.0.2.yaml ``` - 昇腾910 AI处理器节点,协同Volcano工作。 ``` kubectl apply -f device-plugin-volcano-v2.0.2.yaml ``` - 昇腾710 AI处理器节点。 ``` kubectl apply -f device-plugin-710-v2.0.2.yaml ``` - 昇腾910 AI处理器节点,Ascend Device Plugin独立工作,不协同Volcano。 ``` kubectl apply -f device-plugin-910-v2.0.2.yaml ``` 部署完成后需要等待几分钟,才能看到节点设备部署信息。yaml文件的中参数信息请参考[表1](#table1286935610129)。 **表 1** Ascend Device Plugin启动参数

参数

类型

默认值

说明

-mode

string

指定Ascend Device Plugin运行模式,不指定该参数会根据NPU芯片类型自动指定。

  • ascend310:以昇腾310 AI处理器的模式运行
  • ascend710:以昇腾710 AI处理器的模式运行
  • ascend910:以昇腾910 AI处理器的模式运行

-fdFlag

bool

false

边缘场景标志,是否使用FusionDirector系统来管理设备。

-useAscendDocker

bool

true

是否使用Ascend-docker-runtime。

说明:

开启CPU绑核功能,无论是否使用Ascend-docker-runtime,参数“useAscendDocker”均设置为false。

-volcanoType

bool

false

是否使用Volcano进行调度。

-version

bool

false

查看当前device-plugin的版本号。

-edgeLogFile

string

/var/alog/AtlasEdge_log/devicePlugin.log

边缘场景日志路径配置。

-logLevel

int

0

日志级别:

  • -1:debug
  • 0:info
  • 1:warning
  • 2:error
  • 3:dpanic
  • 4:panic
  • 5:fatal

-maxAge

int

7

日志备份时间限制,最少为7天,单位:天。

-isCompress

bool

false

是否自动将备份日志文件进行压缩。

-logFile

string

/var/log/mindx-dl/devicePlugin/devicePlugin.log

日志文件。

说明:

单个日志文件超过20 MB时会触发自动转储功能,文件大小上限不支持修改。

-maxBackups

int

30

转储后日志文件保留个数上限,范围:(0,30],单位:个。

9. 执行如下命令,查看节点设备部署信息。 ``` kubectl describe node ``` 如下所示,字段中对应标签及节点数量正确说明部署成功。 ``` Capacity: cpu: 128 ephemeral-storage: 3842380928Ki huawei.com/Ascend910: 8 hugepages-2Mi: 0 memory: 263865068Ki pods: 110 Allocatable: cpu: 128 ephemeral-storage: 3541138257382 huawei.com/Ascend910: 8 hugepages-2Mi: 0 memory: 263762668Ki pods: 110 ```

创建业务容器

## 操作步骤 1. 进入“ascend-device-plugin“目录,执行如下命令编辑Pod的配置文件,根据文件模板编写配置文件。 ``` cd /home/ascend-device-plugin vi ascend.yaml ``` ``` apiVersion: v1 #指定API版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: name: rest502 #Pod名称,在同一个namespace中必须唯一。 spec: #Pod中容器的详细定义。 containers: #Pod中容器列表。 - name: rest502 #Pod中容器名称。 image: centos_arm64_resnet50:7.8 #Pod中容器使用的推理或训练业务镜像地址。 imagePullPolicy: Never resources: limits: #资源限制 huawei.com/Ascend310: 2 #根据实际修改资源类型。支持资源类型见下文。 volumeMounts: - name: joblog mountPath: /home/log/ #容器内部日志路径,根据任务需要修改。 - name: model mountPath: /home/app/model #容器内部模型路径,根据任务需要修改。 - name: slog-path mountPath: /var/log/npu/conf/slog/slog.conf - name: ascend-driver-path mountPath: /usr/local/Ascend/driver #根据Driver实际所在路径修改。 volumes: - name: joblog hostPath: path: /home/test/docker_log #宿主机挂载日志路径,根据任务需要修改。 - name: model hostPath: path: /home/test/docker_model/ #宿主机挂载模型路径,根据任务需要修改。 - name: slog-path hostPath: path: /var/log/npu/conf/slog/slog.conf - name: ascend-driver-path hostPath: path: /usr/local/Ascend/driver #根据Driver实际所在路径修改。 ``` 支持的资源类型: - huawei.com/Ascend310: 2,表示分配2颗昇腾310 AI处理器。 - huawei.com/Ascend710: 1,表示分配1颗昇腾710 AI处理器。 - huawei.com/Ascend910: 4,表示分配4颗昇腾910 AI处理器。 - huawei.com/Ascend910-16c: 1,表示分配1颗算力为16核的虚拟设备,只支持单卡单容器任务(即数值只能填1)。支持调度2c、4c、8c、16c四种AI core数量的虚拟设备。 2. 执行如下命令,创建Pod。 ``` kubectl apply -f ascend.yaml ``` >![](figures/icon-note.gif) **说明:** >如需删除请执行以下命令: >**kubectl delete -f** **ascend.yaml** 3. 分别执行以下命令,进入Pod查看分配信息。 ``` kubectl exec -it pod名称 bash ``` Pod名称为[1](#zh-cn_topic_0269670251_zh-cn_topic_0249483204_li104071617503)中配置的Pod名称。 ``` ls /dev/ ``` 如下类似回显信息中可以看到davinci3和davinci4即为分配的Pod。 ``` core davinci3 davinci4 davinci_manager devmm_svm fd full hisi_hdc mqueue null ptmx ```

目录结构

``` ├── build # 编译脚本 │ └── build.sh ├── output # 编译结果目录 ├── src # 源代码目录 │ └── plugin │ │ ├── cmd/ascendplugin │ │ │ └── ascend_plugin.go │ │ └── pkg/npu/huawei ├── test # 测试目录 ├── Dockerfile # 镜像文件 ├── LICENSE ├── Open Source Software Notice.md ├── README.ZH.md ├── README.EN.md ├── ascend.yaml # sample运行任务yaml ├── ascendplugin-310.yaml # 310推理卡部署yaml ├── ascendplugin-710.yaml # 710推理卡部署yaml ├── ascendplugin-volcano.yaml # 910搭配volcano实现亲和性调度部署yaml ├── ascendplugin-910.yaml # 910未使用volcano部署yaml ├── go.mod └── go.sum ```

版本更新记录

版本

发布日期

修改说明

v2.0.3

2021-10-15

v2.0.2

2021-07-15

  • 昇腾910 AI处理器支持算力拆分。

v2.0.1

2021-04-20

  • 适配昇腾710 AI处理器。
  • 处理器信息上报由逻辑ID修改为物理ID。
  • 处理器一般告警修改为不主动隔离。

v20.2.0

2021-01-08

优化“创建DaemonSet”描述。

v20.2.0

2020-11-18

第一次正式发布。