解决问题INVALID_PROTOBUF : Load model from /tmp/ort.quant.x__uutdn/augmented_model.onnx failed:Protobuf

部署运行你感兴趣的模型镜像

尝试进行stable diffusion静态量化,当前用了onnx runtime进行处理。出现了: Load model from /tmp/ort.quant.x__uutdn/augmented_model.onnx failed:Protobuf parsing failed问题。不断尝试用几种AI大模型进行询问,建议了
1)检查onnx模型;
2)检查输入数据的类型和名字和模型是否匹配;
3)减少输入参数个数;
4)升级onnx,onnxruntime版本,升级protobuf版本4.25.3->6.31.1;
5)增添了extra_options={“external_data_format”: True}有点接近,但还不是正确答案。

个人也尝试了
1)直接量化decoder模型,是可以成功量化的;
2)转成onnx模型的时候修改opt_version,没有变化;
3)尝试onnxsim,onnxsim_large_model,有一些其他问题;
4)最终发现>2GB的onnx模型会被打散成小的模型,在进行量化的时候使用use_external_data_format=True就能正常运行了。

原始情况

from onnxruntime.quantization import CalibrationDataReader, quantize_static, QuantType, QuantFormat
import torch
import numpy as np
import onnx

model_fp32 = "/home/xxx/ProjectStableDiffusion/stable-diffusion-pytorch/data_check_onnx/diffusion.onnx"
model_quant = "/home/xxx/ProjectStableDiffusion/stable-diffusion-pytorch/data_check_onnx/quantized_diffusion.onnx"

str_list = ["a"]
calibration_dataset=[]

def evaluate_diffusion():
    for j,str_name in enumerate(str_list):
        context = torch.load("data_check/context" + str_name + ".pt")
        print(j,str_name)
        for i in range(1):
            input_latents = torch.load("data_check/input_latents_before" + str_name + str(i) + ".pt")
            time_embedding = torch.load("data_check/time_embedding" + str_name + str(i) + ".pt")
            calibration_dataset.append({"input_latents": input_latents.cpu().numpy(),
                            "context": context.cpu().numpy(),
                            "time_embedding": time_embedding.cpu().numpy()
                            })
            print(i,"finished")

class MultiInputDataReader(CalibrationDataReader):
    def __init__(self, dataset):
        self.dataset = iter(dataset)
        
    def get_next(self):
        return next(self.dataset, None)

onnx_model = onnx.load(model_fp32)
onnx.checker.check_model(model_fp32, full_check=True)
for input in onnx_model.graph.input:
    print(f"Input Name: {input.name}, Shape: {input.type.tensor_type.shape.dim}, Type: {input.type.tensor_type.elem_type}")
del onnx_model

evaluate_diffusion()
data_reader = MultiInputDataReader(calibration_dataset)
for key, value in calibration_dataset[0].items():
    print(f"Key '{key}' 的数组形状是: {value.shape}")

quantize_static(
    model_input=model_fp32,
    model_output=model_quant,
    calibration_data_reader=data_reader,
    #quant_format=QuantFormat.QOperator,  # 量化格式(QOperator 或 QDQ)
    quant_format=QuantFormat.QDQ,  # 量化格式(QOperator 或 QDQ)
    activation_type=QuantType.QUInt8,    # 激活值量化类型(INT8/UINT8)
    weight_type=QuantType.QUInt8         # 权重量化类型
)

以上代码出现如下错误,请分析应该如何解决
Exception has occurred: InvalidProtobuf
[ONNXRuntimeError] : 7 : INVALID_PROTOBUF : Load model from /tmp/ort.quant.x__uutdn/augmented_model.onnx failed:Protobuf parsing failed.
File “/home/xxx/ProjectStableDiffusion/stable-diffusion-pytorch/quantize_onnx_diffusion.py”, line 44, in
model_input=model_fp32,
model_output=model_quant,
calibration_data_reader=data_reader,
#quant_format=QuantFormat.QOperator, # 量化格式(QOperator 或 QDQ)
quant_format=QuantFormat.QDQ, # 量化格式(QOperator 或 QDQ)
activation_type=QuantType.QUInt8, # 激活值量化类型(INT8/UINT8)
weight_type=QuantType.QUInt8 # 权重量化类型
)
onnxruntime.capi.onnxruntime_pybind11_state.InvalidProtobuf: [ONNXRuntimeError] : 7 : INVALID_PROTOBUF : Load model from /tmp/ort.quant.x__uutdn/augmented_model.onnx failed:Protobuf parsing failed.

关键修改

quantize_static(
    model_input=model_fp32,
    model_output=model_quant,
    calibration_data_reader=data_reader,
    #quant_format=QuantFormat.QOperator,  # 量化格式(QOperator 或 QDQ)
    quant_format=QuantFormat.QDQ,  # 量化格式(QOperator 或 QDQ)
    activation_type=QuantType.QUInt8,    # 激活值量化类型(INT8/UINT8)
    weight_type=QuantType.QUInt8,         # 权重量化类型
    use_external_data_format=True, 
)

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

ONNXRuntime加载resnet.onnx模型时出现 `InvalidProtobuf` 错误(Protobuf解析失败),可尝试以下方法解决: ### 检查模型文件完整性 要保证resnet.onnx模型文件没有损坏。可以重新下载模型文件,或者从可靠的来源获取模型。若模型是通过训练生成的,需要重新导出模型以确保其完整性。 ### 检查Protobuf版本兼容性 ONNXRuntime和Protobuf版本需要兼容。可通过以下命令查看当前安装的Protobuf版本: ```python import google.protobuf print(google.protobuf.__version__) ``` 根据ONNXRuntime的官方文档,选择合适的Protobuf版本进行安装或升级: ```bash pip install protobuf==<合适的版本号> ``` ### 重新安装ONNXRuntime 有时候ONNXRuntime安装不完整或损坏会导致该错误。可以先卸载现有的ONNXRuntime,再重新安装: ```bash pip uninstall onnxruntime pip install onnxruntime ``` ### 检查模型导出代码 如果模型是自己导出的,要确保导出代码正确。以PyTorch为例,导出ONNX模型的代码示例如下: ```python import torch import torchvision.models as models # 加载预训练的ResNet模型 model = models.resnet18(pretrained=True) model.eval() # 定义输入张量 dummy_input = torch.randn(1, 3, 224, 224) # 导出ONNX模型 torch.onnx.export(model, dummy_input, "resnet.onnx", export_params=True, opset_version=11) ``` ### 检查文件路径和权限 要确保模型文件路径正确,并且当前用户有读取该文件的权限。可以使用以下代码检查文件是否存在: ```python import os if os.path.exists("resnet.onnx"): print("模型文件存在") else: print("模型文件不存在,请检查路径") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值