Как измерить время на слой в Chainer - PullRequest
1 голос
/ 08 октября 2019

Как я могу измерить время, затраченное на каждый слой? Это должно включать как прямой, так и обратный проход.

Например, в случае с 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)


1 Ответ

0 голосов
/ 12 октября 2019

В случае прямого прохода вы можете попытаться обезопасить выполнение модели примерно следующим образом:

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)

Поскольку цепочник следует стратегии «определения при запуске», график вычисленийсоздается во время выполнения кода, поэтому метод backward() определяется только для экземпляров chainer.Function. Вам нужно будет обезьяны-исправлять соответствующие методы после каждого запуска, что, я думаю, сделает ваш код довольно медленным.

В любом случае, я надеюсь, мой код даст вам представление о том, как делать то, что вы хотите.

...