GTE Chinese Embedding模型转换为Openvino IR模型

1、概述

1.1 目标

本文档描述了将 HuggingFace 格式的 nlp_gte_sentence-embedding_chinese-base 中文文本嵌入模型转换为 OpenVINO IR 格式的完整流程,以实现:

  • 性能优化: 在 Intel CPU/GPU 上获得更快的推理速度

  • 体积优化: 减小模型部署包大小(从 587 MB 降至 196 MB)

  • 跨平台部署: 便于在各种设备上部署

1.2 转换路径

PyTorch 模型 (HuggingFace)
    ↓
ONNX 模型 (中间格式)
    ↓
OpenVINO IR (最终格式)

1.3 关键指标对比

格式 文件大小 CPU 推理延迟 部署复杂度 跨平台支持
PyTorch ~200 MB 50-80 ms 中等
ONNX ~390 MB 35-50 ms 优秀
OpenVINO ~196 MB 20-35 ms Intel 优化

1.4 Python 依赖

PyTorchONNX 阶段:

transformers>=4.30.0
torch>=2.0.0
sentencepiece>=0.1.99
onnx>=1.14.0
onnxruntime>=1.15.0
numpy>=1.24.0

ONNX → OpenVINO 阶段:

openvino>=2024.0.0
transformers>=4.30.0
numpy>=1.24.0
sentencepiece>=0.1.99

2、环境准备

2.1 创建 Python 虚拟环境

# 创建虚拟环境
conda create -n ov_convert python=3.11

# 激活虚拟环境
conda activate ov_convert

2.2 安装依赖

pip install transformers torch onnx onnxruntime openvino numpy sentencepiece
# 可选
pip install onnxoptimizer

3、转换流程

3.1 阶段一:PyTorch → ONNX

3.1.1 转换原理

ONNX (Open Neural Network Exchange) 是一个开放的深度学习模型表示格式,支持在不同框架间转换模型。

转换步骤:

  1. 加载 PyTorch 模型

  2. 生成示例输入(用于推导图结构)

  3. 使用 torch.onnx.export() 导出

  4. 应用 ONNX 优化器

  5. 验证模型正确性

3.1.2 转换 ONNX 模型
from pathlib import Path
import numpy as np

def export_to_onnx(
    model_dir: str,
    output_path: str,
    opset_version: int = 18,
    optimize: bool = True,
    verify: bool = True,
):
    import torch
    from transformers import AutoModel, AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
    base_model = AutoModel.from_pretrained(model_dir, trust_remote_code=True)
    base_model = base_model.to(torch.float32)
    base_model.eval()

    class LastHiddenStateModel(torch.nn.Module):
        def __init__(self, m):
            super().__init__()
            self.m = m

        def forward(self, input_ids, attention_mask):
            return self.m(input_ids=input_ids, attention_mask=attention_mask).last_hidden_state

    model = LastHiddenStateModel(base_model).eval()

    if opset_version < 18:
        opset_version = 18

    sample = tokenizer(
        ["这是一个示例文本用于转换模型"],
        return_tensors="pt",
        padding=True,
        truncation=True,
        max_length=512,
    )

    out = Path(output_path)
    out.parent.mkdir(parents=True, exist_ok=True)

    torch.onnx.export(
        model,
        (sample["input_ids"], sample["attention_mask"]),
        str(out),
        input_names=["input_ids", "attention_mask"],
        output_names=["last_hidden_state"],
        dynamic_axes={
            "input_ids": 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值