使用Docker容器的最大好处就是“独立性强”,在前面文章中我们教大家如何使用NVIDIA在NGC提供创建好的l4t-ml系列镜像为基础,去创建各种机器学习/深度学习的开发或部署用途的独立容器,包括各种基于TensorRT的推理应用、基于Pytorch的各种YOLO相关应用等等。
但是l4t-ml容器内将大部分深度学习所需要的工具全部涵盖进去,使得这个容器镜像变得十分庞大,例如配合JetPack 5.0DP版本的nvcr.io/nvidia/l4t-ml:r34.1.1-py3镜像需要占用16.2G空间,这对大部分存储空间较为紧凑的Jetson边缘设备来说是个不小的负担,需要进一步的优化。
熟悉Docker创建容器的人都知道,只要使用“docker build -f DOCKERFILE”方式就能创建容器,不过Dockerfile内容是有复杂度的,至少包含以下两大部分:
这是相对神奇的环节,我们至少得先在一个“以操作系统为基础”的基础镜像文件之上去创建新的容器,不过还好操作系统源头都会提供这些基础镜像,只要我们能找到这些基础镜像的发行位置,就能在Dockerfile一开始使用“FROM”指令进行导入。
在Jetson设备上使用的L4T(Linxun for Tegra)版本Ubuntu操作系统是由NVIDIA所维护,因此操作系统基础镜像也由NVIDIA所提供,并且存放在NGC云中心提供下载,可以在https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-base/tags上找到详细的内容与下载的指令。
l4t-base容器内只有最基础的操作系统、驱动与Python开发环境,并未安装CUDA、cuDNN或TensorRT等开发库,L4T版本与JetPack版本是对应的,请参考下表:
如果要使用l4t-base镜像为基础,去创建与深度学习相关应用的镜像文件,就需要自行在Dockerfile内加入CUDA/cuDNN/TensorRT以及其他所需要的依赖库与软件的安装步骤,以下整理出不同Jetpack版本所对应的CUDA/cuDNN/TensorRT/OpenCV的版本,提供读者在创建相关镜像时候可以参考:
从上面简表可以看出,在JetPack 4.4至4.6版本的操作系统都是Ubuntu 18.04、CUDA版本都是10.2、Python3的版本都是3.6、OpenCV版本都是4.1.1,至于cuDNN与TensoRT则有些微的差异,基本上镜像文件的兼容性比较高。不过到了JetPack 5.0之后,操作系统升级至Ubuntu 20.04版之后,包括Python、OpenCV、CUDA版本的变化就比较大,与JetPack 4.x版本的镜像
基础容器的版本编号是对应L4T版本号,如下图:
因此要创建Jetson容器的首要工作,就是先确认系统的L4T版本,然后再挑选合适的基础镜像来进行创建的任务。
这部分就是将平常安装软件的正确步骤加入Dockerfile,使用“RUN”指令来执行所有安装内容,为了要让容器结构更加简化,通常会将所有需要的依赖库全部放在一个“RUN”指令里操作,因此创建者需要先收集并确认所需要的内容。
由于创建的容器会以root用户进行操作,因此过程都不需要用“sudo”去取得权限,可以直接使用apt-get、pip或dpkg等安装方式,有些需要预先下载的.deb、.whl或压缩文件,在使用过后最好删除以减少空间的占用。
这部分的细节内容相当繁琐,需要比较多的执行经验与整理过程,对初学者来说难度较大,因此本文特别挑选NVIDIA高级工程师所维护的jetson-container开源项目,针对在Jetson设备上创建深度学习与ROS两大类应用,提供各种对应的Dockerfile参考内容,包括安装CUDA、cuDNN、TensorRT、OpenCV、PyTorch、Tensorflow以及ROS相关环境的细节,读者可以参考这些内容再进行调整。
接下来就是下载jetson-container项目,并且以创建l4t-ml容为示范来进行讲解其操作的重点,读者只要比照相同的逻辑进行调整与修改,就能轻松地创建自己的应用与开发用途的容器镜像。
项目开源仓位置在 https://github.com/dusty-nv/jetson-containers,请执行以下指令下载到Jetson设备上:
$ $ |
git clone https://github.com/dusty-nv/jetson-containers cd jetson-containers |
项目仓的内容总共有将近60个文件,主要分为以下三大类:
接下来分析执行的重点。
这个项目主要提供深度学习与ROS两大应用类别的容器创建资源,真正的使用入口就是scripts目录下的docker_build_ml.sh与docker_build_ros.sh这两个脚本,其余脚本多是辅助用途的,用来协助判断相关软件版本,然后甚至对应变量给执行脚本进行完整的镜像创建步骤。
现在以docker_build_ml.sh为例来进行说明,后面可以加上all、tensorflow或pytorch等机器学习框架选项,现在来看看脚本的主要内容:
前面说过,创建Docker镜像的首要任务就是要确认L4T版本,然后指定NGC中合适的基础镜像版本,作为Dockerfile中第一个“FROM”的参数,在“docker build”过程中下载这个镜像。
然后传回给docker_bash.sh脚本使用;
脚本第6、7行分别执行opencv_version.sh与python_version.sh,去决定这两个部分的版本。
其中OpenCV部分经过作者修改之后固定为4.5.0版本,并以$OPENCV_DEB与$OPENCV_URL变量存放安装包的下载路径与名称。而Python版本则指定于所使用的Jetson设备上的版本,如果是JetPack 4.x版本的设备则Python版本为3.6,如果是Jetpack 5.0以后版本的设备则Python版本为3.8。
这部分主要是PyTorch与Tensorflow的版本,因为这两个是目前深度学习领域使用率最高的框架,因此这里就以这两个工具为主来创建深度学习的容器镜像。
脚本第37~137行与160~221行的内容,会根据$L4T_RELEASE变量,分别针对创建PyTorch与TensorFlow镜像所需要的配套资源,提供完整的对应参数,包括需要赋予对应的下载链接、文件名称、镜像标签(tag)等等信息,在PyTorch部分还需要提供torchvision与torchaudio的版本。
下表是根据NGC提供的l4t-ml镜像所整理的各项版本信息:
前面判断好相关版本信息之后,就会分别调用第14行build_pytorch()与第142行build_tensorflow()分别创建l4t-pytorch与l4t-tensorflow容器镜像。
下面截屏是build_pytorch()的主要内容,会调用scripts/docker_build.sh脚本与目录下的Dockerfile.pytorch配置文件,然后套用6个“--build-arg”参数进行实际创建的工作,这样就完成对l4t-pytorch镜像的创建任务。
创建l4t-tensorflow镜像的方式也是大致相同,就不重复说明。脚本最后第229~235行是创建包含PyTorch与Tensorflow两种框架的l4t-ml镜像,主要指令如下:
这样就完成在Jetson上从头创建深度学习相关的容器镜像任务,另一个创建ROS应用的docker_build_ros.sh脚本内容也是雷同,所有的关键就是先确认$L4T_RELEASE版本信息,其他的软件版本都会根据这个参数进行调整。
本文先讲解这个开源项目内的脚本内容,下一篇文章会进一步说明Dockerfile的主要细节,这样就能很轻松地掌握容器镜像的创建过程。
好文章,需要你的鼓励
Blackwell GPU的生产制造工作量达到Hopper GPU的两倍有余,但带来的收入仅增加至约1.7倍。
由AMD驱动的El Capitan超级计算机(现位于美国劳伦斯利弗莫尔国家实验室(LLNL))成为世界上速度最快的超级计算机。