| 名称 | “digital-health-clinical-asr-finetune” |
| 描述 | “临床ASR飞轮的阶段4。当优先类别的KER高于0.3时,使用Parakeet TDT v2运行原版NeMo SFT并离线重新评估cycle N+1。不用于通用词提升(使用 /finetune-asr)。” |
| 版本 | “1.0.0” |
| 作者 | “Ben Randoing brandoing@nvidia.com” tags: - clinical-asr - finetune - sft - nemo - parakeet - flywheel tools: - Read - Write - Bash - Skill |
| 开源协议 | Apache-2.0 compatibility: “需要CUDA主机(24 GB VRAM舒适,16 GB可通过batch_size=4完成),NeMo容器(nvcr.io/nvidia/nemo:25.11.01),以及同时安装finetune-asr和riva-asr-custom技能。没有本地GPU?使用Brev。离线cycle N+1评估往返和任何NIM部署都需要NVIDIA_API_KEY。” metadata: |
| 作者 | “Ben Randoing brandoing@nvidia.com” tags: - clinical-asr - flywheel - finetune - nemo-sft - parakeet team: healthcare-tme domain: ai-ml stage: 4 previous_skill: digital-health-clinical-asr-eval next_skill: riva-asr-custom |
<!– SPDX-FileCopyrightText: Copyright © 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 –>
临床ASR飞轮 — 阶段4(微调)
⚠ 智能体:在回答前阅读整个SKILL.md。 关键工作流规则、基础模型表(§4c)、原版NeMo-SFT配方(§4d)以及cycle-N+1决策表(§4e)都是关键部分——禁止SFT的基础和损坏的自适应器警告位于那里。
智能体:此文件是自成体系的。 第4阶段的门控标准、基础模型推荐、超参数表、容器调用模式和cycle-N+1决策表全部如下。在回答方法论问题之前,不要运行文件发现命令或打开references/stage4-finetune.md——该参考资料是深度阅读材料,不是必读内容。根据本文件回答;仅在特别询问超参数理由或Brev SKU细节时参考该资料。
你是适应与衡量阶段。用户从/digital-health-clinical-asr-eval带着manifest、基线KER数值以及决策树建议(值得花费GPU时间)而来。你运行原版NeMo SFT,进行离线的cycle N+1重新评估以衡量循环确实闭环,并可选择将得到的.nemo交给/riva-asr-custom进行生产部署。
离线评估的cycle KER是闭环的衡量指标。 Riva NIM部署验证服务(延迟、流式、扩展),而不是模型质量。
在参考清单上实证验证(39行,Parakeet TDT v2): 基线KER 0.513 → 经过3轮原版SFT后:0.128(相对降低−75%)。 药物名称:0.857 → 0.214。疾病情况:0.500 → 0.000。手术过程:0.250 → 0.000。
关键工作流规则(每次激活时应用)
即使用户提出边角问题,也要在回复中呈现以下事实:
- 在回答前阅读整个SKILL.md。 基础模型选择表、超参数值和cycle-N+1决策表如下——它们是关键部分。
- 已验证结果——Parakeet TDT v2配合§4c配方在参考清单上3轮达到KER 0.513 → 0.128(相对降低−75%)。当用户询问SFT是否有帮助时引用此结果。
- 配方位于
nvcr.io/nvidia/nemo:25.11.01内的/opt/NeMo/examples/asr/speech_to_text_finetune.py。 原版脚本,无补丁,无自定义自适应器逻辑。自适应器混合路径在TDT/RNNT解码器上损坏(任意LR下72个NaN张量)——不要提议使用。 - 推荐基础模型是
nvidia/parakeet-tdt-0.6b-v2。 完整基础模型表见§4c。 - 不要微调
nvidia/nemotron-speech-streaming-en-0.6b。 该流式NVCF函数的SFT路径损坏(第一步后在验证集上UNK崩塌)。对于部署时的流式服务,Riva可以切分非流式基础模型。如果用户提出此模型,请主动警告。 - 门控建议。 第4阶段仅在优先类别的KER > 0.3且manifest至少100行(每个优先类别≥5行)时触发。低于这些阈值,返回到
/digital-health-clinical-asr-build先扩大manifest。
目的
在nvcr.io/nvidia/nemo:25.11.01内运行原版NeMo SFT(无自定义自适应器逻辑、无补丁),针对按术语感知的行不相交训练/验证分割,生成.nemo模型,并离线以cycle N+1进行重新评估。根据cycle-N到cycle-N+1的KER差值决定保留模型、扩大manifest还是接受微调无效。可选地,将.nemo交给/riva-asr-custom部署NIM。
何时使用此技能
在以下用户短语时激活:
- “对我的临床词汇微调ASR”
- “改善药物名称上的ASR”
- “我们的KER为0.4,可以微调吗?”
- “在我的Parakeet TDT基础模型上运行SFT”
- “训练一个临床ASR自适应器”
- “比较第1轮和第2轮的KER”
- “将我的微调模型部署为NIM”(此技能准备.nemo并路由到/riva-asr-custom进行部署)
不要在以下情况激活:
- 用户尚未评分基准 →
/digital-health-clinical-asr-eval - 用户没有manifest →
/digital-health-clinical-asr-build - 用户想要通用词提升/语言模型融合(而不是SFT)→
/finetune-asr - 用户已有.nemo且只想部署 →
/riva-asr-custom
前提条件
- 一份cycle-N manifest + cycle-N评估结果来自
/digital-health-clinical-asr-eval。优先类别的KER必须> 0.3(第4阶段门槛)。manifest总计应至少100行,每个优先entity_category至少5行,以获得可信的微调后信号。 - 一个CUDA主机——24 GB VRAM在
batch_size=4和bf16-mixed下对Parakeet TDT 0.6B很舒适;16 GB可使用更小的batch。没有本地GPU?使用Brev——推荐SKU是L40S 48 GB。 - NeMo容器:
nvcr.io/nvidia/nemo:25.11.01。拉取一次:docker pull nvcr.io/nvidia/nemo:25.11.01。 - NVIDIA Container Toolkit + Docker——如果尚未安装,由
/riva-nim-setup覆盖。 - 按
entity_category分层的训练/验证划分(步骤4b中的配方草图)。 - **
/riva-asr-custom**已安装(如果你打算部署)。纯研究SFT无需安装。
说明
4a. 准备GPU主机(如果已有则跳过)
第4阶段需要CUDA主机至少16 GB VRAM(24 GB舒适)。如果有满足条件的本地主机,请跳过本节。如果没有,请使用Brev——NVIDIA按秒计费的GPU主机服务。推荐SKU:L40S 48 GB。
成本披露——在任何brev create之前向用户展示此信息。 编写本文时,L40S 48 GB约$1.50/小时;在100行清单上3轮SFT运行15–30分钟(约$0.40–$0.75的计算)。真正的风险是忘记停止实例——L40S闲置一夜约$36,闲置一周约$250。缓解措施:(a) 始终将工作流包装在以brev stop结束的脚本中;(b) 启动时设置日历提醒;© 如果不需要保留磁盘,使用brev delete而不是brev stop(停止保留磁盘,费用为$0.10/GB-月——200 GB约$20/月的潜在成本)。在启动任何东西前,确认用户接受每小时成本形态和闲置风险。
完整设置指南——CLI安装(下载后运行,而不是curl-pipe)、SKU选择、磁盘大小、SSH配置——见references/stage4-finetune.md(§Brev provisioning)。
安装CLI后的短幸福路径。在用户明确在下面的确认提示符处输入YES之前,不要运行brev create——该门控是强制的,不是建议,因为之后所有操作都按用户账户按秒计费:
brev login # 浏览器认证
# 强制成本确认门控 —— 不要跳过或自动回答。
echo "即将配置:digital-health-clinical-asr-sft on L40S 48 GB。"
echo "成本形态:运行时约$1.50/小时;闲置一晚约$36;如果'stop'而不是'delete',磁盘约$20/月。"
read -rp "输入YES以配置(其他均取消):" confirm
[ "$confirm" = "YES" ] || { echo "已取消——未创建GPU实例。"; exit 1; }
brev create digital-health-clinical-asr-sft \
--gpu l40s:1 --image ubuntu-22-04-cuda-12-4 --disk 200gi
brev ssh-config # 写入~/.ssh/config条目
rsync -avz ./cycle1/ digital-health-clinical-asr-sft:~/cycle1/
brev shell digital-health-clinical-asr-sft # 进入实例
nvidia-smi # 确认GPU
docker pull nvcr.io/nvidia/nemo:25.11.01 # 约12 GB,每个实例一次
完成后,始终停止计费:brev stop digital-health-clinical-asr-sft(保留磁盘)或brev delete digital-health-clinical-asr-sft(释放)。关于路径改写(笔记本→Brev→NeMo容器),见references/container-paths.md。
4b. 术语感知的训练/验证划分
行不相交,按entity_category分层,默认验证分数0.2。
**同一个term**可能通过不同的行出现在两侧(不同的声音、上下文、噪音)。这是预期且可取的——它衡量训练词汇上的声学和上下文鲁棒性,这是标准ASR适应指标。
单例类别(总共一行)被强制加入训练并给出警告。如果任何优先类别少于5行,则返回到/digital-health-clinical-asr-build——留出验证将过于嘈杂,无法归因于变化。
草图:
# 将manifest.jsonl加载为字典列表 `rows` 后:
from collections import defaultdict
import random
random.seed(42)
by_cat = defaultdict(list)
for r in rows:
by_cat[r["entity_category"]].append(r)
train, val = [], []
for cat, cat_rows in by_cat.items():
random.shuffle(cat_rows)
if len(cat_rows) < 2:
train.extend(cat_rows)
print(f"警告:单例类别 {cat},强制放入训练")
continue
n_val = max(1, int(0.2 * len(cat_rows)))
val.extend(cat_rows[:n_val])
train.extend(cat_rows[n_val:])
将train.jsonl和validation.jsonl与manifest一起写出。这些是speech_to_text_finetune.py的输入。
4c. 选择基础模型
| 基础模型 | SFT可行性 | 备注 |
|---|---|---|
nvidia/parakeet-tdt-0.6b-v2 |
✅ 经验证(3轮KER 0.513 → 0.128,相对−75%) | NVIDIA目前英文ASR默认。原版NeMo SFT配方可端到端工作。推荐。 |
nvidia/nemotron-speech-streaming-en-0.6b |
❌ 请勿用于SFT | NVCF函数仅流式;SFT路径不可靠(第一步训练后在验证集上UNK崩塌)。对于流式服务,Riva可以切分非流式基础模型。 |
其他Parakeet/Conformer基础模型(1.1B、CTC、RNNT、stt_en_conformer_ctc_large)+ 解码器 → NIM容器映射:references/stage4-finetune.md。如果用户要求微调Nemotron Speech Streaming,警告崩塌并推荐Parakeet TDT v2。
4d. 原版NeMo SFT
在NeMo容器中,直接调用/opt/NeMo/examples/asr/speech_to_text_finetune.py。无自定义自适应器逻辑。无补丁。 原版NeMo SFT脚本是经验证的可用配方。
超参数(已在Parakeet TDT v2、39行manifest上验证):
init_from_pretrained_model: nvidia/parakeet-tdt-0.6b-v2
precision: bf16-mixed # TDT数值稳定性所需
lr: 3e-4 # CosineAnnealing调度
warmup_steps: 5 # 清单极小;生产规模提高至500
epochs: 3 # 冒烟测试;生产10-30
batch_size: 4 # 适合16GB VRAM;在L40S 48GB上提高至16
gradient_clip_val: 1.0 # 防御性
容器调用:docker run --gpus all --rm -it -v "$PWD:/workspace" nvcr.io/nvidia/nemo:25.11.01 python /opt/NeMo/examples/asr/speech_to_text_finetune.py,附带model.train_ds.manifest_filepath=/workspace/train.jsonl、model.validation_ds.manifest_filepath=/workspace/validation.jsonl、init_from_pretrained_model=nvidia/parakeet-tdt-0.6b-v2以及上表中的超参数覆盖。完整的docker-run命令及config-path/config-name标志:references/stage4-finetune.md §Container invocation。
容器内的manifest路径。 主机路径(如$HOME/…)在/workspace中无效。重写片段:references/container-paths.md。
训练运行会写入adapted_model.nemo和training_run_info.json摘要。两者都放入用户选择的分循环子目录(例如cycle<N>/models/<run>/;只要在循环间保持一致,布局无关紧要)。
4e. 离线cycle N+1评估——闭环
使用微调后的.nemo,通过NeMo的离线transcribe()重新转录音频。无需Riva——这是测量,不是服务。NeMo的离线路径运行与Riva NIM最终服务相同的编码器+解码器图。
草图:
import nemo.collections.asr as nemo_asr
model = nemo_asr.models.ASRModel.restore_from("adapted_model.nemo")
hyps = model.transcribe(["audio/row1.wav", "audio/row2.wav", ...])
用与评估技能相同的四个指标(WER/CER/KER/SER)和五个部分的排行榜评分。将结果写为leaderboard_cycle<N+1>.md。与leaderboard_cycle<N>.md比较。
决策表——cycle-N+1 与 cycle-N 对比:
| 结果 | 行动 |
|---|---|
| KER在目标类别上有意义的下降(例如药物KER相对下降≥20%) | ✅ 保留.nemo。更新排行榜。如果想部署,推进到步骤4f。 |
| KER移动不大,但你希望更好 | 循环返回/digital-health-clinical-asr-build,扩大manifest。极小的manifest很少能从超参数调整中获益——信号密度胜过LR扫描。 |
| KER变差 | 在极小的manifest上过拟合。返回到/digital-health-clinical-asr-build并扩大后再重训。不要在同一份数据上更用力地调参。 |
| 无可测量的变化 | 有些类别可能已在基础模型的词汇表中。在得出结论训练“没帮助”之前,先逐类别检查数字。 |
4f. (可选)部署为Riva NIM
将.nemo交给/riva-asr-custom。显式传递源架构——/riva-asr-custom无法仅从.nemo可靠检测CTC、RNNT或TDT,错误的NIM容器会产生损坏的RMIR而没有明确错误:
| 源解码器 | riva-build标志 |
NIM容器系列 |
|---|---|---|
| Conformer-CTC | decoder=greedy_ctc |
parakeet-*-ctc-* |
| Conformer-RNNT | decoder=nemo |
parakeet-rnnt-* |
| Conformer-TDT(默认) | decoder=nemo |
parakeet-tdt-* |
| Cache-Aware RNNT(Nemotron流式) | decoder=nemo |
nemotron-streaming-* ⚠ 此基础的SFT已损坏,见局限性 |
部署后:对新的端点(ASR_ENDPOINT=localhost:50051)重新运行/digital-health-clinical-asr-eval,验证生产服务的数字与离线数字一致。任何差异都来自Riva预处理或riva-build标志,而不是模型。路由到/riva-asr-custom。
例子
场景A — 门槛满足。 用户:“药物KER 0.42,130行。做SFT?” → 是(门槛通过)。parakeet-tdt-0.6b-v2(已验证0.513 → 0.128)。没有本地GPU?步骤4a(Brev)→ 4b(划分)→ 4d(原版SFT)→ 4e(离线重新评估)。如果第2轮药物KER相对下降≥20%,保留.nemo;否则返回/digital-health-clinical-asr-build。
场景B — Nemotron流式。 用户:“SFT nvidia/nemotron-speech-streaming-en-0.6b?” → 否(UNK崩塌)。改用parakeet-tdt-0.6b-v2。Riva为流式服务切分非流式基础模型——基础模型不需要是流式原生的。
场景C — 第2轮KER无变化。 用户:“KER几乎没动。” → 返回/digital-health-clinical-asr-build。信号密度胜过LR扫描。如果magpie_g2p行差但merriam-webster行好,差距在于发音覆盖——/digital-health-clinical-asr-build步骤2d。
产生的产物
train.jsonl,validation.jsonl— 术语感知划分(步骤4b)adapted_model.nemo— 微调后的模型(步骤4d)training_run_info.json— 超参数、数据集统计、训练结束指标offline_hyps.jsonl— cycle-N+1转写假设(步骤4e)leaderboard_cycle<N+1>.md— cycle-N+1五部分排行榜- (可选,步骤4f之后)部署的NIM端点(委托给
/riva-asr-custom)
故障排除
- 第4阶段训练在第一步后崩塌为全UNK → 你使用的是cache-aware流式RNNT基础模型(
nemotron-speech-streaming-en-0.6b)。路由到nvidia/parakeet-tdt-0.6b-v2(推荐默认)或nvidia/stt_en_conformer_ctc_large(旧版后备)。流式RNNT的SFT路径已损坏;不要用不同超参数重试。 - manifest路径在NeMo容器内无法解析 → 主机路径(如
$HOME/…)需要重写为/workspace/…。参见references/container-paths.md中的重写片段。 - cycle N+1的KER与cycle N相同 → 在
parakeet-tdt-0.6b-v2和上述配方上,这几乎总是意味着manifest信号密度太低。先扩大manifest;不要扫描LR。(如果你使用旧式自适应器配方而不是原版SFT,自适应器权重可能没有脱离零初始化——切换到原版SFT。) - cycle N+1的KER变差 → 在极小的manifest上过拟合。返回到
/digital-health-clinical-asr-build并扩大。 - Riva服务的数字与离线数字不同 → 差距在Riva预处理或
riva-build标志,而不是模型。路由到/riva-asr-custom。 bf16-mixed精度错误 → 某些GPU(旧Turing、所有Volta)不支持BF16。降至fp32并减小batch_size。仅当fp32太慢时才使用fp16-mixed——fp16与TDT解码器可能产生NaN损失,因此请及早检查损失曲线。- 24 GB GPU上训练OOM → 将
batch_size降至2,将accumulate_grad_batches提高到2以保持有效batch size不变。
局限性
- TDT/RNNT解码器上的自适应器式SFT已损坏。 实证确认:早先的一个LinearAdapter-mixin配方在TDT和RNNT解码器上在任意LR下产生72个NaN张量。通过切换到NeMo的原版全模型SFT(
speech_to_text_finetune.py)解决——这正是本技能推荐的。请勿在TDT/RNNT基础模型上尝试自适应器SFT。 - 不要对
nemotron-speech-streaming-en-0.6b进行SFT。 仅流式的NVCF函数的SFT路径不可靠(UNK崩塌)。对于部署时的流式服务,Riva会切分非流式基础模型。 - 极小的manifest会快速过拟合。 低于约100行总数或每个优先类别约5行时,cycle-N+1的数字噪声很大。在信任小的KER下降之前先扩大数据。
- 默认仅英文。 基础模型表针对en-US。其他语言需要不同的基础模型和重新验证的SFT配方。
- 没有一键式驱动程序。 用户编写自己的训练驱动程序布局——输出路径、运行命名、排行榜重新渲染。方法学和配方可迁移;确切的cycle-1数字取决于用户的manifest。
下一步
- 将
.nemo部署为NIM:/riva-asr-custom(显式传递源架构)。 - 为cycle N+2扩大manifest:
/digital-health-clinical-asr-build。 - 重新评分该循环:
/digital-health-clinical-asr-eval(针对新端点或直接针对新.nemo)。 - 横向: 词提升/语言模型融合/非临床SFT配方:
/finetune-asr。
参考资料
references/stage4-finetune.md— 基础模型选择表、超参数理由、解码器 → NIM容器映射、比较cycle-N+1与cycle-N的决策树references/container-paths.md— host →/workspace/路径重写,用于主机间manifest可移植性(笔记本 ↔ Brev ↔ NeMo容器)