网易首页 > 网易号 > 正文 申请入驻

NVIDIA Jetson 系列文章(11):从头创建Jetson的容器(2)

0
分享至

前一篇文章已经对 Jetson-container 的容器创建脚本进行较为深入的说明,主要是为了更广泛地适用于不同 JetPack 版本的环境,因此使用嵌套式脚本的处理方式,初看之下会觉得相当繁琐,不过只要将脚本之间负责传递信息的变量内容理清,就会有种豁然开朗的感觉,并不难懂。

本文将带大家继续深入了解 Dockerfile 镜像创建过程中最重要的配置文件内容,更加透彻地了解整个容器镜像的创建过程。

3、使用 docker_build.sh 脚本创建容器:

在 scripst/docker_build_ml.sh 里有三处调用 scripst/docker_build.sh 脚本的部分,才是真正创建个别容器的环节。

以创建 l4t-pytorch 的 build_pytorch() 函数为例,在第 26 行调用 docker_build.sh 脚本并提供所有需要的相关参数:

sh ./scripts/docker_build.sh $pytorch_tag Dockerfile.pytorch \\ --build-arg BASE_IMAGE=$BASE_IMAGE \\ --build-arg PYTORCH_URL=$pytorch_url \\ --build-arg PYTORCH_WHL=$pytorch_whl \\ --build-arg TORCHVISION_VERSION=$vision_version \\ --build-arg TORCHAUDIO_VERSION=$audio_version \\ --build-arg TORCH_CUDA_ARCH_LIST=$cuda_arch_list \\ --build-arg OPENCV_URL=$OPENCV_URL \\ --build-arg OPENCV_DEB=$OPENCV_DEB

再看看 docker_build.sh 内容,里面里其实只有 “docker build -t $CONTAINER -f $DOCKERFILE "$@" .” 这一道创建镜像的指令,而相关所需要的参数都在上图中做好完整的配置。

这里调用了主目录下的 Dockerfile.pytorch,并且以 “--build-arg” 方式将相关参数去对应 Dockerfile.pytorch 配置文件里的变量,这些变量在 Dockerfile 里可能会提供预设值,但是这些新的设定值就会覆盖掉配置文件的预设值。

创建 l4t-tensorflow 镜像的方式也是一样的,在第 172 行 buidl_tensorflow() 函数里第 181~187 行内容(如下),也是调用 docker_build.sh 脚本去执行,不过配置文件改成 Dockerfile.tensorflow,其他需要的参数也有所调整。

sh ./scripts/docker_build.sh $tensorflow_tag Dockerfile.tensorflow \\ --build-arg BASE_IMAGE=$BASE_IMAGE \\ --build-arg TENSORFLOW_URL=$tensorflow_url \\ --build-arg TENSORFLOW_WHL=$tensorflow_whl \\ --build-arg PROTOBUF_VERSION=$protobuf_version \\ --build-arg OPENCV_URL=$OPENCV_URL \\ --build-arg OPENCV_DEB=$OPENCV_DEB

在第 275~281 行用同样的模式去创建 l4t-ml 镜像,同样调用 docker_build.sh 脚本,不过配置文件换成 Dockerfile.ml,相关配套参数也要根据配置文件内的实际状况进行调整,这里就不重复说明。

4、分析 Dockerfile 内容:

这个项目所提供的脚本,主要功能是为将对应的 Dockerfile 进行变量配置的工作,现在以创建 l4t-ml 镜像会使用到的 Dockerfile.pytorch、Dockerfile.tensorflow 与 Dockerfile.ml 为例,简单说明一下几个环节:

1)检查 Dockerfile 的变量

可以用文字编辑器打开这些文件,使用 “搜索” 功能查找关键字 “ARG”,就能轻松找到里面的各项变量与预设值。

下面列出 Dockerfile.pytorch 的 6 个变量与预设值:

ARG BASE_IMAGE=nvcr.io/nvidia/l4t-base:r32.4.4ARG PYTORCH_URL=https://nvidia.box.com/shared/static/xxx.whlARG PYTORCH_WHL=torch-1.2.0-cp36-cp36m-linux_aarch64.whlARG TORCHVISION_VERSION=v0.4.0ARG TORCH_CUDA_ARCH_LIST="5.3;6.2;7.2;8.7"ARG TORCHAUDIO_VERSION

