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(
"_打包输入已压缩_" +
函数名)
返回
打包输入属性