onnx.load()|ALBert抛出DecodeError:分析消息时出错



目标:重新开发此BERT笔记本以使用textattack/albert-base-v2-MRPC。

内核:conda_pytorch_p36。PyTorch1.8.1+cpu

我将PyTorch/HugingFace Transformers模型转换为ONNX并存储它。DecodeError出现在onnx.load()上。

我的ONNX文件是否已损坏这似乎是一个常见的解决方案;但我不知道该怎么查。

ALBert笔记本和谷歌Colab上的模型文件。

我还有这个Git问题,详细介绍了调试。


问题不是

  • 量化-我尝试的任何量化代码都会抛出相同的错误
  • 优化-无论是否进行优化,都会发生错误

第2.2节量化ONNX模型:

from onnxruntime.quantization import quantize_dynamic, QuantType
import onnx
def quantize_onnx_model(onnx_model_path, quantized_model_path):    
onnx_opt_model = onnx.load(onnx_model_path)
quantize_dynamic(onnx_model_path,
quantized_model_path,
weight_type=QuantType.QInt8)
logger.info(f"quantized model saved to:{quantized_model_path}")
quantize_onnx_model('albert.opt.onnx', 'albert.opt.quant.onnx')
print('ONNX full precision model size (MB):', os.path.getsize('albert.opt.onnx')/(1024*1024))
print('ONNX quantized model size (MB):', os.path.getsize("albert.opt.quant.onnx")/(1024*1024))

追溯:

---------------------------------------------------------------------------
DecodeError                               Traceback (most recent call last)
<ipython-input-16-2d2d32b0a667> in <module>
10     logger.info(f"quantized model saved to:{quantized_model_path}")
11 
---> 12 quantize_onnx_model('albert.opt.onnx', 'albert.opt.quant.onnx')
13 
14 print('ONNX full precision model size (MB):', os.path.getsize("albert.opt.onnx")/(1024*1024))
<ipython-input-16-2d2d32b0a667> in quantize_onnx_model(onnx_model_path, quantized_model_path)
3 
4 def quantize_onnx_model(onnx_model_path, quantized_model_path):
----> 5     onnx_opt_model = onnx.load(onnx_model_path)
6     quantize_dynamic(onnx_model_path,
7                      quantized_model_path,
~/anaconda3/envs/pytorch_p36/lib/python3.6/site-packages/onnx/__init__.py in load_model(f, format, load_external_data)
119     '''
120     s = _load_bytes(f)
--> 121     model = load_model_from_string(s, format=format)
122 
123     if load_external_data:
~/anaconda3/envs/pytorch_p36/lib/python3.6/site-packages/onnx/__init__.py in load_model_from_string(s, format)
156     Loaded in-memory ModelProto
157     '''
--> 158     return _deserialize(s, ModelProto())
159 
160 
~/anaconda3/envs/pytorch_p36/lib/python3.6/site-packages/onnx/__init__.py in _deserialize(s, proto)
97                          'ntype is {}'.format(type(proto)))
98 
---> 99     decoded = cast(Optional[int], proto.ParseFromString(s))
100     if decoded is not None and decoded != len(s):
101         raise google.protobuf.message.DecodeError(
DecodeError: Error parsing message

输出文件:

albert.onnx  # original save
albert.opt.onnx  # optimised version save

问题是为我的新模型更新config变量。

更改:

configs.output_dir = "albert-base-v2-MRPC"
configs.model_name_or_path = "albert-base-v2-MRPC"

然后我遇到了另一个问题,我没有正确地git cloned我的模型。问题和答案在此详述。

最后,拥抱脸🤗ALBertBertOptimizationOptions不等价。我在ONNX模型上尝试过torch_poptimizer提供的通用PyTorch优化器,但它们似乎与ONNX型号不兼容。

如需进一步澄清,请随时发表评论。

最新更新