创建 Float16 和混合精度模型

将模型转换为使用 float16 而不是 float32 可以减小模型大小(最多一半)并提高某些 GPU 上的性能。可能会有一些精度损失,但在许多模型中,新的精度是可以接受的。float16 转换不需要调整数据,这使其优于量化。

内容

Float16 转换

按照以下步骤将模型转换为 float16:

  1. 安装 onnx 和onnxconverter-common

    pip install onnx onnxconverter-common

  2. 使用convert_float_to_float16python中的函数。

    <span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code> <span style="color:#a625a4">import</span> <span style="color:#555555 !important">onnx</span>
     <span style="color:#a625a4">from</span> <span style="color:#555555 !important">onnxconverter_common</span> <span style="color:#a625a4">import</span> <span style="color:#555555 !important">float16</span>
    
     <span style="color:#555555 !important">model</span> <span style="color:#383942">=</span> <span style="color:#555555 !important">onnx</span><span style="color:#383942">.</span><span style="color:#555555 !important">load</span><span style="color:#383942">(</span><span style="color:#50a04f">"path/to/model.onnx"</span><span style="color:#383942">)</span>
     <span style="color:#555555 !important">model_fp16</span> <span style="color:#383942">=</span> <span style="color:#555555 !important">float16</span><span style="color:#383942">.</span><span style="color:#555555 !important">convert_float_to_float16</span><span style="color:#383942">(</span><span style="color:#555555 !important">model</span><span style="color:#383942">)</span>
     <span style="color:#555555 !important">onnx</span><span style="color:#383942">.</span><span style="color:#555555 !important">save</span><span style="color:#383942">(</span><span style="color:#555555 !important">model_fp16</span><span style="color:#383942">,</span> <span style="color:#50a04f">"path/to/model_fp16.onnx"</span><span style="color:#383942">)</span>
    </code></span></span></span></span></span>

Float16 工具参数

如果转换后的模型不起作用或精度较差,您可能需要设置其他参数。

<span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code><span style="color:#555555 !important">convert_float_to_float16</span><span style="color:#383942">(</span><span style="color:#555555 !important">model</span><span style="color:#383942">,</span> <span style="color:#555555 !important">min_positive_val</span><span style="color:#383942">=</span><span style="color:#b66a00">1e-7</span><span style="color:#383942">,</span> <span style="color:#555555 !important">max_finite_val</span><span style="color:#383942">=</span><span style="color:#b66a00">1e4</span><span style="color:#383942">,</span> <span style="color:#555555 !important">keep_io_types</span><span style="color:#383942">=</span><span style="color:#ca7601">False</span><span style="color:#383942">,</span>
                         <span style="color:#555555 !important">disable_shape_infer</span><span style="color:#383942">=</span><span style="color:#ca7601">False</span><span style="color:#383942">,</span> <span style="color:#555555 !important">op_block_list</span><span style="color:#383942">=</span><span style="color:#ca7601">None</span><span style="color:#383942">,</span> <span style="color:#555555 !important">node_block_list</span><span style="color:#383942">=</span><span style="color:#ca7601">None</span><span style="color:#383942">)</span>
</code></span></span></span></span></span>
  • model:要转换的 ONNX 模型。
  • min_positive_valmax_finite_val:常量值将被剪裁到这些边界。0.0naninf、 和-inf将保持不变。
  • keep_io_types:模型输入/输出是否应保留为 float32。
  • disable_shape_infer:跳过运行 onnx 形状/类型推断。如果形状推断崩溃、模型中已存在形状/类型或不需要类型(类型用于确定不支持/阻止的操作需要强制转换操作),则很有用。
  • op_block_list:保留为 float32 的操作类型列表。默认情况下使用来自 的列表float16.DEFAULT_OP_BLOCK_LIST。此列表包含 ONNX 运行时中 float16 不支持的操作。
  • node_block_list:保留为 float32 的节点名称列表。

