机器学习工作流程
机器学习(ML)工作流是旨在加速Isaac SDK采纳ML的代码和示例的集合。这些示例使用Tensorflow框架进行培训,但是相同的原理和代码也应与其他ML框架(如PyTorch)一起使用。
模拟训练
培训数据很难收集且难以标注。合并来自仿真的合成数据可以加快该过程。在 自由空间分割部分介绍了与Unity3D合成数据训练样本ML车型。
在PC和Edge设备上的推断
Isaac SDK中提供了三个可能的运行时,以在Jetson TX2 / Xavier和PC上对经过训练的ML模型进行推断。所有示例均可在两个平台上编译并运行。
用Tensorflow推断
Tensorflow是Google流行的ML框架,可用于此处介绍的示例中的训练。Isaac SDK还可以与Tensorflow运行时一起使用,以按原样执行经过训练的模型的推断。
该立体深度DNN节礼物与Tensorflow执行推断示例应用程序。
有关在Isaac中使用Tensorflow的更多信息,请参考 TensorflowInference Codelet,其API参考isaac.ml.TensorflowInference 和Tensorflow开发人员指南。
注意
请注意,Tensorflow需要大量资源,这可能会导致系统紧张,并需要一些时间才能在资源有限的边缘设备上加载。
用TensorRT推理
TensorRT是NVIDIA的深度学习推理优化工具和运行时。它旨在提供低延迟和高吞吐量。它支持所有主要框架的模型,包括Tensorflow,Caffe 2,Chainer,Microsoft Cognitive Toolkit,MxNet和PyTorch。
有关在Isaac中使用TensorRT的更多信息,请参考 TensorRT推断代码,其API参考isaac.ml.TensorflowInference和 TensorRT开发人员指南。
火炬推论
Torch Torch是一个科学的计算框架,广泛支持深度学习算法。借助简单快速的脚本语言,Lua和底层C / CUDA实现,Torch易于使用且高效。
有关使用Torch的更多信息,请参阅Torch推理API参考 isaac.ml.TorchInference和Torch文档。
样品
开发,训练和调整深度学习模型需要大量的数据和计算能力。此类繁重的任务预计将由云或计算集群中的存储和GPU执行,而真正的机器人应用程序将在计算能力有限的边缘设备上运行。
从数据收集一直到机器人的深度学习模型部署,整个流程都非常顺畅,可加快机器人应用程序的开发速度。
PyCodelet
许多ML开发人员都精通Python。PyCodelet有助于在Python中与Isaac SDK之间的数据传输。
/apps/engine/pyalice/tests/pycodelet_test.py
ML开发人员可以使用PyCodelet在Python中进行编码,而不必在C ++中对Codelet进行编码。首先,需要将基于Python的小码声明为的子类alice.Codelet
。
class MyPyCodeletProducer(Codelet):
就像++基于C的小码,显影剂需要重写3个成员函数: start()
,tick()
和stop()
。 tick
将消息到达或超时时定期调用,而 start()
和stop()
将当小码进入或退出运行状态被调用。
尽管Python Codelet与C ++ Codelet具有相似的概念,但仍存在一些细微差异:
- Python Codelet需要通过
isaac_proto_tx()
和显式检索消息的挂钩isaac_proto_rx()
。 - Python Codelet需要
get_proto()
通过init_proto()
挂钩从显式检索消息并通过显式创建消息。 - 为了方便在应用程序中使用Python Codelet,将通过以下JSON规范创建Python Codelet的节点
alice.loadGraphFromFile()
。
{
"name": "foo_node",
"components": [
{
"name": "ml",
"type": "isaac::alice::MessageLedger"
},
{
"name": "isaac.alice.PyCodelet",
"type": "isaac::alice::PyCodelet"
}
]
}
alice.register_pycodelets()
稍后明确调用,以使用如下所示的映射将Python Codelet绑定到这些节点。
{
"producer": MyPyCodeletProducer,
"consumer": MyPyCodeletConsumer
}
Python Codelet可以通过JSON访问参数。检查python_ping以获取示例。
支持代码
Tensorflow推理代码
TensorflowInference小码采用经过训练的Tensorflow冻结模型,并在Isaac SDK应用程序中运行推理。输入和输出消息都是消息TensorList
列表 TensorProto
。小码采用几个参数,如球分割推断应用程序的配置所示:
"model_file_path": "/tmp/ball_segmentation/ckpts/model-0-frozen.pb",
"config_file_path": "",
"input_tensor_info": [
{
"ops_name": "input",
"index": 0,
"dims": [1, 256, 512, 3]
}
],
"output_tensor_info": [
{
"ops_name": "output",
"index": 0,
"dims": [1, 256, 512, 1]
}
]
-
model_file_path
-指向Tensorflow冻结模型以在应用程序中运行。有关冻结模型的更多信息,请参阅 TensorFlow NVIDIA GPU加速容器和Tensorflow工具。 -
config_file_path
-指向包含用于配置Tensorflow运行时的Tensorflow ConfigProto对象的protobuf文件。使用以下命令作为自定义的起点。
python -c "import tensorflow as tf; f=open('config_proto.pb', 'w');f.write(tf.ConfigProto(allow_soft_placement=True, gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.5)).SerializeToString()); f.close()"
-
input_tensor_info
-输入张量规格列表。每个规范都包括操作名称(如NodeDef中所示),操作中输入的索引以及张量尺寸。例如,以下代码指定三个输入张量:
"input_tensor_info": [
{
"ops_name": "input_color",
"dims": [1, 3, 256, 512],
"index": 0
},
{
"ops_name": "input_color",
"dims": [1, 3, 256, 512]
"index": 1
},
{
"ops_name": "input_depth",
"dims": [1, 1, 256, 512]
"index": 0
}
]
-
output_tensor_info
-输出张量规格列表。每个规范都包括操作名称(如NodeDef中所示),操作内输出的索引以及张量尺寸。例如,以下代码指定操作的输出张量:
"output_tensor_info": [
{
"ops_name": "Predictions/Reshape",
"dims": [1, 1001],
"index": 0
}
]
TensorRT推理代码
TensorRT推理小代码采用TensorRT .plan,.uff或.onnx模型,并在GPU上的Isaac SDK应用程序中运行推理。输入和输出消息都是TensorList
,这是TensorProto
消息列表。
TensorRT推断采用以下参数:
-
model_file_path.
-UFF或ONNX格式的设备不可知模型的路径。UFF模型可以通过UFF转换器工具创建,也可以从Tensorflow GraphDef,Frozen Protobuf模型或Keras模型转换而来。使用此工具的示例代码和Bazel构建步骤可在上找到packages/ml/tools
。该ONNX格式是一种开放格式,并通过Caffe2,MXNet和PyTorch支持,与出口ONNX可用于所有主要框架。另请参阅:ONNX教程。注意
如果在默认位置或指定位置找到了特定于设备的序列化引擎文件,则将忽略模型文件(请参见下文)。
-
model_file_path
(可选)-特定于设备的序列化TensorRT引擎的路径。引擎可以通过Isaac TensorRT小码自动创建,也可以在首次在目标设备上启动时从模型中创建。目标设备的转换过程和优化过程可能需要几秒钟到几分钟,这取决于模型的大小和系统的性能。或者,可以将引擎预先缓存在设备上。如果未指定此参数,则默认设置为“模型文件路径”,扩展名替换为.plan。
注意
引擎文件(如果存在)优先于模型文件。
注意
该引擎无法在不同设备,不同版本的TensorRT或不同版本的CuDNN库之间移植。
-
input_tensor_info
-输入张量规格列表。每个规范都包括操作名称(如NodeDef中所示),张量尺寸和可选参数。举个例子,以下代码指定两个输入张量:
"input_tensor_info": [
{
"operation_name": "input_1",
"dims": [1, 3, 256, 512]
},
{
"operation_name": "input_2",
"dims": [1, 3, 256, 512]
}
]
**输入张量规格参数**
* `operation_name` -要在模型图中查找的操作的名称。
* `dims`-张量尺寸。注意:在TensorRT文档中,单个张量尺寸可能由以下名称表示:
"dims": [Batch Size, Channel, Rows, Columns]
* 批次大小(可选,默认= 1)-批次中的样本数。
> 注意
要指定可变的批量大小,请将此参数设置为-1。还必须设置最大批量大小参数(请参见下文)。
* 通道-图像通道或矢量分量的数量。
* 行数(可选)-矩阵的行数(或图像的高度)。
* 列(可选)-矩阵的列数(或图像的宽度)。
例如,假设在320x200x3(RGB)图像上训练了TensorFlow / Keras模型。此类模型的正确设置如下:
"dims": [1, 3, 200, 320]
注意
虽然模型训练期间的输入顺序(或权重内存布局)可以使用以下两种格式之一,但是此小码 在推断时仅支持输入张量的channels_first格式,而与原始框架的输入顺序无关:
* channels_last:将Channel作为张量的最后一个索引。TensorRT文档将此称为“ NHWC”布局(批号,高度,宽度,通道)。例如,。`[1, 200, 320, 3]`
* channels_first:使用Channel作为张量的第一个(或第二个)索引。TensorRT文档将此称为“ NCHW”布局(批号,通道,高度,宽度)。例如,。`[1, 3, 200, 320]`
> 注意
“批量大小”张量尺寸设置为1,在该示例中可以省略。
- 模型分析器使用此输入张量规范列表来剪切
-
图的一部分,用于推理,设置可变大小的输入的尺寸并执行内存分配。它也可以在推理时使用,以验证输入张量的等级和大小。
- 输入张量规范应符合:
-
-
Isaac图中前一个节点的输出。 输入张量规范的张量等级和尺寸应与前一个节点的输出相匹配。前一个节点的输出的“批处理大小”应小于或等于引擎的最大批处理大小。
如果未设置“批次大小”,则先前的节点输出也应将其忽略:
"input_tensor_info": [ { "dims": [3, 256, 512] ... "isaac.ml.TensorReshape": { "output_tensors_dimension": [[3, 256, 512]]
正在解析的训练模型的规范。 该模型应包含大小固定为匹配输入张量规范或可变大小(-1)的匹配节点。
-
TensorRT的局限性。 TensorRT当前仅支持以下输入存储器布局:
- (批量大小,通道,行,列),例如[1、3、480、640];
- (通道,行,列),例如[3,480,640];
- (批量大小,通道),例如[1,1024];
- (频道),例如[1024]。
注意
图像的 TensorRT输入顺序是色平面,而不是混合的颜色通道阵列(即不是RGB)。通常,它需要将图像转换为色彩平面格式或通道轴的转置。这可以通过选择相关的图像编码顺序来实现,例如:
"tensor_encoder": { "isaac.ml.ColorCameraEncoder": { "rows": 480, "cols": 640, "pixel_normalization_mode": "PositiveNegative", "tensor_index_order": "201" }
-
output_tensor_info
-输出张量规格列表。每个规范都包括操作名称(如NodeDef)和张量尺寸。例如,以下代码指定一个输出张量:
"output_tensor_info": [ { "operation_name": "output", "dims": [1, 1001] } ]
另请参见上面的输入张量规范。
-
max_batch_size
(可选)-将针对其调整引擎的批量大小。在执行时,可以使用较小的批次,但不能较大。默认设置为“ -1”,它指定将使用输入张量大小来推断最大批处理大小。注意:此参数会影响GPU内存分配量和引擎性能。输入和输出张量规范应具有相同的批量大小。该批次大小应小于或等于模型的“最大批次大小”。
如果批量大小等于1,则可以缩回该尺寸,例如:
"dims": [1, 256, 512, 1]
批次大小等于1,并且第一个尺寸可以缩回:
"dims": [256, 512, 1]
这可以避免TensorReshape操作。 如果设置了最大批处理大小,则此尺寸也可以设置为-1,例如:
"dims": [-1, 256, 512, 1]
在这种情况下,尺寸将在运行时设置。这样可以支持可变的批量大小。 注意 最大批次大小用于引擎优化步骤,为获得最佳性能,建议将其设置为推理时使用的实际值。
max_workspace_size
(可选)-将为其调整引擎的临时GPU内存大小。层算法通常需要临时工作空间。此参数限制网络中任何层可以使用的最大大小。如果提供的刮擦不足,则TensorRT可能无法找到给定层的实现。..注意::此参数影响分配的GPU内存量和引擎性能。inference_mode
(可选)-设置是否允许使用8位和16位内核。-Float16(默认)-在引擎构建期间,启用此模式时,将尝试fp16内核。-Float32-在引擎构建期间,仅允许使用fp32内核。device_type
(可选)-设置此层/网络将在其上执行的默认设备,GPU或DLA。-GPU(默认)-在引擎构建期间,GPU将被设置为默认设备。-DLA-在引擎构建期间,DLA引擎将用作默认设备。allow_gpu_fallback
(可选)-如果无法在DLA上执行此层/网络,则允许回退到GPU。force_engine_update
(可选)-强制更新CUDA引擎,即使存在输入或缓存的.plan文件也是如此。调试功能。plugins_lib_namespace
(可选)-使用可选的名称空间初始化所有现有TensorRT插件并将其注册到Plugin Registry。要启用插件,请设置plugins_lib_namespace参数。空字符串是此参数的有效值,它指定默认的 TensorRT命名空间:
"plugins_lib_namespace": "",
> 注意 允许访问插件注册表的函数(initLibNvInferPlugins)应该仅被调用一次。为了防止从多个TensorRT推理小码实例调用此函数,请仅包括单个小码实例的Plugins Namespace参数。
-
verbose
(可选)-启用详细日志输出。此选项启用DNN优化进度的日志记录。默认情况下禁用它,以增加默认设置下的日志文件可用性。调试功能。
球分割推理应用程序配置示例:
"model_file_path": "external/ball_segmentation_model/model-9000-trimmed.uff", "engine_file_path": "external/ball_segmentation_model/model-9000-trimmed.plan", "input_tensor_info": [ { "operation_name": "input", "dims": [1, 3, 256, 512] } ], "output_tensor_info": [ { "operation_name": "output", "dims": [1, 256, 512, 1] }
SampleAccumulator Codelet
SampleAccumulator小码是一个组件,用于缓冲来自模拟器的合成数据。使用Python绑定,SampleAccumulator可以用作用于训练ML模型的张量流数据集。
SampleAccumulator采用一个参数,即要保留在缓冲区中的最大样本数。
"sample_buffer_size": 500
SampleAccumulatorViewer代码
SampleAccumulatorViewer小代码可视化在SampleAccumulator实例中排队的模拟数据。它在父节点中搜索SampleAccumulator实例,并可视化其队列缓冲区。
SampleAccumulatorViewer采用以下参数:
- 网格大小: 2个正整数的数组,指定要在高度和宽度上堆叠多少图像。
- 马赛克大小: 2个正整数的数组,指定生成的可视化图像的高度和宽度(以像素为单位)。
- 报价周期:可视化更新频率。
"mosaic_samples": { "isaac.viewers.SampleAccumulatorViewer": { "grid_size": [8, 8], "mosaic_size": [1080, 1920], "tick_period": "100ms" }, "isaac.ml.SampleAccumulator": { "sample_buffer_size": 64 } },
张量
在Isaac SDK中,Tensor数据作为的消息进行存储和传递
TensorProto
,这与Tensorflow中使用的numpy ndarray数据相对应。ML需要进行转换以容纳其他数据格式,例如图像。请参阅IsaacSDK/packages/ml/ColorCameraEncoderCpu.cpp
示例。 -