nvidia-docker做了什么?
在nvidia jetson mount plugin中提到默认的docker和nvidia-docker打开容器的流程不同:
docker打开容器流程:docker --> dockerd -rpc-> containerd--> containerd-shim -->runc --> container-process
nvidia-docker打开容器流程:docker--> dockerd -rpc-> containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvidia-container --> runc -- > container-process
其实nvidia-docker在做了 nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvidia-container这些操作之后又调用的runc。
我们知道containerd这一步,会进行镜像的下载和解压到bundle中。
进入runc这一步之前,已经在filesystem bundle中准备好镜像解压文件,nvidia docker想必就是在bundle中注入了nvidia的driver等文件。
ps:
1、containerd-shim
containerd-shim is a small shim that sits in front of a runtime implementation that allows it to be reparented to init and handle reattach from the caller.
the cwd of the shim should be the path to the state directory where the shim can locate fifos and other information\
Arg0: id of the container
Arg1: bundle path
Arg2: runtime binary
在启动容器时,containerd-shim的命令行格式如下所示:
docker-containerd-shim 9decb150527a3b64a86b85cfc6faeb09f786dcb2f4e668611418280c75755539 /var/run/docker/libcontainerd/9decb150527a3b64a86b85cfc6faeb09f786dcb2f4e668611418280c75755539 docker-runc
此外,在containerd-shim这一步中,会进行runc的启动容器时的参数的组装
2、关于bundle文件参考文章
3、如果没有安装nvidia-docker如何实现nvidia-docker的功能呢?
可以从原始docker 用volume-driver选项
DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')
docker run -itd --volume-driver=nvidia-docker --volume=nvidia_driver_396.44:/usr/local/nvidia:ro $DEVICES <docker-image> bash -c "ldconfig;/bin/bash"
或者
# 其中396.44是安装的驱动的版本号
docker volume create --name=nvidia_driver_396.44 -d nvidia-docker
创建好卷后,docker volume inspect nvidia_driver_396.44会发现需要透传的文件都被收集到/var/lib/nvidia-docker/volumes/nvidia_driver/384.90下了,有很多符号链接和硬链接。最后创建容器的时候,使用下面的docker run 命令行参数就能把驱动、CUDA透传到容器里
--volume=nvidia_driver_384.90:/usr/local/nvidia:ro --volume=/usr/local/cuda/lib64:/usr/local/cuda/lib64:ro -e LD_LIBRARY_PATH=/usr/local/cuda/lib64/:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
或者
在镜像中装上cuda driver,然后用ls -la /dev | grep nvidia查出所有的设备,然后用device选项映射设备到容器中:
ls -la /dev | grep nvidia
crw-rw-rw- 1 root root 195, 0 Oct 25 19:37 nvidia0
crw-rw-rw- 1 root root 195, 255 Oct 25 19:37 nvidiactl
crw-rw-rw- 1 root root 251, 0 Oct 25 19:37 nvidia-uvm
docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash
参考:
1、contaierd-shim中,会根据不同情况进行runc参数的组装
2、nvidia-docker 作为Docker的一个包装,需要运行一个独立的daemon,实际上是一个Volume Plugin,nvidia-docker实现了一个专门的Volume Driver,指定用这个Driver创建Volume后,会自动针对宿主的驱动的版本,收集需要透传的文件统一放到一个目录下,直接把这个目录透传给容器就行
3、从原始docker 用device 选项实现nvidia-docker相同的功能
4、镜像中装上driver,然后查出来device,挨个用device选项 将deivce映射回到容器中
posted on 2021-11-23 12:53 MissSimple 阅读(294) 评论(0) 编辑 收藏 举报