美文网首页
机器学习工作流程

机器学习工作流程

作者: YottaYuan | 来源:发表于2020-03-18 03:43 被阅读0次

    机器学习工作流程

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

    相关文章

      网友评论

          本文标题:机器学习工作流程

          本文链接:https://www.haomeiwen.com/subject/jjwtyhtx.html