2.15. 为 pod 分配 GPU


基于属性的 GPU 分配启用对 OpenShift Container Platform 中图形处理单元(GPU)资源分配进行调优的控制,允许 pod 根据特定设备属性请求 GPU,包括产品名称、GPU 内存容量、计算能力、供应商名称和驱动程序版本。这些属性由第三方动态资源分配(DRA)驱动程序公开。

重要

基于属性的 GPU 分配只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

2.15.1. 关于为工作负载分配 GPU

基于属性的 GPU 分配可让 pod 根据特定设备属性请求图形处理单元(GPU)。这样可确保每个 pod 接收其所需的确切 GPU 规格。

基于属性的资源分配需要您安装动态资源分配(DRA)驱动程序。DRA 驱动程序是在集群中的每个节点上运行的第三方应用程序,与该节点的硬件进行接口。

DRA 驱动程序公告 OpenShift Container Platform 可用于精确 GPU 选择的多个 GPU 设备属性,包括以下属性:

产品名称
Pod 可以根据性能要求或与应用程序的兼容性来请求准确的 GPU 模型。这样可确保工作负载将最适合的硬件用于其任务。
GPU 内存容量
Pod 可以请求具有最小或最大内存容量的 GPU,如 8 GB、16 GB 或 40 GB。这对内存密集型工作负载(如大型 AI 模型培训或数据处理)非常有用。此属性可让应用程序分配满足内存需要的 GPU,而无需过度使用或利用资源。
计算能力
Pod 可以根据 GPU 的计算功能请求 GPU,如支持的 CUDA 版本。Pod 可以目标与应用程序框架兼容的 GPU,并利用优化的处理功能。
Power 和 Thermal Profiles
Pod 可以根据功耗或热特征请求 GPU,使对电源敏感或温度敏感的应用程序能够高效操作。这在能源或冷却限制是因素的高密度环境中特别有用。
设备 ID 和供应商 ID
Pod 可以根据 GPU 的硬件特定请求请求 GPU,允许需要特定供应商或设备类型的应用程序发出目标请求。
驱动程序版本
Pod 可以请求运行特定驱动程序版本的 GPU,确保与应用程序依赖项兼容并最大化 GPU 功能访问。

2.15.2. 关于 GPU 分配对象

基于属性的 GPU 分配使用以下对象来提供核心图形处理单元(GPU)分配功能。所有这些 API 类型都包含在 resource.k8s.io/v1beta2 API 组中。

设备类

设备类是 pod 可以声明以及如何在声明中选择特定设备属性的设备类别。有些设备驱动程序包含自己的设备类。或者,管理员可以创建设备类。设备类包含一个设备选择器,它是一个通用表达式语言 (CEL) 表达式,如果设备满足请求,则必须评估为 true。

以下示例 DeviceClass 对象选择由 driver.example.com 设备驱动程序管理的任何设备:

设备类对象示例

apiVersion: resource.k8s.io/v1beta1
kind: DeviceClass
metadata:
  name: example-device-class
spec:
  selectors:
  - cel:
      expression: |-
        device.driver == "driver.example.com"
Copy to Clipboard Toggle word wrap

资源片段
每个节点上的 Dynamic Resource Allocation (DRA)驱动程序会创建和管理 集群中的资源片段。资源片段表示附加到节点的一个或多个 GPU 资源。在 pod 中创建并使用资源声明时,OpenShift Container Platform 使用资源片段查找可访问所请求资源的节点。在为资源声明找到合格的资源片段后,OpenShift Container Platform 调度程序会使用分配详情更新资源声明,将资源分配给资源声明,并将 pod 调度到可访问资源的节点。
资源声明模板

集群管理员和操作员可以创建 资源声明模板,从特定设备类请求 GPU。资源声明模板为 pod 提供对独立的类似资源的访问。OpenShift Container Platform 使用资源声明模板为 pod 生成资源声明。OpenShift Container Platform 从模板生成的每个资源声明都绑定到特定的 pod。当 pod 终止时,OpenShift Container Platform 会删除对应的资源声明。

以下示例资源声明模板请求 example-device-class 设备类中的设备。

资源声明模板对象示例

apiVersion: resource.k8s.io/v1beta1
kind: ResourceClaimTemplate
metadata:
  namespace: gpu-test1
  name: gpu-claim-template
