5月22日,2020年 bobapp官方网址

NVIDIA Contract Contract Runtime为Wind River Linux

Pablo Rodriguez Quesada著

pablo_bw-3

介绍

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

嵌入式系统也不例外。我们每天都能看到智能交通灯、自动驾驶汽车、智能物联网设备等等。目前的发展方向是在这些嵌入式设备(主要是片上系统)中安装加速器。硬件开发人员已经将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维护。

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

的好处,和局限性

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

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

先决条件

您需要从他们的网站上下载英伟达的财产代码。为此,您需要创建一个NVIDIA开发者网络帐户。

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

所需的Jetpack版本是4.3

/ opt / nvidia / sdkmanager / sdkmanager

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

如果您需要在您的构建中包含TensorRT,您必须创建子目录,并将SDK管理器下载的所有TensorRT包移动到那里。

$ cp /home/$USER/Downloads/nvidia/sdkm_downloads/ nvidia/sdkm_downloads/ nvidia/sdkm_downloads/

创建项目

$ git clone——branch WRLINUX_10_19_BASE https://github.com/WindRiver-Labs/wrlinux-x.git $ ./wrlinux-x/setup.sh——all-layers——dl-layers——templates feature/docker .sh

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

添加meta-tegra层

免责声明:meta-tegra是一个社区维护层,在撰写本文时Wind River还不支持它

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

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

$。./environment-setup-x86_64-wllinuxsdk-linux $。./oe-init-build-env.
$ bitbaker -layers add-layer ../layers/meta-tegra/ $ bitbake-layers add-layer ../layers/meta-tegra/contrib .

配置项目

美元回声“BB_NO_NETWORK = 0”> > conf /美元local.conf echo ' INHERIT_DISTRO_remove =“白名单”> > conf / local.conf

把机器对准你的捷森板

$ echo "PREFERRED_PROVIDER_virtual/kernel =' linux-tegra'" " linux-tegra =' linux-tegra'

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

$ echo 'GCCVERSION = "7。$ echo "require contrib/conf/include/gcc-compat.conf

为便于部署,将图像导出类型设置为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 .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf .conf

设置nvidia下载位置

//home/$USER/Downloads/nvidia/sdkm_downloads / "cuda- binaries_native = "cuda-binaries-ubuntu1604-native"

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

$ echo ' IMAGE_INSTALL_append = " nvidia-docker nvidia-container-runtime cudnn tensorrt libvisionworks libvisionworks-sfm libvisionworks-tracking cuda-container-csv cudnn-container-csv tensorrt-container-csv libvisionworks-container-csv libvisionworks-sfm-container-csv libvisionworks-tracking-container-csv”“> > conf / local.conf

启用nvidia容器运行时所需的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

连接Jetson板到您的电脑使用micro USB电缆如图所示:

jetson_nano_pins_setup_photo_v2.
图片2。杰森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

警告:替换的=设备指向你的sdcard
不这样做会导致意外擦除硬盘

部署目标

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

然后,ssh进入机器并运行docker:

美元ssh root@ < ip_address >

使用“来自”的示例创建tensorflow_demo.py。与Keras一起培训和评估在Tensorflow文档中的部分:

# !/usr/bin/python3 from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf import numpy as np from tensorflow import keras from tensorflowkeras import layers inputs = keras. input (shape=(784,), name='digits') x = layers。致密(64,activation='relu', name='dense_1')(输入)x = layers。density (64, activation='relu', name='dense_2')(x)输出= layers。致密(10,名称='预测')(x)模型= keras。(x_test, y_test) = keras.datasets. mist .load_data() #预处理数据(Numpy数组)stype('float32') / 255 x_test = x_test. aspx ('float32')重塑(10000、784).astype (float32) / 255 y_train = y_train.astype(“float32”)y_test = y_test.astype (float32) #储备10000个样本进行验证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 (),#优化器# Loss function to最小化Loss =keras.losses.SparseCategoricalCrossentropy(from_logits=True), # List of metrics to monitor metrics=['sparse_categorical_accuracy']) print('# Fit model on training data') history = model。fit (x_train、y_train batch_size = 64,时代= 3,#我们通过一些验证#监控验证损失和指标#在每个时代validation_data = (x_val y_val))打印(‘\ nhistory dict类型:’,history.history) #评估模型使用“评估”打印测试数据(“\ n #评估测试数据”)=结果模型。print(x_test, y_test, batch_size=128) print('test loss, test acc:', results) #生成预测(概率——最后一层的输出)# on new data using 'predict ' print('\n#为3个样本生成预测')

创建一个dockerfile:

从tianxiang84/l4t-base:所有的工作目录/根拷贝tensorflow_demo.py。ENTRYPOINT ["/usr/bin/python3"] CMD ["/root/tensorflow_demo.py"]

构建容器:

#docker build -t l4t-tensorflow。

运行容器:

# docker run——runtime nvidia -it l4t-tensorflow

结果

nvidia_container_results_v2
注意使用GPU0:

2020-04-22 21:13:56.969319:i tensorflow / core / common_runtime / gpu / gpu_device.cc:1763]添加可见GPU设备:0 2020-04-22 21:13:58.210600:i tensorflow / core / 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-containers可以顺畅地部署AI应用程序。一旦您让您的Linux发行版运行带有自定义NVIDIA运行时的容器,让神经网络工作就像运行一个命令一样简单。让NVIDIA Tegra板运行计算密集型工作现在比以往任何时候都容易。

通过提供的定制runc引擎(允许使用CUDA和其他相关库),您可以像在裸机上一样运行应用程序。

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

参考文献

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

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

TensorFlow、TensorFlow标识及任何相关标志均为谷歌Inc.的商标。

Docker是Docker, Inc.的商标。

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

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