0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

云知聲詳解AI計算用途和未來的發(fā)展趨勢

云知聲 ? 來源:djl ? 作者:云知聲 ? 2019-08-08 17:26 ? 次閱讀

計算任務容器化

Docker 是目前業(yè)內主流的容器技術,在各個領域得到廣泛的應用。容器的概念具有新穎的設計思想,非常方便開發(fā)、測試以及發(fā)布產品,并能保證在這幾個環(huán)節(jié)中軟件運行環(huán)境的一致性。Docker 和虛擬機是不一樣的,兩者差異很大,虛擬機需要大量的資源來模擬硬件,運行操作系統(tǒng),而 Docker 幾乎不會有計算性能的損失,輕量級是其顯著特點,所以得到廣泛的應用。

容器本質上是宿主機上的一個進程,一般來說,容器技術主要包括 cgroups (control groups) 和 namespace 這兩個內核特性,namespace 實現(xiàn)資源隔離,cgroups 實現(xiàn)資源限制。除此之外,在容器鏡像制作時,利用UnionFS 實現(xiàn) Copy on Write 的 Volume 文件系統(tǒng)。

Namespace 的作用就是隔離,是 Linux 在內核級別的隔離技術,從內核 2.4.19 開始逐漸引入并完善。它可以讓進程擁有自己獨立的進程號,網絡,文件系統(tǒng)(類似 chroot )等,不同 namespace 下的進程之間相互不可見。主要包括以下六類 namespace:

Mount namespace系統(tǒng)內核版本 >2.4.19

實現(xiàn)文件系統(tǒng)掛載

每個容器內有獨立的文件系統(tǒng)層次結構

UTS namespace

系統(tǒng)內核版本 >2.6.19

每個容器有獨立的 hostname 和 domain

name

IPC namespace

系統(tǒng)內核版本 >2.6.19

每個容器內有獨立的 System V IPC 和

POSIX 消息隊列系統(tǒng)

PID namespace

系統(tǒng)內核版本 >2.6.24

每個 PID namespace 中的進程有獨立的 PID,容器中的每個進程有兩個PID:容器中的 PID 和 host 上的 PID

Network namespace

系統(tǒng)內核版本 >2.6.29

每個容器用有獨立的網絡設備,IP 地址、

IP 路由表、端口號等

User namespace

系統(tǒng)內核版本 >3.8

容器中進程的用戶和組 ID 和 host 上不

同,每個容器有不同的用戶和組 、ID;

host 上的非 root 可以成為

usernamespace 中的root

容器通過 namespace 實現(xiàn)資源的隔離,每個容器可以有上述六種獨立的 namespace,有了資源隔離之后,如果不能對各個 namespace 下進程的資源使用做限制的話,那么 namespace 隔離也沒有意義了,所以在容器中,我們利用 cgroups 實現(xiàn)對進程以及其子進程的資源限制。

Cgroups 顧名思義就是把進程放到一個組里統(tǒng)一加以控制。根據(jù)官方的定義:

cgroups 是 Linux 內核提供的一種機制,這種機制可以根據(jù)特定的行為,把一系列系統(tǒng)任務及其子任務整合(或分隔)到按資源劃分等級的不同組內,從而為系統(tǒng)資源管理提供一個統(tǒng)一的框架。

通俗的來說,cgroups 可以限制、記錄、隔離進程組所使用的物理資源(包括:CPU、memory、IO 等)。需要說明是,我們可以通過本地的文件系統(tǒng)來管理 cgroups 配置,就像修改 /sys 目錄下的文件內容一樣,來類似修改cgroups配置。而且,在 docker引擎這一層已經幫我們屏蔽了底層的細節(jié),我們可以通過 docker 命令很方便的配置 cgroups 相關的參數(shù)

針對CPU資源,cgroups 提供了三種限制CPU資源的方式:cpuset、cpuquota 和 cpushares。針對內存資源,提供包括物理內存和swap兩塊的限制。另外,blkio子系統(tǒng)的功能提供對塊設備讀寫的速率限制。由于篇幅限制,關于cgroups 的介紹不詳細展開。

除了上述 namespace 和 cgroups 實現(xiàn)資源隔離和限制之外,容器利用 UnionFS 提供容器鏡像 (images) 的基礎文件系統(tǒng)。UnionFS 文件系統(tǒng)是分層的,當我們需要修改一個文件的內容的時候,會將這個文件拷貝一份新的放到最上層的目錄上然后修改文件,實際上,下層的目錄并沒有改動。這也是容器鏡像文件系統(tǒng)的一個核心特性,基于此特性:

