public-sft-qwen9b-v4 · Qwen3.5-9B × nvidia/HelpSteer2(英文,ShareGPT 衍生 prompt + 模型生成回复)LoRA 适配器(实验产物)
English TL;DR. A LoRA adapter (r=32, alpha=64) for
Qwen/Qwen3.5-9B, trained with QLoRA for 3 epochs / 270 optimizer steps on a 1,440-example random subset ofnvidia/HelpSteer2(cc-by-4.0, revision990b2711a36180dd19d9c94b8627844866f8982a, https://huggingface.co/datasets/nvidia/HelpSteer2), used here as plain SFT data (one human-rated best response per prompt). Lineage, per the dataset card: prompts are "mostly user-contributed ShareGPT prompts" (user turns from ChatGPT conversations that users shared themselves), with ~5% written by humans at Scale AI; responses were generated by models ("a mix of 10 different inhouse LLMs") and then rated by human annotators on 5 attributes. The response text is not human-written. Training only: no evaluation of any kind was run, so no claim is made about helpfulness (or any other ability). The adapter weights are released under apache-2.0; the dataset's own license (cc-by-4.0) is not changed by this release. This is a lab experiment, not a product.
本仓库是一个 LoRA 适配器:在 Qwen/Qwen3.5-9B 上,用公开数据集 nvidia/HelpSteer2(英文;原本是为训练 reward model 发布的人工标注 helpfulness 数据)随机抽取的 1440 条做了一轮指令微调(SFT)。
只做了训练,没有做任何评测。 本卡所有数字都取自这一轮训练的实际产物(训练记录、训练元数据、适配器文件本身)以及对数据筛选的复算;没有估算值。
⚠ 请先读这三条
- prompt 来自 ShareGPT(衍生血统),回复是模型生成的。 据上游数据集卡「Source」节原文:"Prompts are collected based on mostly user-contributed ShareGPT prompts and with a small proportion (~5%) that are human generated by Scale AI." 以及 "Responses are generated by early versions of a mix of 10 different inhouse LLMs (note: none from properitary LLM providers such as OpenAI)." 也就是说:prompt 主要是用户自行分享的 ChatGPT 对话里的「用户提问」,约 5% 由 Scale AI 的人员撰写;回复由多个模型生成,再由人工对 5 个属性打分。回复文本本身不是人工撰写的,其中的事实错误与偏差会原样进入训练。
- 本轮把它当 SFT 数据用,不是用来训练 reward model。 每个 prompt 只保留人工评分最高的一条回复(规则见下文「数据」),人工评分只用于挑选,没有进入训练目标。「评分最高」不等于「质量高」:入训的 1440 条里,helpfulness 评分为 4 的 1,020 条、3 的 321 条、2 的 42 条、1 的 27 条、0 的 30 条。
- 不声称任何能力。 本轮没有做任何评测(没有基准、没有验证集、没有人工抽检生成结果),因此无法说明本适配器在有用性或任何其他方面比基座更好、更差或没有变化。
Provenance 一览
| 项 | 内容 |
|---|---|
| 基座模型 Base model | Qwen/Qwen3.5-9B,HF 快照 commit c202236235762e1c871ad0ccb60c8ee5ba337b9a(训练机本地缓存中唯一的快照,refs/main 指向它)。基座自身许可为 apache-2.0 |
| 数据集 Dataset | nvidia/HelpSteer2(NVIDIA 与 Scale AI 合作发布的 helpfulness 标注数据集;Wang et al. 2024, arXiv:2406.08673):https://huggingface.co/datasets/nvidia/HelpSteer2 |
| 数据快照 Revision | commit 990b2711a36180dd19d9c94b8627844866f8982a;只用其中的 train.jsonl.gz(20,324 行,上游 LFS sha256 c0d7e91d738d42e8a08070db26c4c09a9c7631308e1f0fd380ff43d130c9f713);未用 validation、preference、disagreements |
| 血统 Lineage | prompt 主要源自 ShareGPT(用户自分享的 ChatGPT 对话中的用户提问),约 5% 由 Scale AI 人工撰写;response 由多个模型(上游卡原文 "a mix of 10 different inhouse LLMs")生成,再由 Scale AI 招募的人工标注者对 5 个属性打分(上游数据集卡原文) |
| 数据许可 Data license | cc-by-4.0(上游数据集卡 YAML 头逐字 license: cc-by-4.0)。原数据集许可不因本发布而改变。 |
| 子集 / 筛选 | 原始 20,324 行 → 去掉多轮行 5,906 → 单轮 14,418 行(7,208 个不同 prompt)→ 每个 prompt 取评分最高的一条回复 7,208 → 去空 0 → 按 (user,assistant) 整对去重 −1 → 可用 7,207 → 丢弃经 chat template 渲染后 >1024 token 的 206 条 → fit 7,001 → seed=42 洗牌后取 1440 条(1440 个不同 prompt) |
| 权重许可 Weights license | apache-2.0(仅指本仓库的 LoRA 适配器权重) |
| 训练配置 Training | QLoRA(基座以 4-bit NF4 加载)· LoRA r32 / α64 / dropout 0.05 / targets auto · seq 1024 · batch 4 × grad_accum 4(有效 16)· lr 1e-4(cosine)· warmup 0.03 · 3 epoch = 270 步(steps) · seed 42 · bf16 + Liger kernel · 单卡 |
| 已知局限 Limitations | 只训 3 epoch / 270 步 / 1440 条;prompt 为 ShareGPT 衍生、回复为模型生成;未做任何评测;单一 seed;交付 LoRA 未合并;不是产品。详见下文「已知局限」 |
文件 Files
| 文件 | 说明 |
|---|---|
adapter_model.safetensors |
LoRA 适配器权重,fp32,496 个张量 / 86,556,672 个参数,346,302,176 字节,sha256 0683e783f149935dee4f05440029484d16d6741244e7fb929a577841b0bf9c83(= 第 270 步,也就是最终 checkpoint) |
adapter_config.json |
PEFT 配置(由 peft 0.20.0 写出) |
tokenizer.json / tokenizer_config.json / chat_template.jinja |
训练时实际使用的 tokenizer 与对话模板,由 transformers 5.15.0 随适配器一起保存(见下文「tokenizer 说明」) |
不包含:合并后的完整权重、中间 checkpoint(第 100 / 200 步)、优化器状态、训练语料或其副本。训练数据请从上游获取。
数据 Data
- 数据集:
nvidia/HelpSteer2,NVIDIA 与 Scale AI 合作发布的 helpfulness 数据集,原用途是训练 reward model(每条 = prompt + 一条 response + 人工对 helpfulness / correctness / coherence / complexity / verbosity 五个属性的 0–4 评分)。来源 URL:https://huggingface.co/datasets/nvidia/HelpSteer2 - 快照:revision
990b2711a36180dd19d9c94b8627844866f8982a,取其中的train.jsonl.gz(11,315,813 字节,20,324 行;上游 LFS sha256c0d7e91d738d42e8a08070db26c4c09a9c7631308e1f0fd380ff43d130c9f713,与本地下载文件逐字一致)。 - 血统(上游数据集卡「Source」节原文):
- "Prompts are collected based on mostly user-contributed ShareGPT prompts and with a small proportion (~5%) that are human generated by Scale AI." —— ShareGPT 是用户自行分享的 ChatGPT 对话合集;这里取的是其中用户提问部分。
- "Responses are generated by early versions of a mix of 10 different inhouse LLMs (note: none from properitary LLM providers such as OpenAI). We generate 2 responses per prompts (each from a different model) …" —— 回复全部是模型生成的。
- "Annotations of various attributes were done by Scale AI." —— 人工标注的是评分,不是回复文本。
- 许可:上游数据集卡 YAML 头逐字为
license: cc-by-4.0(正文亦写 "HelpSteer2 is an open-source Helpfulness Dataset (CC-BY-4.0)")。CC-BY-4.0 允许再分发与商用,要求署名(见下文「引用」)。原数据集许可不因本发布而改变。 ShareGPT 原始对话的权利状况、生成回复所用模型的条款,请以上游说明为准。 - 筛选(CPU 复算,口径与训练读取一致):
- 全量 20,324 行(train split)
- → 去掉多轮行:据上游卡约 29% 的 prompt 是多轮对话,用
<extra_id_1>User/<extra_id_1>Assistant控制符拼在 prompt 字段里,这些不是 Qwen 的对话模板 token;去掉 prompt 含<extra_id_1>的 5,906 行 → 单轮 14,418 行(7,208 个不同 prompt) - → 每个 prompt 只保留一条回复:helpfulness 最高者,平手依次比 correctness、coherence,再平手取更长的回复 → 7,208 条
- → 去空(strip 后为空)0 条 → 按 (user, assistant) 整对去重 −1 → 可用 7,207
- → 用 Qwen3.5-9B chat template(
apply_chat_template(..., add_generation_prompt=False))实测 token 长度,丢弃 >1024 的 206 条(2.86%) - → fit 7,001 →
random.Random(42).shuffle后取前 1,440 条写入训练文件(1,440 条对应 1,440 个不同 prompt)
- 入训回复的 helpfulness 评分分布(把 1,440 条逐条对回原始行复算):4 分 1,020 · 3 分 321 · 2 分 42 · 1 分 27 · 0 分 30。也就是约 6.9% 的入训回复评分 ≤2——这是「每个 prompt 取最佳」的副作用(两条候选都差时也会入选),本轮没有按分数下限再过滤。
- 子集长度(token,含 chat template):p50 376 / p90 704 / p99 960 / max 1,023,均值 404.7,合计 582,774 token/epoch。assistant 回复长度(字符):p50 1,535,均值 1,585.1,max 7,042。
- 映射:
prompt→ user,response→ assistant,两轮消息({"messages":[{role,content}...]});无 system 提示。 - loss 只算在 assistant 回复 token 上(
all_tokens_loss=false);user 部分与模板标记不计入。
训练配置 Training
| 参数 | 值 |
|---|---|
| 方法 | QLoRA:基座经 bitsandbytes 以 4-bit NF4(double quant)加载,计算 dtype bf16;训练 bf16=True |
| LoRA | r=32,lora_alpha=64,lora_dropout=0.05,bias=none,task_type=CAUSAL_LM |
| target_modules | auto,解析为 q_proj/k_proj/v_proj/o_proj/gate_proj/up_proj/down_proj/in_proj_qkv/in_proj_z/in_proj_a/in_proj_b/out_proj;exclude_modules 排除 vision/audio/visual/mtp(只覆盖文本解码器) |
| 可训练参数 | 86,556,672(496 个 fp32 张量) |
| max_seq_len | 1024(训练集中 0 条被截断;子集最长 1,023 token) |
| batch | 每卡 4 × grad_accum 4 = 有效 batch 16 |
| optimizer | paged_adamw_8bit |
| lr / schedule | 1e-4,cosine |
| warmup | warmup_ratio 0.03 |
| epochs / steps | 3 epoch;1440 条 / 有效 batch 16 = 90 步/epoch,共 270 步(训练记录的最终 step 与最终 checkpoint 的 global_step 均为 270) |
| seed | 42 |
| loss 范围 | 只算 assistant 回复 token(all_tokens_loss=false) |
| kernels | Liger kernel;attention sdpa;开启 gradient checkpointing |
| 硬件 / 显存峰值 | 单卡;显存峰值 11.9 GiB |
| 时长 / 吞吐 | 5,059 秒(约 1.41 小时),345.6 tok/s;每 epoch 582,774 token |
| 软件 | transformers 5.15.0、peft 0.20.0 |
| 训练日期 | 2026-10-16 |
训练集 loss:第 5 步 0.865,第 270 步(最后一个记录点)0.444。这只是训练集上的 loss,不是验证或评测指标;本轮没有验证集。训练集 loss 下降只说明模型更贴合这批模型生成回复的风格,不说明回答质量或有用性。
怎么用 Usage
import torch
from transformers import AutoModelForImageTextToText, AutoTokenizer
from peft import PeftModel
base_id = "Qwen/Qwen3.5-9B"
adapter_id = "alfaplus/public-sft-qwen9b-v4"
tok = AutoTokenizer.from_pretrained(adapter_id)
# 用 AutoModelForImageTextToText 加载基座(与训练时一致)。Qwen3.5 的 checkpoint 是 *ForConditionalGeneration,
# 用 AutoModelForCausalLM 加载可能静默漏掉文本解码器权重(只打警告),LoRA 也就挂不对地方。
base = AutoModelForImageTextToText.from_pretrained(
base_id, revision="c202236235762e1c871ad0ccb60c8ee5ba337b9a",
dtype=torch.bfloat16, device_map="auto")
model = PeftModel.from_pretrained(base, adapter_id)
msgs = [{"role": "user", "content": "Explain the difference between a list and a tuple in Python."}]
inputs = tok.apply_chat_template(msgs, add_generation_prompt=True, enable_thinking=False,
return_tensors="pt", return_dict=True).to(model.device)
out = model.generate(**inputs, max_new_tokens=512)
print(tok.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
- 这段示例代码没有在本发布流程中实际运行过(准备发布时不占用 GPU)。加载方式(
AutoModelForImageTextToText+ PEFT)与训练脚本一致,但请自行验证。 - 训练样本采用
enable_thinking=False的格式(空思考块);思考模式下的行为没有评测。 - 训练时基座是 4-bit NF4 加载的;挂到 bf16 基座上的差异没有测过。
tokenizer 说明(对本仓库实测)
本仓库附带的 tokenizer.json 不是基座 tokenizer.json 的逐字节副本(chat_template.jinja 则与基座逐字节相同)。实测对比本仓库这份与基座那份:
- 本仓库这份的预切分(pre-tokenizer)正则是
…[\p{L}\p{N}]?\p{L}+…,而基座文件写的是…[\p{L}\p{N}]?[\p{L}\p{M}]+…(即基座含\p{M}组合附加符类、本仓库这份不含)。这是 transformers 5.15.0 保存 Qwen3.5 tokenizer 时的已知行为。 - 行为探针:直接用
tokenizers库分别读取基座与本仓库的tokenizer.json,对 10 条多语种/组合字符探针切分,有 2 条不同(都含组合附加符:天城文、带变音符的阿拉伯文)。 - 对本轮训练用的 1,440 条样本(user / assistant 共 2,880 段文本)逐段比对,两份 tokenizer 的切分有 1 段不同(一条 assistant 回复,含孟加拉文组合附加符);其余 2,879 段相同。
- 也就是说,训练时实际使用的切分就是本仓库附带的这份 tokenizer。如果推理栈不经过 transformers、直接读取基座的 tokenizer 文件,含组合附加符的文本(天城文、孟加拉文、阿拉伯文变音符等)会被切得和训练时不同。
已知局限 Limitations
- 训练量小:只训了 3 epoch / 270 步,只用了 1440 条样例(单轮、≤1024 token 的 7,001 条里的随机子集,不代表全量 20,324 行或多轮部分的分布)。
- 衍生血统:prompt 主要来自 ShareGPT(用户分享的 ChatGPT 对话中的用户提问),回复由模型生成;回复没有人工改写或逐条核对,生成模型的事实错误、偏差和文体习惯会被学进去。上游数据集卡自述的局限同样适用。
- 按评分挑选不等于高质量:每个 prompt 只取评分最高的一条回复,但约 6.9% 的入训回复 helpfulness 评分 ≤2;人工评分本身有标注者间分歧。
- 没有任何评测:只跑了训练,没有做任何基准评测,没有留出验证集,也没有人工检查生成结果。上面的 loss 只是训练集 loss,不能说明泛化能力或与基座的优劣。不声称任何能力,包括「更有用」。
- 单一 seed,未做超参搜索:只有 seed 42 这一次运行,结果的稳定性未知。
- 交付形态:交付 LoRA 适配器本体,未合并权重;合并 / 低比特量化(如 GGUF)之后的效果未验证,低比特量化可能削弱适配器的作用。
- 训练与推理条件:训练时基座 4-bit NF4;其他精度 / 思考模式未测。
- 只有单轮、只有英文、只有文本:训练样本全是单轮英文对话、无 system 提示;多轮对话与其他语言下的行为未测。只训练了文本解码器;挂上适配器后基座的图像 / 视频能力是否受影响未测。
- 没有任何保证:未做安全评测或红队测试。这是实验室的实验产物,不是产品。
许可 License
- 适配器权重:apache-2.0。 本仓库 YAML 中的
license: apache-2.0指适配器权重与本卡。 - 训练数据:cc-by-4.0(上游数据集卡 YAML 头逐字
license: cc-by-4.0)。原数据集许可不因本发布而改变。 本仓库不包含 HelpSteer2 数据或其衍生副本;如需使用数据,请从上游按其许可获取,并按 CC-BY-4.0 署名。 - 基座模型:
Qwen/Qwen3.5-9B按其自身许可(apache-2.0,https://huggingface.co/Qwen/Qwen3.5-9B/blob/main/LICENSE)发布;使用本适配器需另行获取基座并遵守其条款。
引用 / 出处 Citation
数据集:nvidia/HelpSteer2(NVIDIA,与 Scale AI 合作),https://huggingface.co/datasets/nvidia/HelpSteer2 ,CC-BY-4.0。
@misc{wang2024helpsteer2,
title={HelpSteer2: Open-source dataset for training top-performing reward models},
author={Zhilin Wang and Yi Dong and Olivier Delalleau and Jiaqi Zeng and Gerald Shen and Daniel Egert and Jimmy J. Zhang and Makesh Narsimhan Sreedhar and Oleksii Kuchaiev},
year={2024},
eprint={2406.08673},
archivePrefix={arXiv}
}