【问题标题】:Converting PyTorch to ONNX model increases file size for ALBert将 PyTorch 转换为 ONNX 模型会增加 ALBert 的文件大小
【发布时间】:2022-01-21 20:30:33
【问题描述】:

目标:使用此Notebookalbert-base-v2 模型执行量化。

内核:conda_pytorch_p36.


第 1.2 节和第 2.2 节中的输出表明:

  • 将原版 BERTPyTorch 转换为 ONNX 保持相同大小417.6 MB
  • 量化模型比普通 BERT、PyTorch 173.0 MB 和 ONNX 104.8 MB 更小

但是,在运行 ALBert 时:

  • PyTorch 和 ONNX 模型大小不同
  • 量化模型尺寸比普通模型大

认为这就是与普通 ALBert 相比,ALBert 的两种 Quantization 方法的模型性能较差的原因。

PyTorch:

Size (MB): 44.58906650543213
Size (MB): 22.373255729675293

ONNX:

ONNX full precision model size (MB): 341.64233207702637
ONNX quantized model size (MB): 85.53886985778809

为什么将 ALBert 从 PyTorch 导出到 ONNX 会增加模型大小,而不是 BERT?

如果还有什么我可以添加到帖子中的,请告诉我。

【问题讨论】:

标签: python pytorch onnx quantization onnxruntime


【解决方案1】:

说明

ALBert 模型在各层之间共享权重。 torch.onnx.export 将权重输出到不同的张量,导致模型尺寸变大。

关于此现象,许多 Git 问题已被标记为已解决。

最常见的解决方案是移除共享权重,即移除包含完全相同值的张量数组。


解决方案

onnx_remove_shared_weights.ipynb 中的“删除共享权重”部分。

Pseudo-code:

from onnxruntime.transformers.onnx_model import OnnxModel
model=onnx.load(path)
onnx_model=OnnxModel(model)
count = len(model.graph.initializer)
same = [-1] * count
for i in range(count - 1):
  if same[i] >= 0:
    continue
  for j in range(i+1, count):
     if has_same_value(model.graph.initializer[i], model.graph.initializer[j]):
    same[j] = i

for i in range(count):
   if same[i] >= 0:
        onnx_model.replace_input_of_all_nodes(model.graph.initializer[i].name, model.graph.initializer[same[i]].name)

onnx_model.update_graph()
onnx_model.save_model_to_file(output_path)

Source of both solutions

【讨论】:

  • 我会在 72 小时内接受答复
猜你喜欢
  • 2021-10-20
  • 2022-10-13
  • 2023-01-31
  • 2018-10-05
  • 2018-11-25
  • 2019-11-10
  • 2019-12-09
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多