登录
首页 >  Golang >  Go问答

指导k8s按照规定分配gpu/npu设备

来源:stackoverflow

时间:2024-02-18 09:09:22 129浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《指导k8s按照规定分配gpu/npu设备》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我在一台机器上有多个 GPU 卡,我需要让 k8s 按照我设置的一些规则分配 GPU/NPU 设备。

例如,假设有 8 个 id 为 0-7 的 GPU 卡,并且只有 device0、device1、device6 和 device7 可用。现在我需要创建一个包含 2 个设备的 pod,这两个设备必须是 (device0, device1) 或 (device6, device7)。其他设备组合(例如(device0、device6))无效。

有什么办法可以做到这一点吗?我使用的是1.18版本的kubernetes并实现了我自己的设备插件。


解决方案


我不明白你为什么要写这样的规则:

如果你想限制 gpu 的数量,你应该使用 limitsrequests,这在 Schedule GPUs 上有很好的解释。 因此,您可以将资源限制为仅 4 个 gpu,如下所示:

apiversion: v1
kind: pod
metadata:
  name: cuda-vector-add
spec:
  restartpolicy: onfailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 4 # requesting 1 gpu

如果不同节点上有不同类型的 gpu,您可以使用 labels,您可以在此处阅读 Clusters containing different types of GPUs

如果您的节点运行不同版本的 gpu,则使用节点标签和节点选择器将 pod 调度到适当的 gpu。以下是此工作流程的说明:

作为节点引导的一部分,识别节点上的 gpu 硬件类型并将其公开为节点标签。

nvidia_gpu_name=$(nvidia-smi --query-gpu=gpu_name --format=csv,noheader --id=0)
source /etc/default/kubelet
kubelet_opts="$kubelet_opts --node-labels='alpha.kubernetes.io/nvidia-gpu-name=$nvidia_gpu_name'"
echo "kubelet_opts=$kubelet_opts" > /etc/default/kubelet

通过节点亲和性规则指定 pod 可以使用的 gpu 类型。

kind: pod
apiVersion: v1
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/affinity: >
      {
        "nodeAffinity": {
          "requiredDuringSchedulingIgnoredDuringExecution": {
            "nodeSelectorTerms": [
              {
                "matchExpressions": [
                  {
                    "key": "alpha.kubernetes.io/nvidia-gpu-name",
                    "operator": "In",
                    "values": ["Tesla K80", "Tesla P100"]
                  }
                ]
              }
            ]
          }
        }
      }
spec: 
  containers: 
    - 
      name: gpu-container-1
      resources: 
        limits: 
          alpha.kubernetes.io/nvidia-gpu: 2

这将确保 pod 被调度到具有 tesla k80 或 tesla p100 nvidia gpu 的节点。

您可以在unofficial-kubernetes Scheduling gpus上找到其他相关信息。

今天关于《指导k8s按照规定分配gpu/npu设备》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>