在容器中調用nvidia GPU,官方提供了nvidia-docker2, nvidia-container-runtime,nvidia-container-tookit等多種方式,很多人不知道這幾個的區別,官方文檔也比較分散,今天我們就來說一說。
libnvidia-container:該包確保容器能使用 NVIDIA GPU 來運行任務。它被設計為與容器運行時無關,并提供了定義良好的 API 和包裝器 CLI,不同的runtime可以調用這些 API 來將 NVIDIA GPU 支持注入到其容器中。
nvidia-container-toolkit:該軟件包包含一個腳本,該腳本實現了 runC 預啟動掛鉤所需的接口。該腳本由 runC 在創建容器之后、啟動之前調用,并有權訪問與容器關聯的 config.json。然后,它獲取 config.json 中包含的信息,并通過設置合適的標志來調用 libnvidia-container CLI。其中最重要的標志之一是應將哪些特定 GPU 設備注入到容器中。
nvidia-container-runtime:該軟件包曾經是 runC 的完整分支,其中注入了 NVIDIA 特定代碼。如今,它是安裝在計算機上的本機 runC 的薄包裝。它所做的只是將 runC 規范作為輸入,將 nvidia-container-toolkit 腳本作為預啟動鉤子注入其中,然后調用本機 runC,將帶有該鉤子集的修改后的 runC 規范傳遞給它。需要注意的是,這個包不一定特定于 docker(但它特定于 runC)
nvidia-docker2這個包是其中唯一一個特定于 docker 的包。它獲取與 nvidia-container-runtime 關聯的腳本并將其安裝到 docker 的 /etc/docker/daemon.json 文件中。然后,您可以運行 docker run --runtime=nvidia 來自動向容器添加 GPU 支持。它還在本機 docker CLI 周圍安裝了一個名為 nvidia-docker 的包裝器腳本,它允許您調用 docker,而無需每次都指定 --runtime=nvidia。它還允許您在主機 (NV_GPU) 上設置環境變量,以指定應將哪些 GPU 注入到容器中。
所以如果只安裝 nvidia-container-toolkit (建議在 Docker 19.03+ 中安裝),那么 nvidia-container-runtime 將不會作為其中的一部分安裝,因此無法使用--runtime =nvidia。這對 Docker 19.03+ 來說沒問題, 當使用--gpus 選項時,它會直接調用 nvidia-container-toolkit,而不是依賴 nvidia-container-runtime 作為代理。
但是如果想將 Kubernetes 與 Docker 19.03 一起使用,實際上需要繼續使用 nvidia-docker2,因為 Kubernetes 還不支持通過 --gpus 標志將 GPU 信息傳遞給 docker。它仍然依賴 nvidia-container-runtime 通過一組環境變量將 GPU 信息傳遞到堆棧中。