安装 NVIDIA GPU

本章介绍用于包含 NVIDIA GPU 的集群的端到端安装步骤。有关 Huawei Ascend NPU,请参阅 安装 Huawei Ascend NPU。

前提条件

  • 对 ACP 集群具有集群管理员访问权限
  • Kubernetes 版本:v1.16+
  • CUDA 版本:v10.2+
  • NvidiaDriver:Hami 中为 v440+,DCGM-exporter 中为 v450+
  • ACP 版本:v4.0+

操作步骤

在 GPU 节点上安装 NVIDIA driver

请参阅 NVIDIA 官方安装指南。

安装 NVIDIA Container Runtime

请参阅 NVIDIA Container Toolkit 安装指南。

在 GPU 节点中添加 Nvidia yum 库

注意:请确保 GPU 节点可以访问 nvidia.github.io

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
yum makecache -y

当出现 “Metadata cache created.” 消息时,表示添加成功。

安装 Nvidia Container Runtime

yum install nvidia-container-toolkit -y

当出现 “Complete!” 提示时,表示安装成功。

配置 containerd 使用 NVIDIA runtime 并重启:

nvidia-ctk runtime configure --runtime=containerd
systemctl restart containerd

下载集群插件

INFO

Alauda Build of Hami、Alauda Build of DCGM-Exporter 和 Alauda Build of Hami-WebUI(可选)集群插件可从 Customer Portal 获取。

如需更多信息,请联系 Consumer Support。

注意:部署在 global 集群中的 Alauda Build of DCGM-Exporter v4.2.3-413 版本可能会导致组件持续重新安装。v4.2.3-413-1 版本已解决此问题,因此请务必使用该版本。

上传集群插件

有关上传集群插件的更多信息,请参阅 Uploading Cluster Plugins

安装 Alauda Build of Hami

  1. 在每个 NVIDIA GPU 节点上添加标签 "gpu=on",以便 hami-device-plugin(NVIDIA)仅在这些节点上运行。

    kubectl label nodes {nodeid} gpu=on
    TIP

    此标签仅适用于 NVIDIA 节点——Ascend 节点应使用 ascend=on 标签。请参阅 安装 Huawei Ascend NPU。

  2. 转到 管理员 -> Marketplace -> Cluster Plugin 页面,切换到目标集群,然后部署 Alauda Build of Hami 集群插件。

    在部署表单中保持 Enable NVIDIA 开启。如果集群不包含任何 Huawei Ascend NPU 节点,请将 Enable Ascend 保持关闭。其他参数可以保持默认值,或在了解其用法后再修改。

    参数默认值说明
    Enable NVIDIA已启用启用后会同时部署 hami-scheduler 和 hami-device-plugin(NVIDIA)。
    Enable Ascend已禁用对于仅包含 NVIDIA 的集群,请保持禁用。如果你的集群也包含 Huawei Ascend NPU,请参阅 安装 Huawei Ascend NPU。
    TIP

    Enable NVIDIA 和 Enable Ascend 是相互独立的。你可以关闭其中任意一个,但至少应保持一种设备类型处于启用状态。

  3. 验证结果。你可以在 UI 中查看 “Installed” 状态,也可以检查 pod 状态:

    kubectl get pods -n kube-system | grep -E "hami-scheduler|hami-device-plugin"
  4. 创建一些定义扩展资源的 ConfigMaps,这些资源可用于在 ACP 上设置扩展资源。请在你的 gpu 集群中运行以下脚本:

    点击展开代码
    kubectl apply -f - <<EOF
    apiVersion: v1
    data:
      dataType: integer
      defaultValue: "1"
      descriptionEn: Number of GPU jobs for resource quota. When create workload, declare how many physical GPUs needs and the requests of gpu core and gpu memory are the usage of per physical GPU
      descriptionZh: 资源配额代表 GPU 任务数。创建负载时代表申请的物理 gpu 个数, 申请的算力和显存都是每个物理 GPU 的使用量
      group: hami-nvidia
      groupI18n: '{"zh": "HAMi NVIDIA", "en": "HAMi NVIDIA"}'
      key: nvidia.com/gpualloc
      labelEn: gpu number
      labelZh: gpu 个数
      limits: optional
      requests: disabled
      resourceUnit: "count"
      relatedResources: "nvidia.com/gpucores,nvidia.com/gpumem"
      excludeResources: "nvidia.com/mps-core,nvidia.com/mps-memory,tencent.com/vcuda-core,tencent.com/vcuda-memory"
      runtimeClassName: ""
    kind: ConfigMap
    metadata:
      labels:
        features.cpaas.io/enabled: "true"
        features.cpaas.io/group: hami-nvidia
        features.cpaas.io/type: CustomResourceLimitation
      name: cf-crl-hami-nvidia-gpualloc
      namespace: kube-public
    ---
    apiVersion: v1
    data:
      dataType: integer
      defaultValue: "20"
      descriptionEn: vgpu cores, 100 cores represents the all computing power of a physical GPU
      descriptionZh: vgpu 算力, 100 算力代表一个物理 GPU 的全部算力
      group: hami-nvidia
      groupI18n: '{"zh": "HAMi NVIDIA", "en": "HAMi NVIDIA"}'
      key: nvidia.com/gpucores
      prefix: limits
      labelEn: vgpu cores
      labelZh: vgpu 算力
      limits: optional
      requests: disabled
      relatedResources: "nvidia.com/gpualloc,nvidia.com/gpumem"
      excludeResources: "nvidia.com/mps-core,nvidia.com/mps-memory,tencent.com/vcuda-core,tencent.com/vcuda-memory"
      runtimeClassName: ""
      ignoreNodeCheck: "true"
    kind: ConfigMap
    metadata:
      labels:
        features.cpaas.io/enabled: "true"
        features.cpaas.io/group: hami-nvidia
        features.cpaas.io/type: CustomResourceLimitation
      name: cf-crl-hami-nvidia-gpucores
      namespace: kube-public
    ---
    apiVersion: v1
    data:
      dataType: integer
      defaultValue: "4000"
      group: hami-nvidia
      groupI18n: '{"zh": "HAMi NVIDIA", "en": "HAMi NVIDIA"}'
      key: nvidia.com/gpumem
      prefix: limits
      labelEn: vgpu memory
      labelZh: vgpu 显存
      limits: optional
      requests: disabled
      resourceUnit: "Mi"
      relatedResources: "nvidia.com/gpualloc,nvidia.com/gpucores"
      excludeResources: "nvidia.com/mps-core,nvidia.com/mps-memory,tencent.com/vcuda-core,tencent.com/vcuda-memory"
      runtimeClassName: ""
      ignoreNodeCheck: "true"
    kind: ConfigMap
    metadata:
      labels:
        features.cpaas.io/enabled: "true"
        features.cpaas.io/group: hami-nvidia
        features.cpaas.io/type: CustomResourceLimitation
      name: cf-crl-hami-nvidia-gpumem
      namespace: kube-public
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cf-crl-hami-config
      namespace: kube-public
      labels:
        device-plugin.cpaas.io/config: "true"
    data:
      deviceName: "HAMi"
      nodeLabelKey: "gpu"
      nodeLabelValue: "on"
    EOF
    

