百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

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

connygpt 2024-09-29 11:02 8 浏览

前一篇文章已经对 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.4
ARG PYTORCH_URL=https://nvidia.box.com/shared/static/xxx.whl
ARG PYTORCH_WHL=torch-1.2.0-cp36-cp36m-linux_aarch64.whl
ARG TORCHVISION_VERSION=v0.4.0
ARG TORCH_CUDA_ARCH_LIST="5.3;6.2;7.2;8.7"
ARG TORCHAUDIO_VERSION


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


ARG BASE_IMAGE
ARG HDF5_DIR="/usr/lib/aarch64-linux-gnu/hdf5/serial/"
ARG MAKEFLAGS=-j$(nproc)
ARG PROTOBUF_VERSION=3.19.4
ARG PROTOBUF_URL=https://。。。/v${PROTOBUF_VERSION}
ARG PROTOBUF_DIR=protobuf-python-${PROTOBUF_VERSION}
ARG PROTOC_DIR=protoc-${PROTOBUF_VERSION}-linux-aarch_64
ARG TENSORFLOW_URL=https://。。。/。。。-linux_aarch64.whl
ARG 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.4
ARG PYTORCH_IMAGE
ARG TENSORFLOW_IMAGE
ARG MAKEFLAGS=-j$(nproc) 
ARG PYTHON3_VERSION=3.8
ARG CUPY_VERSION=v10.2.0
ARG CUPY_NVCC_GENERATE_CODE="arch=compute_53。。。"
ARG OPENCV_URL=https://nvidia.box.com/shared/static/。。。.gz
ARG 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 pytorch
FROM ${TENSORFLOW_IMAGE} as tensorflow


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


COPY --from=tensorflow /usr/local/bin/protoc /usr/local/bin
COPY --from=tensorflow /usr/local/lib/libproto* /usr/local/lib/
COPY --from=tensorflow /usr/local/include/google /usr/local/include/google
COPY --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.gz
ARG OPENCV_DEB=OpenCV-4.5.0-aarch64.tar.gz

COPY scripts/opencv_install.sh /tmp/opencv_install.sh
RUN 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 镜像的能力。

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...