注意:被阻止的操作将在它们周围插入到 float16/float32 之间的强制转换。目前,如果两个被阻止的操作彼此相邻,则仍会插入强制转换,从而创建冗余对。ORT 将在运行时优化这对,因此结果将保持全精度。

混合精度

如果 float16 转换的结果很差,您可以将大部分操作转换为 float16,但保留一些操作为 float32。该auto_mixed_precision.auto_convert_mixed_precision工具会找到要跳过的最小操作集,同时保持一定程度的准确性。您将需要为模型提供示例输入。

由于 ONNX Runtime 的 CPU 版本不支持 float16 运算,并且该工具需要测量精度损失,因此混合精度工具必须在具有 GPU 的设备上运行

<span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code><span style="color:#a625a4">from</span> <span style="color:#555555 !important">onnxconverter_common</span> <span style="color:#a625a4">import</span> <span style="color:#555555 !important">auto_mixed_precision</span>
<span style="color:#a625a4">import</span> <span style="color:#555555 !important">onnx</span>

<span style="color:#555555 !important">model</span> <span style="color:#383942">=</span> <span style="color:#555555 !important">onnx</span><span style="color:#383942">.</span><span style="color:#555555 !important">load</span><span style="color:#383942">(</span><span style="color:#50a04f">"path/to/model.onnx"</span><span style="color:#383942">)</span>
<span style="color:#555555 !important">model_fp16</span> <span style="color:#383942">=</span> <span style="color:#555555 !important">auto_convert_mixed_precision</span><span style="color:#383942">(</span><span style="color:#555555 !important">model</span><span style="color:#383942">,</span> <span style="color:#555555 !important">test_data</span><span style="color:#383942">,</span> <span style="color:#555555 !important">rtol</span><span style="color:#383942">=</span><span style="color:#b66a00">0.01</span><span style="color:#383942">,</span> <span style="color:#555555 !important">atol</span><span style="color:#383942">=</span><span style="color:#b66a00">0.001</span><span style="color:#383942">,</span> <span style="color:#555555 !important">keep_io_types</span><span style="color:#383942">=</span><span style="color:#ca7601">True</span><span style="color:#383942">)</span>
<span style="color:#555555 !important">onnx</span><span style="color:#383942">.</span><span style="color:#555555 !important">save</span><span style="color:#383942">(</span><span style="color:#555555 !important">model_fp16</span><span style="color:#383942">,</span> <span style="color:#50a04f">"path/to/model_fp16.onnx"</span><span style="color:#383942">)</span>
</code></span></span></span></span></span>

混合精度工具参数

<span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code><span style="color:#555555 !important">auto_convert_mixed_precision</span><span style="color:#383942">(</span><span style="color:#555555 !important">model</span><span style="color:#383942">,</span> <span style="color:#555555 !important">feed_dict</span><span style="color:#383942">,</span> <span style="color:#555555 !important">validate_fn</span><span style="color:#383942">=</span><span style="color:#ca7601">None</span><span style="color:#383942">,</span> <span style="color:#555555 !important">rtol</span><span style="color:#383942">=</span><span style="color:#ca7601">None</span><span style="color:#383942">,</span> <span style="color:#555555 !important">atol</span><span style="color:#383942">=</span><span style="color:#ca7601">None</span><span style="color:#383942">,</span> <span style="color:#555555 !important">keep_io_types</span><span style="color:#383942">=</span><span style="color:#ca7601">False</span><span style="color:#383942">)</span>
</code></span></span></span></span></span>
  • model:要转换的 ONNX 模型。
  • validate_fn:一个接受两个 numpy 数组列表(分别是 float32 模型和混合精度模型的输出)的函数,True如果结果足够接近则返回,False否则返回。rtol可以用来代替 and 或与and一起使用atol
  • rtolatol: 用于验证的绝对和相对公差。
  • keep_io_types:模型输入/输出是否应保留为 float32。

混合精度工具的工作原理是将操作集群转换为 float16。如果一个集群失败,它会被分成两半,两个集群都会独立尝试。该工具工作时会打印簇大小的可视化结果。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