5月22日,2020年 lol亚博

NVIDIA Contract Contract Runtime为Wind River Linux

Pablo Rodriguez Quesada著

pablo_bw-3

介绍

训练和使用人工智能模型是需要强大计算能力的任务。目前的趋势更多地指向深度神经网络,每一次迭代包含数千次,甚至数百万次操作。在过去的一年中,越来越多的研究人员对深度学习成本的爆炸性增长敲响了警钟。现在,人工智能所需的计算能力比以往任何时候都要快7倍[1].这些新需求促使硬件公司创造硬件加速器,如神经处理单元、cpu和gpu。

嵌入式系统也不例外。我们每天都能看到智能交通灯、自动驾驶汽车、智能物联网设备等。目前的方向是在这些嵌入式设备中安装加速器,主要是片上系统(Systems On-Chip)。硬件开发人员已经将gpu、fpga等小型加速器嵌入到soc、SOMs和其他系统中。我们称这些现代系统为:异构计算体系结构。

在Linux上使用gpu并不是什么新鲜事;多年来,我们一直能够做到这一点。然而,它将极大地加快HPC应用程序的开发和部署。在部署应用程序时,容器支持可移植性、稳定性和许多其他特性。出于这个原因,公司在这些技术上投入了大量资金。例如,NVIDIA最近启动了一个在Docker上支持CUDA的项目[2]

处理容器时需要考虑的一个问题是性能的损失。然而,当比较有和没有容器环境的GPU性能时,研究人员发现没有额外的开销[3].性能上的一致性是容器优于虚拟机的主要优点之一;访问GPU是无缝的,因为内核保持不变。

yocto上的nvidia-docker

我们与Matt Madison (meta-tegra层的维护者)一起创建了在Wind River Linux LTS 19 (Yocto 3.0 Zeus)上构建和部署NVIDIA-docker所需的菜谱。[4]

在本教程中,您将了解如何在自定义Linux发行版上启用nvidia容器,并运行一个利用容器内gpu使用的小型测试应用程序。

描述

要启用NVIDIA容器,Docker需要具有NVIDIA-Containers-Runtime,该运行时是一个修改的Runc版本,它为所有容器添加了自定义预启动挂钩。NVIDIA-Containers-Runtime使用库libnvidia-container通信Docker,它会自动配置利用NVIDIA硬件的GNU / Linux容器。此库依赖于内核基元,旨在成为集装箱运行时的不可知。将这些库和工具搬到Yocto项目的所有努力都提交给社区,现在是Matta-Tegra层的一部分,由Matt Madison维护。

注意:这个设置是基于Linux的Tegra,而不是原始的Yocto Linux内核

的好处,和局限性

容器内gpu的主要好处是在部署时环境中的可移植性和稳定性。当然,开发人员也看到了拥有这个可移植环境的好处,因为开发人员可以更有效地协作。

然而,由于NVIDIA环境的特性,也存在一些限制。容器是重量级的,因为它们基于Linux4Tegra映像,其中包含运行时所需的库。另一方面,由于重新分发的限制,有些库没有包含在容器中。这需要runc挂载一些属性代码库,在这个过程中失去了可移植性。

先决条件

你需要从他们的网站上下载NVIDIA的物业代码。为此,您需要创建一个NVIDIA开发者网络帐户。

进入https://developer.nvidia.com/embedded/downloads.,下载NVIDIA SDK管理器,安装它并下载你自己的Jetson板的所有文件。将这些库和工具移植到Yocto项目的所有努力都提交给了社区,现在是由Matt Madison维护的元组层的一部分。

所需的Jetpack版本是4.3

/ opt / nvidia / sdkmanager / sdkmanager

download_jetpack_4.3.
图片1。SDK安装管理器

如果需要在构建中包含TensorRT,则必须创建子目录,并将SDK Manager下载的所有TensorRT包移到该目录。

$ cp /home/$USER/Downloads/nvidia/sdkm_downloads/ nvidia/sdkm_downloads/ libv * /home/$USER/Downloads/nvidia/sdkm_downloads/ nvidia/sdkm_downloads/ nvidia . txt / libv * /home/$USER/Downloads/nvidia/sdkm_downloads/ nvidia . txt

创建项目

$ git clone——branch WRLINUX_10_19_BASE https://github.com/WindRiver-Labs/wrlinux-x.git

