阿里云容器计算服务ACS以Serverless形态提供容器算力,在使用GPU资源时,支持在Pod上声明GPU型号和ACS支持的驱动版本,极大降低了业务的基础设施管理和运维成本。本文主要介绍如何在创建Pod时指定GPU型号和驱动版本。
GPU型号说明
ACS支持多种GPU型号,您可以结合GPU容量预留使用,也可在Pod创建时按需申请。对于不同的计算类型(compute-class),使用方式如下。
- 高性能网络GPU型 - 仅支持节点预留,需要在购买后关联集群,每份资源预留在集群中以独立的虚拟节点供形式Pod使用,详见GPU-HPN容量预留。 
- GPU型 - 支持按量使用和容量预留两种方式,Pod创建后会自动抵扣容量预留。 
目前支持的GPU具体型号列表请提交工单咨询。
为Pod指定GPU型号
对于高性能网络GPU型,其仅支持申请节点预留使用资源,每份预留资源在集群内以独立的虚拟节点形式存在,虚拟节点的标签中包含了具体的GPU型号,您可以直接通过节点亲和性调度配置使用,详见基于属性标签将应用调度到高性能网络GPU型虚拟节点上。
对于GPU型,您需要在Pod的labels和nodeSelector中显式指定GPU型号。具体方式如下。
| 计算类 | 协议字段 | 样例 | 
| 高性能网络GPU型 | spec.nodeSelector |  | 
| GPU型 | metadata.labels[ alibabacloud.com/gpu-model-series] |  | 
驱动版本说明
GPU应用通常需要依赖CUDA(Compute Unified Device Architecture)运行,CUDA是显卡厂商NVIDIA在2007年推出的并行计算平台和编程模型。下图为CUDA的架构体系,CUDA软件堆栈中的驱动层API和运行时层API有以下区别。
- 驱动层API(Driver API):功能较完整,但是使用复杂。 
- 运行时API(CUDA Runtime API):封装了部分驱动的API,将某些驱动初始化操作隐藏,使用方便。 
CUDA的Driver API由NVIDIA Driver包提供,而CUDA Library和CUDA Runtime由CUDA Toolkit包提供。

在使用ACS集群运行GPU应用时,您需要注意:
- 容器镜像中安装CUDA Toolkit时,使用NVIDIA提供的CUDA基础镜像。这些基础镜像已经安装了CUDA Toolkit。您可以基于基础镜像构建应用容器镜像。您也可以根据不同的CUDA Toolkit版本选择不同的CUDA基础镜像。 
- 创建应用时指定Pod所需的驱动版本,详见为Pod指定驱动版本。 
- 关于CUDA Toolkit与NVIDIA驱动的版本兼容性列表,请参见NVIDIA官方文档CUDA Toolkit Release Notes。 
应用程序使用的CUDA运行时API版本与该应用的Docker镜像使用的CUDA基础镜像版本一致。例如,您的应用的Docker镜像基于CUDA基础镜像NVIDIA/CUDA:12.2.0-base-Ubuntu20.04构建,那么应用使用的CUDA运行时API版本为12.2.0。
为Pod指定驱动版本
ACS支持在应用使用GPU资源时,通过Pod的label标签指定驱动版本,具体格式如下。
| 计算类 | 协议字段 | 样例 | 
| GPU型 | metadata.labels[alibabacloud.com/gpu-driver-version] |  | 
| 高性能网络GPU型 |  | 
GPU驱动版本
在为Pod指定驱动版本时,需要确保驱动版本包含在ACS支持的驱动版本列表中,GPU驱动版本说明。
Pod默认GPU驱动版本
ACS支持按一定规则为Pod配置特定属性,若产品默认驱动版本不满足需求,可以通过在kube-system/acs-profile增加以下配置,实现为特定类型的GPU Pod配置不同的GPU驱动版本,详见配置Selectors。
以下配置实现了将集群内所有gpu-hpn计算类的pod驱动版本设置为1.5.0。
apiVersion: v1
kind: ConfigMap
metadata:
  name: acs-profile
  namespace: kube-system
data:
  # 其他系统配置保持不变
  selectors: |
    [
      {
        "name": "gpu-hpn-driver",
        "objectSelector": {
          "matchLabels": {
            "alibabacloud.com/compute-class": "gpu-hpn"
          }
        },
        "effect": {
          "labels": {
            "alibabacloud.com/gpu-driver-version": "1.5.0"
          }
        }
      }
    ]操作示例
- 使用以下YAML内容,创建gpu-pod-with-model-and-driver.yaml文件,文件中描述了一个compute-class为GPU的Pod,申请型号为example-model的GPU资源和535.161.08驱动版本。 - apiVersion: v1 kind: Pod metadata: name: gpu-pod-with-model-and-driver labels: # 指定compute-class为gpu类型 alibabacloud.com/compute-class: "gpu" # 指定GPU型号为example-model,请按实际情况填写,如T4 alibabacloud.com/gpu-model-series: "example-model" # 指定驱动版本为535.161.08 alibabacloud.com/gpu-driver-version: "535.161.08" spec: containers: - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5 name: tensorflow-mnist command: - sleep - infinity resources: requests: cpu: 1 memory: 1Gi nvidia.com/gpu: 1 limits: cpu: 1 memory: 1Gi nvidia.com/gpu: 1
- 执行以下命令,将gpu-pod-with-model-and-driver.yaml部署到集群。 - kubectl apply -f gpu-pod-with-model-and-driver.yaml
- 执行以下命令,查看Pod状态。 - kubectl get pod- 预期输出: - NAME READY STATUS RESTARTS AGE gpu-pod-with-model-and-driver 1/1 Running 0 87s
- 执行以下命令,查看Pod的GPU信息。 说明- 以下命令中的 - /usr/bin/nvidia-smi为样例镜像中已经封装好的命令参数。- kubectl exec -it gpu-pod-with-model-and-driver -- /usr/bin/nvidia-smi- 预期输出: - +---------------------------------------------------------------------------------------+ | NVIDIA-SMI xxx.xxx.xx Driver Version: 535.161.08 CUDA Version: xx.x | |-----------------------------------------+----------------------+----------------------+ ... |=========================================+======================+======================| | x NVIDIA example-model xx | xxxxxxxx:xx:xx.x xxx | x | | xxx xxx xx xxx / xxxx | xxxx / xxx| x% xxxxxxxx| | | | xxx | +-----------------------------------------+----------------------+----------------------+- 预期输出的信息中GPU型号为example-model,驱动版本为535.161.08,与Pod标签中配置一致。 重要- 以上内容只是样例输出,实际数据以您的操作环境为准。