NPU Exporter

使用约束

在安装MindCluster NPU Exporter前,需要提前了解相关约束,具体说明请参见表1

表1 约束说明

约束场景

约束说明

NPU驱动

MindCluster NPU Exporter会周期性调用NPU驱动的相关接口以检测NPU状态。如果要升级驱动,请先停止业务任务,再停止MindCluster NPU Exporter容器服务。

K8s版本

使用MindCluster NPU Exporter前需要确保环境的K8s版本,若K8s版本在1.24.x及以上版本,需要用户自行安装cri-dockerd依赖。

DCMI动态库

DCMI动态库目录权限要求如下:

MindCluster NPU Exporter调用的DCMI动态库其所有父目录,需要满足属主为root,其他属主程序无法运行;同时,这些文件及其目录需满足group和other不具备写权限。

DCMI动态库路径深度必须小于20。

如果通过设置LD_LIBRARY_PATH设置动态库路径,LD_LIBRARY_PATH环境变量总长度不能超过1024。

Atlas 200I SoC A1 核心板

Atlas 200I SoC A1 核心板使用MindCluster NPU Exporter组件,需要确保Atlas 200I SoC A1 核心板的NPU驱动在23.0.RC2及以上版本。升级NPU驱动可参考Atlas 200I SoC A1 核心板 NPU驱动和固件升级指南进行操作。

Atlas 200I SoC A1 核心板节点上使用容器化部署MindCluster NPU Exporter,需要配置多容器共享模式,具体请参考Atlas 200I SoC A1 核心板 NPU驱动和固件安装指南

虚拟机场景

如果在虚拟机场景下部署MindCluster NPU Exporter,需要在MindCluster NPU Exporter的镜像中安装systemd,推荐在Dockerfile中加入RUN apt-get update && apt-get install -y systemd命令进行安装。

操作步骤

MindCluster NPU Exporter支持两种安装方式,用户可根据实际情况选择其中一种进行安装。该组件仅提供HTTP服务,如需使用更为安全的HTTPS服务,请自行修改源码进行适配。

容器化方式安装

  1. 以root用户登录各计算节点,并执行以下命令,查看MindCluster NPU Exporter镜像和版本号是否正确。

    docker images | grep npu-exporter

    回显示例如下:

    npu-exporter                         v6.0.RC2             20185c45f1bc        About an hour ago         90.1MB

  2. MindCluster NPU Exporter软件包解压目录下的yaml文件,拷贝到K8s管理节点上任意目录。
  3. 如果使用默认的MindCluster NPU Exporter启动参数“-containerMode=docker”,可跳过本步骤。

    如果是Containerd场景,需要将containerMode设置为containerd,即“-containerMode=containerd”。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: npu-exporter
      namespace: npu-exporter
    spec:
      selector:
        matchLabels:
          app: npu-exporter
    ...
        spec:
    ...
            volumeMounts:
    ...
              - name: docker-shim                                        # 仅使用containerd时需要删除
                mountPath: /var/run/dockershim.sock
                readOnly: true
              - name: docker                                       # 仅使用containerd时删除
                mountPath: /var/run/docker
                readOnly: true
               - name: cri-dockerd                                 # 当k8s版本为1.24+且容器运行时为docker时保留
                 mountPath: /var/run/cri-dockerd.sock
                 readOnly: true
                - name: containerd                             
                   mountPath: /run/containerd
                   readOnly: true
                - name: isulad                                # 使用containerd或者docker时删除
                   mountPath: /run/isulad.sock
                   readOnly: true
    ...
          volumes:
    ...
            - name: docker-shim                             # 仅使用containerd时删除
              hostPath:
                path: /var/run/dockershim.sock
            - name: docker                                # 仅使用containerd时删除
              hostPath:
                path: /var/run/docker
             - name: cri-dockerd                           # 当k8s版本为1.24+且容器运行时为docker时保留
               hostPath:
                 path: /var/run/cri-dockerd.sock
             - name: containerd                            
                hostPath:
                path: /run/containerd
            - name: isulad                                # 使用containerd或者docker时删除
               hostPath:
                path: /run/isulad.sock
    
    ...

  4. (可选)删除原有容器运行时的挂载文件,新增dockershim.sock文件的挂载目录。

    该步骤可有效解决kubelet重启后,造成的MindCluster NPU Exporter数据丢失问题。新增挂载目录后,会同时新增很多挂载文件,如docker.sock,有容器逃逸的风险。

    ...
            volumeMounts:
              - name: log-npu-exporter
    ...
              - name: sys
                mountPath: /sys
                readOnly: true
              - name: docker-shim                        # 删除以下加粗字段
                mountPath: /var/run/dockershim.sock
                readOnly: true
              - name: docker 
                mountPath: /var/run/docker
                readOnly: true
              - name: cri-dockerd 
                mountPath: /var/run/cri-dockerd.sock
                readOnly: true
              - name: sock                   新增以下加粗字段
                mountPath: /var/run        # 以实际的dockershim.sock文件目录为准
              - name: containerd  
                mountPath: /run/containerd
    ...
          volumes:
            - name: log-npu-exporter
    ...
            - name: sys
              hostPath:
                path: /sys
            - name: docker-shim                    # 删除以下加粗字段
              hostPath:   
                path: /var/run/dockershim.sock
            - name: docker 
              hostPath:
                path: /var/run/docker
            - name: cri-dockerd 
              hostPath:
                path: /var/run/cri-dockerd.sock
            - name: sock                 # 新增以下加粗字段
              hostPath:
                path: /var/run                    # 以实际的dockershim.sock文件目录为准
            - name: containerd  
              hostPath:
                path: /run/containerd
     ...

  5. 如不修改组件的其他启动参数,可跳过本步骤。否则,请根据实际情况修改yaml文件中MindCluster NPU Exporter的启动参数。启动参数如表2所示,也可执行./npu-exporter -h查看参数说明。
  6. 在管理节点的yaml所在路径,执行以下命令,启动MindCluster NPU Exporter。如果集群中同时存在Atlas 200I SoC A1 核心板和其他类型的节点,请分别执行对应命令。

    • K8s集群中使用Atlas 200I SoC A1 核心板节点,执行以下命令。
      kubectl apply -f npu-exporter-310P-1usoc-v{version}.yaml
    • K8s集群中使用除Atlas 200I SoC A1 核心板外的其他类型节点,执行以下命令。
      kubectl apply -f npu-exporter-v{version}.yaml
    启动示例如下:
    namespace/npu-exporter unchanged
    networkpolicy.networking.K8s.io/exporter-network-policy unchanged
    daemonset.apps/npu-exporter created

  7. 执行以下命令,查看组件是否启动成功。

    kubectl get pod -n npu-exporter

    回显示例如下,出现Running表示组件启动成功。若状态为CrashLoopBackOff,可能是因为目录权限不正确导致,可以参见NPU Exporter检查动态路径失败,日志出现check uid or mode failed章节进行处理。

    NAME                            READY   STATUS    RESTARTS   AGE
    ...
    npu-exporter-hqpxl              1/1     Running   0          11s

