torch.utils 源代码
# mypy: 允许未类型化定义
导入 copyreg
导入
os.path 模块 as _osp
导入
弱引用
导入
火炬
from torch.utils 导入 (
兼容后向 as
向后兼容,
收集环境变量 as
收集环境变量,
数据 as
数据,
确定性 as
确定性,
钩子 as
钩子,
)
from torch.utils.backend_registration 导入 (
为私有使用 1 后端生成方法,
重命名_privateuse1_backend,
)
from torch.utils.cpp_backtrace 导入
获取_cpp_backtrace
from torch.utils.throughput_benchmark 导入 ThroughputBenchmark
[文档]def 设置模块(obj, mod):
"""
为给定对象设置 Python 对象的模块属性,以便更美观地打印
"""
如果不是 isinstance(mod, str):
抛出 TypeError 异常("The mod argument should be a string")
obj.__module__ = mod
如果
火炬.
_运行时使用部署():
# 在 torch_deploy 解释器内部无效,不存在冻结模块的路径
cmake 前缀路径 =
无
否则:
cmake 前缀路径 = _osp.
连接(
_osp.目录名(_osp.
目录名(__file__)),
分享,
cmake
)
[文档]
定义
交换张量(t1, t2):
""
此函数交换两个张量对象的内容。
总体而言,这将使 t1 具有 t2 的内容,同时保留
它的身份。
如果 t1 和 t2 有不同的槽位,则这不会工作。
"""
确保没有弱引用
如果
弱引用.getweakrefs(t1):
抛出
运行时错误(
"无法交换 t1,因为它与弱引用相关联")
如果
弱引用.getweakrefs(t2):
抛出
运行时错误(
无法交换 t2,因为它与弱引用相关联)
t1 槽位 =
设置(
复制注册.
_槽位名称(t1.
类))
# 类型:忽略[已定义]
t2_槽位 =
设置(
复制注册.
_槽位名称(t2.
类))
# 类型:忽略[已定义]
如果 t1_slots != t2_slots:
抛出
运行时错误(
无法交换具有不同槽位的 t1 和 t2)
定义 swap_attr(
名称):
临时 = getattr(t1,
名称)
setattr(t1, 名称, (getattr(t2,
名称)))
setattr(t2, 名称, tmp)
定义
错误前钩(grad_outputs):
抛出
运行时错误(
尝试执行被 swap_tensors 毒化的 AccumulateGrad 节点
这可能发生在你尝试在一个被交换的张量上反向运行时。
对于具有 `torch.__future__.set_swap_module_params_on_conversion(True)` 的模块 m
您不应该更改模块的设备或 dtype(例如 `m.cpu()` 或 `m.half()`)。
在前后跑动之间。为解决这个问题,请只更改“
"运行前(或运行前后)的设备/数据类型。"
)
定义
检查使用次数(t,
名称="t1"):
使用次数 = t._use_count()
错误字符串 = (
f预期使用次数{
名称}
要为 1 或 2 个 AccumulateGrad 节点,但得到了{
使用次数} "
f"确保您在其他地方没有保留对张量的引用。"
)
如果
使用次数 > 1:
如果
使用次数 == 2
和 t.
是否为叶子节点:
累积梯度节点 =
火炬.
自动微分.
图.
获取梯度边(t).
节点
确保累积梯度节点没有被获取梯度边懒初始化
如果 t._use_count() == 2:
累积梯度节点.
注册预钩子(
错误预钩)
否则:
抛出
运行时错误(
错误字符串)
否则:
抛出
运行时错误(
错误字符串)
检查使用次数(t1, "t1")
检查使用次数(t2, "t2")
交换类型
注意,如果槽位不匹配,这将失败
交换属性(
"__类__")
# 交换动态属性
交换属性("__dict__")
# 交换槽位
对于
槽
在 t1_slots:
如果
有属性(t1,
插槽)
和
有属性(t2,
插槽):
交换属性(
插槽)
elif 有属性(t1,
插槽):
setattr(t2, 插槽, (getattr(t1,
插槽)))
delattr(t1, 插槽)
elif 有属性(t2,
插槽):
setattr(t1, 插槽, (getattr(t2,
插槽)))
delattr(t2, 插槽)
# 交换它们指向的 at::Tensor
火炬._C._swap_tensor_impl(t1, t2)