如何正确标记和配置Kubernetes以使用Nvidia GPU?

时间:2019-11-12 10:42:25

标签: kubernetes gpu nvidia

我有一个在裸机上运行的内部K8s集群。在我的一个工作节点上,我有4个GPU,并且我想配置K8以识别和使用这些GPU。 根据官方文档,我安装了所有必需的东西,现在运行时:

doc.data().name

我知道我必须标记节点,以便K8能够识别这些GPU,但是我在官方文档中找不到正确的标记。在文档中,我只看到以下内容:

docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi


Tue Nov 12 09:20:20 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.67       Driver Version: 418.67       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  On   | 00000000:02:00.0 Off |                  N/A |
| 29%   25C    P8     2W / 250W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  On   | 00000000:03:00.0 Off |                  N/A |
| 29%   25C    P8     1W / 250W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce RTX 208...  On   | 00000000:82:00.0 Off |                  N/A |
| 29%   26C    P8     2W / 250W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce RTX 208...  On   | 00000000:83:00.0 Off |                  N/A |
| 29%   26C    P8    12W / 250W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

在另一个教程(仅适用于Google cloude)中,我发现了这一点:

# Label your nodes with the accelerator type they have.
kubectl label nodes <node-with-k80> accelerator=nvidia-tesla-k80

那么标记节点的正确方法是什么?我是否还需要用GPU的数量和内存大小标记它?

1 个答案:

答案 0 :(得分:0)

我看到您正在尝试确保将pod安排在具有GPU的节点上

最简单的方法是像这样用GPU标记节点:

kubectl label node <node_name> has_gpu=true

,然后创建您的Pod,并添加nodeSelectorhas_gpu: true。这样,将仅在具有GPU的节点上调度pod。了解更多here in k8s docs

唯一的问题是,在这种情况下,调度程序不知道节点上有多少个GPU,而仅用4个GPU即可在节点上调度4个以上的容器。

更好的选择是使用node extended resource

它看起来如下:

  1. 运行kubectl proxy
  2. patch node resource configuration

    curl --header "Content-Type: application/json-patch+json" \
    --request PATCH \
    --data '[{"op": "add", "path": "/status/capacity/example.com~1gpu", "value": "4"}]' \
    http://localhost:8001/api/v1/nodes/<your-node-name>/status
    
  3. assign an extender resource to a pod

    apiVersion: v1
    kind: Pod
    metadata:
    name: extended-resource-demo
    spec:
    containers:
    - name: extended-resource-demo-ctr
        image: my_pod_name
        resources:
            requests:
                example.com/gpu: 1
            limits:
                example.com/gpu: 1
    

在这种情况下,调度程序会知道节点上有多少个GPU可用,如果无法满足请求,则不会调度更多的Pod。