實現(xiàn)容器鏡像的分層復用和共享,在基礎鏡像的基礎上構建新鏡像,而不需要從零開始構建,容器鏡像也有自己的標準規(guī)范(https://github.com/opencontainers/image-spec),多鏡像之間可以復用共享,還可以通過 DockerHub 等網站共享與分發(fā)鏡像。

由于 Copy on Write 特性,在使用時需要注意避免不當?shù)臉嫿ǚ绞?,導致鏡像的 size 過大。

容器鏡像中只包含必要的運行環(huán)境(依賴的庫等),,同一節(jié)點上的各個容器共享 kernel,相比與虛擬機的重量級封裝,鏡像的 size 可以做的很小。

容器的核心特點是輕量級的資源隔離、限制和封裝,極大的簡化了程序運行時的環(huán)境依賴,同時還能解決多版本共存運行的問題,計算程序和運行節(jié)點之間獨立,為進一步的多節(jié)點間的自動調度奠定了基礎。下圖展示的是容器中計算程序封裝的邏輯圖。其最大好處是整體運行環(huán)境的封裝,在此邏輯下,用戶也會逐步從傳統(tǒng)的 make build 生成可執(zhí)行文件過渡到利用 docker build 制作應用鏡像,容器的使用也會越來越廣泛。

總結一下,使用容器技術作為計算程序運行環(huán)境封裝,帶來諸多優(yōu)勢:

一致的運行環(huán)境,解決計算框架環(huán)境依賴、安裝配置繁瑣的問題;

多個計算框架可以共存運行,同一個計算框架的多版本也可以共存運行;

計算節(jié)點與運行環(huán)境獨立,這是實現(xiàn)多節(jié)點計算自動調度的基礎;

一次構建,隨時隨地多次運行;

基于上述容器技術帶來的優(yōu)勢,目前主流的 AI 計算框架都支持以容器的方式運行,也逐漸成為社區(qū)的標準運行方式,TensorFlow 官方也在 Dockerhub 上直接提供 TensorFlow 各個版本的相關鏡像下載。其他 AI 計算框架也以提供 Dockerfile 的形式或者直接提供 Docker images 供用戶使用。同時,用戶也可以根據(jù)自己的計算需求或者以自己的應用算法為基礎,創(chuàng)建和維護專用鏡像文件。

GPU計算任務容器化

