Skip to content

Releases: RapidAI/RapidSpeech.cpp

新增ASR 模型 FunASR-nano

27 Apr 10:38

Choose a tag to compare

📦 模型支持

新增 FunASR-nano(ASR), 支持q3、q4、 q5、 q6、 q8

🚀 新特性

  • Flash Attention 支持:Qwen3 注意力层新增 ggml_flash_attn_ext 路径,通过 llm_cparams::flash_attn 参数控制开关(默认开启)。相比标准多头注意力实现,Flash Attention 在长序列上具有更好的内存局部性和计算效率。
  • 量化工具 rs-quantize:新增模型量化命令行工具,支持 Q4_0、Q4_K、Q5_0、Q5_K、Q8_0 等多种量化格式。funasr-nano-fp16 (1955 MB) → Q4_K (596 MB),压缩 3.3x。

⚡ 性能优化

  1. Decode KV 只追加新列:每步仅回读最后 1 列 KV(~0.1MB),替代全量回读(~50MB/步)
  2. Prefill 仅输出最后位置 logits:logits 传输从 242MB 降到 0.6MB
  3. Embedding lookup 内联到 decode 图:去掉每步独立 mini embed 图,省去 36 次 alloc/sched_reset 开销
  4. KV 持久化驻留 GPU:用 ggml_backend_alloc_ctx_tensors 在 GPU 端独立分配 KV buffer,省去每步 ~100MB CPU→GPU 全量上传

GPU 性能基准 (Apple M1 Pro, funasr-nano-fp16, 15s 音频)

阶段 优化前 优化后 提升
Decoder 4.36s 3.45s 21%
RTF 0.205 0.170 17%

🐛 Bug 修复

  • Metal 后端 memcpy 静默失败set_position_ids/set_input_data 改用 ggml_backend_tensor_set,修复 GPU tensor data 为 null 时的写入问题
  • KV output tensor buffer 未分配:Prefill 分支直接将 3D ggml_cont tensor 标记为 output,避免 scheduler 不分配独立 buffer 导致 abort
  • Causal mask shape:从 [n_tokens, n_kv] 改为 [n_kv, n_tokens],修复 decode 阶段 n_tokens=1 时 broadcast 失败
  • Flash Attention mask 类型ggml_flash_attn_ext 要求 F16 mask,自动将 F32 mask 转换为 F16
  • Flash Attention tensor 布局:permute q/k/v 从 [d_k, n_head, n_seq][d_k, n_seq, n_head],匹配 ggml_flash_attn_ext 接口要求
  • CI 构建修复:Windows DLL 搜索路径、rs_log/load_wav_file hidden visibility 链接错误、PowerShell 2>/dev/null 兼容性