pytorch - 模型的前向定义是在 PyTorch 中顺序执行还是并行执行?
问题描述
我想知道深度模型类的前向定义中的指令是否按顺序执行?例如:
class Net(nn.Module):
...
def forward(self,x):
#### Group 1
y = self.conv1(x)
y = self.conv2(y)
y = self.conv3(y)
### Group 2
z = self.conv4(x)
z = self.conv5(z)
z = self.conv6(z)
out = torch.cat((y,z),dim=1)
return out
在这种情况下, Group1和Group2指令可以并行化。但是前向定义会自动理解这一点,还是会按顺序执行?如果不是,那么如何并行运行它们?
我正在运行 PyTorch 1.3.1
非常感谢
解决方案
它们是按顺序执行的,只有操作的计算是并行的。据我所知,PyTorch 没有直接的方法让它们并行运行。
我假设您希望通过并行运行它们来提高性能,但这充其量是最小的,最坏的情况是慢得多,因为像卷积这样的操作已经高度并行化,除非输入非常小,否则所有内核都会永久使用。并行运行多个卷积会导致大量上下文切换,除非您要平均分配可用内核,但这并不会比使用所有内核按顺序执行它们更快。
如果同时运行两个 PyTorch 程序,您可以观察到相同的行为,例如运行以下程序,它具有 3 个相对常见的卷积并使用224x224图像(如 ImageNet),与其他模型(例如对象检测)相比,这是很小的) 利用:
import torch
import torch.nn as nn
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
def forward(self, input):
out = self.conv1(input)
out = self.conv2(out)
out = self.conv3(out)
return out
input = torch.randn((10, 3, 224, 224))
model = Model().eval()
# Running it 100 times just to create a microbenchmark
for i in range(100):
out = model(input)
要获取有关上下文切换的信息,/usr/bin/time
可以使用(不是内置的time
)。
/usr/bin/time -v python bench.py
单次运行:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:22.68
Involuntary context switches: 857
同时运行两个实例:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:43.69
Involuntary context switches: 456753
澄清一下,每个实例大约需要 43 秒,这不是累积时间。
推荐阅读
- apache-spark - 按计数对 collect_set 进行排序
- python - 使用 Dask 读取的参差不齐的 CSV 会产生 DtypeWarning - 加载时忽略“nan”的选项?
- html - Select2 插件破坏了 Vega 可视化下拉菜单
- java - 如何使用 Axis 库设置超时选项
- node.js - Express+Redis Post 请求未字符串化
- intellij-idea - IntelliJ Show Diff 包括未版本控制的文件
- azure-data-explorer - 如何根据 Kusto 中的条件计算列的累积总和
- java - 在 SharedPreferences 中保存 hashmap
- java - 如果父窗口不在焦点中,Java 11 上的 JComboBox 在第一次鼠标单击时不显示弹出菜单
- python - 将管理员创建的用户连接到 django 项目中的注册用户