pytorch深度学习入门(16)之-使用onnx模型混合精度Float16量化
·
创建 Float16 和混合精度模型
将模型转换为使用 float16 而不是 float32 可以减小模型大小(最多一半)并提高某些 GPU 上的性能。可能会有一些精度损失,但在许多模型中,新的精度是可以接受的。float16 转换不需要调整数据,这使其优于量化。
内容
Float16 转换
按照以下步骤将模型转换为 float16:
-
安装 onnx 和onnxconverter-common
pip install onnx onnxconverter-common -
使用
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_val,max_finite_val:常量值将被剪裁到这些边界。0.0、nan、inf、 和-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。rtol,atol: 用于验证的绝对和相对公差。keep_io_types:模型输入/输出是否应保留为 float32。
混合精度工具的工作原理是将操作集群转换为 float16。如果一个集群失败,它会被分成两半,两个集群都会独立尝试。该工具工作时会打印簇大小的可视化结果。
更多推荐
所有评论(0)