Факел Факел JIT сохранить и компиляция SageMaker Neo - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь оптимизировать модель 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?

...