注意:——distro wrlinux-graphics可以用于一些需要x11的应用程序。

添加meta-tegra层

免责声明:meta-tegra是风河在撰写本文时不支持的社区维护层

$ git clone https://github.com/madisongh/meta-tegra.git layers/meta-tegra $ git checkout 11a02d02a7098350638d7bf3a6c1a3946d3432fd $ CD -

测试:https://github.com/madisongh/meta-tegra/commit/11a02d02a7098350638d7bf3a6c1a3946d3432fd

$。./environment-setup-x86_64-wllinuxsdk-linux $。./oe-init-build-env.
$ bitbake-players添加图层../layers/meta-tegra/ $ Bitbake-图层添加图层../layers/meta-tegra/contrib

配置项目

$ echo "BB_NO_NETWORK = '0'" >> conf/local.conf $ echo 'INHERIT_DISTRO_remove = "白名单" >> conf/local.conf .conf .conf

将机器设置为Jetson Board

$ echo "MACHINE=' jeton -nano-qspi-sd'" >> conf/local.conf $ echo "PREFERRED_PROVIDER_virtual/kernel =' linux-tegra'" >> conf/local.conf .conf

CUDA不能与高于7的GCC版本编制。将GCC版设置为7.%:

$ echo 'GCCVERSION = " 1 ";%"' >> conf/local.conf $ echo "require contrib/conf/include/gcc-compat.conf" >> conf/local.conf .conf

为便于部署,将IMAGE导出类型设置为tegraflash。

$ echo'image_classes + =“image_types_tegra”''>> conf / local.conf $ echo'image_fstypes =“tegraflash”'>> conf / local.conf

更改Docker版本,添加NVIDIA-Container-Runtime。

$ echo'image_install_remove =“docker”>> conf / local.conf $ echo'image_install_append =“docker-ce”'>> conf / local.conf

修复TINI构建错误

$ echo ' SECURITY_CFLAGS_pn-tini_append = " $ {SECURITY_NOPIE_CFLAGS} " ' > > conf / local.conf

设置nvidia下载位置

//home/$USER/Downloads/nvidia/sdkm_downloads'" >> conf/local.conf

添加Nvidia容器运行时,AI库和AI库CSV文件

$ echo'image_install_append =“nvidia-docker nvidia-container-contride cudnn tensorrt libvisworks libvisworks-sfm libvisworks-tracking cuda-container-csv cudnn-container-csv tensorrt-container-csv libvisworks-container-contacter-csv libvimicorks-sfm-container-csvlibvisworks-tracking-container-csv“'>> conf / local.conf

启用nvidia-container-runtime所需的ldconfig

$ echo'distro_features_append =“ldconfig”'>> conf / local.conf

构建项目

美元bitbake wrlinux-image-glibc-std

将图像刻录到SD卡中

$ unzip wrlinux-image-glibc-std-sato-jetson-nano-qspi-sd-20200226004915.tegrash.zip -d wrlinux-jetson-nano $ cd wrlinux-jetson-nano

使用micro USB线将Jetson Board连接到你的电脑上,如图所示:

jetson_nano_pins_setup_photo_v2.
图片2。为Jetson Nano设置恢复模式

jetson_nano_pins
图像3. Jetson Nano的针图

连接单板后,执行以下命令:

$ sudo ./dosdcard.sh.

这个命令将创建文件wrlinux-image-glibc-std.sdcard包含引导所需的SD卡映像。

将图像刻录到SD卡:

$ sudo dd if = wrlinux-image-glibc-std.sdcard of = / dev / ***** bs = 8k

警告:将of= device替换为指向你的sdcard的那个
不这样做会导致意外擦除硬盘

部署目标

启动单板并使用命令找到ip地址ifconfig.

然后,SSH进入机器并运行Docker:

美元ssh root@ < ip_address >

使用“来自”的示例创建tensorflow_demo.py。用凯拉斯训练和评估章节中的Tensorflow文档:

