NVIDIA Nemotron 3 Nano Omni

当天最大的 infra-native 模型发布。NVIDIA 推出 Nemotron 3 Nano Omni,是一个开放的 30B / A3B 多模态 MoE,具有 256K 上下文,专为跨越文本、图像、视频、音频和文档的 agentic 工作负载而构建。

分发立即覆盖了整个生态:OpenRouter、LM Studio、Ollama、Unsloth、fal、Fireworks、DeepInfra、Together、Baseten、Canonical 等都宣布了当天的可用性。

关键规格:这是 NVIDIA 第一个 omni 发布,由 Parakeet encoder 提供语音/音频理解能力,目前仅限英语,在 Open ASR 排行榜上 WER 5.95%。多家服务商引用了相比同类开放 omni 模型 约 9 倍的吞吐量

Mini-SGLang:match 到底在做什么

一句话回忆:match = 查询树里已经存了多少前缀能复用。

类比:你去图书馆找书,librarian(match 函数)告诉你「这本《哈利波特》前 5 章我们书架上已经有了,第 6 章往后是新的」。

视觉化

假设 radix 树现在长这样(每个 [...] 是一个节点):

                 root
                  │
         [你是健身教练。]    ← 14 token 共享前缀
                  │
           [我该怎么练]
              ╱       ╲
         [胸肌?]    [腹肌?]   ← 已有的两条分叉

来了一个新 prompt:

"你是健身教练。我该怎么练腹肌?还需要注意什么?"

match 的工作过程

match(root, prompt_tokens):
  step 1: 从 root 开始往下走
          "你是健身教练。" → 树里有,共享 14 tokens
  step 2: 走到下一个节点 "[我该怎么练]"
          "我该怎么练" → 树里也有,共享 5 tokens
  step 3: 走到分叉口,看子节点里有没有 "腹"
          有,走进 [腹肌?] → 共享 4 tokens
  step 4: 继续走 "还需要注意什么?"
          子节点没有这个 token → 停!
          → 返回: matched_node=[腹肌?], n_matched=23
          (前 23 token 已在树里, 后面是新的)

两个返回值的含义

matched_node, n_matched = match(root, prompt_tokens)
       ↓                ↓
   走到了哪个节点      一共匹配上多少 token
   (后续要在它下面挂  (前几个 token 不用
    新东西)             重算 KV)

为什么 match 和 insert 必须配对

match  → 告诉你「前 23 个不用算」
insert → 把「第 24 个之后的」挂到树上、塞进 KV cache

没 match:  不知道哪些能复用 → 全部重算 → 浪费
没 insert: 算完了没存树 → 下次又重算 → 浪费

Unsloth:LoRA 微调的两种模式

A) 不合并模式(peft 库默认):

推理时: y = (W + α*B@A) * x
→ 推理稍慢一点(多一次矩阵加法)
→ 灵活:一个 base model 可以挂多个不同 adapter
   (英文 / 中文 / 医疗 / ...)

B) 合并模式(merge_and_unload):

先把 A, B 烘焙进 W: W_new = W + α*B@A
→ 推理跟普通模型一模一样的速度
→ 但 W_new 是 14GB,失去了「轻便」的好处

用 Unsloth 模仿《红楼梦》风格

体积差异很有意思:

Qwen3-8B (base):   16 GB
LoRA adapter:      167 MB    ← 小 100 倍

我训练了一个小 adapter,跑了一段「西湖游记,用红楼梦风格」的生成。输出里宝玉和黛玉的对话有那种该有的味道,时代用词和语气都接上了。逻辑上有些地方对不上,但 格式是对的——换更大的 base model,同样的方法应该可以跑通。

TRL:HuggingFace 的 Transformer Reinforcement Learning

TRL = Transformer Reinforcement Learning。HuggingFace 出品的训练库,覆盖 SFT / DPO / PPO / GRPO,全家桶。

今天过了一遍的内容:

  • TRL 是什么:HuggingFace 的训练库,SFT/DPO/PPO/GRPO 全家桶
  • DPO 数据格式:(prompt, chosen, rejected)
  • DPO 公式直觉:推 chosen 上去,推 rejected 下来,但锚住 reference 模型
  • on-policy vs off-policy 的区别
  • 写过完整 DPO 训练循环 pseudocode
  • 跟 TRL 真代码对比,理解 sigmoid loss
  • 自己跑通:数据生成 + DPOTrainer + 前后对比测试
  • 看到「过拟合警告」(margin 过高、loss 过低)