Tutorial5: bge-reranker-v2-m3¶

本节旨在展示使用 bge-reranker-v2-m3 模型来计算语言相似度的流程。

分以下几步来实现:

  1. 环境安装与应用创建

  2. 下载模型

  3. 模型使用

    3.1 通过 FlagEmbedding 运行

    3.2 通过 Huggingface Transformer 运行

reranker 使用 cross similarity 来计算两个句子的相似度,把两个句子共同作为模型的输入,与 embedding 方法相比更耗费计算资源,但是对语言有更好的理解。

1. 环境安装与应用创建¶

首先在联网的命令行中创建conda环境:

conda create -n tutorial5 python=3.9
conda activate tutorial5
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip install notebook jupyterlab peft numpy==1.26.4 matplotlib==3.8.4 transformers==4.42.4

( pytorch 版本需与 cuda 版本对应,请查看版本对应网站:https://pytorch.org/get-started/previous-versions ,通过 nvidia-smi 命令可查看 cuda 版本)

然后创建JupyterLab应用, Conda环境名请填写tutorial5, 硬件资源为1个GPU。创建应用后, 进入应用并打开本文件。

CUDA Version: 12.1; Torch Version: 2.3.1

2. 下载模型¶

在联网的命令行中执行,命令执行位置在当前文件所在的文件夹。

# 如果以下目录存在, 可以直接复制:
cp -r /lustre/public/tutorial/models/models--BAAI--bge-reranker-v2-m3/ ./

# 否则请自行下载:
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download --resume-download BAAI/bge-reranker-v2-m3 --local-dir models--BAAI--bge-reranker-v2-m3

(建议使用 tmux 工具进行数据下载。tmux(Terminal Multiplexer)是一个终端复用器,它允许用户在一个单一终端会话中运行多个终端会话,并且它的会话可以在不同的时间和地点断开和重新连接,非常适合远程工作和需要长时间运行的任务。关于 tmux 的安装和介绍参考:https://tmuxcheatsheet.com/how-to-install-tmux ; 使用参考: https://tmuxcheatsheet.com)

3. 模型使用¶

3.1 通过 FlagEmbedding 运行¶

使用 FlagEmbedding, 计算 cross similarity

在data shell 中执行,安装 FlagEmbedding 包:

pip install -U FlagEmbedding

安装后,运行下方代码:

In [ ]:
from FlagEmbedding import FlagReranker

# 填写模型路径
# VAR_PLACEHOLDER
reranker = FlagReranker('models--BAAI--bge-reranker-v2-m3', use_fp16=True) 

# 计算相似度
score = reranker.compute_score(['query', 'passage'], normalize=True)
print(score) # 0.003497010252573502

scores = reranker.compute_score(
    [['what is panda?', 'hi'],
     ['what is panda?',
      'The giant panda (Ailuropoda melanoleuca), sometimes called a panda'
       ' bear or simply panda, is a bear species endemic to China.']],
       normalize=True)
print(scores) # [0.00027803096387751553, 0.9948403768236574]

3.2 通过 Huggingface Transformer 运行¶

或者使用 Huggingface Transformer 也可以调用模型,运行下方代码:

In [ ]:
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

# 填写模型路径
# VAR_PLACEHOLDER
modle_path = 'models--BAAI--bge-reranker-v2-m3'

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained(modle_path)
model = AutoModelForSequenceClassification.from_pretrained(modle_path)
model.eval()

# 把模型移动到显卡
print(torch.cuda.is_available())
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)


# 计算相似度
pairs = [
    ['what is panda?', 'hi'],
    ['what is panda?',
     'The giant panda (Ailuropoda melanoleuca), sometimes called a panda'
      ' bear or simply panda, is a bear species endemic to China.']]
with torch.no_grad():
    inputs = tokenizer(
        pairs, padding=True, truncation=True,
        return_tensors='pt', max_length=512)
    
    # 将输入数据移动到GPU
    inputs = {key: value.to(device) for key, value in inputs.items()}
    
    scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
    print(scores)

作者: 黎颖; 龙汀汀

联系方式: yingliclaire@pku.edu.cn; l.tingting@pku.edu.cn