下面列出 Dockerfile.tensorflow 的 9 个变量与预设值:

ARG BASE_IMAGEARG HDF5_DIR="/usr/lib/aarch64-linux-gnu/hdf5/serial/"ARG MAKEFLAGS=-j$(nproc)ARG PROTOBUF_VERSION=3.19.4ARG PROTOBUF_URL=https://。。。/v${PROTOBUF_VERSION}ARG PROTOBUF_DIR=protobuf-python-${PROTOBUF_VERSION}ARG PROTOC_DIR=protoc-${PROTOBUF_VERSION}-linux-aarch_64ARG TENSORFLOW_URL=https://。。。/。。。-linux_aarch64.whlARG TENSORFLOW_WHL=tensorflow-1.15.3+nv20.9-cp36-cp36m-linux_aarch64.whl

下面列出 Dockerfile.ml 的 10 个变量与预设值:

ARG BASE_IMAGE=nvcr.io/nvidia/l4t-base:r32.4.4ARG PYTORCH_IMAGEARG TENSORFLOW_IMAGEARG MAKEFLAGS=-j$(nproc) ARG PYTHON3_VERSION=3.8ARG CUPY_VERSION=v10.2.0ARG CUPY_NVCC_GENERATE_CODE="arch=compute_53。。。"ARG OPENCV_URL=https://nvidia.box.com/shared/static/。。。.gzARG OPENCV_DEB=OpenCV-4.5.0-aarch64.tar.gz

对照一下前面脚本所提供的参数,这样就能很轻松地了解前面脚本的任务与目的,如果前面脚本中有使用 “--build-arg” 设定的参数值,就会覆盖配置文件内的预设值。

2)导入所需要的基础镜像

这种 docker build 创建容器的方式,是必须基于某个(些)已经存在的基础容器之上,添加的相关依赖库与软件,因此首要工作就是从 “FROM ${BASE_IMAGE}” 导入指定的基础镜像开始,在 Dockerfile.pytorch 与 Dockerfile.tensorflow 就是如此,不过在 Dockerfile.ml 文件中还多了以下两行内容:

FROM ${PYTORCH_IMAGE} as pytorchFROM ${TENSORFLOW_IMAGE} as tensorflow

就是要从这两个镜像里提取 PyTorch 与 Tensorflow 的配套资源,如下所列的指令:

COPY --from=tensorflow /usr/local/bin/protoc /usr/local/binCOPY --from=tensorflow /usr/local/lib/libproto* /usr/local/lib/COPY --from=tensorflow /usr/local/include/google /usr/local/include/googleCOPY --from=pytorch /usr/local/lib/python2.7/dist-packages/ /usr/local/lib/python2.7/dist-packages/COPY --from=pytorch /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/ /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/COPY --from=tensorflow /usr/local/lib/python2.7/dist-packages/ /usr/local/lib/python2.7/dist-packages/COPY --from=tensorflow /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/ /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/

这是比较有技巧的安排,然后使用者可以独立创建 l4t-pytorch 与 l4t-tensorflow 镜像,也可以将这两个框架合并在 l4t-ml 镜像内,此时只要将前面两个镜像已经编译安装好的部分复制到新镜像里面里就可以。

我们当然也可以将 Dockerfile.pytorch 与 Dockerfile.tensorflow 里的安装步骤全部放入 Dockerfile.ml 里面,不过这样会让整个配置文件变得非常冗长,估计要超过 400 行的内容,其最大的麻烦之处是会导致除错工作变得相当复杂与冗长,因此这里将处理过程进行分割再做合并。

3)安装依赖库

在 Dockerfile 配置文件内使用 “RUN” 指定后面要执行的指令,后面加上 Ubuntu 使用的 apt-get install、pip install 等方式安装依赖库或软件。由于镜像的操作是设定为 root 用户,因此不需要使用 "sudo" 去取得执行权限。

这个环节的最大困难点是 “要安装哪些内容”?这就需要整理出软件原厂所提供的依赖库列表,这个过程是相对繁琐的,而 Jetson-containers 项目所提供的 12 个 Dockerfile 参考内容,能让我们节省很多摸索的时间。

4)需要编译的部分:

例如在 Dockerfile.pytorch 里面执行 torchvision 的编译安装步骤,如下内容:

