Я пытаюсь оптимизировать модель fastai с помощью компиляции SageMaker Neo.Похоже, я могу сохранить свою модель одним из трех способов.
- обычный:
learn.save
, который выводит, например, resnet34.pth
- onnx:
torch.onnx.export
, который выводит, например, resnet34.onnx
- jit:
torch.jit.save
, который выводит, например, resnet34.pth
Я фактически сделал все три, чтобы попытаться поэкспериментировать с различными способами компиляции модели с Neo.С каждым типом сохранения я пытался скомпилировать модель, также пытаясь framework
как pytorch
и onnx
с версиями 1.0.0
и 1.4
соответственно.
framework='pytorch' # 'onnx'
framework_version='1.0.0' # '1.4'
output_path = '/'.join(estimator.output_path.split('/')[:-1])
optimized_ic = estimator.compile_model(target_instance_family='ml_c5',
input_shape={'actual_input_1':[1, 3, 224, 224]},
output_path=output_path,
framework= framework,
framework_version=framework_version,
role=role)
Я получаюодна и та же ошибка при попытке всех трех способов с обоими типами платформы:
Ошибка Причина: Ошибка клиента: InputConfiguration: Неверная модель PyTorch или несоответствие формы ввода.Убедитесь, что входные данные расположены в лексическом порядке и имеют правильную размерность.Обновите до PyTorch 1.0 и используйте torch.jit.trace () и torch.jit.save () для экспорта вашей модели.Также приведите вашу модель с помощью eval () перед экспортом.
Есть идеи, что я могу делать неправильно?И имеет ли значение имя ключа для input_shape
, если я сохраню модель с jit.save
?
Подробности
Для JIT я делаю это:
learn.model.eval()
trace_input = torch.ones(1,3,args.image_size,args.image_size).cuda()
jit_model = torch.jit.trace(learn.model.float(), trace_input)
output_path = str(path/f'{args.model_arch}_jit.pt')
torch.jit.save(jit_model, output_path)
И для ONNX я делаю это:
dummy_input = torch.ones(1,3,args.image_size,args.image_size).cuda()
output_path = str(path/f'{args.model_arch}.onnx')
input_names = [ "actual_input_1" ] + [ "learned_%d" % i for i in range(16) ]
output_names = [ "output1" ]
torch.onnx.export(learn.model, dummy_input, output_path, verbose=True, input_names=input_names, output_names=output_names)
Кроме того, как дополнительный вопрос, как следует ожидать, что производительность будет сравниваться с компиляцией Neo, начиная с модели, сохраненной с помощьюONNX против JIT?