Skip to content

[ROCm] Prefill performance optimization for embedding models#1102

Open
liaocz wants to merge 1 commit into
mainfrom
feat/opt_emb
Open

[ROCm] Prefill performance optimization for embedding models#1102
liaocz wants to merge 1 commit into
mainfrom
feat/opt_emb

Conversation

@liaocz

@liaocz liaocz commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

Skip fused QKV transpose, KV cache write, and Q buffer allocation for embedding models on ROCm.

Embedding models (task_type != LANGUAGE_MODEL) do not use KV cache. This change adds an
embedding_fast_path in FusedRopeKVCachePrefillOp and AiterPrefillImplAsm to avoid:

  1. Q output buffer allocation and zero-fill
  2. K/V output buffer allocation
  3. invokeAddFusedQKVBiasTransposePrefill with unnecessary parameters
  4. KV cache read/write in Qwen3Model forward

Instead, return the in-place RoPE'd packed QKV buffer directly and split it in Python attention layer for flash_attn_varlen_func.

No impact on normal LLM path (kv_cache present).

@liaocz liaocz requested a review from LLLLKKKK as a code owner June 15, 2026 09:08
@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/2 · P2/0 · P3/0

Blocking Issues

P1

  • Qwen3 在选层前误判 embedding 并跳过 RoPE @ rtp_llm/models_py/model_desc/qwen3.py:130
    • 建议:把 no-cache 判定放到每层 select_block_map_for_layer 之后,并且不要在模型层修改 need_rope_kv_cache;让 no-cache wrapper 继续执行 RoPE。
  • NonASM 未适配 packed QKV 返回契约 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1494
    • 建议:将 packed-QKV no-cache 解包和 flash_attn 调用抽成 ASM/NonASM 共用 helper,或仅对已适配实现启用 fast path,并补 no-cache RoPE 回归测试。

Checklist Violations (17 fail / 93 total)

General Principles Checklist

  • [6.1] Software Engineering — DIP:高层策略不依赖非必要具体细节 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    Qwen3Model 直接修改 fmha_impl.need_rope_kv_cache 控制 ROCm attention 内部路径,导致模型层泄漏实现细节并跳过 RoPE。
  • [6.1] Software Engineering — DRY:重复非平凡逻辑被抽取或显式复用 → issue NonASM 未适配 packed QKV 返回契约
    ASM 新增 packed-QKV 解包逻辑,但 NonASM 没有同等处理,两个 no-cache wrapper 行为分叉并导致崩溃风险。
  • [6.1] Architecture — 分层边界:新概念在正确层级,不泄漏内部 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    Qwen3 模型描述层通过 need_rope_kv_cache 改 ROCm wrapper 内部状态,绕过了原本负责 RoPE 的实现层。
  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    Qwen3 在按层选择 block map 前固定 is_embedding,并修改共享 fmha_impl 状态,后续层状态不变量被破坏。
  • [6.1] Architecture — 错误语义:fail-fast/retry/fallback/silent 行为显式 → issue NonASM 未适配 packed QKV 返回契约
    NonASM 接到 packed_qkv+空 K/V 后没有显式分支或报错,会在下游把空 K/V 当 tensor 使用而隐式崩溃。
  • [6.1] Architecture — 兼容性:公开 API/持久数据/配置/环境迁移安全 → issue NonASM 未适配 packed QKV 返回契约
    FusedRopeKVCachePrefillOp 返回内容变化后,NonASM 旧消费者仍按 Q/K/V tensor 处理,缺少兼容分支。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → checklist-only
    diff 未新增覆盖 Qwen3 no-cache 判定、C++ packed-QKV 返回契约、ASM/NonASM no-cache RoPE 的测试;该缺口服务于已列两个阻塞问题,不单独升级为 issue。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue NonASM 未适配 packed QKV 返回契约
    没有覆盖 kv_cache=None、need_rope_kv_cache=True 的关键边界,NonASM 在该组合下会收到 packed_qkv+空 K/V。
  • [6.1] Tests — 分布式/跨平台变更有对应覆盖 → issue NonASM 未适配 packed QKV 返回契约
    这是 ROCm attention 路径变更,ASM/NonASM 两个 ROCm 分支没有随 diff 增加对应覆盖。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    Qwen3 在 select_block_map_for_layer 前检查 block id,并在 embedding 分支把 need_rope_kv_cache 置 False,导致后续 attention 直接消费未 RoPE 的 qkv。
  • [B] 正确性与逻辑 — 边界 case(空输入、单元素、最大值) → issue NonASM 未适配 packed QKV 返回契约
    无 KV cache 的边界返回 (packed_qkv, None, None),NonASM 未处理空 K/V。
  • [B] 正确性与逻辑 — 状态标志有完整 set/reset 生命周期 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    need_rope_kv_cache 在 Qwen3 forward 中被置 False 后没有恢复;若同一 fmha_impl 复用,后续层或调用会继承错误状态。
  • [B] 正确性与逻辑 — 非连续 tensor 不直接调用 .view() → checklist-only
    ASM 分支对 torch.split 后的 packed QKV slice 直接 .view() 并传给 aiter;该 singleton 风险需要确认 aiter stride 契约,未升级为 issue。
  • [B] 正确性与逻辑 — 接口返回类型变更有兼容处理 → issue NonASM 未适配 packed QKV 返回契约
    C++ op 的 no-cache 返回内容从 Q/K/V tensor 变成 packed QKV+空 K/V,但 NonASM 消费者未兼容。
  • [B] 正确性与逻辑 — Bypass/shortcut 路径包含新增变换步骤 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    Qwen3 embedding/no-cache shortcut 关闭 need_rope_kv_cache,绕过了原本必须执行的 RoPE 变换。
  • [I] 代码质量 — 同一功能用统一工具函数 → issue NonASM 未适配 packed QKV 返回契约
    packed_qkv no-cache 处理只写在 ASM 分支,NonASM 没复用同一 helper,导致新 C++ 返回形态下行为不一致。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 hasattr 做控制流分支 → issue Qwen3 在选层前误判 embedding 并跳过 RoPE
    qwen3.py 使用 hasattr(kv_block_id, 'numel') 和 hasattr(fmha_impl, 'need_rope_kv_cache') 控制分支,并基于动态属性改写 FMHA 行为,导致 no-cache 判定和 RoPE 状态错误。

