6.5 KiB
PRD: 天垓100 BI-V100 推理引擎竞赛
目标
首位通过全部功能测试+效果测试+性能基准的参赛者获得基础奖。
竞赛门槛
- 50+ 功能测试用例全部通过
- 效果偏差 ≤±4%
- 性能门槛 Token 吞吐加权值 ≥8000
- Output TPS 权重占 83%(decode kernel 优化投入产出比最高)
架构策略
CCCL系统设计移植 + base引擎serving层改造。
核心原则
- 不覆盖模型层代码 — Sub168证明base镜像CoreX原生代码能正确运行
- 只部署serving层 — patch_ops.sh控制部署范围
- 通过环境变量做硬件适配 — CCCL policy_selector模式
部署文件清单(patch_ops.sh)
- protocol.py — OpenAI API兼容层
- serving_chat.py — 请求处理核心
- qwen3coder_tool_parser.py — Qwen3 XML tool call解析
- reasoning/ — thinking/reasoning分离
- api_server.py — 入口点
- chat_utils.py — 消息预处理
- cli_args.py — 参数注册
- registry.py — 仅当base缺少Qwen3_5时
不部署的文件(base镜像原生)
qwen3_5.py, model_runner.py, _custom_ops.py, sampler.py, scheduler.py, sequence.py, xformers.py, paged_attn.py, prefix_prefill.py, logits_processor.py, mamba_cache.py, arg_utils.py
Sub168参数基准(已对齐)
- max_model_len=256000
- max_num_seqs=2
- gpu_memory_utilization=0.95
- max_num_batched_tokens=4096
- enable_chunked_prefill=True
- enforce_eager=True
- dtype=half
- tensor_parallel_size=4
CCCL → base 映射记录
| CCCL源码 | 映射到base位置 | 改动类型 |
|---|---|---|
| buddy_allocator.cu | computility-run.yaml env | PYTORCH_CUDA_ALLOC_CONF |
| device_reduce policy_selector | computility-run.yaml params | 启动参数对齐Sub168 |
| agent_reduce_by_key ConsumeTile | serving_chat.py | fast path/safe path分离 |
| tuning_find_bound_sorted_values | yaml --dtype half | 类型大小自适应 |
已修复的Sub508/509失败点
- ✅ n>1 OOM级联 → 允许n=2(匹配max_num_seqs=2)
- ✅ max_completion_tokens 400 → protocol.py接受
- ✅ tool_calls content=None → chat_utils.py容错
- ✅ d03 tool_call thinking耗尽 → 自动禁用thinking
- ✅ 内存碎片OOM → PYTORCH_CUDA_ALLOC_CONF
- ✅ 模型层代码破坏CoreX → patch_ops.sh只部署serving层
CCCL tuning_select_if.cuh → serving_chat.py 映射
设计思想翻译
CCCL三级分发:compute_capability → sm_tuning → benchmark参数 我们三级分发:请求类型 → 处理路径 → Sub168实测参数
参数对应关系
| CCCL概念 | 我们的对应 |
|---|---|
| compute_capability (SM80/90/100) | 请求类型 (tool_call/reasoning/basic) |
| input_size (1/2/4/8 bytes) | 请求复杂度 (simple/multimodal/multi-turn) |
| flagged/unflagged | has_tools/no_tools |
| keep_rejects/discard | enable_thinking/disable_thinking |
| threads_per_block | max_tokens cap |
| items_per_thread | default_max_tokens计算 |
| delay_constructor | token budget 分配策略 |
| benchmark注释 (4个加速比) | Sub168日志实测数据 |
Sub168 benchmark数据(=我们的tuning表)
| 请求类型 | 时间 | token数 | TPS |
|---|---|---|---|
| d01 basic | 8.49s | 139 | 16.4 |
| d03 tool_call | 2.12s | ~34 | ~16 |
| d04 reasoning | 17.78s | 1192 | 67 |
| d07 reasoning+content | 61.11s | 4451 | 72.8 |
| replay avg | - | - | 11.86 |
CCCL agent_rle.cuh → streaming SSE 映射
| CCCL agent_rle | serving_chat.py |
|---|---|
| streaming_context.num_uniques() | reasoning_token_counts[i] |
| streaming_context.base_offset() | previous_num_tokens[i] |
| BlockDiscontinuity (值变化检测) | reasoning_end_arr[i] (检测) |
| per-partition isolated state | per-choice state arrays |
| ScatterDirect (压缩输出) | delta_message分发 |
CCCL adjacent_difference → streaming delta 映射
| CCCL adjacent_diff | serving_chat.py |
|---|---|
| SubtractLeftCopy | delta_text = output.text (保留原始+输出差值) |
| previous element | previous_texts[i] |
| current = prev + delta | current_text = previous_text + delta_text |
| update prev = current | previous_texts[i] = current_text |
CCCL tuning_batched_topk.cuh → 采样策略映射
设计思想
6级worker_policy按tile size递减排列。运行时选最小够用的配置。 multi_worker_policy用于超大segment的协作处理。
映射
| CCCL batched_topk | 我们的对应 |
|---|---|
| worker_policy.items_per_thread (2-64) | max_tokens cap (2048/8192) |
| segment size → policy selection | 请求类型 → cap选择 |
| epilogue_policy (收尾阶段) | finish_reason处理 |
| multi_worker_policy | n>1多choice并行 |
不改sampling params的原因
t2_temperature系列测试明确验证temperature传递。 覆盖默认值会导致测试失败。当前策略正确。
CCCL block_reduce_warp_reductions → DeltaNet chunk_size
设计思想
Sequential path dominance → reduce per-iteration work. CCCL: thread count固定时,减少items_per_thread让每个thread做更少work。 我们: Python loop iterations固定(=chunk_size),减少chunk_size从32→16。
CCCL execution/exception.cuh → api_server.py _select_error_policy
设计思想
Device code: exception_ptr永远false,不假装能恢复,直接fail fast。 Host code: 用标准exception。 我们: _select_error_policy按exception类型分发——OOM→503, dead→503, validation→400。
CCCL segmented_sort.cu → 完整base引擎迁移
关键发现
通过segmented_sort.cu的AST链追溯到base引擎zip包,发现我们缺少10个关键文件。
base引擎完整部署清单 (patch_ops.sh)
| 文件 | 作用 | 缺失后果 |
|---|---|---|
| paged_attn.py | 绕过Triton hang | GPU永久挂起 |
| patch_model_runner.py | 修prefix_cache_hit bug | chunked prefill第2+chunk crash |
| mamba_cache.py | GatedDeltaNet状态管理 | 状态丢失→输出错误 |
| sequence.py | 修completion_tokens膨胀 | 10K prompt×3 chunks = 30K虚假token |
| scheduler.py | prefix cache metrics | 无cache统计 |
| patch_xformers_sdpa_seq.py | head_dim=256 bypass | attention crash |
| qwen3_5.py | 模型代码(条件部署) | ModuleNotFoundError |
| serving层6文件 | API兼容 | 功能测试全失败 |
| transformers==4.55.3 | Qwen3_5Config支持 | 配置加载失败 |
qwen3_5.py策略
base原版1369行 → 无nan_to_num、无clamp、无_hw_policy。 条件部署:如果Docker镜像已有>1000字节的qwen3_5.py就不覆盖。