首頁 >運維 >Docker >nvidia docker2是什麼

nvidia docker2是什麼

藏色散人
藏色散人原創
2021-12-08 17:27:524349瀏覽

nvidia-docker2.0是一個簡單的包,它主要透過修改docker的設定檔「/etc/docker/daemon.json」來讓docker使用NVIDIA Container runtime。

nvidia docker2是什麼

本文操作環境:Windows10系統、Docker 20.10.11版、Dell G3電腦。

NVidia Docker介紹

NVIDIA於2016年開始設計NVIDIA-Docker已方便容器使用NVIDIA GPUs。第一代nvidia-docker1.0實作了docker client的封裝,並在容器啟動時,將必要的GPU device和libraries掛載到容器中。但是這種設計的方式高度的與docker運行時耦合,缺乏彈性。存在的缺陷具體如下:

設計高度與docker耦合,不支援其它的容器運行時。如: LXC, CRI-O及未來可能增加的容器運作時。

不能更好的利用docker生態的其它工具。如: docker compose。

不能將GPU當作調度系統的一種資源來進行靈活的調度。

完善容器運行時對GPU的支援。如: 自動的獲取用戶層面的NVIDIA Driver libraries, NVIDIA kernel modules, device ordering等。

基於上面描述的這些弊端,NVIDIA開始了對下一代容器運行時的設計: nvidia-docker2.0。

nvidia-docker 2.0 的實作機制

先簡單介紹下nvidia-docker 2.0, containerd,nvidia-container-runtime,libnvidia-container以及runc直接的關係。

它們之間的關係可以透過下面這張圖關聯起來:

nvidia docker2是什麼

#nvidia-docker 2.0

nvidia-docker2.0 是一個簡單的套件,它主要透過修改docker的設定檔/etc/docker/daemon.json來讓docker使用NVIDIA Container runtime。

nvidia-container-runtime

nvidia-container-runtime 才是真正的核心部分,它在原有的docker容器運行時runc的基礎上增加一個prestart hook,用於呼叫libnvidia-container函式庫。

libnvidia-container

libnvidia-container 提供一個函式庫和一個簡單的CLI工具,使用這個函式庫可以讓NVIDIA GPU被Linux容器使用。

Containerd

Containerd主要負責的工作是:

  • 管理容器的生命週期(從容器的建立到銷毀)

  • 拉取/推送容器映像

  • #儲存管理(管理鏡像及容器資料的儲存)

  • 呼叫runc 運行容器

  • 管理容器的網路介面及網路

nvidia docker2是什麼

當containerd接收到請求之後,做好相關的準備工作,可以選擇自己呼叫runc也可以透過建立containerd-shim再去呼叫runc,而runc是基於OCI檔案對容器進行建立。上面就是普通容器所建立的基本流程。

RunC

RunC 是一個輕量級的工具,它是用來運行容器的,只用來做這一件事,而這一件事要做好。我們可以認為它就是一個命令列小工具,可以不用通過 docker 引擎,直接運行容器。事實上,runC 是標準化的產物,它根據 OCI 標準來創建和運行容器。而 OCI(Open Container Initiative)組織,旨在圍繞容器格式和運行時制定一個開放的工業化標準。

直接使用RunC的命令列即可以完成建立一個容器,並提供了簡單的互動能力。

上面已經介紹個各個元件的作用以及它們之間的關係,接下來詳細的描述下這張圖:

nvidia docker2是什麼

正常建立一個容器的流程是這樣的:

docker --> dockerd --> containerd--> containerd-shim -->runc --> container-process

docker客戶端將創建容器的請求發送給dockerd, 當dockerd收到請求任務之後將請求發送給containerd, containerd經過查看校驗啟動containerd-shim或者自己來啟動容器進程。

建立一個使用GPU的容器

建立GPU容器的流程如下:

docker--> dockerd --> containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvidia-container --> runc -- > container-process

基本流程和不使用GPU的容器差不多,只是把docker預設的運行時替換成了NVIDIA自家的nvidia-container-runtime。

這樣當nvidia-container-runtime建立容器時,先執行nvidia-container-runtime-hook這個hook去檢查容器是否需要使用GPU(透過環境變NVIDIA_VISIBLE_DEVICES來判斷)。如果需要則呼叫libnvidia-container來暴露GPU給容器使用。否則走預設的runc邏輯。

說到這裡nvidia-docker2.0的大體機制基本上就通了。但涉及到的nvidia-container-runtime, libnvidia-container, containerd,runc這些項目, 這本篇文章裡面就不一一介紹了。如果有興趣可以自行去探索學習。這些項目的地址在文章中都已經做個相關的連結。

推薦學習:《Docker影片教學

以上是nvidia docker2是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn