torch.export.passes 的源代码
from
打字
导入
联合
导入
火炬
导入 torch.utils._pytree
是 pytree
from torch.export.exported_program 导入
导出程序
全部 = [
move_to_device_pass]
[文档]def
将程序移动到设备(
ep: 导出程序,
位置:
联合[
火炬.
设备,
字符串,
字典[
字符串,
字符串]]
) 翻译
导出程序:
""
将导出的程序移动到指定的设备上。
参数:
ep (ExportedProgram): 要移动的导出程序。
location (Union[torch.device, str, Dict[str, str]]): 移动导出程序到的设备。
如果是字符串,则解释为设备名称。
如果是字典,则解释为从现有设备到目标设备的映射。
现有设备到目标设备的映射。
返回:
ExportedProgram: 移动的已导出程序。
""
def 获取新设备(
当前设备:
火炬.
设备,
位置:
联合[
火炬.
设备,
字符串,
字典[
字符串,
字符串]],
) 翻译
字符串:
如果 isinstance(
位置,
字典):
如果
字符串(
当前设备)
在
位置.
键():
返回
位置[
字符串(
当前设备)]
else:
返回
字符串(
当前设备)
else:
返回
字符串(
位置)
# 移动所有 state_dict
为 k, v
在 ep.
状态字典.
项目():
如果 isinstance(v,
火炬.
神经网络.
参数):
ep._state_dict[k] = 火炬.
神经网络.
参数(
v.到(
_获取新设备(v.
设备,
位置)),
v.需要梯度,
)
else:
ep._state_dict[k] = v.到(_get_new_device(v.
设备,
位置))
# 将所有常量移动
为 k, v
在 ep.
常量.
项目():
如果 isinstance(v,
火炬.
张量):
ep._constants[k] = v.到(
获取新设备(v.
设备,
位置))
为
节点
在 ep.graph.
节点:
将所有具有内置设备的节点 kwargs 移动
如果
"设备"
在
节点.kwargs:
kwargs = 节点.kwargs.
复制()
kwargs["设备"] =
获取新设备(kwargs[
"设备"
]
位置)
节点.kwargs = kwargs
移动所有张量元数据
节点.
元数据[
值] =
py 树.tree_map(
lambda v: v.到(
_获取新设备(v.
设备,
位置))
如果 isinstance(v,
火炬.
张量)
否则 v,
节点.
元数据.
获取(
值),
)
ep.验证()
返回 ep