快捷键

torch.utils.mobile_optimizer 的源代码

# mypy: 允许未类型化定义
本模块包含用于移动模型优化和代码检查的实用方法。

导入 火炬
from 枚举 导入 枚举
from torch._C 导入 _MobileOptimizerType  MobileOptimizerType
from 打字 导入 可选, AnyStr

 LintCode(枚举):
    BUNDLED_INPUT = 1
    REQUIRES_GRAD = 2
    丢弃 = 3
    批标准化 = 4

[文档]定义 优化移动端( 脚本模块: 火把.算子.脚本模块, 优化黑名单: 可选[设置[移动优化器类型]] = , 保留方法: 可选[列表[任意字符串]] = , 后端: 字符串 = CPU) -> 火把.算子.递归脚本模块: "" 优化 Torch 脚本模块以进行移动部署。 参数: torch 脚本模块的实例,类型为 ScriptModule。 类型为 MobileOptimizerType 的集合。当未传递集合时, 优化方法将运行所有优化器遍历;否则,优化方法 将运行不在 optimization_blocklist 内部的优化遍历。 需要保留的方法列表:当调用 freeze_module 过滤器时需要保留的方法 后端:运行结果模型所使用的设备类型(默认为 'CPU','Vulkan' 或 'Metal') 返回: 一个新的优化后的 torch 脚本模块 "文档" 如果 isinstance(脚本模块, 火把.算子.脚本模块): raise 类型错误( f'已获取{类型(脚本模块)}但是期望 ScriptModule.') 如果 优化黑名单 : 优化黑名单 = 设置() 如果 保留方法 : 保留方法 = 输入文本为空,请提供需要翻译的文本 # 将潜在的字节数组转换为字符串(如果有)以通过类型检查 # 这里我们使用一个新的名称,因为将其分配回 preserved_methods 将会调用 # mypy 错误(即 List[AnyStr] = List[str]) preserved_methods_str: 列表[字符串] = [字符串(方法) for 方法 保留方法] 打包输入属性 = 获取保留的打包输入属性(脚本模块, 保留方法字符串) 如果 所有(有属性(脚本模块, 方法) for 方法 打包输入属性): 保留方法字符串 = 列表(设置(保留方法字符串 + 打包输入属性)) 不存在的函数 = [方法 for 方法 保留的方法_str 如果 有属性(脚本模块, 方法)] 如果 不存在的函数: raise 属性错误( f"以下要保留的方法在 script_module 中不存在: "{“,”.连接(不存在的函数)}") 后端 = 后端.小写() 如果 后端 == cpu: 优化 C++模块 = 火把._C._jit_pass 优化移动端( 脚本模块._c, 优化黑名单, 保留方法字符串) elif 后端 == vulkan: 优化 C++模块 = 火把._C._jit_pass_vulkan 优化移动端( 脚本模块._c, 优化黑名单, 保留方法字符串) elif 后端 == 金属: 优化后的 C++模块 = 火把._C._jit_pass_metal_optimize_for_mobile(脚本模块._c, 保留方法_str) 否则: raise 类型错误("未知后端,必须是 'CPU'、'Vulkan' 或 'Metal' 之一") 返回 火把.算子.递归.包装 C++模块(优化后的 cpp 模块)
定义 生成移动模块的 lints(脚本模块: 火把.算子.脚本模块): "" 生成给定 torch 脚本模块的 lints 列表。 参数: script_module: torch 脚本模块的实例,类型为 ScriptModule。 返回: lint_map: 包含模块 lints 的字典列表。 "文档" 如果 isinstance(脚本模块, 火把.算子.脚本模块): raise 类型错误( f'已获取'{类型(脚本模块)}',但期望 ScriptModule。') 'lint 列表' = 输入文本为空,请提供需要翻译的文本 如果 有属性(脚本模块, '_生成用于前向的捆绑输入'): 检查列表.append({名称: LintCode.包含输入.名称, "消息": "没有捆绑输入用于前向,请添加捆绑输入 " "在保存模块之前,使用 torch.utils.bundled_inputs.augment_model_with_bundled_inputs。"}) for 名称, 参数 脚本模块.命名参数。(): 如果 参数.需要梯度: lint_list.append({名称: LintCode.需要研究生学历.名称, "消息": f"参数"{名称}需要研究生," "请设置 torch.no_grad()以减少内存使用并提高推理阶段的计算速度。" "推理阶段。"}) op_names = 火把.算子.导出操作名称(脚本模块) for 操作名称 op_names: 如果 "dropout" 操作符名称: lint_list.append({名称: LintCode.DROPOUT.名称, "消息": f"操作符"{操作符名称}存在,保存模块前请记得调用 eval() "并调用 torch.utils.mobile_optimizer.optimize_for_mobile 来删除 dropout " 操作符。}) 如果 批标准化 操作符名称: 检查列表.append({名称: LintCode.批标准化.名称, "消息": f"运算符"{操作符名称}存在,记得在调用 eval() 之前 "保存模块并调用 torch.utils.mobile_optimizer.optimize_for_mobile 以删除批归一化" "运算符。"}) 返回 lint 列表 定义 _get_bundled_inputs_preserved_attributes(脚本模块: 火把.算子.脚本模块, 保留方法: 列表[字符串]) -> 列表[字符串]: 打包输入属性 = 输入文本为空,请提供需要翻译的文本 # 具备打包输入功能 如果 有属性(脚本模块, 获取所有打包输入): 打包输入属性.append('获取所有捆绑输入') 捆绑输入属性.append('获取捆绑输入数量') # 模块中捆绑输入在引入为多个函数捆绑输入的更改之后 如果 有属性(脚本模块, 获取捆绑输入函数和信息): 捆绑输入属性.append(获取捆绑输入函数和信息) 所有信息 = 脚本模块.获取捆绑输入函数和信息() for 函数名 所有信息: 如果 函数名 保留方法: 捆绑输入属性.append(函数名称) 打包输入属性.append(获取所有打包输入的_ + 函数名) 打包输入属性.append("_打包输入已压缩_" + 函数名) 返回 打包输入属性

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源