二进制方式安装

MindCluster NPU Exporter组件以容器化方式运行时需使用特权容器、root用户和挂载了docker-shim或Containerd的socket文件,如果容器被人恶意利用,有容器逃逸风险。当安全性要求较高时,请直接在物理机上通过二进制方式运行。

以二进制方式运行MindCluster NPU Exporter需要将日志目录权限修改为非root,可以执行chown hwMindX:hwMindX /var/log/mindx-dl/npu-exporter命令修改日志权限。

  1. 使用root用户登录服务器。
  2. 将软件包上传至服务器的任意目录(如“/home/ascend-npu-exporter”)并进行解压操作。
  3. 执行以下命令,创建npu-exporter.service文件。

    vi /home/ascend-npu-exporter/npu-exporter.service

  4. 参考如下内容,写入npu-exporter.service文件中。

    [Unit]
    Description=Ascend npu exporter
    Documentation=hiascend.com
    
    [Service]
    ExecStart=/bin/bash -c "/usr/local/bin/npu-exporter -ip=127.0.0.1 -port=8082 -logFile=/var/log/mindx-dl/npu-exporter/npu-exporter.log>/dev/null  2>&1 &"
    Restart=always
    RestartSec=2
    KillMode=process
    Environment="GOGC=50"
    Environment="GOMAXPROCS=2"
    Environment="GODEBUG=madvdontneed=1"
    Type=forking
    User=hwMindX
    Group=hwMindX
    
    [Install]
    WantedBy=multi-user.target

  5. MindCluster NPU Exporter默认情况只侦听127.0.0.1,可通过修改的启动参数“-ip”“npu-exporter.service”文件的“ExecStart”字段修改需要侦听的IP地址。

    ...
    [Service]
    ExecStart=/bin/bash -c "/usr/local/bin/npu-exporter -ip=127.0.0.1 -port=8082 -logFile=/var/log/mindx-dl/npu-exporter/npu-exporter.log &"
    Restart=always
    RestartSec=2
    ...

  6. 依次执行以下命令,在节点上将hwMindX用户加入到HwBaseUser、HwDmUser用户组中。如果部署节点为Atlas 200I SoC A1 核心板,可跳过该步骤。

    usermod -a -G HwBaseUser hwMindX
    usermod -a -G HwDmUser hwMindX

  7. 依次执行以下命令,启用MindCluster NPU Exporter服务。

    cd /home/ascend-npu-exporter
    cp npu-exporter /usr/local/bin
    cp npu-exporter.service /etc/systemd/system
    chattr +i /etc/systemd/system/npu-exporter.service
    chmod 500 /usr/local/bin/npu-exporter
    chown hwMindX:hwMindX /usr/local/bin/npu-exporter
    chattr +i /usr/local/bin/npu-exporter
    systemctl enable npu-exporter
    systemctl start npu-exporter
    如果需要获取容器相关指标,MindCluster NPU Exporter需要临时提权以便于和CRI、OCI的socket建立连接,需要执行以下命令。
    chattr -i /usr/local/bin/npu-exporter
    setcap cap_setuid+ep /usr/local/bin/npu-exporter
    chattr +i /usr/local/bin/npu-exporter
    systemctl restart npu-exporter