RUN git clone https://github.com/pytorch/vision torchvision && \\ cd torchvision && \\ git checkout ${TORCHVISION_VERSION} && \\ python3 setup.py install && \\ cd ../ && \\ rm -rf torchvision

在 Dockerfile.tensorflow 文件里有执行 protobuf 与 protoc 的编译安装步骤,如下内容:

RUN cd /tmp && \\ wget --quiet --show-progress --progress=bar:force:noscroll --no-check-certificate ${PROTOBUF_URL}/$PROTOBUF_DIR.zip && \\ wget --quiet --show-progress --progress=bar:force:noscroll --no-check-certificate ${PROTOBUF_URL}/$PROTOC_DIR.zip && \\ unzip ${PROTOBUF_DIR}.zip -d ${PROTOBUF_DIR} && \\ unzip ${PROTOC_DIR}.zip -d ${PROTOC_DIR} && \\ cp ${PROTOC_DIR}/bin/protoc /usr/local/bin/protoc && \\ cd ${PROTOBUF_DIR}/protobuf-${PROTOBUF_VERSION} && \\ ./autogen.sh && \\ ./configure --prefix=/usr/local && \\ make -j$(nproc) && \\ make check -j4 && \\ make install && \\ ldconfig && \\ cd python && \\ python3 setup.py build --cpp_implementation && \\ python3 setup.py test --cpp_implementation && \\ python3 setup.py bdist_wheel --cpp_implementation && \\ cp dist/*.whl /opt && \\ pip3 install dist/*.whl && \\ cd ../../../ && \\ rm ${PROTOBUF_DIR}.zip && \\ rm ${PROTOC_DIR}.zip && \\ rm -rf ${PROTOBUF_DIR} && \\ rm -rf ${PROTOC_DIR}

在 Dockerfile.ml 里面执行 OpenCV 的编译安装步骤,如下内容:

ARG OPENCV_URL=https://nvidia.box.com/shared/static/5v89u6g5rb62fpz4lh0rz531ajo2t5ef.gzARG OPENCV_DEB=OpenCV-4.5.0-aarch64.tar.gzCOPY scripts/opencv_install.sh /tmp/opencv_install.shRUN cd /tmp && ./opencv_install.sh ${OPENCV_URL} ${OPENCV_DEB}

上面这三个部分是大部分创建深度学习相关应用的 Docker 镜像所需要的步骤,现在可以直接从 Jetson-containers 这些配置文件中,复制相关步骤到自己的配置文件中,节省大量的尝试与摸索的时间。

5、小结:

为智能边缘设备创建 Docker 版本镜像,对应用工程师是一项非常重要的技能,因为这个关系到将来的大量部署与长期维护的问题,因此学习使用 “docker build” 指令配合 Dockerfile 配置文件的方式,是一项必备的能力。

这个 Jetson-containers 项目作者为了广泛满足各种状况,特别是 JetPack 的 L4T 版本变化以及对应的 TensorFlow、PyTorch、OpenCV 版本,因此使用多个变量进行调节,但这种方法会让配置文件内容变得相当复杂。

本系列文章的目的就是为大家解开这些变量的意义,让读者能清楚识别出这些变量之间的关系,提升对 Dockerfile 配置文件的了解,最终协助读者进一步简化出自己所需要的特定脚本与配置内容,以自己创建 Docker 镜像的能力。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
理想汽车开启裁员,纯电团队将被收缩

理想汽车开启裁员,纯电团队将被收缩

界面新闻
2024-05-16 18:48:36
片约不断,却演啥毁啥,《庆余年2》这个“戏混子”该醒醒了

片约不断,却演啥毁啥,《庆余年2》这个“戏混子”该醒醒了

娱乐圈十三太保
2024-05-17 14:38:38
河南64岁大爷五年间染指55名女性,只因太了解女性心理

河南64岁大爷五年间染指55名女性,只因太了解女性心理

真实故事汇
2024-05-06 13:31:30
打开国门,也融不进现代文明

打开国门,也融不进现代文明

更夫频道
2024-05-16 10:41:47
越南内斗失控,阮富仲心力憔悴!中国可以着手准备了……

越南内斗失控,阮富仲心力憔悴!中国可以着手准备了……

占豪
2024-05-18 03:22:26
给《庆余年2》女演员美貌排名,金晨第十、王楚然第三、李沁第一

给《庆余年2》女演员美貌排名,金晨第十、王楚然第三、李沁第一

不八卦会死星人
2024-05-17 18:05:45
以色列财长说将废除与土耳其的自贸协定

以色列财长说将废除与土耳其的自贸协定

界面新闻
2024-05-17 07:04:15
彻底倒向美囯?拒绝中方移民,驱离中方工人,中方大怒:永不合作

彻底倒向美囯?拒绝中方移民,驱离中方工人,中方大怒:永不合作

星辰故事屋
2024-04-27 19:04:44
主持界的神!《歌手2024》香缇莫说“不在”,何炅解释:不在话下

主持界的神!《歌手2024》香缇莫说“不在”,何炅解释:不在话下

娱乐寡姐
2024-05-17 21:59:54
恩比德不来又何妨!法国男篮阵容名单公布:9位NBA球员,内线太强

恩比德不来又何妨!法国男篮阵容名单公布:9位NBA球员,内线太强

你的篮球频道
2024-05-17 13:08:32
1991年李瑞环在华西村发现华国锋的照片,村领导:我们农民讲感情

1991年李瑞环在华西村发现华国锋的照片,村领导:我们农民讲感情

旧时楼台月
2024-05-02 08:53:35
5月17日夜晚,突然发生一个重大消息!又要来大动作吗?

5月17日夜晚,突然发生一个重大消息!又要来大动作吗?

股市皆大事
2024-05-17 18:17:21
掘金被拖入抢七,引发4连锁反应:穆雷顶薪没了,抢七也是大胜?

掘金被拖入抢七,引发4连锁反应:穆雷顶薪没了,抢七也是大胜?

篮坛扒客
2024-05-17 14:54:53
守不住了!投降潮开始了!

守不住了!投降潮开始了!

大嘴说天下
2024-05-17 19:38:22
纪实:禽兽赵志勇强占25名初中生,14名未满14岁,下场大快人心

纪实:禽兽赵志勇强占25名初中生,14名未满14岁,下场大快人心

小胡子谈汇
2024-05-17 19:27:54
F-16战斗机在乌克兰的惊人表现,引发全球关注

F-16战斗机在乌克兰的惊人表现,引发全球关注

亡海中的彼岸花
2024-05-17 13:37:43
马斯克确认,低价特斯拉新车曝光!用中国制造和比亚迪打价格战

马斯克确认,低价特斯拉新车曝光!用中国制造和比亚迪打价格战

户外小阿隋
2024-05-16 03:19:29
夫妻生活总是“进不去”怎么办?别担心!这4种方法你一定用得上

夫妻生活总是“进不去”怎么办?别担心!这4种方法你一定用得上

39健康网
2024-05-17 23:00:47
24歌手出场费:那英200万阿木50万,两位欧美歌手费用大跌眼镜

24歌手出场费:那英200万阿木50万,两位欧美歌手费用大跌眼镜

真相人间
2024-05-16 11:54:40
货币保卫战,输了!外汇储备见底,巨额债务压顶,或率先倒下?

货币保卫战,输了!外汇储备见底,巨额债务压顶,或率先倒下?

侃故事的阿蚌
2024-05-18 00:26:18
2024-05-18 06:56:49
NVIDIA英伟达中国
NVIDIA英伟达中国
英伟达(中国)官方账号
2345文章数 1271关注度
往期回顾 全部

科技要闻

京东拼增长,大力出奇迹

头条要闻

媒体:菲律宾在南海闹事时 美国航母紧急"撤"到新加坡

头条要闻

媒体:菲律宾在南海闹事时 美国航母紧急"撤"到新加坡

体育要闻

中超疯狂星期五!5场28球,单场5球起步

娱乐要闻

《庆余年2》首播口碑出炉!有好有坏

财经要闻

重磅!楼市王炸来了 多部门出手救楼市

汽车要闻

内饰与配置全新升级 全新途观L PRO将于5月30日上市

态度原创

亲子
房产
艺术
公开课
军事航空

亲子要闻

小朋友背着琵琶下课,像极了琵琶放假~

房产要闻

19.1亿,三亚挂出超级教育+宅地!要建国际学校,这个板块价值又要涨!

艺术要闻

真诚度101%,35岁的诚品画廊为什么选择北京?

公开课

父亲年龄越大孩子越不聪明?

军事要闻

印防长称印度将开始建第三艘母

无障碍浏览 进入关怀版