我正在尝试使用SageMaker Neo编译来优化fastai模型。看来我可以用以下三种方法之一保存模型。
learn.save
,其输出例如resnet34.pth
torch.onnx.export
,其输出例如resnet34.onnx
torch.jit.save
,其输出例如resnet34.pth
我实际上已经完成了全部三个操作,以尝试使用Neo编译模型的不同方法。对于每种保存类型,我都尝试编译模型,还尝试将framework
和pytorch
分别用作onnx
和1.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编译相比较?