# 完整模型精简与推理加速 精简模型位于 `runs/bilingual_s5_full/final_compact/`,由 `runs/bilingual_s5_full/final/` 导出,保留文本、图像、视频、音频理解和语音输出。原始目录保留。 ## 模型体积 | 项目 | 原模型 | 精简模型 | |---|---:|---:| | 独立参数量 | 2,031,972,995 | 2,031,710,851 | | safetensors 权重字节数 | 5,677,248,858 | 4,115,251,826 | | 权重文件大小(十进制 GB) | 5.677 | 4.115 | 权重文件减少 27.5%,实际参数减少 262,144(约 0.013%)。参数统计覆盖完整多模态模型,共享参数只计算一次。 删除的是 codec 两个从未参与解码的 `input_proj`。Thinker 按配置的 BF16 推理精度保存;音频投影器和特殊 token 参数保持 FP32。精简目录支持常规 `save_pretrained` / `from_pretrained`。 Talker 的 132,588 行文本 embedding 全部可达且无完全重复行;32 张声码 embedding/输出头也无可进一步共享的完整表或重复行。原有 15 张共享声码 embedding 保持共享。 ## 推理结构 - 音频分块长度在 CPU 上一次计算,SDPA 各层复用,避免反复从 GPU 取回长度。 - 不做音频池化或堆叠时,直接返回编码输出。 - Thinker 的线性注意力 decoder 层在 CUDA 上对单 token 解码使用 CUDA Graph,覆盖归一化、递归状态更新、MLP 和残差计算。运算、权重和动态 KV cache 保持原样。 - 每个请求保有独立缓存;训练、有梯度的 forward、CPU 和多 token prefill 执行常规模型路径。改变设备、精度或训练模式会释放已有 graph。 - `generate()` 使用公开的 `model.generation_config`,并在调用期间选择 Flash/memory-efficient/math SDPA 后端。 ## 验证结果 完整 MMAU test-mini 1,000 条输入中,原模型与精简模型生成 token 和文本全部一致,均自然到 EOS;答案字母准确率均为 **64.9%(649/1000)**。sound、speech、music 分别为 240/333、210/333、199/334。清单为 `data/spoken_execution_eval/mmau_test_mini_1000.jsonl`,提示词保持该清单原样。 音频问答时延在 sound/speech/music 各 4 条代表样本上各测 3 次,两模型交替执行,所有 token 一致。MMAU 每条输出 2 token(答案字母和 EOS)。 | 中位数指标 | 原模型 | 精简模型 | |---|---:|---:| | 整答时延 | 173.03 ms | 97.35 ms | | TTFT | 129.12 ms | 86.43 ms | | 解码吞吐量 | 30.71 token/s | 65.03 token/s | | 端到端吞吐量 | 11.56 token/s | 20.54 token/s | 同一样本成对加速比中位数 **1.82×**。TTFT/解码吞吐量来自独立 streaming 测量,普通整答时延未插入逐 token 同步。 6 个中英文文本任务、每任务 2 次普通测量和 1 次独立 streaming 测量,生成 token 全部一致;回答长度为 10、35、58、110、256、256 token。整答成对加速比中位数 **2.44×**,整答时延中位数 **2.490 s → 0.944 s**,解码吞吐量中位数 **32.41 → 77.00 token/s**。两条 256-token 输出达到设定上限,两模型停止位置相同。 加载后 1,574 个保留 state-dict tensor 逐元素一致;真实音频投影特征以及中英文语音的声码、波形逐元素一致。CPU/CUDA 测试覆盖 FP32/BF16、缓存独立性、保留 hidden states、图复用、训练梯度、保存加载及图像/视频路径,共 **126 项通过**。 结果文件位于 `runs/hf_inference_optimization/`: - `mmau_equivalence.json`:1,000 条 MMAU 输出及准确率对比。 - `mmau_verified_shard_0.json` 至 `mmau_verified_shard_3.json`:完整逐条记录。 - `mmau_latency.json`:12 条样本、3 次重复的最终音频问答计时。 - `text_decode_pair.json`:长回答计时、TTFT、吞吐量和 token 对比。 - `weight_and_speech_equivalence.json`:权重、音频特征和语音输出等价验证。 - `redundancy.json`:embedding 可达性及逐行去重统计。 实测使用 NVIDIA H20、PyTorch 2.11.0+cu130、Transformers 5.12.1、fla-core 0.5.0、causal-conv1d 1.6.0;CPU 功能及独立 CUDA Graph 测试另外覆盖 PyTorch 2.6.0+cu124。 ## 使用 上传的 `run_mmau.py` 只需把 `--model` 指向 `runs/bilingual_s5_full/final_compact`。默认自动使用优化路径,保留两次预热。 重新导出: ```bash python -m hf.compact_edgeinstant \ --source runs/bilingual_s5_full/final \ --output runs/bilingual_s5_full/final_compact_new \ --device cuda:0 ``` 配对测量: ```bash OMP_NUM_THREADS=2 MKL_NUM_THREADS=2 python scripts/benchmark_hf_inference.py \ --source runs/bilingual_s5_full/final \ --candidate runs/bilingual_s5_full/final_compact \ --manifest runs/hf_inference_optimization/mmau_pair_manifest.jsonl \ --repeats 3 --device cuda:0 \ --output runs/hf_inference_optimization/mmau_latency.json ``` 测量包含前处理、设备传输、贪心生成至 EOS/token 上限、文本解码和 CUDA 同步。音频文件读取及重采样在计时外完成。TTFT 在独立的 streaming 测量中从前处理开始,至第一个新 token 返回。解码吞吐量为 `(生成 token 数 − 1) / (最后 token 时间 − 首 token 时间)`,端到端吞吐量为 `生成 token 数 / 整答时延`;均包含 EOS。普通整答计时不插入 streamer。 ## 限制 等价基准是原 checkpoint 按上传脚本的 `dtype="auto"` 加载后的模型;精简权重不保留原文件额外的 FP32 小数精度,原始目录可继续用于 FP32 实验。首次 CUDA Graph 建立和新 batch shape 需要预热。最终测量时机器有其他 GPU 工作负载,因此绝对时延受资源争用影响;同一样本的两模型在同一 GPU 上交替执行。绝对速度还取决于硬件、CUDA/PyTorch 和 kernel 依赖,实际运行环境及其他 GPU 进程均记录在测量 JSON 中。MMAU 短答案通常只有答案字母和 EOS,长回答吞吐量应参考独立的文本测试。