完成后,在 ACP 业务视图中创建原生应用时,Hami 会出现在资源配置页面的扩展资源类型下拉列表中,你就可以开始使用它了。

安装 Alauda Build of DCGM-Exporter

  1. 转到 管理员 -> Marketplace -> Cluster Plugin 页面,切换到目标集群,然后部署 Alauda Build of DCGM-Exporter 集群插件: 在弹出的表单中设置节点标签:

    • Node Label Key: gpu
    • Node Label Value: on

    如果需要为 pgpu 启用 dcgm-exporter,请添加以下标签:

    • Node Label Key: nvidia-device-enable
    • Node Label Value: pgpu
  2. 验证结果。你可以在 UI 中查看 “Installed” 状态,也可以检查 pod 状态:

    kubectl get pods -n kube-system | grep dcgm-exporter

配置项目级配额记录规则

HAMi scheduler 会按 namespace 暴露 QuotaUsed 指标。若要在 Alauda Container Platform 中监控项目级配额使用情况,请应用一条 recording rule,将 QuotaUsed 按 quotaName 和 project 聚合。该规则通过 namespace 名称将 QuotaUsed 与 kube_namespace_labels(来自 kube-state-metrics)进行关联,从而提取 project 标签。

请选择与你在集群中部署的监控栈相匹配的变体。

当监控栈为 VictoriaMetrics 时

应用以下资源。该聚合在 by(...) 中保留 vmcluster,并在 vmcluster 上进行关联,以确保该规则在多个 vmcluster 实例下仍然正确。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: hami-project-quota
  namespace: kube-system
  labels:
    app.kubernetes.io/component: hami-scheduler
    prometheus: kube-prometheus
spec:
  groups:
    - name: quotaused-project-quotaname.rules
      interval: 30s
      rules:
        - record: QuotaUsedByProject
          expr: |
            sum by (quotaName, project, vmcluster) (
              QuotaUsed
              * on(quotanamespace, vmcluster) group_left(project)
                label_replace(kube_namespace_labels, "quotanamespace", "$1", "namespace", "(.*)")
            )
          labels:
            description: QuotaUsed metric aggregated by project and quotaname

使用以下命令应用:

kubectl apply -f hami-project-quota-prometheusrule.yaml

当监控栈为 Prometheus 时

当监控栈为上游 Prometheus / kube-prometheus-stack 时,不存在 vmcluster 标签,因此需要将其从聚合 by(...) 子句和关联的 on(...) 中移除。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: hami-project-quota
  namespace: kube-system
  labels:
    app.kubernetes.io/component: hami-scheduler
    prometheus: kube-prometheus
