# Sub509 深度诊断 — 基于CCCL源码阅读的系统级分析 ## 一、Sub509 vs Sub168 关键数据对比 | 测试 | 对手Sub168 | 我们Sub509 | 差距分析 | |------|-----------|-----------|---------| | d01_basic_nostream | 8.49s, content[11] tok=139 | 95.85s, content[0] reasoning[1102] tok=1085 | 11x慢; 我们产了1085个token全是reasoning | | d02_stream_usage | 2.75s, chunks=53 | 1.84s, chunks=9 | 我们居然更快(但只产了9个chunks vs 53) | | d03_tool_call | 2.12s, tool=get_weather | **49.04s, tools=0 finish=stop** | **致命**: 模型不输出 XML | | d04_reasoning | 17.78s, content[181] reasoning[1011] | 128.74s, content[0] reasoning[1447] | 7x慢; 我们有reasoning但没有content | ## 二、三大根因(按严重程度排序) ### 根因1: GatedDeltaNet每层产NaN → 模型"智力"丧失 docker日志证据: ``` WARNING qwen3_5.py:445] NaN in prefill GatedDeltaNet layer 0 (frac=0.9998) WARNING qwen3_5.py:445] NaN in prefill GatedDeltaNet layer 1 (frac=0.9997) WARNING qwen3_5.py:445] NaN in prefill GatedDeltaNet layer 2 (frac=1.0000) WARNING qwen3_5.py:445] NaN in prefill GatedDeltaNet layer 4 (frac=1.0000) ``` **99.98%-100% NaN率**。`nan_to_num(result, nan=0.0)` 将这些NaN替换为零,等于整个DeltaNet层输出全是零。 这是一种"活着但脑死亡"的状态——前向传播不报错,但模型失去了DeltaNet层的能力。 **NaN来源追踪**: 1. `_torch_chunk_gated_delta_rule` 中 `g.cumsum(dim=-1)` → 累积值可能极大 2. `g.clamp(-20,20)` 后 `g.exp()` → 最大 ~5e8,但这些值进入矩阵乘法后仍可能溢出 3. `decay_mask = (g_diff).tril().exp()` → 即使单个exp不溢出,大矩阵乘法的累加也可能溢出 4. `_forward_sub_lower` 中的前向替代: `x[i] = rhs[i] + A[i,:i] @ x[:i]`,如果A中有大值,误差逐行放大 **对手为什么没有这个问题**: 对手可能用的是不同的模型架构(不含DeltaNet),或者在NVIDIA GPU上float32精度够高不会溢出。 ### 根因2: FusedMoE完全fallback → 性能灾难 ``` ERROR _custom_ops.py:58] module 'ixformer.functions' has no attribute 'vllm_moe_topk_softmax' WARNING qwen3_5.py:913] FusedMoE native kernel failed, falling back to pure PyTorch experts permanently. ``` BI-V100的ixformer没有MoE kernel,所有MoE层都用纯PyTorch: - 256个expert × top_k=8 → 最多256次F.linear调用(prefill) - 每次decode也需要top_k=8次expert forward - 对比native kernel的1次fused launch,这是数量级的差距 ### 根因3: computility-run.yaml vs 实际参数不一致 yaml写的: `--max-model-len 256000 --max-num-seqs 2 --gpu-memory-utilization 0.95` docker日志: `max_seq_len=100000, max_num_seqs=1, gpu_memory_utilization=0.9` **可能原因**: 部署时还在用旧的配置。需要确认yaml是否真的被用于部署。 ## 三、d03_tool_call为什么FAIL d03日志: `tools=0 finish=stop reasoning[0] (tool_choice=auto) (49.04s)` **reasoning[0]说明enable_thinking=False确实生效了**。但模型仍然不输出`` XML。 analysis: 1. enable_thinking=False → 模型不产生`...`块 ✓ 2. 但模型的输出内容不包含`...` 格式 3. tool parser `Qwen3CoderToolParser` 在输出中找不到 `` — 在可能溢出的地方用更高精度的中间类型 2. `cc_dispatch` — 不同硬件不同策略,不硬编码 3. `policy_selector` — 基于benchmark数据选择参数,不拍脑袋 我们的DeltaNet实现缺少CCCL级别的数值稳定性保证。