Views
No views yet
<think>)。推理时:thinking_mode(连 thinking_mode="off" 都会注入未训练过的 <think>)。apply_chat_template(..., add_generation_prompt=True) 即可,渲染出的 prompt 末尾必须是 <|im_start|>assistant\n。Triple_prompt_v2_finetune.md(与训练完全一致)。title.strip() + 空格 + abstract.strip(),再把连续空白压成单空格。chat_template.jinja:百川 M2 官方对话模板。apply_chat_template 默认即用它渲染(不传 thinking_mode 时末尾为 <|im_start|>assistant\n,与训练分布一致)。tokenizer.json(fast)+ vocab.json / merges.txt / added_tokens.json / special_tokens_map.json / tokenizer_config.json(slow 所需)——fast 与 slow 两种 tokenizer 都能正常加载。tokenizer.json 而缺 vocab.json / merges.txt,某些框架(尤其 vLLM)会回退到慢速 Qwen2Tokenizer,并因缺词表文件直接崩溃:AttributeError: Qwen2Tokenizer has no attribute all_special_tokens_extendedsave_pretrained 存出的 tokenizer 可能仍只含 tokenizer.json,因此 serve 时请显式指定一个完整的 tokenizer(见下方命令的 --tokenizer)。| 项 | 值 |
|---|---|
| 基座 | Baichuan-M2-32B(Qwen2 架构,32B,bf16) |
| 方法 | QLoRA(bitsandbytes 4bit nf4 量化 + LoRA) |
| LoRA | r=16,alpha=32,dropout=0.05,target_modules = q/k/v/o/gate/up/down_proj(7 个线性层) |
| 序列长度 | max_seq_length = 5120 |
| 批大小 | per_device=2 × grad_accum=8 = 有效 16 |
| 学习率 / 轮数 | 1e-4 / 3 epoch(846 步) |
| 硬件 / 耗时 | A100-SXM4-80GB ×1,约 18.8 小时 |
| 结果 | train_loss ≈ 0.067,eval_loss ≈ 0.0745,token 准确率 ≈ 97.56%(eval≈train,无明显过拟合) |
adapter_model.safetensors / adapter_config.json:LoRA 权重与配置(base_model_name_or_path 已指向 baichuan-inc/Baichuan-M2-32B,PEFT 可自动拉取基座)。chat_template.jinja:百川 M2 官方对话模板。tokenizer.json / tokenizer_config.json / vocab.json / merges.txt / added_tokens.json / special_tokens_map.json:完整 tokenizer(与基座一致,fast/slow 均可加载)。Triple_prompt_v2_finetune.md:训练用的精简版抽取 system 提示词(含 19 类实体与关系表)。1import re, torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3from peft import PeftModel
4
5ADAPTER = "Siyu2Zhou/Baichuan-M2-32B-QLoRA-immunology-triples"
6BASE = "baichuan-inc/Baichuan-M2-32B"
7
8# tokenizer 与 chat_template 直接从本 adapter 仓库加载(已完整)
9tok = AutoTokenizer.from_pretrained(ADAPTER, trust_remote_code=True)
10base = AutoModelForCausalLM.from_pretrained(
11 BASE, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map="auto",
12)
13model = PeftModel.from_pretrained(base, ADAPTER) # 挂上 adapter
14model.eval()
15
16# 1) 读取与训练一致的 system 提示词(本仓库自带)
17from huggingface_hub import hf_hub_download
18system = open(hf_hub_download(ADAPTER, "Triple_prompt_v2_finetune.md"), encoding="utf-8").read().strip()
19
20# 2) 构造 user:title + 空格 + abstract,连续空白压成单空格
21def merge_title_abstract(title, abstract):
22 return re.sub(r"\s+", " ", f"{title.strip()} {abstract.strip()}".strip())
23
24title = "..." # 文章标题
25abstract = "..." # 文章摘要
26user = merge_title_abstract(title, abstract)
27
28messages = [{"role": "system", "content": system},
29 {"role": "user", "content": user}]
30
31# 3) 渲染 prompt:不传 thinking_mode,末尾应为 <|im_start|>assistant\n
32inputs = tok.apply_chat_template(
33 messages, tokenize=True, add_generation_prompt=True,
34 return_tensors="pt", return_dict=True,
35).to(model.device)
36
37with torch.no_grad():
38 out = model.generate(**inputs, max_new_tokens=2560, do_sample=False, # 贪心,确定性抽取
39 pad_token_id=tok.eos_token_id)
40text = tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True).strip()
41
42import json
43triples = json.loads(text) # 一个三元组 JSON 数组
44print(len(triples), triples[:2])1# 1) 合并 adapter 到基座得到完整权重(32B bf16 约需 ~64G 内存;不足时建临时 swap)
2python -c "
3from transformers import AutoModelForCausalLM, AutoTokenizer
4from peft import PeftModel
5import torch
6base = AutoModelForCausalLM.from_pretrained('baichuan-inc/Baichuan-M2-32B', trust_remote_code=True, torch_dtype=torch.bfloat16)
7m = PeftModel.from_pretrained(base, 'Siyu2Zhou/Baichuan-M2-32B-QLoRA-immunology-triples')
8m = m.merge_and_unload()
9m.save_pretrained('merged')
10AutoTokenizer.from_pretrained('baichuan-inc/Baichuan-M2-32B', trust_remote_code=True).save_pretrained('merged')
11"
12
13# 2) vLLM 起 OpenAI 兼容服务(建议 vllm 0.8.5.post1 + torch cu124;driver/CUDA 需匹配)
14# ⚠️ 显式指定 --tokenizer 指向完整 tokenizer(基座或本 adapter 仓库),
15# 避免 merged 目录缺 vocab.json/merges.txt 时 vLLM 回退慢速 tokenizer 崩溃。
16vllm serve merged \
17 --tokenizer baichuan-inc/Baichuan-M2-32B \
18 --served-model-name baichuan-m2-qlora \
19 --max-model-len 8192 --gpu-memory-utilization 0.95/v1/completions 端点,由客户端自己用上面 tokenizer 渲染 prompt 后原样推理,不要走可能默认注入 thinking 的 chat 端点;生成参数建议 temperature=0(贪心)、max_tokens≈2560。{head, head_type, relation, tail, tail_type, source_sentence, score},其中类型/关系只能取训练提示词中预定义的集合(19 类实体 + 数十种有向关系),source_sentence 为原文依据句,score 为 0–100 置信度。