以云上优化任务为例,您可以仅配置优化层级,并根据实际需求选择优化设备设备型号等必选参数,即可进行零输入优化。但是,建议您提供更多有关模型的具体信息及优化配置,从而更好地满足您对该模型的优化需求。

提供辅助数据

辅助数据指测试数据和校正数据:
  • 测试数据

    强烈建议您提供一组可以正常进行模型推理的真实测试数据(尤其对于PyTorch模型),即test_data。PAI-Blade将基于该组数据的测速情况进行模型优化,其优化结果将更加有效且可靠。

    您可以在提交优化任务的配置页面,选择优化类型数据辅助优化,并上传用于test_data的辅助数据。test_data的生成示例如下所示:
    • TensorFlow模型test_data的生成示例
      import numpy as np
      
      feed_dict = {
          'image_placeholder:0': np.ones((8, 3, 224, 224), dtype=np.float32),
          'threshold_placeholder:0': np.float32(0.5),
      }
      with open('test_data.npy', 'wb') as f:
          np.save(f, feed_dict)
      说明 feed_dict中的value需要全部为np.ndarray类型。
    • PyTorch模型test_data的生成示例
      import torch
      
      image = torch.ones(8, 3, 224, 224)
      threshold = torch.tensor(0.5)
      feed_tuple = (image, threshold)
      torch.save(feed_tuple, 'test_data.pth')
  • 校正数据

    在进行O2(标准通用优化结合混合精度量化,可能存在微小精度损失)级别优化时,会打开PAI-Blade INT8优化。在不提供校正数据集的情况下,PAI-Blade将执行在线INT8量化方案。如果此时希望能够获得更进一步的加速效果,建议您提供一组用于离线计算量化参数的校正数据集(通常建议提供100条以上真实数据),PAI-Blade将自动开启离线INT8量化。

    您可以在提交优化任务的配置页面,选择优化类型数据辅助优化,并上传用于校正数据的辅助数据集。校正数据的生成示例如下所示:
    • TensorFlow模型校正数据的生成示例
      import numpy as np
      
      calib_data = list()
      for i in range(10):
          feed_dict = {
              'image_placeholder:0': np.ones((8, 3, 224, 224), dtype=np.float32),
              'threshold_placeholder:0': np.float32(0.5),
          }
          calib_data.append(feed_dict)
      with open('calib_data.npy', 'wb') as f:
          np.save(f, calib_data)
      说明 feed_dict中的value需要全部为np.ndarray类型。
    • PyTorch模型校正数据的生成示例
      import numpy as np
      
      calib_data = list()
      for i in range(10):
          image = torch.ones(8, 3, 224, 224)
          threshold = torch.tensor(0.5)
          feed_tuple = (image, threshold)
          calib_data.append(feed_tuple)
      torch.save(calib_data, 'calib_data.pth')

提供高级配置参数

除提供辅助数据外,建议您根据模型情况和优化需求,选中高级配置复选框,并在其下方的文本框中,输入JSON格式的模型详细配置,PAI-Blade将按照您设定的参数进行优化。

