运行 使用来自 kubernetes 的 GPU 的 docker 容器无法找到 GPU

Running a docker container which uses GPU from kubernetes fails to find the GPU

我想 运行 一个使用 GPU 的 docker 容器(它 运行 是一个 cnn 来检测视频上的对象),然后 运行 那个容器Kubernetes。

我可以 运行 来自 docker 的容器,没有问题,但是当我尝试 运行 来自 Kubernetes 的容器时,它找不到 GPU。

我运行它使用这个命令:

kubectl exec -it namepod /bin/bash

这是我遇到的问题:

kubectl exec -it tym-python-5bb7fcf76b-4c9z6 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@tym-python-5bb7fcf76b-4c9z6:/opt# cd servicio/
root@tym-python-5bb7fcf76b-4c9z6:/opt/servicio# python3 TM_Servicev2.py 
 Try to load cfg: /opt/darknet/cfg/yolov4.cfg, weights: /opt/yolov4.weights, clear = 0 
CUDA status Error: file: ./src/dark_cuda.c : () : line: 620 : build time: Jul 30 2021 - 14:05:34 

 CUDA Error: no CUDA-capable device is detected
python3: check_error: Unknown error -1979678822
root@tym-python-5bb7fcf76b-4c9z6:/opt/servicio#

编辑。 我遵循了 Nvidia docker 2 指南中的所有步骤并下载了适用于 Kubernetes 的 Nvidia 插件。

然而,当我部署 Kubernetes 时,它保持“待定”状态,从未真正启动。我不再收到错误,但它永远不会开始。 广告连播如下所示:

gpu-pod                       0/1     Pending   0          3m19s

编辑 2.

我最终重新安装了所有内容,现在我的 pod 似乎已完成但未 运行ning。像这样。

default       gpu-operator-test                          0/1     Completed   0             62m

正在回答 Wiktor。 当我 运行 这个命令时:

kubectl describe pod gpu-operator-test 

我得到:

Name:         gpu-operator-test
Namespace:    default
Priority:     0
Node:         pdi-mc/192.168.0.15
Start Time:   Mon, 09 Aug 2021 12:09:51 -0500
Labels:       <none>
Annotations:  cni.projectcalico.org/containerID: 968e49d27fb3d86ed7e70769953279271b675177e188d52d45d7c4926bcdfbb2
              cni.projectcalico.org/podIP: 
              cni.projectcalico.org/podIPs: 
Status:       Succeeded
IP:           192.168.10.81
IPs:
  IP:  192.168.10.81
Containers:
  cuda-vector-add:
    Container ID:   docker://d49545fad730b2ec3ea81a45a85a2fef323edc82e29339cd3603f122abde9cef
    Image:          nvidia/samples:vectoradd-cuda10.2
    Image ID:       docker-pullable://nvidia/samples@sha256:4593078cdb8e786d35566faa2b84da1123acea42f0d4099e84e2af0448724af1
    Port:           <none>
    Host Port:      <none>
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 09 Aug 2021 12:10:29 -0500
      Finished:     Mon, 09 Aug 2021 12:10:30 -0500
    Ready:          False
    Restart Count:  0
    Limits:
      nvidia.com/gpu:  1
    Requests:
      nvidia.com/gpu:  1
    Environment:       <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9ktgq (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  kube-api-access-9ktgq:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

我正在使用这个配置文件来创建 pod

apiVersion: v1
kind: Pod
metadata:
  name: gpu-operator-test
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "nvidia/samples:vectoradd-cuda10.2"
    resources:
      limits:
         nvidia.com/gpu: 1

这里讨论两个主题:

  1. 你一开始看到的错误:

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

表示您尝试使用已弃用的 kubectl exec 命令版本。正确的语法是:

$ kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]

有关详细信息,请参阅 here

  1. 根据 official docs gpu-operator-test pod 应该 运行 完成:

可以看到pod的状态是Succeeded还有:


 State:          Terminated
   Reason:       Completed
   Exit Code:    0

Exit Code: 0表示指定的容器命令成功完成。

可以在 official docs 中找到更多详细信息。