概述
本次實踐的環(huán)境:
Ubuntu18.04
docker version : 18.09.5
查看nvidia-docker版本命令
dpkg -l |grep nvidia-docker
nvidia-docker2 : 2.2.2 > 注意nvdia-docker1和2是不兼容的
nvidia-docker調(diào)用GPU
在docker中調(diào)用英偉達的gpu可以通過nvidia-docker調(diào)用定欧,nvidia-docker是一個可以使用GPU的docker猜绣,nvidia-docker是在docker上做了一層封裝处硬,通過nvidia-docker-plugin,然后調(diào)用到docker上污秆,其最終實現(xiàn)的還是在docker的啟動命令上指定runtimes為nvidia-container-runtime,具體的參數(shù)在可以通過查看/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并加上一系列的參數(shù)庸推。
k8s中調(diào)用GPU
k8s在v1.8版本后推薦使用NVIDIA/k8s-device-plugin來調(diào)用GPU。其實就是集群版的nvidia-docker...都是暴露gpu分配調(diào)度接口浇冰,并進行監(jiān)聽贬媒。原理參照k8s插件原理。
預準備
- NVIDIA drivers ~= 361.93
- nvidia-docker version > 2.0 (see how to install and it's prerequisites)
- Kubernetes version >= 1.10
- 接下來設置默認runtime.
vim /etc/docker/daemon.json
重啟docker使配置生效
systemctl restart docker
- 安裝k8s-device-plugin
在master節(jié)點上運行
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的node上肘习,守護Pods中多了nvidia-device-plugin-daemonset用于監(jiān)聽和分配gpu际乘,在Allocated resources(可分配資源)中多了gpu。
測試k8s中g(shù)pu的使用
- 編寫資源清單
vim gpu_test.yaml
內(nèi)容的組織形式類似docker file
apiVersion: v1
kind: Pod
metadata:
name: ffmpeg-pod
spec:
nodeName: wangzishen-ms-7846 #指定有g(shù)pu的節(jié)點
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
- 創(chuàng)建Pod
kubectl create -f gpu_test.yaml
啟動的過程中會去docker hub拉取nightseas/ffmpeg:latest這個鏡像脖含,在啟動過程中可以通過
kubectl describe pod ffmpeg-pod
查看當前的執(zhí)行情況- 進入Pod調(diào)用gpu進行視頻轉(zhuǎn)碼
kubectl exec ffmpeg-pod -it -- bash
- 下載視頻
wget http://xxxxxxxx/tmp/00000000088000000.mp4
- 進行轉(zhuǎn)碼
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 00000000088000000.mp4 -vf scale_npp=1280:720 -vcodec h264_nvenc out.mp4
-
查看gpu調(diào)用情況
在有g(shù)pu的節(jié)點上watch nvidia-smi,可以看到gpu已經(jīng)被運行在k8s中的容器通過k8s-device-plugin調(diào)用投蝉。
調(diào)用情況
多個pod共享一張GPU
不行养葵,pod在創(chuàng)建的時候請求gpu最低是卡級別,一張顯卡只能分配給一個pod瘩缆。但是一個pod是由多個容器組成的关拒,所以同一個pod的容器可以共享分配給當前pod的所有GPU。
多個docker容器共享一張GPU
可以。通過nvidia-docker啟動的容器可以共享一張GPU夏醉。因為容器是進程級的程序所以分配GPU可以達到顯存級爽锥。