docs: dlopen SO开发计划 — gap analysis from comp168 log + real tree

This commit is contained in:
Claude
2026-08-13 06:23:59 +00:00
parent 17fdf7e2d6
commit c720cbc3a3

155
DLOPEN_DEV_PLAN.md Normal file
View File

@@ -0,0 +1,155 @@
# dlopen SO开发计划 — 从日志到代码
> 基于 comp168 docker (2d5232c5) 日志分析 + 真机代码 tree (不带 --depth)
> 原则upstream已有的搬过来接口对上不允许fallback不允许全新开发
---
## 一、真机调用链现状qwen3_5.py imports
qwen3_5.py 声明了 **11个** corex SO模块的 import
| # | 模块名 | prebuilt .so | .cu源码 | build脚本 | qwen3_5.py调用点 | 状态 |
|---|--------|-------------|---------|-----------|-----------------|------|
| 1 | corex_gdn_causal_conv | ✅ | ✅ | ✅ | L1158: conv更新 | **就绪** |
| 2 | corex_gdn_gated_norm | ✅ | ✅ | ✅ | L848: 反向norm | **就绪** |
| 3 | corex_gdn_beta_decay | ✅ | ✅ | ✅ | L1215: 衰减计算 | **就绪** |
| 4 | corex_gdn_qk_map | ✅ | ✅ | ✅ | L1258: QK映射 | **就绪** |
| 5 | corex_gdn_packed_decode | ✅ | ✅ | ✅ | L1195: 打包解码 | **就绪** |
| 6 | corex_attn_head_rms_norm | ✅ | ✅ | ✅ | L1322: 头归一化 | **就绪** |
| 7 | corex_moe_exact_reduce | ✅ | ✅ | ✅ | L1707: MoE精确归约 | **就绪** |
| 8 | corex_moe_weight_gather | ✅ | ✅ | ✅ | L1681: 权重收集 | **就绪** |
| 9 | corex_moe_direct_routed | ✅ | ✅ | ✅ | L1659: 直接路由MoE | **就绪** |
| 10 | corex_moe_topk_softmax | ✅ | ✅ | ✅ | L1621: topk+softmax | **就绪** |
| 11 | corex_moe_index_combine | ❌ 无prebuilt | ✅ | ✅ | L1719: 索引合并 | **需在docker build编译** |
## 二、prebuilt有但qwen3_5.py没引用的SO
| 模块名 | prebuilt | .cu源码 | qwen3_5.py引用 | 说明 |
|--------|---------|---------|---------------|------|
| corex_block_major_kv_transfer | ✅ | ✅ | ❌ | block_major_kv_cache.py用 |
| corex_fused_paged_prefill | ✅ | ✅ (split4版) | ❌ | paged_attn.py用 |
| corex_paged_kv_gather | ✅ | ✅ | ❌ | paged_attn.py用 |
## 三、有.cu但无prebuilt的模块
| 模块名 | .cu源码 | 说明 | 行动 |
|--------|---------|------|------|
| corex_gdn_chunk_recurrent | ✅ (10807字节) | GDN prefill chunked recurrent | **需precompile可能是NaN修复的关键** |
| corex_fused_paged_prefill_split4 | ✅ (20172字节) | 分4路prefill attention | prebuilt有 corex_fused_paged_prefill (名字不同) |
| corex_moe_index_combine | ✅ (5554字节) | patch_ops.sh已有编译步骤 | **Docker内编译** |
| corex_query_tiled_paged_prefill | ✅ (20409字节) | Q-tiled prefill | 当前paged_attn.py的Python版替代 |
## 四、comp168日志揭示的关键差距
comp168竞争对手sub168的Docker工作正常
- GDN用 corex_gdn.so 的fused kernel**无NaN**
- MoE用自己的 topk_softmax 实现 + WMMA group_gemm**不依赖 ixf_F.vllm_moe_topk_softmax**
- 权重17.35 GB我们16.23 GB
- model_runner.py: 用base镜像原版(1074行)不是我们的1119行版
我们的Docker(sub655)的问题:
- GDN99.98% NaN → nan_to_num → 输出垃圾
- MoEfallback到PyTorch loop → 约50x慢
- 服务器最终崩溃 → Connection refused → 881个replay请求全失败
## 五、现在的代码量够不够?
```
qwen3_6_scripts/
├── 15个 corex_*.cu 文件 (总计 ~115K 字节 CUDA源码)
├── 14个 build_corex_*.sh (编译脚本)
├── 13个 prebuilt/*.so (已编译二进制)
├── qwen3_5.py (1700+行,模型实现)
├── patch_ops.sh (部署脚本)
├── paged_attn.py (paged attention)
├── serving_chat.py + protocol.py + api_server.py (serving层)
├── vendor_overrides/ (vllm核心override6文件)
└── ...
ex_engine/
├── csrc/ (C++ bridge代码24个文件)
├── python/ (Python bridge代码7个文件)
├── xllm_kernels/ (xllm上游kernel8个文件)
└── xllm_layers/ + xllm_models/ (xllm上游层/模型实现)
upstream_ref/
├── ds_vllm/ (最新vllm参考实现)
├── xllm/ (xllm完整参考)
├── fla/ (flash-linear-attention参考)
└── vllm_gdn/ (vllm GDN参考实现)
```
**回答你的问题:代码数量是够的。** 15个.cu、13个prebuilt .so、qwen3_5.py已经完整引用了所有11个import。问题不是代码数量
1. **corex_moe_index_combine.so 没有prebuilt** — 需要在docker build时在线编译
2. **corex_gdn_chunk_recurrent.so 没有prebuilt** — 10K字节的GDN prefill kernel可能是解决NaN的关键
3. **patch_ops.sh 只编译了 moe_index_combine** — 其余12个走prebuilt安装
## 六、下一步行动(代码开发,不是推理)
### 立即要做的3件事
**1. 把 corex_gdn_chunk_recurrent 加入 prebuilt 或 patch_ops.sh 编译链**
这个.cu存在10807字节build脚本也存在但既没有prebuilt .so也没在patch_ops.sh里编译。真机上需要
```bash
# 在你的BI-V100真机上
cd /home/dylan/project_6/qwen3_6_scripts
bash build_corex_gdn_chunk_recurrent.sh /usr/local/corex/lib/python3/dist-packages/vllm
# 如果成功,把.so拷到 prebuilt/corex-3.2.3-ivcore10/
```
**2. qwen3_5.py GDN prefill路径需要对接 chunk_recurrent kernel**
当前qwen3_5.py的GDN prefill fallback是纯PyTorch `_torch_chunk_gated_delta_rule`产生NaN。corex_gdn_chunk_recurrent.cu 是 fp32 accumulation 的 kernel — 应该能解决NaN。需要在qwen3_5.py里加上对应的 import + dispatch。
**3. 把 corex_fused_paged_prefill_split4.cu precompile**
这个20K字节的kernel对应prefill attention加速prebuilt目录有 `corex_fused_paged_prefill.so`(可能是同一个的改名),需要确认对应关系。
### 在真机上验证步骤:
```bash
# 单卡验证:
cd /home/dylan/project_6
python3 -c "
import torch
# 测试prebuilt SO能否加载
import importlib.util
spec = importlib.util.spec_from_file_location('corex_gdn_causal_conv',
'qwen3_6_scripts/prebuilt/corex-3.2.3-ivcore10/corex_gdn_causal_conv.so')
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
print('corex_gdn_causal_conv loaded:', dir(mod))
"
```
## 七、commit 9ff2450能得分的版本
这个commit不在当前仓库里。你说它是 `clean: remove build artifacts from docker context`date Aug 12 07:58。这意味着它是在current HEAD (17fdf7e2) 之后的commit可能在另一个branch或还没push。
**需要你执行:**
```bash
git log --all --oneline | grep 9ff2450
# 或者
git push origin main # 如果在真机上有unpushed commits
```
## 八、ex_engine upstream搬运清单
ex_engine里有大量代码但 **没有接入 patch_ops.sh 部署链**。以下是已有但未使用的:
| 文件 | 功能 | upstream来源 | 接入状态 |
|------|------|-------------|---------|
| ex_engine/python/corex_gdn.py | GDN完整dispatch | 自己写的 | ❌ 未部署 |
| ex_engine/python/corex_moe.py | MoE完整dispatch | 自己写的 | ❌ 未部署 |
| ex_engine/python/ix_bridge.py | C++→Python bridge | 自己写的 | ❌ 未部署 |
| ex_engine/csrc/ix_full_bridge.cpp | ixformer C++桥 | 基于symbol probe | ❌ 未部署 |
| ex_engine/xllm_kernels/cuda/moe/*.cu | MoE CUDA kernels | xllm upstream | ❌ 未部署 |
| ex_engine/xllm_layers/npu_torch/*.cpp | 层实现 | xllm upstream | ❌ 未部署 |
**这些不需要重写,但接口要对上后再搬。** 特别是 ix_full_bridge.cpp 里明确说了 "MoE functions are NOT in base image",所以 MoE 必须走 prebuilt .so + Python fallback 路线,而不是试图 dlopen 不存在的 ixformer MoE symbols。
现在的策略13个prebuilt .so + 1个在线编译已经是正确的路线。