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文件参考文章

runc和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  阅读(280)  评论(0编辑  收藏  举报

导航