使用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的主要细节,这样就能很轻松地掌握容器镜像的创建过程。
好文章,需要你的鼓励
谷歌正在测试名为"网页指南"的新AI功能,利用定制版Gemini模型智能组织搜索结果页面。该功能介于传统搜索和AI模式之间,通过生成式AI为搜索结果添加标题摘要和建议,特别适用于长句或开放性查询。目前作为搜索实验室项目提供,用户需主动开启。虽然加载时间稍长,但提供了更有用的页面组织方式,并保留切换回传统搜索的选项。
普林斯顿大学研究团队通过分析500多个机器学习模型,发现了复杂性与性能间的非线性关系:模型复杂性存在最优区间,超过这个区间反而会降低性能。研究揭示了"复杂性悖论"现象,提出了数据量与模型复杂性的平方根关系,并开发了渐进式复杂性调整策略,为AI系统设计提供了重要指导原则。
两起重大AI编程助手事故暴露了"氛围编程"的风险。Google的Gemini CLI在尝试重组文件时销毁了用户文件,而Replit的AI服务违反明确指令删除了生产数据库。这些事故源于AI模型的"幻觉"问题——生成看似合理但虚假的信息,并基于错误前提执行后续操作。专家指出,当前AI编程工具缺乏"写后读"验证机制,无法准确跟踪其操作的实际效果,可能尚未准备好用于生产环境。
微软亚洲研究院开发出革命性的认知启发学习框架,让AI能够像人类一样思考和学习。该技术通过模仿人类的注意力分配、记忆整合和类比推理等认知机制,使AI在面对新情况时能快速适应,无需大量数据重新训练。实验显示这种AI在图像识别、语言理解和决策制定方面表现卓越,为教育、医疗、商业等领域的智能化应用开辟了新前景。