torch.utils.mobile_optimizer ¬
警告
PyTorch Mobile 已不再积极维护。请查看 ExecuTorch,PyTorch 的新一代设备端推理库。您还可以查看 XNNPACK 和 Vulkan 代理的文档。
Torch mobile 支持使用 torch.utils.mobile_optimizer.optimize_for_mobile
工具以 eval 模式运行模块的优化流程列表。该方法接受以下参数:一个 torch.jit.ScriptModule 对象、一个优化集黑名单、一个保留方法列表和后端。
- 对于 CPU 后端,默认情况下,如果优化黑名单为空或为空列表,
optimize_for_mobile
将运行以下优化: Conv2D + BatchNorm 融合(黑名单选项 mobile_optimizer.MobileOptimizerType.CONV_BN_FUSION):此优化过程将
Conv2d-BatchNorm2d
折叠到Conv2d
中,并在该模块及其所有子模块的forward
方法中执行。Conv2d
的权重和偏置相应更新。插入并折叠预打包操作(blocklisting 选项 mobile_optimizer.MobileOptimizerType.INSERT_FOLD_PREPACK_OPS):此优化过程重写图,用其预打包对应物替换 2D 卷积和线性操作。预打包操作是状态操作,因为它们需要创建一些状态,例如权重预打包,并在操作执行期间使用此状态,即预打包权重。XNNPACK 是提供预打包操作的后端之一,其内核针对移动平台(如 ARM CPU)进行了优化。权重预打包使内存访问更有效,从而加快内核执行速度。目前,
optimize_for_mobile
过程重写图以替换Conv2D/Linear
,包括 1)为 XNNPACK conv2d/linear 操作预打包权重的操作,以及 2)以预打包权重和激活作为输入并生成输出激活的操作。由于 1)只需要执行一次,因此我们将权重预打包折叠起来,使其在模型加载时只执行一次。optimize_for_mobile
过程执行 1 和 2,然后折叠,即删除,权重预打包操作。ReLU/Hardtanh 融合:XNNPACK 操作支持夹紧的融合。也就是说,输出激活的夹紧作为内核的一部分执行,包括 2D 卷积和线性操作内核。因此,夹紧是免费的。因此,任何可以表示为夹紧操作的 op,如
ReLU
或hardtanh
,都可以与 XNNPACK 中的前一个Conv2D
或linear
操作融合。此过程通过查找前一个过程写入的 XNNPACKConv2D/linear
操作后面的ReLU/hardtanh
操作来重写图,并将它们融合在一起。Dropout 移除(blocklisting 选项 mobile_optimizer.MobileOptimizerType.REMOVE_DROPOUT):此优化过程在训练为 false 时从该模块中移除
dropout
和dropout_
节点。卷积打包参数提升(blocklisting 选项 mobile_optimizer.MobileOptimizerType.HOIST_CONV_PACKED_PARAMS):此优化过程将卷积打包参数移动到根模块,以便可以删除卷积结构。这减小了模型大小,而不会影响数值。
加/ReLU 融合(blocklisting 选项 mobile_optimizer.MobileOptimizerType.FUSE_ADD_RELU):此过程查找
relu
操作跟随add
操作的实例,并将它们融合成一个单一的add_relu
。
- 对于 Vulkan 后端,默认情况下,如果优化黑名单为空或为空列表,
optimize_for_mobile
将运行以下优化: 自动 GPU 传输(黑名单选项 mobile_optimizer.MobileOptimizerType.VULKAN_AUTOMATIC_GPU_TRANSFER):此优化过程将重写图,使得输入和输出数据在 GPU 之间的移动成为模型的一部分。
optimize_for_mobile
还将调用冻结模块 pass,该 pass 仅保留 forward
方法。如果您有其他需要保留的方法,请将它们添加到保留方法列表中,并传递给方法。
- torch.utils.mobile_optimizer.optimize_for_mobile(script_module, optimization_blocklist=None, preserved_methods=None, backend='CPU')[source][source]
优化 Torch 脚本模块以适应移动部署。
- 参数:
script_module (ScriptModule) - torch 脚本模块的实例,类型为 ScriptModule。
optimization_blocklist (可选[set[torch._C._MobileOptimizerType]]) - 类型为 MobileOptimizerType 的集合。当未传入集合时,优化方法将运行所有优化器遍历;否则,优化方法将运行不在 optimization_blocklist 中的优化遍历。
preserved_methods (可选[list[~AnyStr]]) - 当调用 freeze_module 遍历需要保留的方法列表。
后端(字符串)- 运行结果模型的设备类型(默认为‘CPU’,或‘Vulkan’或‘Metal’)。
- 返回:
一个新的优化后的 torch 脚本模块
- 返回类型:
递归脚本模块