首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PyTorch转换为ONNX模型会增加ALBert的文件大小

将PyTorch转换为ONNX模型会增加ALBert的文件大小
EN

Stack Overflow用户
提问于 2022-01-20 12:11:41
回答 1查看 741关注 0票数 0

目标:使用这个记事本albert-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的两种量化ALBert方法的模型性能都较差。

PyTorch:

代码语言:javascript
复制
Size (MB): 44.58906650543213
Size (MB): 22.373255729675293

ONNX:

代码语言:javascript
复制
ONNX full precision model size (MB): 341.64233207702637
ONNX quantized model size (MB): 85.53886985778809

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 09:39:28

解释

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

关于这一现象,已经解决了一些Git问题。

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

解决方案

weights.ipynb中的“移除共享权重”部分。

伪码

代码语言:javascript
复制
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)

两种解决方案的来源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70786010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档