spec:
# ...
  spec:
    devices:
      requests:
      - name: gpu
        deviceClassName: example-device-class
Copy to Clipboard Toggle word wrap

资源声明

管理员和操作员可以创建 资源声明,从特定设备类请求 GPU。资源声明与资源声明模板不同,方法是允许您与多个 pod 共享 GPU。另外,当请求 pod 终止时,资源声明不会被删除。

以下示例资源声明模板使用 CEL 表达式来请求位于特定大小的 example-device-class 设备类中的特定设备。

资源声明对象示例

apiVersion: resource.k8s.io/v1beta1
kind: ResourceClaimTemplate
metadata:
  namespace: gpu-claim
  name: gpu-devices
spec:
  spec:
    devices:
      requests:
      - name: 1g-5gb
        deviceClassName: example-device-class
        selectors:
        - cel:
            expression: "device.attributes['driver.example.com'].profile == '1g.5gb'"
      - name: 1g-5gb-2
        deviceClassName: example-device-class
        selectors:
        - cel:
            expression: "device.attributes['driver.example.com'].profile == '1g.5gb'"
      - name: 2g-10gb
        deviceClassName: example-device-class
        selectors:
        - cel:
            expression: "device.attributes['driver.example.com'].profile == '2g.10gb'"
      - name: 3g-20gb
        deviceClassName: example-device-class
        selectors:
        - cel:
            expression: "device.attributes['driver.example.com'].profile == '3g.20gb'"
Copy to Clipboard Toggle word wrap

有关配置资源声明、资源声明模板的更多信息,请参阅 "Dynamic Resource Allocation" ( Kubernetes 文档)。

有关向 pod 添加资源声明的详情,请参考"将资源声明添加到 pod"。

2.15.3. 将资源声明添加到 pod

基于属性的 GPU 分配使用资源声明和资源声明模板,允许您为 pod 中的容器请求特定的图形处理单元(GPU)。资源声明可以和多个容器一起使用,但资源声明模板只能用于一个容器。如需更多信息,请参阅附加资源部分中的"使用设备属性配置设备分配 "。

以下流程中的示例创建了资源声明模板,将特定的 GPU 分配给 container0,以及一个资源声明来在 container1container2 之间共享 GPU。

先决条件

  • 已安装 Dynamic Resource Allocation (DRA)驱动程序。有关 DRA 的更多信息,请参阅 "动态资源分配" ( Kubernetes 文档)。
  • 已创建一个资源片段。
  • 已创建资源声明和/或资源声明模板。
  • 您可以通过编辑名为 clusterFeatureGate CR 为集群启用所需的技术预览功能:

    FeatureGate CR 示例

    apiVersion: config.openshift.io/v1
    kind: FeatureGate
    metadata:
      name: cluster
    spec:
      featureSet: TechPreviewNoUpgrade 
    1
    Copy to Clipboard Toggle word wrap

    1
    启用所需的功能。
    警告

    在集群中启用 TechPreviewNoUpgrade 功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。

流程

  1. 通过创建类似如下的 YAML 文件来创建 pod:

    请求资源的 pod 示例

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: gpu-allocate
      name: pod1
      labels:
        app: pod
    spec:
      restartPolicy: Never
      containers:
      - name: container0
        image: ubuntu:24.04
        command: ["sleep", "9999"]
        resources:
          claims: 
    1
    
          - name: gpu-claim-template
      - name: container1
        image: ubuntu:24.04
        command: ["sleep", "9999"]
        resources:
          claims:
          - name: gpu-claim
      - name: container2
        image: ubuntu:24.04
        command: ["sleep", "9999"]
        resources:
          claims:
          - name: gpu-claim
      resourceClaims: 
    2
    
      - name: gpu-claim-template
        resourceClaimTemplateName: example-resource-claim-template
      - name: gpu-claim
        resourceClaimName: example-resource-claim
    Copy to Clipboard Toggle word wrap

    1
    指定用于此容器的一个或多个资源声明。
    2
    指定容器启动所需的资源声明。为资源声明请求包括任意名称,以及资源声明和/或资源声明模板。
  2. 创建 CRD 对象:

    $ oc create -f <file_name>.yaml
    Copy to Clipboard Toggle word wrap

有关配置 pod 资源请求的更多信息,请参阅 "Dynamic 资源分配" ( Kubernetes 文档)。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat