Я сравнил скорость вывода 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)