机器学习工作流程

机器学习工作流程

机器学习(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示例。

你可能感兴趣的:(机器学习工作流程)