如何在 Chainer 中测量每层的时间
How to measure time per layer in Chainer
如何测量每一层所花费的时间?这应该包括向前和向后传递。
例如,对于 VGG,我想知道每一层所花费的时间。部分代码如下所示。
h = F.relu(self.conv1_2(h))
h = F.max_pooling_2d(h, 2, 2)
h = F.relu(self.conv2_1(h))
h = F.relu(self.conv2_2(h))
h = F.max_pooling_2d(h, 2, 2)
在前向传递的情况下,您可以尝试像这样对模型的执行进行猴子修补:
import time
from functools import wraps
def check_time(link_name, func):
@wraps(func)
def wrapper(*args, **kwargs):
t = time.time()
res = func(*arsg, **kwargs)
t = time.time() - t
print("Execution of {0} of the link {1} took {2:.3f} sec".format(func.__name__, link_name, t)
return res
for name, link in model.namedlinks(skipself=True):
link.forward = check_time(name, link.forward)
由于 chainer 遵循 "define-by-run" 策略,计算图是在您 运行ning 代码时构建的,因此 backward()
方法仅在 chainer.Function
实例上定义.你需要在每个 运行 之后对相应的方法进行猴子修补,我猜这会让你的代码变得很慢。
无论如何,我希望我的代码能让你知道如何做你想做的事。
如何测量每一层所花费的时间?这应该包括向前和向后传递。
例如,对于 VGG,我想知道每一层所花费的时间。部分代码如下所示。
h = F.relu(self.conv1_2(h))
h = F.max_pooling_2d(h, 2, 2)
h = F.relu(self.conv2_1(h))
h = F.relu(self.conv2_2(h))
h = F.max_pooling_2d(h, 2, 2)
在前向传递的情况下,您可以尝试像这样对模型的执行进行猴子修补:
import time
from functools import wraps
def check_time(link_name, func):
@wraps(func)
def wrapper(*args, **kwargs):
t = time.time()
res = func(*arsg, **kwargs)
t = time.time() - t
print("Execution of {0} of the link {1} took {2:.3f} sec".format(func.__name__, link_name, t)
return res
for name, link in model.namedlinks(skipself=True):
link.forward = check_time(name, link.forward)
由于 chainer 遵循 "define-by-run" 策略,计算图是在您 运行ning 代码时构建的,因此 backward()
方法仅在 chainer.Function
实例上定义.你需要在每个 运行 之后对相应的方法进行猴子修补,我猜这会让你的代码变得很慢。
无论如何,我希望我的代码能让你知道如何做你想做的事。