【评测】推理和微调 “GTE文本向量-中文-通用领域-base”模型
回到目录
【评测】推理和微调 “GTE文本向量-中文-通用领域-base”模型
GTE文本向量-中文-通用领域-base 模型介绍 ,尝试跑通页面的推理和微调案例
运行环境:AMD 8700G + ddr5-4800-64GB + nvidia 4090D + ubuntu24.04
0. 安装modelscope基础环境
参考 环境安装
1. 推理案例
1.1. 运行推理案例程序
# test_gte_embedding.py
from modelscope.models import Model
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasksmodel_id = "iic/nlp_gte_sentence-embedding_chinese-base"
pipeline_se = pipeline(Tasks.sentence_embedding,model=model_id,sequence_length=512) # sequence_length 代表最大文本长度,默认值为128# 当输入包含“soure_sentence”与“sentences_to_compare”时,会输出source_sentence中首个句子与sentences_to_compare中每个句子的向量表示,以及source_sentence中首个句子与sentences_to_compare中每个句子的相似度。
inputs = {"source_sentence": ["吃完海鲜可以喝牛奶吗?"],"sentences_to_compare": ["不可以,早晨喝牛奶不科学","吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害","吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。","吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷"]}result = pipeline_se(input=inputs)
print (result)inputs2 = {"source_sentence": ["不可以,早晨喝牛奶不科学","吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害","吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。","吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷"]
}
result = pipeline_se(input=inputs2)
print (result)
$ source ~/.venv/bin/activate $ uv run test_gte_embedding.py
...2.0832840e-02, 2.3828523e-02, -1.1581291e-02]], dtype=float32), 'scores': [0.8859604597091675, 0.9830712080001831, 0.966042160987854, 0.891857922077179]}
运行过程中,查看nvidia-smi,基本用不上GPU资源。中间两个选项的得分高,与实际的语义相符。
1.2. 修改test_gte_embedding.py后运行
$ vi test_gte_embedding.py
inputs = {"source_sentence": ["吃完海鲜可以喝牛奶吗?"],"sentences_to_compare": ["海鲜吃多了过敏", <-- 增加这一条 sentence"不可以,早晨喝牛奶不科学","吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害","吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。","吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷"]}$ uv run test_gte_embedding.py
...0.03249872, -0.0043882 ]], shape=(6, 768), dtype=float32), 'scores': [0.6142874360084534, 0.6227918863296509, 0.8829822540283203, 0.8409826755523682, 0.6533908247947693]}
...inputs = {"source_sentence": ["吃完海鲜可以喝牛奶吗?"],"sentences_to_compare": ["不可以,早晨喝牛奶不科学","吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害","吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。","吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷","海鲜吃多了过敏", <-- 这一条 sentence放到最后面]}0.03353969, -0.03277201]], shape=(6, 768), dtype=float32), 'scores': [0.6227918863296509, 0.8829822540283203, 0.8409826755523682, 0.6533908247947693, 0.6142874360084534]}
结论:
- 数组变化后,数组内的sentence会计算出不同score;
- sentence的score与数组内部的排序无关;
2. 微调案例
2.1. 直接运行程序报错
# 需在GPU环境运行
# 加载数据集过程可能由于网络原因失败,请尝试重新运行代码
from modelscope.metainfo import Trainers
from modelscope.msdatasets import MsDataset
from modelscope.trainers import build_trainer
import tempfile
import ostmp_dir = tempfile.TemporaryDirectory().name
if not os.path.exists(tmp_dir):os.makedirs(tmp_dir)# load dataset
ds = MsDataset.load('dureader-retrieval-ranking', 'zyznull')
train_ds = ds['train'].to_hf_dataset()
dev_ds = ds['dev'].to_hf_dataset()
model_id = 'iic/nlp_gte_sentence-embedding_chinese-base'
def cfg_modify_fn(cfg):cfg.task = 'sentence-embedding'cfg['preprocessor'] = {'type': 'sentence-embedding','max_length': 256}cfg['dataset'] = {'train': {'type': 'bert','query_sequence': 'query','pos_sequence': 'positive_passages','neg_sequence': 'negative_passages','text_fileds': ['text'],'qid_field': 'query_id'},'val': {'type': 'bert','query_sequence': 'query','pos_sequence': 'positive_passages','neg_sequence': 'negative_passages','text_fileds': ['text'],'qid_field': 'query_id'},}cfg['train']['neg_samples'] = 4cfg['evaluation']['dataloader']['batch_size_per_gpu'] = 30cfg.train.max_epochs = 1cfg.train.train_batch_size = 4return cfg
kwargs = dict(model=model_id,train_dataset=train_ds,work_dir=tmp_dir,eval_dataset=dev_ds,cfg_modify_fn=cfg_modify_fn)
trainer = build_trainer(name=Trainers.nlp_sentence_embedding_trainer, default_args=kwargs)
trainer.train()
$ uv run test_gte_training.py
FileNotFoundError: https://huggingface.co/datasets/zyznull/dureader-retrieval-ranking/resolve/main/train.jsonl.gz
,科学上网,问题依旧
2.2. 手工下载(中间可能中断,多试几次)
[微调测试数据下载地址 https://hf-mirror.com/datasets/zyznull/dureader-retrieval-ranking/tree/main)
ubuntu下解压缩
$ gzip -d dev.jsonl.gz$ gzip -d train.jsonl.gz
文件结构
test_gte_training.py
- datasets
- dev.jsonl
- train.jsonl
2.3. 修改程序如下:
参考 魔塔的MsDataset.load()如何加载已经下载在本地的数据集修改程序
# test_gte_training.py
...
#ds = MsDataset.load('dureader-retrieval-ranking', 'zyznull')
#train_ds = ds['train'].to_hf_dataset()
#dev_ds = ds['dev'].to_hf_dataset()
...
上面三行修改为
...
ds = load_dataset('json', data_files={'train': 'dataset/train.jsonl', 'dev': 'dataset/dev.jsonl'})
train_ds = ds['train']
dev_ds = ds['dev']
...
$ uv run test_gte_training.py
。。。
2025-05-29 13:52:51,782 - modelscope - INFO - epoch [1][21596/21599] lr: 1.000e-02, eta: 0:00:00, iter_time: 0.144, data_load_time: 0.031, memory: 6967, loss: 3.0015
2025-05-29 13:52:51,937 - modelscope - INFO - epoch [1][21597/21599] lr: 1.000e-02, eta: 0:00:00, iter_time: 0.151, data_load_time: 0.033, memory: 6967, loss: 2.9974
2025-05-29 13:52:52,081 - modelscope - INFO - epoch [1][21598/21599] lr: 1.000e-02, eta: 0:00:00, iter_time: 0.148, data_load_time: 0.034, memory: 6967, loss: 2.9933
2025-05-29 13:52:52,200 - modelscope - INFO - epoch [1][21599/21599] lr: 1.000e-02, eta: 0:00:00, iter_time: 0.115, data_load_time: 0.030, memory: 6967, loss: 2.7065
2025-05-29 13:52:52,552 - modelscope - INFO - Saving checkpoint at 1 epoch
2025-05-29 13:52:54,240 - modelscope - INFO - Train finished. Uploading models, waiting...
2025-05-29 13:52:54,316 - modelscope - INFO - {'done': True}
(ailife) ailife@ailife-System:~/workspace$
程序运行一小时,CPU占用不高,GPU满载运行,显存8096MB。最终结果存放在哪里呢?跑了一个寂寞。
本文结束
回到目录