torch.nn.utils.memory_format 的源代码
# mypy: 允许未类型化定义
导入
火炬
[文档]def
转换 conv2d 权重内存格式(
模块,
内存格式):
r将 ``nn.Conv2d.weight`` 的 ``memory_format`` 转换为 ``memory_format``。
转换递归地应用于嵌套的 `nn.Module`,包括 `module`。
注意,它只更改内存格式,但不改变每个维度的语义。
此函数用于简化计算以采用 NHWC 内核,这
在具有计算能力 >= 7.0 的 CUDA 设备上对 fp16 数据提供了相当大的加速。
.. 注意::
调用 `model.to(memory_format=torch.channels_last)` 更加激进
比起实用函数 `convert_conv2d_weight_memory_format`。任何
具有四维权重的层都会受到 `model.to` 的影响,这并不
一定能够从转换为指定的 `memory_format` 中受益。
我们有信心的一点是,在 cuDNN 中进行 NHWC(channels_last)转换,因为即使在需要应用置换输入张量的情况下,运行卷积在 NHWC 中也是有利的。
因此,我们的策略是仅将卷积的权重转换为 NHWC 格式。
即使在必须对输入张量进行置换的情况下,这也很有益。
因此,我们的策略是仅将卷积的权重转换为 NHWC 格式。
channels_last. 这确保了;
1. 将使用快速卷积核,其好处可能
超出排列(如果输入不是同一格式)的开销。
2. 在对层不产生益处的层上不应用不必要的排列。
从内存格式转换而来。
最佳情况是,卷积层之间的层是通道。
最后兼容。输入张量在遇到第一个卷积层时会转换为通道最后这种内存格式,并保持在该内存格式中。
遇到第一个卷积层时会被转换为通道最后这种内存格式,并保持在该内存格式中。
因此,以下卷积不需要对输入张量进行置换。
如果通道的最后一层不兼容层位于卷积
层,我们需要将输入张量重新排列回连续格式
为此层。输入张量将通过剩余的层
连续格式,在遇到通道时可以转换为通道最后
另一个卷积层。没有必要将这种转换传播到早期层,因为大多数层对“memory_format”相当不敏感
。因为大多数层对“memory_format”相当不敏感
``memory_format``。
这个声明可能会改变,当 PyTorch 支持排列融合时,
可能还有比在卷积之前立即融合排列更好的位置,
。
Args:
模块(nn.Module):``nn.Conv2d`` 和 ``nn.ConvTranspose2d`` 或容器
``nn.Module``
memory_format: 用户指定的 ``memory_format``,
例如 ``torch.channels_last`` 或 ``torch.contiguous_format``,
返回:
原模块已更新为 ``nn.Conv2d``,
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA)
>>> # xdoctest: +REQUIRES(env:CUBLAS_WORKSPACE_CONFIG)
>>> input = torch.randint(1, 10, (2, 8, 4, 4), dtype=torch.float16, device="cuda")
>>> model = nn.Sequential(
>>> nn.Conv2d(8, 4, 3)).cuda().half()
>>> # 这与以下内容相同:
>>> # nn.utils.convert_conv2d_weight_memory_format(model, torch.channels_last)
>>> model = nn.utils.convert_conv2d_weight_memory_format(model, torch.channels_last)
>>> out = model(input)
"源代码"
当支持 channels_last 时,扩展到`_ConvNd`
超越仅限于 4 维张量
如果 isinstance(
模块, (
火炬.nn.
卷积 2D,
火炬.nn.ConvTranspose2d)):
权重数据 = (
模块.
重量.detach().
克隆().
连续(
内存格式=
内存格式)
)
模块.
重量.
数据 =
权重数据.
调整大小(
重量数据.
尺寸(),
内存格式=
内存格式
)
为
儿童
在
模块.
儿童():
将 conv2d_weight_memory_format 转换为 memory_format(
儿童,
内存格式)
返回
模块
[文档]def
将 conv3d_weight_memory_format 转换为 memory_format(
模块,
内存格式):
r将`nn.Conv3d.weight`的`memory_format`转换为`memory_format`
转换递归地应用于嵌套的 `nn.Module`,包括 `module`。
注意,它只更改内存格式,但不改变每个维度的语义。
此函数用于简化计算以采用 NHWC 内核,这
在具有计算能力 >= 7.0 的 CUDA 设备上对 fp16 数据提供了相当大的加速。
.. 注意::
调用 `model.to(memory_format=torch.channels_last_3d)` 更加激进
比起实用函数 `convert_conv3d_weight_memory_format`。任何
具有四维权重的层都会受到 `model.to` 的影响,这并不
一定能够从转换为指定的 `memory_format` 中受益。
我们有信心的一点是 NDHWC(channels_last_3d)转换,因为即使在需要应用置换输入张量的情况下,运行卷积在 NDHWC 中也是有利的。
因此,我们的策略是仅将卷积的权重转换为 NDHWC。
即使在必须对输入张量进行置换的情况下,运行卷积在 NDHWC 中也是有利的。
因此,我们的策略是仅将卷积的权重转换为 NDHWC。
channels_last_3d. 这确保了;
1. 将使用快速卷积核,其好处可能
超出排列(如果输入不是同一格式)的开销。
2. 不会在那些没有受益的层上应用不必要的排列。
从内存格式转换而来。
最佳情况是,卷积层之间的层是通道。
最后兼容。输入张量在遇到第一个卷积层时会转换为通道最后这种内存格式,并保持在该内存格式中。
遇到第一个卷积层时会被转换为通道最后这种内存格式,并保持在该内存格式中。
因此,以下卷积不需要对输入张量进行置换。
如果通道的最后一层不兼容层位于卷积
层,我们需要将输入张量重新排列回连续格式
为此层。输入张量将通过剩余的层
连续格式,在遇到通道时可以转换为通道最后
另一个卷积层。没有必要将这种转换传播到早期层,因为大多数层对“memory_format”相当不敏感
。因为大多数层对“memory_format”相当不敏感
``memory_format``。
这个声明可能会改变,当 PyTorch 支持排列融合时,
可能还有比在卷积之前立即融合排列更好的位置,
。
Args:
模块(nn.Module):``nn.Conv3d`` 和 ``nn.ConvTranspose3d`` 或容器
``nn.Module``
memory_format: 用户指定的 ``memory_format``,
例如 ``torch.channels_last`` 或 ``torch.contiguous_format``,
返回:
原模块已更新为 ``nn.Conv3d``
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA)
>>> # xdoctest: +REQUIRES(env:CUBLAS_WORKSPACE_CONFIG)
>>> input = torch.randint(1, 10, (2, 8, 4, 4, 4), dtype=torch.float16, device="cuda")
>>> model = nn.Sequential(
>>> nn.Conv3d(8, 4, 3)).cuda().half()
>>> # This is identical to:
>>> # nn.utils.convert_conv3d_weight_memory_format(model, torch.channels_last_3d)
>>> model = nn.utils.convert_conv3d_weight_memory_format(model, torch.channels_last_3d)
>>> out = model(input)
"源代码"
当支持 channels_last 时,扩展到`_ConvNd`
超越仅限于 4 维张量
如果 isinstance(
模块, (
火炬.nn.
卷积 3D,
火炬.nn.ConvTranspose3d)):
权重数据 = (
模块.
重量.detach().
克隆().
连续(
内存格式=
内存格式)
)
模块.
重量.
数据 =
权重数据.
调整大小(
重量数据.
尺寸(),
内存格式=
内存格式
)
为
儿童
在
模块.
儿童():
转换 conv3d 权重内存格式(
儿童,
内存格式)
返回
模块