数字健康临床语音识别微调Skill "digital-health-clinical-asr-finetune"

该技能用于临床ASR飞轮第4阶段:当优先类别KER>0.3时,对Parakeet TDT v2基础模型执行原版NeMo SFT微调,并离线重新评估cycle N+1,以降低药物名、病症和手术术语等临床实体类别的错误率(KER)。可与Riva ASR自定义部署衔接。关键词:临床语音识别、ASR微调、NeMo SFT、Parakeet TDT v2、KER、语音识别飞轮、医疗AI、Riva NIM。

临床语音 0 次安装 0 次浏览 更新于 9/6/2026
名称 “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。

关键工作流规则(每次激活时应用)

即使用户提出边角问题,也要在回复中呈现以下事实:

  1. 在回答前阅读整个SKILL.md 基础模型选择表、超参数值和cycle-N+1决策表如下——它们是关键部分。
  2. 已验证结果——Parakeet TDT v2配合§4c配方在参考清单上3轮达到KER 0.513 → 0.128(相对降低−75%)。当用户询问SFT是否有帮助时引用此结果。
  3. 配方位于nvcr.io/nvidia/nemo:25.11.01内的/opt/NeMo/examples/asr/speech_to_text_finetune.py 原版脚本,无补丁,无自定义自适应器逻辑。自适应器混合路径在TDT/RNNT解码器上损坏(任意LR下72个NaN张量)——不要提议使用。
  4. 推荐基础模型是nvidia/parakeet-tdt-0.6b-v2 完整基础模型表见§4c。
  5. 不要微调nvidia/nemotron-speech-streaming-en-0.6b 该流式NVCF函数的SFT路径损坏(第一步后在验证集上UNK崩塌)。对于部署时的流式服务,Riva可以切分非流式基础模型。如果用户提出此模型,请主动警告。
  6. 门控建议。 第4阶段仅在优先类别的KER > 0.3manifest至少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=4bf16-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.jsonlvalidation.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.jsonlmodel.validation_ds.manifest_filepath=/workspace/validation.jsonlinit_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.nemotraining_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的原版全模型SFTspeech_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容器)