Strengths

  • ROCm no-cache fast path 的优化目标清晰,集中在减少 embedding 路径的 Q/K/V 临时分配。
  • ASM 分支已尝试直接消费 packed QKV,方向上能避免旧路径的 padded K/V 往返。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/2 · P2/0 · P3/0

Blocking Issues

P1

  • no-KV fast path 未处理 prefix 长度 @ rtp_llm/models_py/bindings/rocm/FusedRopeKVCacheOp.cc:181
    • 建议:仅在 max_prefix_length == 0 时启用该 fast path;带 prefix 时保留旧的 padded K/V 输出路径,并补 no-cache+prefix 回归测试。
  • fast path 向 aiter 传入非连续 Q/K/V view @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1400
    • 建议:复用 split_raw_qkv,或在 fast path 中对 q/k/v 做 .contiguous() 并按 token_q_num/token_kv_num 切片后再调用 aiter。

Checklist Violations (4 fail / 82 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue no-KV fast path 未处理 prefix 长度
    FusedRopeKVCacheOp.cc:181 的 fast path 没有把 max_prefix_length/prefix_lengths 纳入启用条件,破坏了 cu_seqlens_k 与实际 K/V buffer 长度一致的不变量。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue no-KV fast path 未处理 prefix 长度
    新增 fast path 未覆盖 prefix_lengths>0 的边界;该边界下 cu_seqlens_k 与 packed K/V 实际长度不一致。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue no-KV fast path 未处理 prefix 长度
    no-KV fast path 未限制 max_prefix_length==0,但下游使用包含 prefix 的 cu_seqlens_k
  • [B] 正确性与逻辑 — 非连续 tensor 不直接调用 .view() → issue fast path 向 aiter 传入非连续 Q/K/V view
    aiter.py:1400 的 packed_qkv 经 torch.split 得到的 q/k/v 是非连续 view,新代码直接 .view 并传给 aiter。

Strengths

  • 改动将 no-KV RoPE 路径的多余 Q/K/V 输出分配收敛到 packed QKV fast path,优化方向明确。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/1 · P3/1

lgtm ready to ci

Non-blocking Suggestions

P2

  • packed QKV fast path 绕过 varlen 的设备和长度保护 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1406
    • 建议:复用 _forward_varlen 的 split/device 对齐逻辑,或在 fast path 中显式按 token_q_num/token_kv_num 切片、迁移 cu_seqlens,并按实际 token_q_num reshape 输出。

P3

  • 新增 helper 含 trailing whitespace @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1381
    • 建议:删除新增空行的行尾空格,或运行项目格式化/pre-commit 检查。

Checklist Violations (8 fail / 88 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    _fast path 未保持原 forward_varlen 的 token_q_num/token_kv_num 切片和 cu_seqlens 与 query.device 一致性不变量。
  • [6.1] Quality — 逻辑变更未混入无关格式化 → issue 新增 helper 含 trailing whitespace
    新增 helper 的空行存在 trailing whitespace,属于可由格式检查发现的无关格式问题。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    _新增 fast path 未复用 forward_varlen 的 token_q_num/token_kv_num 与 device 边界处理,padding/跨设备边界仍有缺口。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — Bypass/shortcut 路径包含新增变换步骤 → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    _新增 shortcut 绕过 forward_varlen 中已有的 token 切片和 cu_seqlens device 对齐步骤。
  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    fast path 调用 flash_attn_varlen_func 前遗漏 cu_seqlens device 对齐,并用 packed_qkv.shape[0] 代替实际 token_q_num。
  • [B] 正确性与逻辑 — 边界 case(空输入、单元素、最大值) → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    padding 或 token_q_num/token_kv_num 小于 packed_qkv.shape[0] 时,fast path 不切片,边界行为与原 varlen 路径不一致。
  • [D] 性能 — Model input 修改处理 CUDA Graph padding 填充 → issue packed QKV fast path 绕过 varlen 的设备和长度保护
    _fast path 用 packed_qkv.shape[0] 作为输出长度,未沿用 forward_varlen 的 token_q_num/token_kv_num 切片;graph padding 下可能把 padding token 带入输出。

Python Static-First Checklist

  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    新增私有 helper 的 fmha_input/fmha_impl/fmha_params 使用 Any 但未说明原因;对象来自动态 pybind/FMHA 边界,作为类型规范提醒,不单独提 issue。

Strengths

  • 无 KV-cache fast path 明确限制在无 prefix、非 FP8 paged 输出场景,避免影响 prefix/paged cache 主路径。
  • ASM 与 NonASM wrapper 复用同一个 packed QKV helper,减少两条实现分叉。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/1 · P2/0 · P3/1

Blocking Issues

P1

  • 快路径未对齐 cu_seqlens 设备 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1406
    • 建议:在 fast path 中复用旧路径的 device 对齐逻辑,将 cu_seqlens_q/k 迁到 q.device 后再调用 aiter。

Non-blocking Suggestions

P3

  • 新增 fast path 中存在尾随空白 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1381
    • 建议:删除这些新增空白行中的尾随空格。

Checklist Violations (7 fail / 93 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue 快路径未对齐 cu_seqlens 设备
    快路径绕过旧 _forward_varlen 的 cu_seqlens device 对齐,query 在非默认 GPU 时设备不变量不成立。
  • [6.1] Quality — 逻辑变更未混入无关格式化 → issue 新增 fast path 中存在尾随空白
    git diff --check 报告 aiter.py 第 1381、1384、1392、1396 行新增内容含 trailing whitespace。
  • [6.1] Tests — 分布式/跨平台变更有对应覆盖 → issue 快路径未对齐 cu_seqlens 设备
    ROCm 多 GPU/非默认设备场景缺少对应保护,cu_seqlens 设备对齐风险已升级。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → checklist-only
    少数 draft 指出 fast path 使用 M=packed_qkv.shape[0],未显式校验 token_q_num/token_kv_num;证据不足以升级为 issue,但建议补充 padding/有效 token 边界测试。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue 快路径未对齐 cu_seqlens 设备
    新增 shortcut 未复用旧路径的 cu_seqlens device 对齐,属于条件路径遗漏。
  • [D] 性能 — Model input 修改处理 CUDA Graph padding 填充 → checklist-only
    少数 draft 指出 fast path 未显式按 token_q_num/token_kv_num 裁剪 packed QKV;作为 CUDA Graph/padding 兼容风险记录,不单独升级。

Python Static-First Checklist

  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    新增 _try_embedding_fast_path 参数使用 Any,未说明原因;对象来自 legacy/pybind wrapper,低风险类型债,不作为独立 issue。

Strengths

  • C++ fast path 限定在无 KV cache、无 prefix、非 paged FP8 场景,降低了对现有 cache/prefix 路径的影响。
  • Python wrapper 保留原有 fmha_impl.forward fallback,未识别 packed QKV 模式时仍走原实现。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/0 · P3/0

lgtm ready to ci

Checklist Violations (1 fail / 56 total)

General Principles Checklist

  • [6.1] Architecture — 兼容性:公开 API/持久数据/配置/环境迁移安全 → checklist-only
    单个 draft 指出 rtp_llm/models_py/bindings/rocm/FusedRopeKVCacheOp.cc:351 的 no-cache 返回语义变化;其余 draft 认为该协议只在 ROCm wrapper 内消费,未形成可定位缺陷,因此保留为兼容性风险提示。

Strengths

  • no-cache embedding prefill 路径保留 RoPE 处理,并通过同一个 helper 复用 ASM/NonASM 的 packed QKV 处理。
  • fast path 限定在 ROCm no-kv、非 FP8 paged、无 prefix 条件下,paged cache 与 prefix 分支仍走原路径。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/1 · P2/1 · P3/1

Blocking Issues

P1

  • RoPE 缓存按进程复用会污染不同配置的 prefill @ rtp_llm/models_py/bindings/rocm/FusedRopeKVCacheOp.cc:326
    • 建议:将 RoPE cache key 扩展为完整 RopeConfig、max_position 和 interleave;不匹配时传 nullptr 回退 kernel 内计算。

Non-blocking Suggestions

P2

  • packed QKV fast path 忽略有效 token 数 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1397
    • 建议:复用 split_raw_qkv,按 token_q_num/token_kv_num 裁剪 Q/K/V,并按 token_q_num reshape 输出。

P3

  • 新增 helper 含 trailing whitespace @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1381
    • 建议:删除新增空行末尾空格,并确认 git diff --check 通过。

Checklist Violations (8 fail / 93 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue RoPE 缓存按进程复用会污染不同配置的 prefill
    prefill 依赖进程级 RoPE cache,但 getRopeCacheOnce 初始化后不会随不同 RopeConfig/max_seq_len 更新。
  • [6.1] Quality — 逻辑变更未混入无关格式化 → issue 新增 helper 含 trailing whitespace
    git diff --check 报告 aiter.py 新增行 1381/1384/1392/1396 存在 trailing whitespace。
  • [6.1] Software Engineering — DRY:重复非平凡逻辑被抽取或显式复用 → issue packed QKV fast path 忽略有效 token 数
    _新增 try_embedding_fast_path 重写 QKV split,未复用 split_raw_qkv 的 token_q_num/token_kv_num 裁剪契约。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue packed QKV fast path 忽略有效 token 数
    新增 packed fast path 未保留有效 token 裁剪,说明 padded token/固定容量输入边界未被覆盖。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue packed QKV fast path 忽略有效 token 数
    fast path 用 packed_qkv.shape[0] 作为有效 token 数,未校验其与 cu_seqlens/token_q_num 一致。
  • [F] 跨平台 — ROCm 路径错误处理非静默 → issue RoPE 缓存按进程复用会污染不同配置的 prefill
    RoPE cache 配置不匹配时当前不会 fail-fast,也不会回退,ROCm prefill 可能静默使用旧 cache。
  • [I] 代码质量 — 同一功能用统一工具函数 → issue packed QKV fast path 忽略有效 token 数
    同一文件已有 split_raw_qkv 统一处理 packed QKV 和有效 token 裁剪,新 fast path 未复用。

Python Static-First Checklist

  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    新增 helper 参数使用 Any 接收 pybind/Fmha 动态对象但未解释原因;这是局部类型债,当前不构成独立运行时缺陷。

Strengths

  • 无 KV cache 的 embedding/RoPE 路径复用 packed QKV,减少 K/V 临时分配,优化目标明确。
  • ASM 与 NonASM wrapper 复用 _try_embedding_fast_path,C++ 返回形态和 Python 接入保持一致。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/1 · P2/0 · P3/0

Blocking Issues

P1

  • Embedding fast path 跳过 RoPE/FP8 处理 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1460
    • 建议:将 fast path 限制在 need_rope_kv_cache=False 且非 FP8 的场景;需要 RoPE 时先执行 rope_kvcache_impl.forward,FP8 继续走 fmha_impl.forward 的专用分支。

Checklist Violations (6 fail / 88 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue Embedding fast path 跳过 RoPE/FP8 处理
    kv_cache=None 且 need_rope_kv_cache=True 时,新增 early return 破坏原先必须先应用 RoPE 再进入 FMHA 的执行不变量。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue Embedding fast path 跳过 RoPE/FP8 处理
    新增 fast path 未显式覆盖 need_rope_kv_cache=True 与 FP8 no-cache 组合;已有 RoPE 回归会暴露执行顺序错误,但缺少该快路径的边界覆盖。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue Embedding fast path 跳过 RoPE/FP8 处理
    fast path 在检查 need_rope_kv_cache 前直接返回,导致需要 RoPE 或 FP8 专用处理的 no-cache 路径进入错误实现。
  • [B] 正确性与逻辑 — Bypass/shortcut 路径包含新增变换步骤 → issue Embedding fast path 跳过 RoPE/FP8 处理
    新增 shortcut 没有包含 RoPE 变换,也绕过 AiterPrefillAttnOp.forward 的 FP8 专用分支。
  • [I] 代码质量 — 同一功能用统一工具函数 → issue Embedding fast path 跳过 RoPE/FP8 处理
    新增 helper 直接重写拆分/flash 调用,绕过 AiterPrefillAttnOp.forward 中既有 RoPE/FP8 分发;主要风险由正确性 issue 覆盖。

Python Static-First Checklist

  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    _try_embedding_fast_path 的 fmha_input/fmha_impl/fmha_params 使用 Any;虽处于 pybind/aiter 未类型化边界,代码未明确说明类型退化原因,低风险不单独提 issue。

Strengths

  • 改动范围集中在 ROCm Aiter prefill no-cache 路径,新增 helper 复用于 Asm/NonAsm,未引入公开 API 或配置变更。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/2 · P2/0 · P3/0

Blocking Issues

P1

  • FP8 no-cache 路径被 fast path 错误接管 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1468
    • 建议:显式保存并检查 FP8 状态,或按 packed_qkv.dtype/fmha_impl.alloc_scale 跳过 fast path,让 FP8 继续走 fmha_impl.forward 专用分支。
  • fast path 未按 token_q_num/token_kv_num 裁剪变长输入 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1402
    • 建议:复用 split_raw_qkv/_forward_varlen 的 token_q_num/token_kv_num 裁剪语义,返回 token_q_num 行,并补充不等长回归测试。

Checklist Violations (8 fail / 56 total)

General Principles Checklist

  • [6.1] Software Engineering — DRY:重复非平凡逻辑被抽取或显式复用 → issue fast path 未按 token_q_num/token_kv_num 裁剪变长输入
    _aiter.py:1402 新增 helper 重新实现 packed QKV split,未复用 split_raw_qkv/forward_varlen,遗漏 token_q_num/token_kv_num 裁剪语义。
  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue FP8 no-cache 路径被 fast path 错误接管
    FP8 专用状态原本由 fmha_impl.forward 分支处理;aiter.py:1468 的 getattr guard 默认放行,使 FP8 no-cache 输入走错 kernel。
  • [6.1] Architecture — 兼容性:公开 API/持久数据/配置/环境迁移安全 → issue FP8 no-cache 路径被 fast path 错误接管
    新增 fast path 改变 FP8 no-cache 既有分支选择,FP8 packed QKV 不再保证走专用 fp8 attention API。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue FP8 no-cache 路径被 fast path 错误接管
    diff 只改 aiter.py,未新增覆盖 FP8 non-paged、token_q_num/token_kv_num 不一致或 padding rows 的 embedding fast path 用例。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue fast path 未按 token_q_num/token_kv_num 裁剪变长输入
    新增 fast path 未覆盖 token_q_num/token_kv_num 不一致、prefix/padding rows 等边界,且代码已绕过原裁剪逻辑。

RTP-LLM Checklist

  • [I] 代码质量 — 同一功能用统一工具函数 → issue fast path 未按 token_q_num/token_kv_num 裁剪变长输入
    _新增 fast path 重新实现 packed QKV split,未复用已有 split_raw_qkv/forward_varlen,导致裁剪语义遗漏。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → issue FP8 no-cache 路径被 fast path 错误接管
    aiter.py:1468 新增 getattr(self.fmha_params, 'alloc_scale', False) 掩盖 FMHAParams 未保存该字段的问题,使 FP8 skip guard 失效。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    aiter.py:1376-1378 新增 helper 参数使用 Any 接收 pybind/FMHA 边界对象,缺少注释说明;该类型债未直接造成行为回归,作为 checklist_only 记录。

Strengths

  • 改动范围集中在 ROCm prefill 的 no-cache fast path,paged KV cache 主路径未被改动。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/1 · P2/1 · P3/0

Blocking Issues

P1

  • 新增回归测试未接入 Bazel/CI @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:1
    • 建议:在 rocm_impl/test/BUILD 新增该测试 target,挂上 ROCm GPU tags/exec_properties 和必要 deps,或合并到已有会执行的 ROCm 测试。

Non-blocking Suggestions

P2

  • tuple 快路径未校验 V 为空 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1398
    • 建议:进入快路径前同时校验 K 和 V 都为 None 或 empty;否则返回 None 走通用 tuple 路径。

Checklist Violations (7 fail / 97 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue tuple 快路径未校验 V 为空
    tuple 输入的不变量只校验 K 为空,未校验 V 是否为 None/empty。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue 新增回归测试未接入 Bazel/CI
    新增 test_embedding_fast_path.py 未在同目录 BUILD 注册,自动化测试链路不会运行 fast path 回归。
  • [6.1] Tests — 分布式/跨平台变更有对应覆盖 → checklist-only
    ROCm 专项测试还缺少依赖缺失时的收集期 skip 保护;该点为环境兼容提醒,主要 CI 覆盖缺口已由未接入 BUILD 的问题承载。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue tuple 快路径未校验 V 为空
    packed tuple 判定缺少对第三个元素 V 的 None/empty 检查。
  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue 新增回归测试未接入 Bazel/CI
    test_embedding_fast_path.py 未接入 BUILD,无法提供 CI 回归保护。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → checklist-only
    _try_embedding_fast_path 使用 getattr 读取 token_q_num/token_kv_num fallback,弱化了 FMHAParams 静态契约;当前按可维护性提醒处理。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    _try_embedding_fast_path 的 fmha_input/fmha_impl/fmha_params 标为 Any,docstring 说明输入形态但未说明 Any 的边界。

Strengths

  • 快路径复用了 split_raw_qkv 和 aiter.flash_attn_varlen_func,FP8 输入继续回退原路径,降低了重复实现和影响面。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/3 · P3/1

lgtm ready to ci

Non-blocking Suggestions

P2

  • tuple fast path 未校验 V 为空 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1398
    • 建议:进入 fast path 前同时校验 K 和 V 都是 None 或 empty;否则返回 None 走通用路径。
  • ROCm 测试缺少收集期 skip 保护 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:6
    • 建议:参考相邻 ROCm 测试,用 try/except 包住 aiter/rocm_impl 导入,并用 _is_rocm/_AITER_AVAILABLE 控制 skip。
  • fast path 测试只校验 shape,未校验数值等价 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:71
    • 建议:为 2D packed、tuple packed、变长 case 增加数值等价断言,至少对比现有 varlen 路径或 SDPA reference。

P3

  • 不要用 getattr fallback 隐藏 FMHAParams 契约 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1407
    • 建议:收紧类型并直接访问 fmha_params.token_q_num/token_kv_num;如确需 duck typing,用 Protocol 表达字段契约。

Checklist Violations (7 fail / 81 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue tuple fast path 未校验 V 为空
    tuple fast path 只校验 K 为空,未维护 packed tuple 要求 K/V 同时为空这一输入不变量。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue fast path 测试只校验 shape,未校验数值等价
    新增 fast path trigger 测试只断言 result 非 None 和 shape,缺少与现有 varlen 路径或 SDPA reference 的数值等价校验。
  • [6.1] Tests — 分布式/跨平台变更有对应覆盖 → issue ROCm 测试缺少收集期 skip 保护
    新增 ROCm 专项测试在导入阶段没有 aiter/ROCm 可用性保护,非目标环境下不能稳定 clean skip。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue tuple fast path 未校验 V 为空
    packed tuple 判定只检查第二个元素,遗漏第三个元素 V 的 None/empty 检查。
  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue ROCm 测试缺少收集期 skip 保护
    测试已接入 BUILD,但导入 rocm_impl.aiter 前没有 aiter/ROCm 可用性保护,非目标环境下不能稳定 skip。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → issue 不要用 getattr fallback 隐藏 FMHAParams 契约
    _新增 try_embedding_fast_path 使用 getattr(fmha_params, 'token_q_num', ...) 和 token_kv_num literal fallback。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → issue 不要用 getattr fallback 隐藏 FMHAParams 契约
    新增 helper 的 fmha_input/fmha_impl/fmha_params 均为 Any,未说明无法精确类型化的原因。

Strengths

  • 新增 helper 复用 split_raw_qkv,并保留 FP8 输入回退到原路径的判断。
  • 新增 ROCm py_test 覆盖 fast path 的基本触发、FP8 跳过、tuple packed、变长裁剪和单 token 形状。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/2 · P3/0

lgtm ready to ci

Non-blocking Suggestions

P2

  • 新增 ROCm 测试在非 ROCm 环境会收集期失败 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:6
    • 建议:按 test_aiter_prefill_op.py 的模式包裹 aiter/包装模块 import,并在 ROCm/aiter 不可用时 skip 整个测试类。
  • tuple 快路径应同时确认 K/V 均为空 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1397
    • 建议:tuple 快路径同时确认 fmha_input[2] 也是 None 或 empty;不满足完整契约时返回 None,并补充 K 空/V 非空回归测试。

Checklist Violations (9 fail / 97 total)

General Principles Checklist

  • [6.1] Tests — 分布式/跨平台变更有对应覆盖 → issue 新增 ROCm 测试在非 ROCm 环境会收集期失败
    ROCm 专项测试缺少非 ROCm import guard,跨平台测试收集存在风险。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue 新增 ROCm 测试在非 ROCm 环境会收集期失败
    新增测试顶层 import ROCm aiter 模块,非 ROCm/无 aiter 环境会在 skip 前收集失败。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue tuple 快路径应同时确认 K/V 均为空
    测试覆盖 empty K/V 与 single token,但未覆盖 packed tuple 中 K 为空且 V 非空必须跳过 fast path。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue tuple 快路径应同时确认 K/V 均为空
    tuple fast path 只检查 K 为空,没有检查 V 为空,输入契约校验不完整。
  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue 新增 ROCm 测试在非 ROCm 环境会收集期失败
    新增 ROCm 测试缺少 aiter/ROCm import guard,会让不可用环境在收集期失败。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → checklist-only
    helper 用 getattr 兼容 fmha_params/fake params 的 token_q_num/token_kv_num;当前无具体缺陷,后续可用 Protocol 收紧。
  • [P.F] 语言陷阱 — 禁止模块级 import 副作用 → issue 新增 ROCm 测试在非 ROCm 环境会收集期失败
    新增测试模块顶层 import rocm_impl.aiter,会触发 aiter/aiter_meta 环境依赖加载,skip 保护前可能失败。
  • [P.G] 测试规范 — 数据驱动测试用 pytest.mark.parametrize → checklist-only
    同目录采用 unittest 风格,本条不单独升级;更关键风险已体现在 import guard issue。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    _try_embedding_fast_path 参数使用 Any 兼容 pybind ParamsBase 和测试 fake;建议后续以 Protocol 表达所需字段。

Strengths

  • 新增测试覆盖了 FP8 跳过、tuple packed 输入、变长 token 裁剪和 single-token 场景,并已加入 ROCm 测试 target。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/2 · P3/0

lgtm ready to ci

Non-blocking Suggestions

P2

  • tuple fast path 未校验 V 为空 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1395
    • 建议:同时校验第二、第三元素均为 None/empty,否则返回 None 走原路径;补 second empty、third non-empty 回归用例。
  • Embedding fast path 缺少数值回归校验 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:67
    • 建议:构造固定 Q/K/V,比较 fast path 与参考实现或旧 _forward_varlen 的数值输出,覆盖 causal 与变长 batch。

Checklist Violations (8 fail / 97 total)

General Principles Checklist

  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue Embedding fast path 缺少数值回归校验
    新增测试覆盖 shape 和 skip 条件,但未验证 fast path 与参考实现的 attention 输出数值等价。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue tuple fast path 未校验 V 为空
    tuple 判定缺少 second empty、third non-empty 覆盖,且实现会在该组合下忽略 V。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 边界 case(空输入、单元素、最大值) → issue tuple fast path 未校验 V 为空
    测试覆盖 both empty tuple,但缺少 K empty、V non-empty 的边界组合。
  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue tuple fast path 未校验 V 为空
    tuple fast path 只检查 K 是否空,未确认 V 也为空,存在错误输入被静默当 packed QKV 处理的风险。
  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue Embedding fast path 缺少数值回归校验
    新增触发 fast path 的测试只检查输出 shape,缺少与参考实现的数值等价校验。
  • [I] 代码质量 — 同一功能用统一工具函数 → checklist-only
    _helper 与 forward_varlen 有相近 split/cu_seqlens/flash 调用编排;未达多数 issue 阈值,作为维护性提醒保留。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → checklist-only
    _try_embedding_fast_path 使用 getattr(fmha_params, 'token_q_num', ...) fallback;对应 issue 未达多数阈值,按悲观合并保留为 checklist-only。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → checklist-only
    新增 helper 的 fmha_input/fmha_impl/fmha_params 使用 Any 且未解释 pybind 契约;仅单个 draft 升级,保留为 checklist-only。

Strengths

  • 改动范围集中在 ROCm embedding no-cache attention fast path,保留 FP8 回退,风险面较窄。
  • 新增测试覆盖 FP8 skip、packed/tuple、变长 trimming 和 single-token 等基础场景。

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/1 · P3/0

lgtm ready to ci

Non-blocking Suggestions

P2

  • fast path 缺少数值回归断言 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/test/test_embedding_fast_path.py:67
    • 建议:为 2D packed、tuple packed、变长/GQA/causal case 增加与原 _forward_varlen 或 SDPA reference 的数值对比。

Checklist Violations (3 fail / 60 total)

General Principles Checklist

  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue fast path 缺少数值回归断言
    新增 test_embedding_fast_path 覆盖触发和跳过,但触发路径只检查 shape,缺少 attention 输出数值回归。

RTP-LLM Checklist

  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue fast path 缺少数值回归断言
    新增 fast path 有单测和 BUILD target,但触发路径缺少 attention 数值等价断言。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → checklist-only
    helper 使用 getattr(fmha_params, literal) 兼容动态参数;这是局部静态类型纪律缺口,但生产对象字段固定,暂不升级为独立 issue。

Strengths

  • fast path 封装为独立 helper,并保留 FP8 fallback,改动边界清晰。

q_size = fmha_impl.head_num * fmha_impl.head_dim
cu_seqlens_q = fmha_params.cu_seqlens_q
cu_seqlens_k = fmha_params.cu_seqlens_k
if cu_seqlens_q.device != q.device:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些都不合理? 应该准备阶段做好

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些都不合理? 应该准备阶段做好

已修复,init阶段已处理~

"""
packed_qkv = None

if isinstance(fmha_input, torch.Tensor) and fmha_input.dim() == 2:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些也不合理?输入应该只是 packed qkv

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: LGTM

Summary: P0/0 · P1/0 · P2/1 · P3/2

lgtm ready to ci

Non-blocking Suggestions

P2

  • Tuple 输入未验证 K/V 元素为空,可能静默忽略有效数据 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1390
    • 建议:在 tuple 分支中增加对 fmha_input[1]/[2] 的校验:如果它们是非 None 且 numel()>0 的 tensor,返回 None 走原有路径。例如:if any(isinstance(x, torch.Tensor) and x.dim()>=2 and x.numel()>0 for x in fmha_input[1:]): return None

P3

  • getattr literal 访问 token_q_num/token_kv_num 应替换为直接属性访问 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1404
    • 建议:改为直接访问 fmha_params.token_q_num / fmha_params.token_kv_num,并将 fmha_params 参数类型从 Any 改为 FMHAParams 以获得类型安全。
  • 函数参数类型均为 Any,缺少说明注释 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1374
    • 建议:将参数类型标注为具体类型:fmha_input: Union[torch.Tensor, Tuple[torch.Tensor, ...]],fmha_impl: AiterPrefillAttnOp,fmha_params: FMHAParams。或定义 Protocol 类型替代 Any。

Checklist Violations (2 fail / 60 total)

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → issue getattr literal 访问 token_q_num/token_kv_num 应替换为直接属性访问
    行 1404-1405 使用 getattr(fmha_params, 'token_q_num', fallback) 和 getattr(fmha_params, 'token_kv_num', fallback)。FMHAParams 始终定义这两个属性,getattr fallback 可能掩盖错误的 params 对象被传入。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → issue 函数参数类型均为 Any,缺少说明注释
    行 1375-1377 三个参数 fmha_input/fmha_impl/fmha_params 均为 Any 类型,无注释说明原因。实际分别对应 Union[Tensor, Tuple]、AiterPrefillAttnOp 和 FMHAParams。

Strengths

  • 正确修复了 _forward_varlen 无法处理 (packed_qkv, None, None) 格式导致 AttributeError 的问题,embedding 快速路径设计合理且正确复用 split_raw_qkv
  • FP8 排除逻辑正确且与主路径一致:快速路径返回 None 后回退到 fmha_impl.forward() 中的 FP8 专用分支,不会跳过 FP8 descale 处理
  • 测试覆盖全面且结构清晰:skip 类(FP8/3D/valid-KV-tuple)和 trigger 类(2D/None/empty/变长/单 token)场景均有覆盖,GPU 和 CPU 测试正确分离

… prefill

When kv_cache is None (embedding model), skip the fusedQKV transpose
kernel and KV cache write by splitting packed QKV directly and calling
flash_attn_varlen_func. This avoids unnecessary GPU buffer allocation,
transpose, and cache write operations.

The optimization is fully contained in the ROCm attention implementation
with no changes to model-layer code or C++ kernels.
@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1102

Status: BLOCKING

Summary: P0/0 · P1/1 · P2/1 · P3/0

Blocking Issues

P1

  • _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1389
    • 建议:在 split_raw_qkv 调用前添加校验:expected = (fmha_impl.head_num + 2 * fmha_impl.head_num_kv) * fmha_impl.head_dim; if packed_qkv.ndim != 2 or packed_qkv.size(-1) != expected: return None。同时修复函数契约和两个 skip 测试。

Non-blocking Suggestions

P2

  • _try_embedding_fast_path 三个参数均为 Any 类型缺少注释 @ rtp_llm/models_py/modules/factory/attention/rocm_impl/aiter.py:1374
    • 建议:至少在 Any 旁注释实际需要的属性接口,如 fmha_impl: Any # needs head_num, head_num_kv, head_dim, is_causal,或用 Protocol 类型替代。

Checklist Violations (10 fail / 81 total)

General Principles Checklist

  • [6.1] Software Engineering — DRY:重复非平凡逻辑被抽取或显式复用 → checklist-only
    __try_embedding_fast_path 与 _forward_varlen 的 else 分支存在 split_raw_qkv + flash_attn_varlen_func + reshape 管线重复,但 forward_varlen 额外处理 tuple 输入和 cu_seqlens 设备校验,差异足以证明不完全等价,影响低。
  • [6.1] Architecture — 错误语义:fail-fast/retry/fallback/silent 行为显式 → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    docstring 承诺 'Returns attention output if fast path is taken, None otherwise',但非 2D packed QKV 输入会 crash(RuntimeError from torch.split)而非返回 None。函数的 fallback 语义与实际行为不一致。
  • [6.1] Tests — 新逻辑有聚焦单测 + 相关集成/smoke 测试 → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    新增 test_embedding_fast_path.py 覆盖正常路径(5 个 trigger 测试),但 TestEmbeddingFastPathSkip 中 test_3d_input_skipped 和 test_tuple_with_valid_kv_skipped 会因 torch.split shape mismatch crash(RuntimeError),未能验证 skip 行为。
  • [6.1] Tests — 边界 case 覆盖(空、单元素、最大值) → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    test_3d_input_skipped 和 test_tuple_with_valid_kv_skipped 预期返回 None 但实际会 RuntimeError crash,边界 case 测试不通过。test_single_token 和 test_variable_length_trimming 覆盖了正常边界。

RTP-LLM Checklist

  • [B] 正确性与逻辑 — 逻辑错误、off-by-one、null/zero 检查 → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    _try_embedding_fast_path 缺少 packed_qkv.dim() != 2 校验。split_raw_qkv 假设输入为 2D [tokens, hidden],3D 输入在 torch.split(dim=-1) 处因维度不匹配 crash。
  • [B] 正确性与逻辑 — 边界 case(空输入、单元素、最大值) → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    _3D tensor 输入(rope op 返回的 Q tensor、非标准 shape 输入)是 try_embedding_fast_path 的边界 case,函数未防御。
  • [H] 测试与 CI — 测试覆盖充分:大重构等价覆盖,新功能端到端测试 → issue _try_embedding_fast_path 缺少输入维度校验,非 2D 输入导致 RuntimeError crash
    新增 8 个测试用例覆盖 skip/trigger 场景,但 test_3d_input_skipped 和 test_tuple_with_valid_kv_skipped 因代码缺少 dim guard 会 RuntimeError crash,无法提供有效 skip 覆盖。修复 dim guard 后测试覆盖即完整。
  • [I] 代码质量 — 同一功能用统一工具函数 → checklist-only
    _split_raw_qkv + flash_attn_varlen_func + reshape 管线在 _try_embedding_fast_path 和 _forward_varlen 两处各写一遍,但 forward_varlen 额外处理 tuple 输入和 cu_seqlens 设备校验,差异使完全复用困难,影响低。

Python Static-First Checklist

  • [P.A] 静态结构与类型纪律 — 禁止 getattr/setattr literal 访问 → checklist-only
    getattr(fmha_params, "token_q_num", ...) 和 getattr(fmha_params, "token_kv_num", ...) 使用字面量 key。此处是因 Any 类型做防御性 fallback,修正 Any 类型后可改为直接属性访问,影响低。
  • [P.H] 类型标注 — Any 必须附注释说明原因 → issue _try_embedding_fast_path 三个参数均为 Any 类型缺少注释
    fmha_input/fmha_impl/fmha_params 三个参数均标注为 Any 无注释。这些是 pybind11 返回的复杂类型,精确标注困难,但应至少注释实际需要的属性。

Strengths

  • 提取公共函数 _try_embedding_fast_path 消除了 AiterPrefillImplAsm 和 AiterPrefillImplNonAsm 的重复 embedding 快速路径逻辑,符合 DRY
  • 为 embedding 模型提供了跳过完整 attention dispatch 的 fast path 优化,直接调用 flash_attn_varlen_func 减少推理延迟
  • 正常路径测试覆盖全面:2D packed QKV、tuple+(None,None)、tuple+empty tensor、变长 batch trim、单 token 边界

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants