容器是如何調(diào)用GPU的

容器使用GPU的主要需求有兩個(gè):

  • 容器中可以查看GPU設(shè)備
  • 容器應(yīng)用可以操作GPU顯卡

Nvidia GPU對(duì)容器的支持具體可見:Enabling GPUs in the Container Runtime Ecosystem

Nvidia-docker

Nvidia推出Nvidia-docker套件以支持容器對(duì)GPU的操作。安裝完Nvidia-docker后,在/etc/docker/daemon.jsonrumtimes中注冊(cè)nvidia runtime,使用nvidia runtime運(yùn)行的容器就可通過容器中的Nvidia驅(qū)動(dòng)操作GPU顯卡。

Nvidia-docker項(xiàng)目只是建立在容器層的設(shè)計(jì),真正調(diào)用GPU的核心支持放在libnvidia-container。該庫基于Linux內(nèi)核原語,與更高的容器運(yùn)行時(shí)層無關(guān)。這樣就可以將GPU支持?jǐn)U展到不同的容器環(huán)境中,例如Docker、LXC和CRI-O。該庫包含一個(gè)cli工具并提供API以便繼承到其他運(yùn)行時(shí)環(huán)境中。Nvidia將容器使用GPU需要的運(yùn)行時(shí)中的庫、工具和層集成到Nvidia-container-runtime中。這個(gè)就是GPU容器在啟動(dòng)時(shí)指定的那個(gè)runtime。

Nvidia-container-runtime

是Nvidia維護(hù)的一個(gè)容器runtime,它對(duì)runc進(jìn)行了二次修改(runc是一個(gè)根據(jù)OCI標(biāo)準(zhǔn)來創(chuàng)建和運(yùn)行容器的輕量級(jí)工具),對(duì)所有指定nvidia runtime的容器注入一個(gè)自定義的pre-start hook,使容器支持GPU操作。

Nvidia-container-runtime的構(gòu)建關(guān)系如圖:

NVIDIA Container Runtime Docker GPU

Nvidia-container-runtime-hook是一個(gè)二進(jìn)制包,作用是將當(dāng)前容器中的信息收集并處理,轉(zhuǎn)換為參數(shù)調(diào)用libnvidia-containernvidia-container-cli工具。比如對(duì)環(huán)境變量NVIDIA_VISIBLE_DEVICES的處理,如果未指定或是void,則認(rèn)為是非GPU容器,不做任何處理;否則調(diào)用nvidia-container-cli配置容器對(duì)GPU硬件的使用支持,將Nvidia 驅(qū)動(dòng)庫的so文件 和 GPU設(shè)備信息, 通過文件掛載的方式映射到容器中。環(huán)境變量中指定了哪幾個(gè)GPU就掛載哪幾個(gè)GPU。Nvidia-container-runtime-hook還負(fù)責(zé)傳入容器GPU應(yīng)用進(jìn)程的Pid。

nvidia-container-cli的configure組件中負(fù)責(zé)掛載GPU的部分代碼:

        /* Mount the driver, visible devices, mig-configs and mig-monitors. */
        if (perm_set_capabilities(&err, CAP_EFFECTIVE, ecaps[NVC_MOUNT], ecaps_size(NVC_MOUNT)) < 0) {
                warnx("permission error: %s", err.msg);
                goto fail;
        }
        if (nvc_driver_mount(nvc, cnt, drv) < 0) {
                warnx("mount error: %s", nvc_error(nvc));
                goto fail;
        }
        for (size_t i = 0; i < devices.ngpus; ++i) {
                if (nvc_device_mount(nvc, cnt, devices.gpus[i]) < 0) {
                        warnx("mount error: %s", nvc_error(nvc));
                        goto fail;
                }
        }

在容器中使用mount命令可以看到掛載的GPU

image-20201012210204065.png

使用nvidia-smi命令查看被映射的GPU卡


image-20201012210340046.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容