О скорости вывода PyTorch и Keras - PullRequest
0 голосов
/ 07 апреля 2020

Я сравнил скорость вывода PyTorch и Keras. Но при сравнении той же сети разница в скорости была почти в 5 раз.

Что вызвало такую ​​разницу в скорости? Я понимаю, что Keras - это обертка, поэтому она медленная, но мне нужно более глубокое понимание внутренней работы.

Кроме того, на этот раз, в качестве специального условия, загрузка изображения -> вывод измеряется как 1FPS.

Вот код:

import time

def create_model(frame, arch):
    if(frame == 'keras'):
        import tensorflow.keras.applications as model

        if(arch == 'densenet121'):
            return model.DenseNet121()
        if(arch == 'densenet169'):
            return model.DenseNet169()
        if(arch == 'densenet201'):
            return model.DenseNet201()

    elif(frame == 'pytorch'):
        import torch
        import torchvision.model as model

        if(arch == 'densenet121'):
            model = model.densenet121(pretrained=True).cuda()
        if(arch == 'densenet169'):
            model = model.densenet169(pretrained=True).cuda()
        if(arch == 'densenet201'):
            model = model.densenet201(pretrained=True).cuda()

        model.eval()
        model.to(torch.device('cuda'))

        return model


LOOP = 10
img_path = 'xxx.jpg'
frame = 'keras'
name = 'densenet121'

model = create_model(frame, name)

# inference
if(frame == 'keras'):
    import numpy
    from tensorflow.keras.preprocessing import image

    start = time.perf_counter()
    for i in range(LOOP):
        img = image.load_img(img_path, target_size=(224, 224))
        img = image.img_to_array(img)
        img = numpy.expand_dims(img, axis=0)
        preds = model.predict(img)
    elapsed_time = (time.perf_counter() - start) / LOOP * 1000
    fps = 1 / elapsed_time * 1000

elif(frame == 'pytorch'):
    import torchvision.transforms as transforms
    from PIL import Image
    import torch
    from torch.autograd import Variable
    device = torch.device('cuda')
    transformation = transforms.Compose(
        [
            transforms.Resize([224, 224]),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]
    )

    start = time.perf_counter()
    for i in range(LOOP):
        img = Image.open(img_path)
        img = transformation(img).float()
        img = img.unsqueeze_(0)
        img = Variable(img)
        img = img.to(device)
        preds = model(img)
    elapsed_time = (time.perf_counter() - start) / LOOP * 1000
    fps = 1 / elapsed_time * 1000

line = '| %.3g | %.3g |' % (fps, elapsed_time)
print('| FPS | Throughput |')
print(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...