使用 Docker 容器的最大好處就是 “獨立性強(qiáng)”,在前面文章中我們教大家如何使用 NVIDIA 在 NGC 提供創(chuàng)建好的 l4t-ml 系列鏡像為基礎(chǔ),去創(chuàng)建各種機(jī)器學(xué)習(xí) / 深度學(xué)習(xí)的開發(fā)或部署用途的獨立容器,包括各種基于 TensorRT 的推理應(yīng)用、基于 PyTorch 的各種 YOLO 相關(guān)應(yīng)用等等。
但是 l4t-ml 容器內(nèi)將大部分深度學(xué)習(xí)所需要的工具全部涵蓋進(jìn)去,使得這個容器鏡像變得十分龐大,例如配合 JetPack 5.0 DP 版本的 nvcr.io/nvidia/l4t-ml:r34.1.1-py3 鏡像需要占用 16.2G 空間,這對大部分存儲空間較為緊湊的 Jetson 邊緣設(shè)備來說是個不小的負(fù)擔(dān),需要進(jìn)一步的優(yōu)化。
熟悉 Docker 創(chuàng)建容器的人都知道,只要使用 “docker build -f DOCKERFILE” 方式就能創(chuàng)建容器,不過 Dockerfile 內(nèi)容是有復(fù)雜度的,至少包含以下兩大部分:
-
基礎(chǔ)鏡像
這是相對神奇的環(huán)節(jié),我們至少得先在一個“以操作系統(tǒng)為基礎(chǔ)”的基礎(chǔ)鏡像文件之上去創(chuàng)建新的容器,不過還好操作系統(tǒng)源頭都會提供這些基礎(chǔ)鏡像,只要我們能找到這些基礎(chǔ)鏡像的發(fā)行位置,就能在 Dockerfile 一開始使用 “FROM” 指令進(jìn)行導(dǎo)入。
在 Jetson 設(shè)備上使用的 L4T(Linxun for Tegra)版本 Ubuntu 操作系統(tǒng)是由 NVIDIA 所維護(hù),因此操作系統(tǒng)基礎(chǔ)鏡像也由 NVIDIA 所提供,并且存放在 NGC 云中心提供下載,可以在https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-base/tags 上找到詳細(xì)的內(nèi)容與下載的指令。
l4t-base 容器內(nèi)只有最基礎(chǔ)的操作系統(tǒng)、驅(qū)動與 Python 開發(fā)環(huán)境,并未安裝 CUDA、cuDNN 或 TensorRT 等開發(fā)庫,L4T 版本與 JetPack 版本是對應(yīng)的,請參考下表:
如果要使用 l4t-base 鏡像為基礎(chǔ),去創(chuàng)建與深度學(xué)習(xí)相關(guān)應(yīng)用的鏡像文件,就需要自行在 Dockerfile 內(nèi)加入 CUDA / cuDNN / TensorRT 以及其他所需要的依賴庫與軟件的安裝步驟,以下整理出不同 JetPack 版本所對應(yīng)的 CUDA / cuDNN / TensorRT / OpenCV 的版本,提供讀者在創(chuàng)建相關(guān)鏡像時候可以參考:
從上面簡表可以看出,在 JetPack 4.4 至 4.6 版本的操作系統(tǒng)都是 Ubuntu 18.04、CUDA 版本都是 10.2、Python3 的版本都是 3.6、OpenCV 版本都是 4.1.1,至于 cuDNN 與 TensoRT 則有些微的差異,基本上鏡像文件的兼容性比較高。不過到了 JetPack 5.0 之后,操作系統(tǒng)升級至 Ubuntu 20.04 版之后,包括 Python、OpenCV、CUDA 版本的變化就比較大,與 JetPack 4.x 版本的鏡像
基礎(chǔ)容器的版本編號是對應(yīng) L4T 版本號,如下圖:
因此要創(chuàng)建 Jetson 容器的首要工作,就是先確認(rèn)系統(tǒng)的 L4T 版本,然后再挑選合適的基礎(chǔ)鏡像來進(jìn)行創(chuàng)建的任務(wù)。
-
添加所需軟件的安裝步驟與其他細(xì)節(jié):
這部分就是將平常安裝軟件的正確步驟加入 Dockerfile,使用 “RUN” 指令來執(zhí)行所有安裝內(nèi)容,為了要讓容器結(jié)構(gòu)更加簡化,通常會將所有需要的依賴庫全部放在一個 “RUN” 指令里操作,因此創(chuàng)建者需要先收集并確認(rèn)所需要的內(nèi)容。
由于創(chuàng)建的容器會以 root 用戶進(jìn)行操作,因此過程都不需要用 “sudo” 去取得權(quán)限,可以直接使用 apt-get、pip 或 dpkg 等安裝方式,有些需要預(yù)先下載的 .deb、.whl 或壓縮文件,在使用過后最好刪除以減少空間的占用。
這部分的細(xì)節(jié)內(nèi)容相當(dāng)繁瑣,需要比較多的執(zhí)行經(jīng)驗與整理過程,對初學(xué)者來說難度較大,因此本文特別挑選 NVIDIA 高級工程師所維護(hù)的 jetson-container 開源項目,針對在 Jetson 設(shè)備上創(chuàng)建深度學(xué)習(xí)與 ROS 兩大類應(yīng)用,提供各種對應(yīng)的 Dockerfile 參考內(nèi)容,包括安裝 CUDA、cuDNN、TensorRT、OpenCV、PyTorch、TensorFlow 以及 ROS 相關(guān)環(huán)境的細(xì)節(jié),讀者可以參考這些內(nèi)容再進(jìn)行調(diào)整。
接下來就是下載 jetson-container 項目,并且以創(chuàng)建 l4t-ml 容為示范來進(jìn)行講解其操作的重點,讀者只要比照相同的邏輯進(jìn)行調(diào)整與修改,就能輕松地創(chuàng)建自己的應(yīng)用與開發(fā)用途的容器鏡像。
1、下載開源項目
項目開源倉位置在 https://github.com/dusty-nv/jetson-containers,請執(zhí)行以下指令下載到Jetson 設(shè)備上:
gitclonehttps://github.com/dusty-nv/jetson-containers
cdjetson-containers
項目倉的內(nèi)容總共有將近 60 個文件,主要分為以下三大類:
-
在主目錄下有 12 個以 “Dockerfile.xxx” 格式命名的文件,作為創(chuàng)建各種容器所需要的配置文件;
-
在 scripts 目錄下有 16 個創(chuàng)建容器與確認(rèn)各項相關(guān)軟件版本的 .sh 腳本文件;
-
在 test 目錄下有 21 個測試用的 Python 代碼。
接下來分析執(zhí)行的重點。
2、分析創(chuàng)建容器的腳本
這個項目主要提供深度學(xué)習(xí)與 ROS 兩大應(yīng)用類別的容器創(chuàng)建資源,真正的使用入口就是 scripts 目錄下的 docker_build_ml.sh 與 docker_build_ros.sh 這兩個腳本,其余腳本多是輔助用途的,用來協(xié)助判斷相關(guān)軟件版本,然后甚至對應(yīng)變量給執(zhí)行腳本進(jìn)行完整的鏡像創(chuàng)建步驟。
現(xiàn)在以 docker_build_ml.sh 為例來進(jìn)行說明,后面可以加上 all、TensorFlow 或 PyTorch 等機(jī)器學(xué)習(xí)框架選項,現(xiàn)在來看看腳本的主要內(nèi)容:
(1)確認(rèn)基礎(chǔ)鏡像版本:
前面說過,創(chuàng)建 Docker 鏡像的首要任務(wù)就是要確認(rèn) L4T 版本,然后指定 NGC 中合適的基礎(chǔ)鏡像版本,作為 Dockerfile 中第一個 “FROM” 的參數(shù),在 “docker build” 過程中下載這個鏡像。
-
腳本第 4 行 “source scripts/docker_base.sh” 會啟動 docker_base.sh 腳本以確認(rèn)需要下載的基礎(chǔ)鏡像版本;
-
而 docker_base.sh 第 3 行又呼叫 l4t_version.sh 腳本,獲取本系統(tǒng)上的 l4t 版本,例如為 r34.1.1,分別存入以下 5 個變量之中:
-
$L4T_VERSION=34.1.1
-
$L4T_RELEASE=34
-
$L4T_REVISION=1.1
-
$L4T_REVISION_MAJOR=1
-
$L4T_REVISION_MINOR=1
然后傳回給 docker_bash.sh 腳本使用;
-
docker_base.sh 根據(jù)上面變量決定基礎(chǔ)鏡像版本,存放到 $BASE_IMAGE_L4T 里,例如 “nvcr.io/nvidia/l4t-base:r34.1.1”,這樣就完成了第一個最重要的工作。
(2)確認(rèn) OpenCV 與 Python 版本:
腳本第 6、7 行分別執(zhí)行 opencv_version.sh 與 python_version.sh,去決定這兩個部分的版本。
其中 OpenCV 部分經(jīng)過作者修改之后固定為 4.5.0 版本,并以 $OPENCV_DEB與$OPENCV_URL 變量存放安裝包的下載路徑與名稱。而 Python 版本則指定于所使用的 Jetson 設(shè)備上的版本,如果是 JetPack 4.x 版本的設(shè)備則 Python 版本為 3.6,如果是 JetPack 5.0 以后版本的設(shè)備則 Python 版本為 3.8。
(3)確認(rèn)各容器相關(guān)應(yīng)用版本:
這部分主要是 PyTorch 與 TensorFlow 的版本,因為這兩個是目前深度學(xué)習(xí)領(lǐng)域使用率最高的框架,因此這里就以這兩個工具為主來創(chuàng)建深度學(xué)習(xí)的容器鏡像。
腳本第 37~137 行與 160~221 行的內(nèi)容,會根據(jù) $L4T_RELEASE 變量,分別針對創(chuàng)建 PyTorch 與 TensorFlow 鏡像所需要的配套資源,提供完整的對應(yīng)參數(shù),包括需要賦予對應(yīng)的下載鏈接、文件名稱、鏡像標(biāo)簽(tag)等等信息,在 PyTorch 部分還需要提供 torchvision 與 torchaudio 的版本。
下表是根據(jù) NGC 提供的 l4t-ml 鏡像所整理的各項版本信息:
前面判斷好相關(guān)版本信息之后,就會分別調(diào)用第 14 行 build_pytorch()與第 142 行 build_tensorflow()分別創(chuàng)建 l4t-pytorch 與 l4t-tensorflow 容器鏡像。
下面截屏是 build_pytorch()的主要內(nèi)容,會調(diào)用 scripts/docker_build.sh 腳本與目錄下的 Dockerfile.pytorch 配置文件,然后套用 6 個 “--build-arg” 參數(shù)進(jìn)行實際創(chuàng)建的工作,這樣就完成對 l4t-pytorch 鏡像的創(chuàng)建任務(wù)。
創(chuàng)建 l4t-tensorflow 鏡像的方式也是大致相同,就不重復(fù)說明。腳本最后第 229~235 行是創(chuàng)建包含 PyTorch 與 TensorFlow 兩種框架的 l4t-ml 鏡像,主要指令如下:
這樣就完成在 Jetson 上從頭創(chuàng)建深度學(xué)習(xí)相關(guān)的容器鏡像任務(wù),另一個創(chuàng)建 ROS 應(yīng)用的 docker_build_ros.sh 腳本內(nèi)容也是雷同,所有的關(guān)鍵就是先確認(rèn) $L4T_RELEASE 版本信息,其他的軟件版本都會根據(jù)這個參數(shù)進(jìn)行調(diào)整。
本文先講解這個開源項目內(nèi)的腳本內(nèi)容,下一篇文章會進(jìn)一步說明 Dockerfile 的主要細(xì)節(jié),這樣就能很輕松地掌握容器鏡像的創(chuàng)建過程。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4949瀏覽量
102830 -
容器
+關(guān)注
關(guān)注
0文章
494瀏覽量
22046 -
英偉達(dá)
+關(guān)注
關(guān)注
22文章
3749瀏覽量
90863 -
Docker
+關(guān)注
關(guān)注
0文章
455瀏覽量
11819
原文標(biāo)題:NVIDIA Jetson 系列文章(10):從頭創(chuàng)建Jetson的容器(1)
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論