public-sft-qwen9b-v3 · Qwen3.5-9B × OASST1 (ja+zh) LoRA 适配器(实验产物)
English TL;DR. A LoRA adapter (r=32, alpha=64) for
Qwen/Qwen3.5-9B, trained with QLoRA for 3 epochs / 384 optimizer steps on a 2,048-example Japanese+Chinese subset ofOpenAssistant/oasst1(apache-2.0, revisionfdf72ae0827c1cda404aff25b6603abec9e3399b, https://huggingface.co/datasets/OpenAssistant/oasst1). The subset is Chinese-dominant (zh 1857 vs ja 222 candidate pairs) and the 2048 examples cover only 915 distinct prompts — do not read this as a Japanese-capable model. The adapter weights are released under apache-2.0; the dataset's own license is not changed by this release. Training only: no benchmark evaluation was run. This is a lab experiment, not a product.
本仓库是一个 LoRA 适配器:在 Qwen/Qwen3.5-9B 上,用公开数据集 OpenAssistant/oasst1 的 2048 条【日文+中文】子集做了一轮指令微调(SFT)。
只做了训练,没有做任何基准评测。 本卡所有数字都取自这一轮训练的实际产物(训练记录、训练元数据、适配器文件本身)以及对数据筛选的复算;没有估算值。
⚠ 关于语言能力(请先读这条)
本子集只取 oasst1 里 lang ∈ {ja, zh} 的样本,但实际以中文为主:候选对里 zh 1857 条 / ja 222 条。
而且 oasst1 一个 prompt 常带多条排名不同(rank 0/1/2)的人工回复,所以 2048 条训练样本只对应 915 个不同的 prompt。
因此:不要把本适配器当成有日文能力的模型。 日文样本量很小,且本轮没有做任何评测去验证任何语言上的效果。
Provenance 一览
| 项 | 内容 |
|---|---|
| 基座模型 Base model | Qwen/Qwen3.5-9B,HF 快照 commit c202236235762e1c871ad0ccb60c8ee5ba337b9a(训练机本地缓存中唯一的快照,refs/main 指向它)。基座自身许可为 apache-2.0 |
| 数据集 Dataset | OpenAssistant/oasst1:https://huggingface.co/datasets/OpenAssistant/oasst1 |
| 数据快照 Revision | commit fdf72ae0827c1cda404aff25b6603abec9e3399b;用其中的 data/train-00000-of-00001-b42a775f407cee45.parquet(上游 LFS sha256 bbfadf5ed1278ba2208c837fdcad865adf65f5df55d80abadab2745db13fcb5e) |
| 数据许可 Data license | apache-2.0(上游数据卡 YAML 头 license: 标签逐字如此;仓库另附完整 Apache-2.0 LICENSE 文件)。原数据集许可不因本发布而改变。 |
| 子集 / 筛选 | role=assistant 且 deleted=false 且 review_result=true 且其父 prompter 未删除 → 只保留 lang ∈ {ja, zh}(zh 1857 / ja 222)→ 去空、按 (user,assistant) 整对去重 → 可用 2070 → 丢弃经 chat template 渲染后 >1024 token 的 22 条 → seed=42 洗牌后取 2048 条(覆盖 915 个不同 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 · lr 1e-4(cosine)· warmup 0.03 · 3 epoch = 384 步(steps) · seed 42 · bf16 + Liger kernel · 单卡 |
| 已知局限 Limitations | 只训 3 epoch / 384 步 / 2048 条(仅 915 个不同 prompt);中文为主、日文极少;未做任何评测;单一 seed;不是产品。详见下文「已知局限」 |
文件 Files
| 文件 | 说明 |
|---|---|
adapter_model.safetensors |
LoRA 适配器权重,fp32,496 个张量 / 86,556,672 个参数,346,302,176 字节,sha256 d84774063e80c532389619828fd0be6ac71c2c531b6f88158f5e90907e4f0725(= 第 384 步,也就是最终 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 / 300 步)、优化器状态、训练语料或其副本。训练数据请从上游获取。
数据 Data
- 数据集:
OpenAssistant/oasst1(众包人工撰写的多语对话树;Köpf et al. 2023, arXiv:2304.07327),来源 URL:https://huggingface.co/datasets/OpenAssistant/oasst1 - 快照:revision
fdf72ae0827c1cda404aff25b6603abec9e3399b,取其中的data/train-00000-of-00001-b42a775f407cee45.parquet(上游 LFS sha256bbfadf5ed1278ba2208c837fdcad865adf65f5df55d80abadab2745db13fcb5e)。 - 许可:上游数据卡 YAML 头逐字为
license: apache-2.0,仓库另附完整 Apache-2.0 LICENSE 文件。Apache-2.0 允许再分发与商用。原数据集许可不因本发布而改变。 - 筛选(CPU 复算,口径与训练读取一致):
- 全量 84,437 条消息(prompter 31,525 / assistant 52,912)
- → assistant 且
deleted=false且review_result=true:51,029 - → 父 prompter 存在且未删除:51,029
- → 只保留
lang ∈ {ja, zh}:2,079(zh 1,857 + ja 222) - → 去空 0 → 按 (user, assistant) 整对去重 −9 → 可用 2,070(其中不同 user prompt 917 个)
- → 用 Qwen3.5-9B chat template(
apply_chat_template(..., add_generation_prompt=False))实测 token 长度,丢弃 >1024 的 22 条(1.06%) - → fit 2,048 →
random.Random(42).shuffle后取前 2,048 条写入训练文件(覆盖 915 个不同 prompt)
- 去重口径说明:oasst1 一个 prompt 会有多条排名不同(rank 0/1/2)的人工回复,都是
review_result=true、未删除的人工回答。本轮按 (user, assistant) 整对去重(保留不同回答),而不是只按 user 去重 —— 后者会把 ja+zh 的不同 prompt 压到约 915 个、跌破规模下限,也会丢掉合法的不同人工答案。代价是同一 prompt 会带不同排名的答案重复出现(2048 条 ↔ 915 个 prompt)。 - 映射:父 prompter 文本 → user,assistant 文本 → assistant,两轮消息(
{"messages":[{role,content}...]})。 - 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 条被截断) |
| 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;2048 条 / 有效 batch 16 = 128 步/epoch,共 384 步(v1/v2 是 2400 条 = 450 步,本轮样本更少故步数更少) |
| seed | 42 |
| loss 范围 | 只算 assistant 回复 token(all_tokens_loss=false) |
| kernels | Liger kernel;attention sdpa;开启 gradient checkpointing |
| 硬件 / 显存峰值 | 单卡;显存峰值 11.6 GiB |
| 时长 / 吞吐 | 3,829 秒(约 1.06 小时),238.3 tok/s;每 epoch 304,117 token |
| 软件 | transformers 5.15.0、peft 0.20.0 |
| 训练日期 | 2026-10-15 |
训练集 loss:第 5 步 2.377,第 380 步(最后一个记录点)1.381。这只是训练集上的 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-v3"
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": "次の文章を一文で要約してください。"}]
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=256)
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 的逐字节副本。实测对比本仓库这份与基座那份:
- 本仓库这份的预切分(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 条多语种/组合字符探针切分,有 3 条不同(都含组合附加符:天城文、带变音符的阿拉伯文)。 - 也就是说,训练时实际使用的切分就是本仓库附带的这份 tokenizer。如果推理栈不经过 transformers、直接读取基座的 tokenizer 文件,含组合字符的文本会被切得和训练时不同。
已知局限 Limitations
- 训练量小:只训了 3 epoch / 384 步,只用了 2048 条样例,且只覆盖 915 个不同 prompt。
- 语言:中文为主,日文极少,且未经评测。子集只取
lang ∈ {ja, zh},候选里 zh 1857 / ja 222。不要把它当成日文模型;对任何语言的实际效果都没有测过。 - 没有任何评测:只跑了训练,没有做任何基准评测,也没有留出验证集。上面的 loss 只是训练集 loss,不能说明泛化能力或与基座的优劣。
- 交付形态:交付 LoRA 适配器本体,未合并权重;合并 / 低比特量化(如 GGUF)之后的效果未验证,低比特量化可能削弱适配器的作用。
- 单一 seed,未做超参搜索。
- 训练与推理条件:训练时基座 4-bit NF4;其他精度 / 思考模式未测。
- 只有文本:只训练了文本解码器;挂上适配器后基座的图像 / 视频能力是否受影响未测。
- 数据本身的局限:oasst1 是志愿者众包、社区投票产生,可能带有标注者构成与话题上的偏斜;上游数据卡自述的局限同样适用。
- 没有任何保证:未做安全评测或红队测试。这是实验室的实验产物,不是产品。
许可 License
- 适配器权重:apache-2.0。 本仓库 YAML 中的
license: apache-2.0指适配器权重与本卡。 - 训练数据:apache-2.0(上游数据卡 YAML 头逐字
license: apache-2.0)。原数据集许可不因本发布而改变。 本仓库不包含 oasst1 数据或其衍生副本;如需使用数据,请从上游按其许可获取。 - 基座模型:
Qwen/Qwen3.5-9B按其自身许可(apache-2.0,https://huggingface.co/Qwen/Qwen3.5-9B/blob/main/LICENSE)发布;使用本适配器需另行获取基座并遵守其条款。
引用 / 出处 Citation
@misc{kopf2023openassistant,
title={OpenAssistant Conversations -- Democratizing Large Language Model Alignment},
author={Andreas K\"opf and Yannic Kilcher and Dimitri von R\"utte and Sotiris Anagnostidis and Zhi-Rui Tam and Keith Stevens and Abdullah Barhoum and Nguyen Minh Duc and Oliver Stanley and Rich\'ard Nagyfi and Shahul ES and Sameer Suri and David Glushkov and Arnav Dantuluri and Andrew Maguire and Christoph Schuhmann and Huu Nguyen and Alexander Mattick},
year={2023},
eprint={2304.07327},
archivePrefix={arXiv}
}