AI 算法目前使用 GPU 提供計算加速,所以,容器方式運行的 AI 計算框架需要同時支持 CPU 和 GPU 兩種運行方式。CPU 版的運行和常規(guī)容器運行方式無異,GPU 版的運行方式略微復雜,為此 Nvidia 官方推出 Nvidia-docker(https://github.com/NVIDIA/nvidia-docker)工具簡化 GPU 版的運行方式和流程。在介紹 nvidia-docker 工具之前,我們先看下 GPU 容器的架構邏輯圖,如下所示,從下往上分為:

硬件層:在每個 GPU 計算節(jié)點上配置一個或者多個 GPU 硬件資源。

軟件層:每個計算節(jié)點安裝操作系統(tǒng)和相應的 GPU drivers。

Docker:每個計算節(jié)點安裝 Docker engine 服務。

容器:容器中包含計算相關的運行環(huán)境和 CUDA 庫,并且將 host 上的 GPU 設備和驅動動態(tài)庫映射到容器中。

云知聲詳解AI計算用途和未來的發(fā)展趨勢

用戶可以通過 docker 命令 --device 和 --volume 等參數(shù)實現(xiàn) GPU 設備和動態(tài)庫映射,但是,使用起來不方便,而 nvidia-docker 的功能就是簡化 GPU 容器創(chuàng)建和運行,其是一個 wrapper 的 Bash 腳本,封裝了 docker 的命令參數(shù)。從下面腳本中可以看出,當用戶使用 nvidia-docker 執(zhí)行 run 和 create 這兩個子命令時,nvidia-docker 做了兩個改變:

切換runtime 為 nvidia runtime

如果用戶定義了 NV_GPU 環(huán)境變量,則將 NV_GPU 環(huán)境變量的信息傳給環(huán)境變量 NVIDIA_VISIBLE_DEVICES

云知聲詳解AI計算用途和未來的發(fā)展趨勢

基于以上分析,我們可以得到兩個結論:

nvidia-docker 在除 run 和 create 之外的其他子命令,和普通的 docker 并無太大區(qū)別。所以,我們沒法在使用其他 docker 子命令時(比如 docker build),執(zhí)行需要使用 GPU 資源的相關代碼。

nvidia-docker 實現(xiàn)簡化 GPU container 運行,實際上是通過 nvidia runtime 實現(xiàn),并利用 runtime 的環(huán)境變量 NVIDIA_VISIBLE_DEVICES 控制容器中能夠使用的 GPU 數(shù)量。

NVIDIA_VISIBLE_DEVICES 默認值是 all,其含義是 GPU Container 可使用計算節(jié)點上的所有 GPU 資源,用戶利用 NV_GPU 控制可用 GPU 資源數(shù)量,而 nvidia-docker 腳本再將 NV_GPU 傳遞給 NVIDIA_VISIBLE_DEVICES。我們可以通過兩種方式設置 NV_GPU:

指定 GPU index,此 index 和 nvidia-smi 顯示的 GPU index 一致

指定 GPU 的 UUID

如下面所示:

# Running nvidia-docker isolating specific GPUs by index

NV_GPU='0,1' nvidia-docker

# Running nvidia-docker isolating specific GPUs by UUID

NV_GPU='GPU-836c0c09,GPU-b78a60a' nvidia-docker

下圖展示的是 nvidia-docker2 的工作邏輯圖,GPU 相關的核心工作是由 nvidia-container-runtime 實現(xiàn)的。nvidia container runtime 是 Nvidia 定義的一種 GPU 運行環(huán)境 (https://github.com/NVIDIA/nvidia-container-runtime),基于對 runc (https://github.com/opencontainers/runc)運行環(huán)境的一種修改版本,符合 openContainer 的 OCI 標準定義。

云知聲詳解AI計算用途和未來的發(fā)展趨勢

為了提供一定的靈活性,nvidia-container-runtime 定義了一些 GPU 相關的環(huán)境變量。比如,控制 GPU 使用數(shù)目的 NVIDIA_VISIBLE_DEVICES。下面所示的是兩個常用的環(huán)境變量示例。詳細的環(huán)境變量參見:

https://github.com/NVIDIA/nvidia-container-runtime#environment-variables-oci-spec

NVIDIA_VISIBLE_DEVICES:控制在容器中使用的 GPU 數(shù)目,可選項:

0,1,2, GPU-fef8089b …: GPU UUID 或者 GPU 索引列表

all: 默認值,在容器中可以使用節(jié)點上的所有 GPU 資源

none: 只加載 GPU 驅動,但 GPU 設備不可使用

void or empty or unset: 等同于常規(guī)的 runc

NVIDIA_DRIVER_CAPABILITIES:控制容器如何掛載 GPU 驅動和附屬文件,可選項:

compute,video,graphics,utility …: 驅動功能列表,對于 deep learning 需要開啟 compute

compute: CUDA and OpenCL 計算應用

compat32: 兼容 32位計算應用

graphics: OpenGL and Vulkan 圖形應用

utility: nvidia-smi and NVML 等命令行工具使用

video: 視頻編解碼

all: 開啟驅動所有功能

empty or unset: 空或者不設置,默認值為:utility

我們根據(jù)nvidia-container-runtime Github 上的代碼,具體分析其是如何工作的。首先,我們看一下 nvidia-container-runtime 如何編譯出來的,通過下面節(jié)選的關鍵代碼,nvidia-container-runtime 是在 runc 代碼的基礎上,打上一個 patch,然后編譯,并重命名為 nvidia-container-runtime。

云知聲詳解AI計算用途和未來的發(fā)展趨勢

此 patch 加了一個 prestart Hook,在容器創(chuàng)建時,執(zhí)行程序 nvidia-container-runtime-hook。除此改動之外,nvidia-container-runtime 其余相關的功能依賴 runc 實現(xiàn)。nvidia-container-runtime-hook 是一個 go 語言實現(xiàn)的可執(zhí)行程序,主要功能是讀取當前容器的配置信息 config.json,和 runtime 配置文件 /etc/nvidia-container-runtime/config.toml,并處理 runtime 定義的環(huán)境變量。

nvidia-container-runtime-hook 的上述功能是通過調用 nvidia-container-cli 實現(xiàn) (https://github.com/NVIDIA/libnvidia-container),nvidia-container-cli 也是 Nvidia 官方維護的一個 GPU 工具,其主要功能包括:

加載 GPU 驅動運行動態(tài)庫

掛載 GPU 設備文件

配置參數(shù)

更新系統(tǒng)動態(tài)庫緩存

下圖展示的是 nvidia-docker2 調用邏輯與環(huán)境變量傳遞圖,從 nvidia-docker2 開始,容器最終的 GPU 配置由 nvidia-container-cli 執(zhí)行。圖中右側是用戶可以設置的環(huán)境變量傳遞圖,從 nvidia-docker2 層級的 NV_GPU 到最終轉化為 nvidia-container-cli 命令的 --compute --device 等參數(shù)。

云知聲詳解AI計算用途和未來的發(fā)展趨勢

總結

本篇針對如何簡單有效的實現(xiàn)在單機上使用 GPU 和 TensorFlow 等 AI 計算框架,深入介紹任務容器化的基本思路和概念,詳細分析了 nvidia-docker2 的工作流程和實現(xiàn)邏輯。借助 nvidia-docker2,在單機上運行 AI 計算任務更加方便,解決了安裝配置框架以及多版本共存運行的問題,也避免了配置使用 GPU 的繁瑣工作量。

本篇為 AI 計算系列:從單機到集群(上),那么后續(xù)篇 —— 從單機到集群(中)繼續(xù)為大家?guī)?AI 計算系列的分享,將在本篇介紹單機 AI 計算的基礎上,實現(xiàn)從單機到集群的跨越,重點介紹如何構建面向 AI 計算的 GPU 集群,分析最新 AI 計算集群的 GPU 資源調度邏輯,幫助大家更進一步理解如何實現(xiàn)多機 GPU 資源的自動分配和管理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 硬件
    +關注

    關注

    11

    文章

    3353

    瀏覽量

    66334
  • 軟件
    +關注

    關注

    69

    文章

    4985

    瀏覽量

    87804
  • 人工智能
    +關注

    關注

    1792

    文章

    47492

    瀏覽量

    239176
收藏 人收藏

    評論

    相關推薦

    公眾wifi的未來發(fā)展趨勢

    的商業(yè)信息。因為不管現(xiàn)狀如何,擁有3.8億智能手機的用戶,這個市場已經有很好的用戶基礎,迫使商家尋找各種各樣的創(chuàng)新經營思路,這是商用Wi-Fi市場的發(fā)展規(guī)律,也是公眾wifi的未來發(fā)展趨勢
    發(fā)表于 04-09 10:13

    藍牙技術未來發(fā)展趨勢

    藍牙技術未來發(fā)展趨勢,在APTX后還會有怎么樣的技術革新
    發(fā)表于 03-29 15:56

    計算未來趨勢及入門計算介紹

    計算未來趨勢是什么?新手怎么入門計算
    發(fā)表于 06-19 10:35

    打磨四年的AI芯片出爐

    打磨四年的AI芯片出爐,中國造芯勢力群起
    發(fā)表于 05-05 09:11

    靈動微對于未來MCU發(fā)展趨勢分析

    靈動微對于未來MCU發(fā)展趨勢看法
    發(fā)表于 12-23 06:50

    電源模塊的未來發(fā)展趨勢如何

    電源模塊的未來發(fā)展趨勢如何
    發(fā)表于 03-11 06:32

    電池供電的未來發(fā)展趨勢如何

    電池供電的未來發(fā)展趨勢如何
    發(fā)表于 03-11 07:07

    蜂窩手機音頻架構的未來發(fā)展趨勢是什么

    蜂窩手機音頻架構的未來發(fā)展趨勢是什么
    發(fā)表于 06-08 06:31

    未來PLC的發(fā)展趨勢將會如何?

    未來PLC的發(fā)展趨勢將會如何?基于PLC的運動控制器有哪些應用?
    發(fā)表于 07-05 07:44

    計算產業(yè)發(fā)展現(xiàn)狀及趨勢

    計算產業(yè)發(fā)展現(xiàn)狀及趨勢,本文講的是計算時代IT產業(yè)六大發(fā)
    發(fā)表于 07-27 06:25

    物聯(lián)網未來發(fā)展趨勢

    物聯(lián)網未來發(fā)展趨勢如何?物聯(lián)網用途廣泛,遍及智能交通、環(huán)境保護、***工作、公共安全、平安家居、智能消防、工業(yè)監(jiān)測、環(huán)境監(jiān)測、路燈照明管控、景觀照明管控、樓宇照明管控、廣場照明管控、老人護理、個人
    發(fā)表于 03-11 15:04

    什么是私有?未來發(fā)展趨勢如何?

    已成為政企構建環(huán)境的核心組件。那么,什么是私有?有哪些優(yōu)勢?市場競爭情況及未來發(fā)展趨勢又是怎么樣的? 什么是私有? 私有
    的頭像 發(fā)表于 06-08 11:07 ?1208次閱讀

    未來AI大模型的發(fā)展趨勢

    未來AI大模型的發(fā)展趨勢將呈現(xiàn)多元化和深入化的特點,以下是對其發(fā)展趨勢的分析: 一、技術驅動與創(chuàng)新 算法與架構優(yōu)化 : 隨著Transformer架構的廣泛應用,
    的頭像 發(fā)表于 10-23 15:06 ?710次閱讀

    計算技術的未來發(fā)展趨勢

    計算技術的未來發(fā)展趨勢呈現(xiàn)出多元化和高度集成的特點,以下是對其未來發(fā)展趨勢的介紹: 一、市場規(guī)
    的頭像 發(fā)表于 10-24 09:20 ?1539次閱讀

    邊緣計算未來發(fā)展趨勢

    邊緣計算未來發(fā)展趨勢呈現(xiàn)出多元化和高速增長的態(tài)勢,以下是對其未來發(fā)展趨勢的分析: 一、技術融合與創(chuàng)新 與5G、
    的頭像 發(fā)表于 10-24 14:21 ?1036次閱讀