以下为您介绍高级配置JSON的示例及字段说明:
  • 高级配置示例
    以下为两个虚构模型的高级配置JSON示例。
    #示例一。
    {
        "inputs": ["input_image", "input_sequence"],
        "input_shapes": [["8*224*224*3", "-1*-1"]],
        "outputs": ["Output/GetScores", "Output/GetClasses"]
    }
    
    #示例二。
    {
        "inputs": ["input0", "input1"],
        "input_shapes": [["[1,71]*[1,16]", "copy:0"]],
        "input_ranges": [["[0,1]", "[0,64999]"]],
        "outputs": ["fusion/Sigmoid", "fusion/div_6"],
        "gpu": {
            "aicompiler": {
                "optimize_for_dynamic_shape": true,
                "optimize_for_static_shape": false
            }
        }
    }
  • 高级配置说明
    高级配置项的设置方法及含义如下表所示(以下字段均有默认值,可以缺省)。
    字段 描述 字段类型 默认值
    inputs

    输入节点名称列表。输入节点可以是模型的“Placeholder”,也可以是任意的中间节点,只要使用这些节点可以合法地将图切分为两部分即可。

    对于某些前面一小部分进行数据预处理的模型而言,从中间某个节点开始,Tensor的Shape才变为固定的,那么以该固定Shape Tensor作为输入,通常可以获得更好的优化效果。而前面的数据预处理部分,通常没有很好的优化效果,因此可以排除在优化范围之外。

    数组
    outputs 数组中的元素是该模型有效的输出节点名称。 数组
    gpu disable_fp16_accuracy_check “O1”优化层级将默认开启FP16优化,并自动检查模型输出结果差异是否在默认阈值范围内,即该字段取值为false。如果超出该范围,则取消FP16优化。部分情况下,模型输出的变化并不影响模型精度,则可以设置该参数为true,以取消默认的FP16结果检查。 布尔 false
    aicompiler enable 当该字段为true时,PAI-Blade将启用PAI-TAO编译优化,根据模型特点自适应地生成高效代码,以帮助您获得更好的模型优化效果。当该字段为false时,则不开启PAI-TAO编译优化。 布尔 true
    optimize_for_static_shape 当该字段为true时,表示您的模型为Static Shape(或只存在有限组的Dynamic Shape),PAI-Blade将启用PAI-TAO对Static Shape模型的编译优化。当该字段为false时,PAI-Blade将关闭PAI-TAO对Static Shape模型的编译优化。 布尔 false
    optimize_for_dynamic_shape 当该字段为true时,表示您的模型为Dynamic Shape,PAI-Blade将启用PAI-TAO对Dynamic Shape模型的编译优化。当该字段为false时,PAI-Blade将关闭PAI-TAO对Dynamic Shape模型的编译优化。 布尔 false
    accuracy_keeper “O2”级别优化可能会引入一定的精度损失,如果希望减小该损失,可以尝试将该项设置为true,以尝试保证模型精度。但是与此同时可能会在一定程度上影响加速效果。如果该项设置为false,则PAI-Blade会优先保证加速效果,可能会带来精度损失。 布尔 false
    input_shapes

    该字段用于指定输入数据尺寸,必须是一个数组的数组。即使外层数组中只有一个数组元素,外层数组中的每个元素也必须是一个数组,该数组对应模型每个输入Tensor的Shape。

    例如,在上面的配置示例一中,有两个Input Tensor,分别为:
    • "input_image"

      input_image是一个4维Tensor,其尺寸为[8,224,224,3]。此处的“8”指Batch Size。如果模型在Inference时出现不同的Batch Size,则此处取值为服务将使用的最大Batch Size。

    • "input_sequence"

      input_sequence是一个二维Tensor,其Shape为[-1,-1]。"-1" 代表未知,有可能和[8,224,224,3]搭配的input_sequence可以是任意Shape。每个数组元素中的元素个数必须严格对应inputs的个数,每一维度的Shape以星号(*)作为分隔符。

    在某些特殊情况下,Input Shape每个Dimension值可能在某个区间范围内均有效。此时,您可以采用上面配置示例二中的描述方式"[1,71]*[1,16]"。该方式声明了Input为一个二维Tensor,第一个维度从1到71都是合法的取值,第二个维度从1到16都是合法的取值。
    说明 此处全部采用闭区间标记。

    对于tf.string类型的输入,您也可以标定区间。例如“[‘a’,’k’]”,表示从’a’’k’都是合法输入。

    特别的,您还可以以copy:i的方式表示某个输入的shape始终和第i个输入保持一致(0-Based Numbering)。例如上述示例中的copy:0,即表示”input1”的shape始终和”input0”一致。当”input0”的shape是[45,12]时,”input1”的shape也是[45,12]。如果您将”input1”配置为”[1,72][1,17]”,则无法表示“两者一致”的约束关系,系统在优化时会认为”input0””input1”的一组”[45,12]””[36,8]” shape也是合法的,这可能与您的初衷不符。

    数组的数组
    input_ranges

    该字段用于指定输入Tensor的取值范围,与input_shapes类似,必须是一个数组的数组。

    以上面配置示例二中的第一个输入input0为例,假设该Input实际为一个Mask,因此其有效取值为0和1,您可以指定其input_ranges[0,1]。而该示例中input1的合法取值范围为0至64999。该Field也可以缺省,测试时,系统会使用默认取值范围生成随机输入,例如FLOAT 32类型的默认范围为0到1。

    数组的数组