#!/ usr / bin / python3 from __future__导入absolut_import,division,print_function,unicode_literals导入tensorflow作为tf从tensorflow导入keras从tensorflow.keras导入图层输入= keras.input(形状=(784,),名称='数字')x = players.dense(64,activation ='relu',name ='dense_1')(输入)x = layers.dense(64,激活='relu',name ='dense_2')(x)输出= players.dense(10,name ='预测')(x)model = keras.model(输入=输入,输出=输出)(x_train,y_train),(x_test,y_test)= keras.datasets.mnist。load_data()#preprocess数据(这些是numpy arrays)x_train = x_train.reshape(60000,784).astype('float32')/ 255 x_test = x_test.reshape(10000,784).sastype('float32')/255 y_train = y_train.astype('float32')y_test = y_test.astype('float32')#保留10,000个验证样本x_val = x_train [-10000:] y_val = y_train [-10000:] x_train = x_train [: -  10000] y_train = y_train [: -  10000] model.compile(优化程序= keras.optimizers.rmsprop(),#spextizer#丢失函数最小化丢失= keras.losses.sparseCategoricalcrossentropy(from_logits = true),#监视metrics的指标列表= ['sparse_categorical_accuracy'])打印('#培训数据上的#拟合模型')历史= model.fit(x_train,y_train,batch_size = 64,epochs = 3,#我们通过了#监视验证丢失和度量标准#在每个epoch validation_data =(x_val,y_val)的末尾的验证#data =(x_val,y_val))打印('\ nhistory dict:',历史记录。历史记录)#使用“测试数据”(“测试数据”)评估测试数据的模型('\ n#on test数据')结果= model.epaluate(x_test,y_test,batch_size = 128)打印('测试丢失,测试acc:',结果)#生成预测(概率 - 最后一层的概率)#在新数据上使用`previct`打印('\ n#为3个样本生成预测')predictions = model.predict(x_test [:3])打印('预测形状:',predictions.shape)

创建一个dockerfile:

从tianxiang84/ 14t -base:all WORKDIR /root拷贝tensorflow_demo.py。/usr/bin/python3"] CMD ["/root/tensorflow_demo.py"]

构建容器:

#docker build -t l4t-tensorflow。

运行容器:

# docker run -runtime nvidia -it 14t -tensorflow

结果

nvidia_container_results_v2.
注意使用GPU0:

2020年4月22日21:13:56.969319:我tensorflow /型芯/ common_runtime / GPU / gpu_device.cc:1763]添加可见GPU设备:0 2020年4月22日21:13:58.210600:我tensorflow /型芯/ common_runtime /GPU / GPU_DEVICE.CC:1326]创建了TensorFlow设备(/作业:lobhost / replica:0 /任务:0 /设备:GPU:0带268 MB内存) - >物理GPU(设备:0,名称:NVIDIA TEGRA X1,PCI总线ID:0000:00:00.0,计算能力:5.3)

结论

使用NVIDIA集装箱允许平滑地部署AI应用。一旦您使用自定义NVIDIA运行时运行的Linux发行版运行容器,就会将神经网络工作与运行一个命令一样简单。获得NVIDIA Tegra Loard运行计算密集型工作负载现在比以往任何时候都更容易。

使用提供CUDA和其他相关库的提供的自定义RUNC引擎,您将运行应用程序,就像它们在裸机上一样。

容器提供的一种可能性是将这种设置与Kubernetes或NVIDIA EGX平台结合起来,这样您就可以进行编排了。Kubernetes设备插件分布和管理多个加速设备的工作负载,为您提供高可用性以及其他好处。结合其他技术,如Tensorflow和OpenCV,你将有一个军队的边缘设备准备运行你的智能应用程序。

参考

所有产品名称,徽标和品牌都是其各自所有者的财产。
本软件中使用的所有公司,产品和服务名称仅用于识别目的。Wind River是Wind River Systems的注册商标。

免责声明/不支持:风河不根据风河标准软件支持和维护协议或其他规定为本软件提供支持和维护服务。除非适用法律要求,风河以“现状”为基础提供软件(每位贡献者提供其贡献),不提供任何类型的明示或默示保证,包括但不限于所有权、不侵权、适销性或适用于特定目的的任何保证。您独自负责确定使用或重新发布软件的适当性,并承担与您在许可证下行使许可相关的可能风险。

Tensorflow,Tensorflow徽标和任何相关标记都是谷歌公司的商标

Docker是Docker, Inc.的商标。

NVIDIA、NVIDIA EGX、CUDA、Jetson和Tegra是NVIDIA公司在美国和其他国家的商标和/或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。

以前的5G用例:探索电信以外的5G应用
下一个在Wind River Linux上本身开发QT5应用