torch.utils.mobile_optimizer¶
警告
此 API 处于测试阶段,可能在不久的将来发生更改。
Torch mobile 支持 torch.utils.mobile_optimizer.optimize_for_mobile 实用程序,以在评估模式下使用模块运行一系列优化传递。该方法采用以下参数:一个 torch.jit.ScriptModule 对象、一个阻止列表优化集、一个保留的方法列表和一个后端。
- 对于 CPU 后端,默认情况下,如果优化阻止列表为 None 或为空,optimize_for_mobile将运行以下优化
- Conv2D + BatchNorm 融合(阻止列表选项 mobile_optimizer.MobileOptimizerType.CONV_BN_FUSION):此优化传递将 - Conv2d-BatchNorm2d折叠到此模块及其所有子模块的- forward方法中的- Conv2d中。相应地更新- Conv2d的权重和偏差。
- 插入并折叠预打包操作(阻止选项 mobile_optimizer.MobileOptimizerType.INSERT_FOLD_PREPACK_OPS):此优化传递重写图,以用预打包对应项替换 2D 卷积和线性操作。预打包操作是有状态操作,因为它们需要创建一些状态,例如权重预打包,并在操作执行期间使用此状态,即预打包权重。XNNPACK 就是这样一个后端,它提供预打包操作,其内核针对移动平台(例如 ARM CPU)进行了优化。权重的预打包能够实现高效的内存访问,从而加快内核执行速度。目前, - optimize_for_mobile传递重写图,以用 1)为 XNNPACK conv2d/linear 操作预打包权重的操作和 2)将预打包权重和激活作为输入并生成输出激活的操作替换- Conv2D/Linear。由于 1 只需执行一次,因此我们折叠权重预打包,以便仅在模型加载时执行一次。此- optimize_for_mobile传递执行 1 和 2,然后折叠(即删除)权重预打包操作。
- ReLU/Hardtanh 融合:XNNPACK 操作支持融合钳位。也就是说,输出激活的钳位作为内核的一部分完成,包括 2D 卷积和线性操作内核。因此,钳位实际上是免费的。因此,任何可以表示为钳位操作的操作(例如 - ReLU或- hardtanh)都可以与 XNNPACK 中先前的- Conv2D或- linear操作融合。此传递通过查找遵循由先前的传递编写的 XNNPACK- Conv2D/linear操作的- ReLU/hardtanh操作并将其融合在一起来重写图。
- 删除 Dropout(阻止选项 mobile_optimizer.MobileOptimizerType.REMOVE_DROPOUT):当训练为 false 时,此优化传递从该模块中删除 - dropout和- dropout_节点。
- 提升卷积打包参数(阻止选项 mobile_optimizer.MobileOptimizerType.HOIST_CONV_PACKED_PARAMS):此优化传递将卷积打包参数移动到根模块,以便可以删除卷积结构。这会减小模型大小,而不会影响数值。 
- Add/ReLU 融合(阻止选项 mobile_optimizer.MobileOptimizerType.FUSE_ADD_RELU):此传递查找 - add操作后面的- relu操作的实例,并将它们融合到单个- add_relu中。
 
- 对于 Vulkan 后端,默认情况下,如果优化阻止列表为 None 或为空,optimize_for_mobile将运行以下优化
- 自动 GPU 传输(阻止选项 mobile_optimizer.MobileOptimizerType.VULKAN_AUTOMATIC_GPU_TRANSFER):此优化传递重写图,以便将输入和输出数据移至 GPU 和从 GPU 移出成为模型的一部分。 
 
optimize_for_mobile 还将调用 freeze_module pass,它仅保留 forward 方法。如果您有其他需要保留的方法,请将它们添加到保留方法列表中并传递给该方法。
- torch.utils.mobile_optimizer.optimize_for_mobile(script_module, optimization_blocklist=None, preserved_methods=None, backend='CPU')[source]¶
- 针对移动部署优化 torch 脚本模块。 - 参数
- script_module (ScriptModule) – ScriptModule 类型的 torch 脚本模块实例。 
- optimization_blocklist (Optional[Set[_MobileOptimizerType]]) – MobileOptimizerType 类型的集合。当未传递集合时,优化方法将运行所有优化器 pass;否则,优化器方法将运行未包含在 optimization_blocklist 中的优化 pass。 
- preserved_methods (Optional[List]) – 调用 freeze_module pass 时需要保留的方法列表 
- backend (str) – 用于运行结果模型的设备类型(默认情况下为“CPU”、“Vulkan”或“Metal”)。 
 
- 返回
- 一个新的经过优化的 torch 脚本模块 
- 返回类型
- RecursiveScriptModule