NV1 Converter:原 80k 与 FullCtx 两份 checkpoint
本仓库保存我们在 NV1 复现实验中训练、评测的 两份 hidden-to-embedding converter 权重,均为 seed42、500 个 optimizer steps。每份权重分别用 temperature=0 和 temperature=1 评测,因此共有四组评测结果;温度是解码参数,不对应额外训练的 checkpoint。
这两份文件仅包含 converter,不包含 LLaDA2.0-mini 基座、tokenizer、优化器或完整训练恢复状态。它们需要与兼容的基座及 CLLADA converter 解码器共同使用,不能直接当作完整模型交给 AutoModelForCausalLM.from_pretrained。
两份权重
| 目录 | 训练数据候选池 | 完整上下文要求 | 训练步数 | Global batch | 实际呈现样本数 |
|---|---|---|---|---|---|
raw80k-s500-seed42 |
80,000 条 | 不筛选;训练时保留回答并截断超长上下文 | 500 | 4 | 2,000 |
fullctx15724-s500-seed42 |
15,724 条 | 应用训练 tokenizer/template 后,完整问答可放进 1024 tokens | 500 | 4 | 2,000 |
- 原 80k:使用四领域均衡的英文指令数据,
chat/code/math/stem各 20,000 条。数据已发布在 gj120018/converter_training_datasets,上游为 NVIDIA Nemotron-Post-Training-Dataset-v2。 - FullCtx:使用从上述 80k 中筛选、重新均衡的 15,724 条完整上下文数据,四类各 3,931 条。该数据文件不包含在本模型仓库中,也不是后续 70,544 条扩展池。
- 原 80k 在这次 500 步实际见到的 2,000 条样本中,793 条发生 prompt 截短,其中 358 条完全丢失问题内容。FullCtx 旨在避免这一问题;筛选同时改变了样本成员与长度分布。
- 候选池大小不等于实际训练样本数:两份模型都是
500 × 4 = 2,000条样本呈现,并非遍历了全部候选池。
结构和共同训练配置
基座为冻结的 inclusionAI/LLaDA2.0-mini。本地训练与评测使用其 merged/stacked-expert 形式;加载基座时需要匹配该参数布局。
Converter 结构为 Linear(2048, 2048, bias=True) → LayerNorm → L2 normalize → learned scalar,共 4,200,449 个 FP32 参数。基座使用 BF16,训练中只更新 converter。
| 参数 | 值 |
|---|---|
| 最大训练序列长度 | 1024 tokens |
| Optimizer steps / seed | 500 / 42 |
| Global batch / micro batch | 4 / 1 |
| 优化器 | AdamW,β=(0.9, 0.999),weight decay=0 |
| 学习率 / warmup / schedule | 0.001 / 3% / cosine |
| Gradient clipping | 1.0 |
| Block size | 32 |
continuous_mode |
cadd |
noise_range |
[0.001, 1.0] |
continuous_dropout |
0.0 |
converter_mlp / auxiliary MSE |
false / 0.0 |
这里的 continuous_mode=cadd 描述 converter 的训练输入构造,不代表训练了全参数 CADD 模型。训练第一遍在 masked 位置使用 MASK_embedding + (1-t) × clean_embedding + t × Gaussian_noise,再通过 converter 输出进行第二遍预测。
两个目录均附有 training_config.yaml。其中机器路径已替换为 /path/to/... 占位符;配置取自重新训练后与这两份权重全部五个参数精确相等的 500 步控制实验。
四组评测结果
截至 2026-10-21,使用完整 HumanEval 164 题、tpf1、生成上限 512 tokens、当前修复温度及 EOS/预算边界后的 cllada_infer,得到以下单次运行结果。
| Checkpoint | Temperature | HumanEval 正确题数 | HE pass@1 | HumanEval+ 正确题数 | HE+ pass@1 |
|---|---|---|---|---|---|
| 原 80k | 0 | 117/164 | 71.34% | 109/164 | 66.46% |
| 原 80k | 1 | 123/164 | 75.00% | 117/164 | 71.34% |
| FullCtx 15,724 | 0 | 131/164 | 79.88% | 124/164 | 75.61% |
| FullCtx 15,724 | 1 | 133/164 | 81.10% | 125/164 | 76.22% |
评测设置:block length=32、每块 sampling steps=32、converter threshold=1.1、use_cache=False;输入为 # language: python\n{prompt} 并套用模型 chat template。评分使用 EvalPlus 0.3.1 和 HumanEvalPlus-v0.1.10,经仓库 he_pass 执行代码提取、prompt 拼接和 sanitize。
相关运行环境:Python 3.11.13、PyTorch 2.7.1+cu128、Transformers 4.56.2、Triton 3.3.1、Liger 0.6.2。上表 T=1 为随机采样的一次完整评测,分数可能随采样状态、环境和解码实现变化;它不是多个种子均值。训练窗口 1024 与评测生成上限 512 是不同参数。
evaluation_results.json 保存机器可读设置与汇总;每个模型目录中的 humaneval_t0_scores.json / humaneval_t1_scores.json 保存 164 题逐题通过情况。
复现边界: NV1 文档给出的 converter 目标为 T=1 时 84.15%、T=0 时 85.98%。本仓库这两份模型尚未达到这些分数。FullCtx 改变了训练数据,不能被当作原 80k 配方的逐样本复现;本仓库也不包含作者文档原始出分权重。
下载与加载
有仓库访问权限并完成 Hugging Face 登录后:
hf download gj120018/converter --local-dir ./converter
加载 converter 模块(该示例不加载完整基座,也不执行文本生成):
import sys
import torch
sys.path.insert(0, "./converter")
from hidden_emb_converter import HiddenToEmbConverter
path = "./converter/fullctx15724-s500-seed42/hidden_emb_converter.pt"
# 原 80k 则改为 ./converter/raw80k-s500-seed42/hidden_emb_converter.pt
ckpt = torch.load(path, map_location="cpu", weights_only=True)
converter = HiddenToEmbConverter(
hidden_size=ckpt["hidden_size"],
mlp=ckpt["converter_mlp"],
)
converter.load_state_dict(ckpt["state_dict"], strict=True)
converter.eval()
hidden_emb_converter.py 是与权重匹配的模块实现。导出字典包含 state_dict、hidden_size=2048、converter_mlp=False、continuous_mode="cadd";state_dict 中有 scale、proj.weight、proj.bias、post_norm.weight、post_norm.bias 五项。
在已经配置好 CLLADA 源码、依赖、基座和评测数据的环境中,可将下载文件传入其现有评测入口:
python -m cllada_infer.run_eval \
--task he --model converter --decode tpf1 --temp 0 \
--base /path/to/llada2.0-mini-moe-merged \
--converter_path /path/to/converter/fullctx15724-s500-seed42/hidden_emb_converter.pt \
--save fullctx_t0.json
将 --temp 0 改为 --temp 1 即使用同一份权重进行 T=1 评测。需使用已修复温度处理的解码实现;现存早期 converter 源码接受 temperature 参数但没有使用,不能将该版本的 --temp 1 结果视为真正的 T=1。完整基座、CLLADA 解码器、训练数据和测试执行环境需另行准备,本仓库附带的模块只用于加载 converter 本身。
Model tree for gj120018/converter
Base model
inclusionAI/LLaDA2.0-mini