机器学习工作流程

机器学习工作流程

机器学习(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.TensorflowInferenceTensorflow开发人员指南

注意
请注意,Tensorflow需要大量资源,这可能会导致系统紧张,并需要一些时间才能在资源有限的边缘设备上加载。

用TensorRT推理

TensorRT是NVIDIA的深度学习推理优化工具和运行时。它旨在提供低延迟和高吞吐量。它支持所有主要框架的模型,包括Tensorflow,Caffe 2,Chainer,Microsoft Cognitive Toolkit,MxNet和PyTorch。

有关在Isaac中使用TensorRT的更多信息,请参考 TensorRT推断代码,其API参考isaac.ml.TensorflowInferenceTensorRT开发人员指南

火炬推论

Torch Torch是一个科学的计算框架,广泛支持深度学习算法。借助简单快速的脚本语言,Lua和底层C / CUDA实现,Torch易于使用且高效。

有关使用Torch的更多信息,请参阅Torch推理API参考 isaac.ml.TorchInferenceTorch文档

样品

开发,训练和调整深度学习模型需要大量的数据和计算能力。此类繁重的任务预计将由云或计算集群中的存储和GPU执行,而真正的机器人应用程序将在计算能力有限的边缘设备上运行。

从数据收集一直到机器人的深度学习模型部署,整个流程都非常顺畅,可加快机器人应用程序的开发速度。

PyCodelet

许多ML开发人员都精通Python。PyCodelet有助于在Python中与Isaac SDK之间的数据传输。

<IsaacSDK>/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。

注意
引擎文件(如果存在)优先于模型文件。

注意
该引擎<cite style="box-sizing: border-box;">无法</cite>在不同设备,不同版本的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]
    注意

    虽然模型训练期间的输入顺序(或<cite style="box-sizing: border-box;">权重内存布局</cite>)可以使用以下两种格式之一,但是此小码 在推断时仅支持输入张量的<cite style="box-sizing: border-box;">channels_first</cite>格式,而与原始框架的输入顺序无关:

    *   <cite style="box-sizing: border-box;">channels_last</cite>:将Channel作为张量的最后一个索引。TensorRT文档将此称为“ NHWC”布局(批号,高度,宽度,通道)。例如,。`[1, 200, 320, 3]`
    *   <cite style="box-sizing: border-box;">channels_first</cite>:使用Channel作为张量的第一个(或第二个)索引。TensorRT文档将此称为“ NCHW”布局(批号,通道,高度,宽度)。例如,。`[1, 3, 200, 320]`

   >  注意
    “批量大小”张量尺寸设置为1,在该示例中可以省略。

<dl class="docutils" style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px; list-style: none none;">

<dt style="box-sizing: border-box; font-weight: bold;">模型分析器使用此输入张量规范列表来剪切</dt>

<dd style="box-sizing: border-box; margin: 0px 0px 12px 24px;">

图的一部分,用于推理,设置可变大小的输入的尺寸并执行内存分配。它也可以在推理时使用,以验证输入张量的等级和大小。

<dl class="last docutils" style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px; list-style: none none;">

<dt style="box-sizing: border-box; font-weight: bold;">输入张量规范应符合:</dt>

<dd style="box-sizing: border-box; margin: 0px 0px 12px 24px;">

  • <cite style="box-sizing: border-box;">Isaac图中前一个节点的输出。</cite> 输入张量规范的张量等级和尺寸应与前一个节点的输出相匹配。前一个节点的输出的“批处理大小”应小于或等于引擎的最大批处理大小。

    如果未设置“批次大小”,则先前的节点输出也应将其忽略:

"input_tensor_info": [
  {
    "dims": [3, 256, 512]
...

"isaac.ml.TensorReshape": {
  "output_tensors_dimension": [[3, 256, 512]]
  • <cite style="box-sizing: border-box;">正在解析的训练模型的规范。</cite> 该模型应包含大小固定为匹配输入张量规范或可变大小(-1)的匹配节点。

  • <cite style="box-sizing: border-box;">TensorRT的局限性。</cite> TensorRT当前仅支持以下<cite style="box-sizing: border-box;">输入</cite>存储器布局:

    • (批量大小,通道,行,列),例如[1、3、480、640];
    • (通道,行,列),例如[3,480,640];
    • (批量大小,通道),例如[1,1024];
    • (频道),例如[1024]。

    注意

    <cite style="box-sizing: border-box;">图像的</cite> TensorRT输入顺序是<cite style="box-sizing: border-box;">色平面,</cite>而不是混合的颜色通道阵列(即不是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参数。空字符串是此参数的有效值,它指定<cite style="box-sizing: border-box;">默认的</cite> 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示例。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容