参数说明

表2 MindCluster NPU Exporter启动参数

参数

类型

默认值

说明

-port

int

8082

侦听端口,范围1025~40000。

-updateTime

int

5

信息更新周期1~60秒。如果设置的时间过长,一些生存时间小于更新周期的容器可能无法上报。

-ip

string

参数无默认值,必须配置。

侦听IP地址,在多网卡主机上不建议配置成0.0.0.0。

-version

bool

false

是否查询MindCluster NPU Exporter版本号。

  • true:查询r
  • false:不查询。

-concurrency

int

5

HTTP服务的限流大小,默认5个并发,取值范围为1~512。

-logLevel

int

0

日志级别:

  • -1:debug
  • 0:info
  • 1:warning
  • 2:error
  • 3:critical

-maxAge

int

7

日志备份时间,取值范围为7~700,单位为天。

-logFile

string

/var/log/mindx-dl/npu-exporter/npu-exporter.log

日志文件。

说明:

单个日志文件超过20 MB时会触发自动转储功能,文件大小上限不支持修改。转储后文件的命名格式为:npu-exporter-触发转储的时间.log,如:npu-exporter-2023-10-07T03-38-24.402.log。

-maxBackups

int

30

转储后日志文件保留个数上限,取值范围为1~30,单位为个。

-containerMode

string

docker

设置容器运行时类型。

  • 设置为“docker”表示当前环境使用Docker作为容器运行时。
  • 设置为“containerd”表示当前环境使用Containerd作为容器运行时。
  • 设置为“isula”表示当前环境使用iSula作为容器运行时。

-containerd

string

  • Docker)unix:///var/run/docker/containerd/docker-containerd.sock
  • Containerd)unix:///run/containerd/containerd.sock
  • iSula)unix:///run/isulad.sock

containerd daemon进程endpoint,用于与Containerd通信。

  • 若containerMode=docker,则默认值为/var/run/docker/containerd/docker-containerd.sock;连接失败后,自动尝试连接:unix:///run/containerd/containerd.sock。
  • 若containerMode=containerd,则默认值为/run/containerd/containerd.sock。
  • 若containerMode=isula,则默认值为/run/isulad.sock。

一般情况下使用默认值即可。若用户自行修改了Containerd的sock文件路径则需要进行相应路径的修改。

可通过ps aux | grep containerd命令查询Containerd的sock文件路径是否修改。

-endpoint

string

  • Docker)unix:///var/run/dockershim.sock
  • Containerd)unix:///run/containerd/containerd.sock
  • iSula)unix:///run/isulad.sock

CRI server的sock地址:

  • 若containerMode=docker,将连接到dockershim获取容器列表,默认值/var/run/dockershim.sock;
  • 若containerMode=containerd,默认值/run/containerd/containerd.sock。
  • 若containerMode=isula,则默认值为/run/isulad.sock。

一般情况下使用默认值即可,除非用户自行修改了dockershim或者Containerd的sock文件路径。

-limitIPConn

int

5

每个IP的TCP限制数的取值范围为1~128。

-limitTotalConn

int

20

程序总共的TCP限制数的取值范围为1~512。

-limitIPReq

string

20/1

每个IP的请求限制数,20/1表示1秒限制20个请求,“/”两侧最大只支持三位数。

-cacheSize

int

102400

缓存key的数量限制,取值范围为1~1024000。

-h或者-help

显示帮助信息。

-platform

string

Prometheus

指定对接平台。

  • Prometheus:对接Prometheus
  • Telegraf:对接Telegraf

-poll_interval

duration(int)

1

Telegraf数据上报的间隔时间,单位:秒。此参数在对接Telegraf平台时才起作用,即需要指定-platform=Telegraf时才生效,否则该参数不生效。

-profilingTime

int

200

配置采集PCIe带宽时间,单位:毫秒,取值范围为1~2000。