spec:
  groups:
    - name: quotaused-project-quotaname.rules
      interval: 30s
      rules:
        - record: QuotaUsedByProject
          expr: |
            sum by (quotaName, project) (
              QuotaUsed
              * on(quotanamespace) group_left(project)
                label_replace(kube_namespace_labels, "quotanamespace", "$1", "namespace", "(.*)")
            )
          labels:
            description: QuotaUsed metric aggregated by project and quotaname

使用以下命令应用:

kubectl apply -f hami-project-quota-prometheusrule.yaml
TIP
  • kube_namespace_labels 由 kube-state-metrics 导出。在应用该规则之前,请确保它已被与抓取 HAMi scheduler 相同的 Prometheus / VictoriaMetrics 实例抓取。
  • 生成的 QuotaUsedByProject 序列可被 dashboard 或告警引用,用于跟踪各项目的配额消耗。
  • 如果 hami-scheduler 部署在不同的 namespace 中,请相应修改上面的 metadata.namespace 字段。

安装监控

你可以使用 ACP MonitorDashboard 或 Alauda build of Hami-WebUI

安装 ACP MonitorDashboard(可选)

在 ACP dashboard 中为 HAMi GPU monitor 创建 ACP MonitorDashboard 资源。 将 hami-vgpu-metrics-dashboard-v1.0.2.yaml 文件保存到业务集群中,并执行命令:kubectl apply -f hami-vgpu-metrics-dashboard-v1.0.2.yaml

安装 Alauda build of Hami-WebUI(可选)

Alauda Build of Hami-WebUI 版本兼容性:

  • v1.10.0 与 Hami v2.7 和 v2.8 兼容。
  • v1.5.0 与 Hami v2.8 不兼容。
  • 部署 Hami v2.8 时,请使用 Alauda Build of Hami-WebUI v1.10.0。
  1. 转到 管理员 -> Marketplace -> Cluster Plugin 页面,切换到目标集群,然后部署 Alauda Build of Hami-WebUI 集群插件。 填写 Prometheus 地址和 Prometheus 认证信息。建议启用 NodePort 访问。Prometheus 地址和认证字符串可通过以下脚本获取:
    #!/bin/bash
    
    addr=$(kubectl get feature monitoring -o jsonpath='{.spec.accessInfo.database.service}')
    if [ -z "$addr" ]; then
    addr=$(kubectl get feature monitoring -o jsonpath='{.spec.accessInfo.database.address}')
    fi
    echo "Prometheus Address: $addr"
    
    secret_name=$(kubectl get feature monitoring -o jsonpath='{.spec.accessInfo.database.basicAuth.secretName}')
    namespace="cpaas-system"
    
    username=$(kubectl get secret $secret_name -n $namespace -o jsonpath='{.data.username}' | base64 -d)
    password=$(kubectl get secret $secret_name -n $namespace -o jsonpath='{.data.password}' | base64 -d)
    
    auth="Basic $(echo -n "$username:$password" | base64 -w 0)"
    echo "Prometheus Auth   : $auth"
  2. 验证结果。你可以在 UI 中查看 “Installed” 状态,也可以检查 pod 状态:
    kubectl get pods -n cpaas-system | grep "hami-webui"

验证

本节说明如何验证已安装的 Alauda Build of Hami 及相关监控是否有效。

验证 Hami

  1. 在业务集群的控制节点上,检查 GPU 节点是否存在可分配的 GPU 资源。 运行以下命令:
    kubectl get node  ${nodeName} -o=jsonpath='{.status.allocatable}'
    # The output contains: "nvidia.com/gpualloc":"10" (the specific value depends on the number of GPU cards and installation parameters)
  2. 部署一个 GPU 示例实例。 检查是否有任何与 GPU 相关的资源消耗。在业务集群的 GPU 节点上运行以下命令:
    nvidia-smi pmon -s u -d 1

如果 sm 和 mem 都包含数据,则表示 GPU 已就绪。你可以开始在 GPU 节点上开发 GPU 应用。 注意:部署 GPU 应用时,务必配置以下必填参数:

spec:
  containers:
    - image: your-image
      imagePullPolicy: IfNotPresent
      name: gpu
      resources:
        limits:
          cpu: '2'
          memory: 4Gi
          nvidia.com/gpualloc: 1     # Request 1 physical GPU (required)
          nvidia.com/gpucores: "50"  # Request 50% of the compute resources per GPU (optional)
          nvidia.com/gpumem: 8000    # Request 8000MB of video memory per GPU (optional)

验证 MonitorDashboard

在 HAMi vgpu 服务运行一段时间后,进入 管理员 -> Operations Center -> Monitor -> Dashboards 页面,并切换到 Hami 下的 HAMi GPU Monitoring 图表。 你将看到相关的图表数据。

验证 Hami-WebUI

在 HAMi-WebUI 组件运行一段时间后,在浏览器中访问 http://{business cluster node IP}:NodePort。