在k8s中调用NVIDIA-GPU

2019-11-20  本文已影响0人  zishen

概述

本次实践的环境:
Ubuntu18.04
docker version : 18.09.5
查看nvidia-docker版本命令

dpkg -l |grep nvidia-docker

nvidia-docker2 : 2.2.2 > 注意nvdia-docker1和2是不兼容的

k8s版本 显卡信息

nvidia-docker调用GPU

在docker中调用英伟达的gpu可以通过nvidia-docker调用,nvidia-docker是一个可以使用GPU的docker,nvidia-docker是在docker上做了一层封装,通过nvidia-docker-plugin,然后调用到docker上,其最终实现的还是在docker的启动命令上指定runtimes为nvidia-container-runtime,具体的参数在可以通过查看/etc/docker/daemon.json这个路径。

cat /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

可以看到具体的配置,其中registry-mirrors是配置的镜像源。
当我们用nvidia-docker命令生成并启动容器时,会自动的指定runtimes为nvidia并加上一系列的参数。

k8s中调用GPU

k8s在v1.8版本后推荐使用NVIDIA/k8s-device-plugin来调用GPU。其实就是集群版的nvidia-docker...都是暴露gpu分配调度接口,并进行监听。原理参照k8s插件原理

预准备
vim /etc/docker/daemon.json
添加 "default-runtime": "nvidia"

重启docker使配置生效

systemctl restart docker
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml

返回提示

daemonset.apps/nvidia-device-plugin-daemonset created

查看安装后是否有可用gpu资源

kubectl describe nodes
gpu资源 image.png

可以看到在有GPU的node上,守护Pods中多了nvidia-device-plugin-daemonset用于监听和分配gpu,在Allocated resources(可分配资源)中多了gpu。

测试k8s中gpu的使用

vim gpu_test.yaml 

内容的组织形式类似docker file

apiVersion: v1
kind: Pod
metadata:
  name: ffmpeg-pod
spec:
  nodeName: wangzishen-ms-7846 #指定有gpu的节点
  containers:
    - name: ffmpeg-container
      image: nightseas/ffmpeg:latest #k8s中配置阿里的私有仓库遇到一些问题,暂时用公共镜像
      command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
      resources:
        limits:
          nvidia.com/gpu: 1 # 请求分配 1个 GPU
kubectl create -f  gpu_test.yaml
启动成功

启动的过程中会去docker hub拉取nightseas/ffmpeg:latest这个镜像,在启动过程中可以通过

kubectl describe pod ffmpeg-pod
查看当前的执行情况 当前情况
kubectl exec ffmpeg-pod -it -- bash
wget http://xxxxxxxx/tmp/00000000088000000.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 00000000088000000.mp4 -vf scale_npp=1280:720 -vcodec h264_nvenc out.mp4

多个pod共享一张GPU

不行,pod在创建的时候请求gpu最低是卡级别,一张显卡只能分配给一个pod。但是一个pod是由多个容器组成的,所以同一个pod的容器可以共享分配给当前pod的所有GPU。

多个docker容器共享一张GPU

可以。通过nvidia-docker启动的容器可以共享一张GPU。因为容器是进程级的程序所以分配GPU可以达到显存级。

上一篇下一篇

猜你喜欢

热点阅读