HuggingFace镜像/bge-reranker-base-onnx-o3-npu-openmind
模型介绍文件和版本分析
下载使用量0

BAAI/bge-reranker-base 的 ONNX 转换

  • 采用 O3 优化的 CPU 版 ONNX 模型

使用方法

from openmind  import AutoTokenizer, is_torch_npu_available
from openmind_hub import snapshot_download
import torch.nn.functional as F
from torch import Tensor
import openmind
import torch
from itertools import product
import torch.nn.functional as F
from optimum.onnxruntime import ORTModelForSequenceClassification
import argparse

# Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0]  # First element of model_output contains all token embeddings
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--model_name_or_path",
        type=str,
        help="Path to model",
        default="jeffding/bge-reranker-base-onnx-o3-npu-openmind",
    )
    args = parser.parse_args()
    return args

def main():
    args = parse_args()
    model_path = args.model_name_or_path

    if is_torch_npu_available():
        device = "npu:0"
    else:
        device = "cpu"
        
    sentences = [
    "The llama (/ˈlɑːmə/) (Lama glama) is a domesticated South American camelid.",
    "The alpaca (Lama pacos) is a species of South American camelid mammal.",
    "The vicuña (Lama vicugna) (/vɪˈkuːnjə/) is one of the two wild South American camelids.",
    ]
    queries = ["What is a llama?", "What is a harimau?", "How to fly a kite?"]
    pairs = list(product(queries, sentences))
    
    model_name = model_path
    provider = "CPUExecutionProvider"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = ORTModelForSequenceClassification.from_pretrained(
        model_name, use_io_binding=True, provider=provider, device_map=device
    )
    inputs = tokenizer(
        pairs,
        padding=True,
        truncation=True,
        return_tensors="pt",
        max_length=model.config.max_position_embeddings,
    )
    inputs = inputs.to(device)
    scores = model(**inputs).logits.view(-1).cpu().numpy()
    # Sort most similar to least
    pairs = sorted(zip(pairs, scores), key=lambda x: x[1], reverse=True)
    for ps in pairs:
        print(ps)

if __name__ == "__main__":
    main()