Разное время бега в pytorch nn.conv2d - PullRequest
0 голосов
/ 19 апреля 2019

Я столкнулся с проблемой прямого распространения, полный код выглядит следующим образом:

Я хочу точно записать время работы функции nn.conv2d, где время1 составляет около 0.00009901s, а время2 составляет около 0.00011235s. Как видно из кода, сверточные флопы идентичны, я не знаю, что вызывает разницу во времени с time1 и time2.

import os
os.environ["CUDA_VISIBLE_DEVICES"] = '7'

import torch
import torch.nn as nn
from torch.autograd import Variable

import time
import numpy as np
import random

def main():

    test_input1 = Variable(torch.rand(1,36,56,56)).cuda()
    test_input2 = Variable(torch.rand(1,64,56,56)).cuda()
    m1 = torch.nn.Conv2d(36, 36, kernel_size=3, stride=1, padding=1).cuda()

    time1_list = []
    for i in range(10000):
        torch.cuda.synchronize()
        t1 =time.time()
        temp_out = m1(test_input1)
        torch.cuda.synchronize()
        t2=time.time()
        time1_list.append(t2-t1)
    print('time1:%.8f' %(sum(time1_list[50:])/len(time1_list[50:])))



    output = Variable(torch.zeros(1, 64, 56, 56)).cuda()
    k_in_mask = torch.from_numpy(np.array(random.sample(range(0,64), 36))).cuda()
    k_out_mask = torch.from_numpy(np.array(random.sample(range(0,64), 36))).cuda()

    time2_list = []
    for i in range(10000):
        temp_in = torch.index_select(test_input2, 1, Variable(k_in_mask))

        torch.cuda.synchronize()
        t1=time.time()
        temp_out = m1(temp_in)
        torch.cuda.synchronize()
        t2=time.time()
        time2_list.append(t2-t1)

        output.index_copy(1, Variable(k_out_mask), temp_out)
    print('time2:%.8f' %(sum(time2_list[50:])/len(time2_list[50:])))

if __name__=='__main__':
    main()
...