fastai火炬JIT保存和SageMaker Neo编译

时间:2019-02-20 18:26:16

标签: python pytorch jit amazon-sagemaker onnx

我正在尝试使用SageMaker Neo编译来优化fastai模型。看来我可以用以下三种方法之一保存模型。

  • 常规:learn.save,其输出例如resnet34.pth
  • onnx:torch.onnx.export,其输出例如resnet34.onnx
  • jit:torch.jit.save,其输出例如resnet34.pth

我实际上已经完成了全部三个操作,以尝试使用Neo编译模型的不同方法。对于每种保存类型,我都尝试编译模型,还尝试将frameworkpytorch分别用作onnx1.0.0的{​​{1}}和1.4。 / p>

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)

还有一个附带的问题,从ONNX与JIT保存的模型开始,我应该如何期望性能与Neo编译相比较?

0 个答案:

没有答案