Add multi-op batch screening layer; fix cudagraph fallback regressions
run_batch.py drives run_pytest.sh per operator across GPUs (stable-hash sharding, per-op subprocess isolation, process-group timeouts, retry with deterministic-failure cutoff, two-level dtype fallback, .complete resume, per-op REPLAY_FROM). batch_summary.py aggregates run.log tables into summary.csv. ops/ holds the curated assets: dual-repo inventories rebuilt via AST scan + pytest collect verification, shape sets migrated from the old regression harness and merged with upstream core_shapes class-name keys (upstream's set_shapes falls back op_name -> MRO class name -> 1-D DEFAULT_SHAPES, so replacing the shape file without class keys crashes the BLAS family), and a dismiss list where all 76 entries carry verified reasons. Validated end to end: 1036-op full screen with zero failures. Also fix two cudagraph plugin regressions: newer torch appends "enable device-side assertions" to every CUDA error, so the loose fatal-error marker disabled the documented do_bench fallback entirely; and an aborted graph capture can leave the default CUDA RNG generator stuck in capturing state, poisoning every later torch.randn - captures now run under a throwaway RNG state. run_pytest.sh gains an optional DTYPES passthrough.
This commit is contained in:
+120
@@ -0,0 +1,120 @@
|
||||
# 批量测试排除清单。每行一个算子:`op`(默认 main 仓)或 `repo:op`。
|
||||
# run_batch.py --all 会跳过这里列出的算子;带无条件 pytest.mark.skip 的算子由
|
||||
# inventory 的 marked_skip 列自动剔除,不必写在这里。
|
||||
# 只放"经本仓批量跑复核确认失败"的条目,注明原因与复核日期。
|
||||
#
|
||||
# 2026-08-12 复核记录:
|
||||
# - 旧回归清单 24 个候选全部重验:14 个新上游已修复(移出),3 个系本仓
|
||||
# _cudagraph_plugin 回退失效 bug(已修复,移出),7 个确认为上游/环境问题;
|
||||
# - 全量筛查(1103 算子)新增确认 67 个:43 个 torch jiterator 环境问题 +
|
||||
# 24 个上游 bug/环境限制。shape 语义类失败(28 个)已通过 shape yaml 合并
|
||||
# 上游 core_shapes 类名键修复,不在此列;
|
||||
# - test_FLA/ 补齐后新增确认 2 个(硬件限制 + 专用 harness),共 76 条。
|
||||
|
||||
# ==== 上游 kernel 编译错误 [2026-08-12]
|
||||
# CompilationError(关 cudagraph 后仍复现)
|
||||
hstack
|
||||
scaled_mm_benchmark
|
||||
scaled_mm_out_benchmark
|
||||
# tt.load result/ptr type 校验失败
|
||||
flash_mla_with_kvcache
|
||||
# PassManager::run failed(FlagTree triton 编译失败)
|
||||
flash_mla_sparse_fwd
|
||||
vllm:flash_mla_sparse_fwd
|
||||
# capture 失败回退后仍报 kernel 错误
|
||||
vllm:flash_mla
|
||||
vllm:flash_mla_with_kvcache
|
||||
linalg_lu_factor_ex
|
||||
|
||||
# ==== 上游 benchmark 代码 bug [2026-08-12]
|
||||
# baseline torch.trace 收到非矩阵输入(expected a matrix)
|
||||
trace
|
||||
# set_shapes() 签名与基类调用不符(TypeError)
|
||||
get_paged_mqa_logits_metadata
|
||||
# 输入解包 ValueError(expected 3, got 1)
|
||||
grouped_mm
|
||||
# 上游 benchmark assert 失败
|
||||
get_scheduler_metadata
|
||||
# is_backward 对未参与计算图的张量求梯度(allow_unused)
|
||||
embedding_backward
|
||||
margin_ranking_loss_backward
|
||||
# baseline 函数签名不符(unexpected keyword 'q' / 缺 constexpr 实参)
|
||||
fp8_fp4_paged_mqa_logits
|
||||
vllm:fp8_fp4_mqa_logits
|
||||
# baseline 返回 None(NoneType has no attribute 'device')
|
||||
special_gammainc
|
||||
# normalized_shape=[](上游默认 shape 语义错误)
|
||||
native_layer_norm
|
||||
# 上游断言 K>=16 与其默认 attention shape 冲突
|
||||
perf_scaled_dot_product_flash_attention_backward
|
||||
perf_scaled_dot_product_cudnn_attention_backward
|
||||
# Triton Error [CUDA]: invalid argument(上游默认 shape 下 kernel 启动参数非法)
|
||||
index_select_backward
|
||||
pairwise_distance
|
||||
# test_blas_perf_parallel 专用 harness(shape kind 语义与通用注入冲突;常规 mul 已覆盖)
|
||||
perf_mul
|
||||
# 需要 pytest-benchmark fixture(非 FlagGems Benchmark 体系)
|
||||
vllm:triton_unified_attention_perf
|
||||
# 自定义输出格式(非 FlagGems Benchmark 表)且预编译超 40min
|
||||
vllm:perf_chunk_gla
|
||||
|
||||
# ==== 硬件限制 [2026-08-12]
|
||||
# kernel 共享内存需求 245-335KB 超 H20 上限 227KB,autotune 全候选 OutOfResources
|
||||
vllm:chunk_gdn2
|
||||
|
||||
# ==== 环境限制(换环境后应重验)[2026-08-12]
|
||||
# vllm 0.20.2 无 vllm.utils.deep_gemm.fp8_mqa_logits
|
||||
fp8_mqa_logits
|
||||
# FA2 不支持 num_splits > 1(flash-attn 版本)
|
||||
flash_attn_varlen_opt_func
|
||||
# magma 显存分配失败(cannot allocate memory on GPU, info=-113)
|
||||
cholesky_solve
|
||||
cholesky_solve_out
|
||||
# cusolver INTERNAL_ERROR(Xgeev)
|
||||
linalg_eigvals
|
||||
# ---- torch jiterator/NVRTC 在本环境编译失败(fp32 也复现),
|
||||
# ---- sinc/bessel/special 族的 torch baseline 整体不可用:
|
||||
erfc
|
||||
erfc_
|
||||
erfinv
|
||||
erfinv_
|
||||
lcm
|
||||
lcm_
|
||||
lgamma
|
||||
lgamma_
|
||||
mvlgamma
|
||||
mvlgamma_
|
||||
polygamma
|
||||
polygamma_inplace
|
||||
polygamma_out
|
||||
sinc
|
||||
sinc_
|
||||
special_airy_ai
|
||||
special_airy_ai_out
|
||||
special_bessel_j0
|
||||
special_bessel_j1
|
||||
special_chebyshev_polynomial_u
|
||||
special_chebyshev_polynomial_v
|
||||
special_chebyshev_polynomial_w
|
||||
special_chebyshev_polynomial_w_out
|
||||
special_erfc
|
||||
special_erfcx
|
||||
special_erfinv
|
||||
special_erfinv_out
|
||||
special_gammaln
|
||||
special_gammaln_out
|
||||
special_hermite_polynomial_h
|
||||
special_i1e
|
||||
special_legendre_polynomial_p
|
||||
special_log1p_non_tensor
|
||||
special_modified_bessel_k0
|
||||
special_modified_bessel_k0_out
|
||||
special_modified_bessel_k1
|
||||
special_modified_bessel_k1_out
|
||||
special_scaled_modified_bessel_k1
|
||||
special_scaled_modified_bessel_k1_out
|
||||
special_shifted_chebyshev_polynomial_u
|
||||
special_shifted_chebyshev_polynomial_u_
|
||||
special_shifted_chebyshev_polynomial_v
|
||||
special_shifted_chebyshev_polynomial_w
|
||||
special_sinc
|
||||
@@ -0,0 +1,294 @@
|
||||
#!/usr/bin/env python3
|
||||
"""重建批量测试的算子清单(inventory),并可校验迁移 shape yaml。
|
||||
|
||||
对每个 FlagGems 仓库静态扫描 benchmark/ 下的 test_*.py(含 test_ 前缀的
|
||||
子目录,如 test_FLA/——op_file 记相对路径去前后缀,run_pytest.sh 的
|
||||
`benchmark/test_${OP_FILE}.py` 拼接对其天然成立;models_benchmark/ 等
|
||||
非 test_ 前缀路径不在性能批量范围):
|
||||
|
||||
- 每个模块级 test_* 函数出一行 inventory:op(函数名去 test_ 前缀,即
|
||||
run_pytest.sh 的 OP)、op_file(文件名去 test_ 前缀/.py 后缀,即 OP_FILE);
|
||||
- 标注 marked_skip(函数带无条件 pytest.mark.skip,跑了必 SKIP,批量驱动默认剔除);
|
||||
- 提取 op_name 字符串常量(op_name= 关键字实参,以及 *Benchmark 类
|
||||
__init__ 里 super().__init__ 的首个字符串位置实参),用于 shape yaml 键校验;
|
||||
- --verify-collect 时额外跑一次 pytest --collect-only 核实函数确实可被收集
|
||||
(AST 见到 ≠ pytest 收得到,import 失败/条件定义都会导致差异)。
|
||||
|
||||
产物:
|
||||
ops/inventory_<label>.csv # repo,op,op_file,file,marked_skip,collected,op_names
|
||||
--migrate-shapes 时按 op_name 并集过滤输入 yaml、合并上游 core_shapes 底座:
|
||||
<out>.yaml + <out>.unmatched.yaml(未匹配任何 op_name 的键,供人工复核后删除)
|
||||
|
||||
用法示例(默认扫描两个新仓库):
|
||||
python ops/gen_inventory.py --verify-collect
|
||||
# 上游 op_name/core_shapes 变动后,对现有 shape 集重新校验(输入=输出即原地刷新)
|
||||
python ops/gen_inventory.py --migrate-shapes ops/shapes_single.yaml \
|
||||
--shapes-out ops/shapes_single.yaml
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import ast
|
||||
import csv
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Set, Tuple
|
||||
|
||||
import yaml
|
||||
|
||||
OPS_DIR = Path(__file__).resolve().parent
|
||||
|
||||
DEFAULT_REPOS = [
|
||||
("main", Path("/workspace/dev/FlagGems")),
|
||||
("vllm", Path("/workspace/dev/FlagGems-vllm")),
|
||||
]
|
||||
|
||||
INVENTORY_FIELDS = ["repo", "op", "op_file", "file", "marked_skip", "collected", "op_names"]
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
p = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
||||
p.add_argument("--repo", action="append", default=None, metavar="LABEL=PATH",
|
||||
help="要扫描的仓库(可多次),默认 main=/workspace/dev/FlagGems "
|
||||
"与 vllm=/workspace/dev/FlagGems-vllm")
|
||||
p.add_argument("--verify-collect", action="store_true",
|
||||
help="用 pytest --collect-only 核实每个测试函数可被收集(慢,"
|
||||
"需要完整运行环境;结果写进 collected 列)")
|
||||
p.add_argument("--out-dir", type=Path, default=OPS_DIR,
|
||||
help="inventory CSV 输出目录(默认 ops/)")
|
||||
p.add_argument("--migrate-shapes", type=Path, default=None,
|
||||
help="旧 shape yaml 路径;按扫描出的 op_name 并集过滤后迁移")
|
||||
p.add_argument("--shapes-out", type=Path, default=None,
|
||||
help="迁移后 yaml 输出路径(--migrate-shapes 时必填)")
|
||||
return p.parse_args()
|
||||
|
||||
|
||||
def _resolve_repos(raw: Optional[List[str]]) -> List[Tuple[str, Path]]:
|
||||
if not raw:
|
||||
return [(label, path) for label, path in DEFAULT_REPOS if path.is_dir()]
|
||||
repos = []
|
||||
for item in raw:
|
||||
label, _, path = item.partition("=")
|
||||
if not path:
|
||||
raise SystemExit(f"--repo 需要 LABEL=PATH 形式,收到: {item!r}")
|
||||
repos.append((label, Path(path)))
|
||||
return repos
|
||||
|
||||
|
||||
def _is_unconditional_skip(dec: ast.AST) -> bool:
|
||||
"""pytest.mark.skip(非 skipif)——带不带 reason 实参都算无条件。"""
|
||||
target = dec.func if isinstance(dec, ast.Call) else dec
|
||||
if not (isinstance(target, ast.Attribute) and target.attr == "skip"):
|
||||
return False
|
||||
mark = target.value
|
||||
return (isinstance(mark, ast.Attribute) and mark.attr == "mark"
|
||||
and isinstance(mark.value, ast.Name) and mark.value.id == "pytest")
|
||||
|
||||
|
||||
def _op_names_in(node: ast.AST) -> Set[str]:
|
||||
"""节点范围内的 op_name 字符串常量,覆盖三种上游写法:
|
||||
1. 任意调用的 op_name= 关键字实参;
|
||||
2. super().__init__ 的首个字符串位置实参(FusedDeepseekV4... 模式);
|
||||
3. *Benchmark 类实例化的首个字符串位置实参(ScaledMMBenchmark("scaled_mm",
|
||||
...) 这类经形参转发、常量提取够不到 super() 调用的模式)。
|
||||
误报只会让 shape yaml 多留一个无人读取的键,无害。"""
|
||||
names: Set[str] = set()
|
||||
for sub in ast.walk(node):
|
||||
if not isinstance(sub, ast.Call):
|
||||
continue
|
||||
for kw in sub.keywords:
|
||||
if kw.arg == "op_name" and isinstance(kw.value, ast.Constant) \
|
||||
and isinstance(kw.value.value, str):
|
||||
names.add(kw.value.value)
|
||||
first_str = (sub.args[0].value
|
||||
if sub.args and isinstance(sub.args[0], ast.Constant)
|
||||
and isinstance(sub.args[0].value, str) else None)
|
||||
if first_str is None:
|
||||
continue
|
||||
func = sub.func
|
||||
if (isinstance(func, ast.Attribute) and func.attr == "__init__"
|
||||
and isinstance(func.value, ast.Call)
|
||||
and isinstance(func.value.func, ast.Name)
|
||||
and func.value.func.id == "super"):
|
||||
names.add(first_str)
|
||||
callee = func.id if isinstance(func, ast.Name) else (
|
||||
func.attr if isinstance(func, ast.Attribute) else "")
|
||||
if callee.endswith("Benchmark"):
|
||||
names.add(first_str)
|
||||
return names
|
||||
|
||||
|
||||
def scan_repo(label: str, root: Path) -> Tuple[List[Dict[str, str]], Set[str]]:
|
||||
"""返回 (inventory 行, 该仓库全部 op_name 集合)。"""
|
||||
bench = root / "benchmark"
|
||||
rows: List[Dict[str, str]] = []
|
||||
op_names_all: Set[str] = set()
|
||||
for path in sorted(bench.rglob("test_*.py")):
|
||||
rel = path.relative_to(bench)
|
||||
# 仅收 test_ 前缀链路(根级 test_x.py 与 test_XXX/ 子目录),保证
|
||||
# "benchmark/test_" + op_file + ".py" 能原样重建路径。
|
||||
if not str(rel).startswith("test_"):
|
||||
continue
|
||||
try:
|
||||
tree = ast.parse(path.read_text())
|
||||
except SyntaxError as exc:
|
||||
print(f"[gen] warning: {path} 解析失败,跳过: {exc}", file=sys.stderr)
|
||||
continue
|
||||
op_names_all |= _op_names_in(tree)
|
||||
op_file = str(rel)[len("test_"):-len(".py")]
|
||||
for node in tree.body:
|
||||
if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
|
||||
continue
|
||||
if not node.name.startswith("test_"):
|
||||
continue
|
||||
marked = any(_is_unconditional_skip(d) for d in node.decorator_list)
|
||||
func_ops = sorted(_op_names_in(node))
|
||||
rows.append({
|
||||
"repo": label,
|
||||
"op": node.name[len("test_"):],
|
||||
"op_file": op_file,
|
||||
"file": f"benchmark/{rel}",
|
||||
"marked_skip": "yes" if marked else "",
|
||||
"collected": "",
|
||||
"op_names": ";".join(func_ops),
|
||||
})
|
||||
return rows, op_names_all
|
||||
|
||||
|
||||
def verify_collect(label: str, root: Path, rows: List[Dict[str, str]]) -> None:
|
||||
"""跑 pytest --collect-only 核实测试函数可被收集,写 collected 列。"""
|
||||
env = os.environ.copy()
|
||||
env.setdefault("GEMS_VENDOR", "nvidia") # 跳过 nvidia-smi 子进程探测(可能挂死)
|
||||
proc = subprocess.run(
|
||||
[sys.executable, "-m", "pytest", "--collect-only", "-q",
|
||||
"--continue-on-collection-errors", "benchmark/"],
|
||||
cwd=str(root), text=True, capture_output=True, env=env, timeout=1200,
|
||||
)
|
||||
collected_funcs: Set[Tuple[str, str]] = set()
|
||||
for line in proc.stdout.splitlines():
|
||||
line = line.strip()
|
||||
if "::" not in line or not line.startswith("benchmark/"):
|
||||
continue
|
||||
file_part, _, rest = line.partition("::")
|
||||
func = rest.split("::")[0].split("[")[0]
|
||||
collected_funcs.add((file_part, func))
|
||||
if not collected_funcs:
|
||||
print(f"[gen] warning: {label} collect 无结果 (rc={proc.returncode}),"
|
||||
f"stderr 尾部: {proc.stderr[-500:]}", file=sys.stderr)
|
||||
return
|
||||
for row in rows:
|
||||
key = (row["file"], f"test_{row['op']}")
|
||||
row["collected"] = "yes" if key in collected_funcs else "no"
|
||||
n_missing = sum(1 for r in rows if r["collected"] == "no")
|
||||
if n_missing:
|
||||
print(f"[gen] {label}: {n_missing} 个 AST 可见但 pytest 未收集到的函数"
|
||||
f"(import 失败/条件定义),inventory 中 collected=no")
|
||||
|
||||
|
||||
def carry_over_collected(out_dir: Path, label: str,
|
||||
rows: List[Dict[str, str]]) -> None:
|
||||
"""未跑 --verify-collect 时,从已有 CSV 继承 collected 列,避免重写清单时
|
||||
把上次核实的结果冲掉。"""
|
||||
path = out_dir / f"inventory_{label}.csv"
|
||||
if not path.is_file():
|
||||
return
|
||||
with path.open(newline="") as f:
|
||||
prev = {(r["op"], r["op_file"]): r.get("collected", "")
|
||||
for r in csv.DictReader(f)}
|
||||
for row in rows:
|
||||
row["collected"] = prev.get((row["op"], row["op_file"]), "")
|
||||
|
||||
|
||||
def write_inventory(out_dir: Path, label: str, rows: List[Dict[str, str]]) -> Path:
|
||||
out = out_dir / f"inventory_{label}.csv"
|
||||
tmp = out.with_name(out.name + ".tmp")
|
||||
with tmp.open("w", newline="") as f:
|
||||
writer = csv.DictWriter(f, fieldnames=INVENTORY_FIELDS)
|
||||
writer.writeheader()
|
||||
writer.writerows(rows)
|
||||
os.replace(tmp, out)
|
||||
return out
|
||||
|
||||
|
||||
def migrate_shapes(old_path: Path, out_path: Path, valid_op_names: Set[str],
|
||||
repos: List[Tuple[str, Path]]) -> None:
|
||||
"""迁移旧 shape yaml,并以上游 core_shapes.yaml 为底座合并。
|
||||
|
||||
上游 set_shapes 的回退链是 op_name 键 → MRO 类名键(BlasBenchmark 等)→
|
||||
基类 DEFAULT_SHAPES(1 维)。--shape_file 是整体替换而非叠加,若我们的
|
||||
yaml 缺少类名级条目,BLAS 这类需要 (B,M,N,K) 的算子会跌到 1 维默认值上
|
||||
解包崩溃。因此把各仓库 core_shapes.yaml 里我们没有的键(含类名键与
|
||||
op 级键)原样并入,迁移条目优先,先并 main 后并 vllm(同名键先到先得)。"""
|
||||
data = yaml.safe_load(old_path.read_text()) or {}
|
||||
core_maps = []
|
||||
for label, root in repos:
|
||||
core = root / "benchmark" / "core_shapes.yaml"
|
||||
if core.is_file():
|
||||
core_maps.append((label, yaml.safe_load(core.read_text()) or {}))
|
||||
core_keys = {k for _, m in core_maps for k in m}
|
||||
kept = {k: v for k, v in data.items() if k in valid_op_names}
|
||||
# core_shapes 来源的键(类名键等)不算"未匹配"——它们每次都从上游取新版,
|
||||
# 这样输入=输出的在地刷新也能同步上游 core_shapes 的变动。
|
||||
dropped = {k: v for k, v in data.items()
|
||||
if k not in valid_op_names and k not in core_keys}
|
||||
n_curated = len(kept)
|
||||
merged_from = []
|
||||
for label, m in core_maps:
|
||||
n_before = len(kept)
|
||||
for key, val in m.items():
|
||||
kept.setdefault(key, val)
|
||||
merged_from.append(f"{label}:+{len(kept) - n_before}")
|
||||
header = (f"# 由 gen_inventory.py 从 {old_path.name} 迁移:保留新上游仍存在的"
|
||||
f" op_name 键 {n_curated}/{len(data)},"
|
||||
f"并合并上游 core_shapes.yaml 缺失键({' '.join(merged_from)})。\n"
|
||||
"# 顶层键 = FlagGems op_name 或 Benchmark 类名(上游回退链需要);\n"
|
||||
"# 两者都无键的算子使用其基类 DEFAULT_SHAPES。\n")
|
||||
out_path.write_text(header + yaml.safe_dump(
|
||||
kept, sort_keys=True, default_flow_style=None, allow_unicode=True))
|
||||
if dropped:
|
||||
unmatched = out_path.with_suffix(".unmatched.yaml")
|
||||
unmatched.write_text(
|
||||
f"# {old_path.name} 中未匹配新上游任何 op_name 的键({len(dropped)} 个),"
|
||||
"供人工复核后手动挪回。\n"
|
||||
+ yaml.safe_dump(dropped, sort_keys=True, default_flow_style=None,
|
||||
allow_unicode=True))
|
||||
print(f"[gen] shapes: 保留 {len(kept)},剔除 {len(dropped)} -> {unmatched}")
|
||||
else:
|
||||
print(f"[gen] shapes: 全部 {len(kept)} 个键有效")
|
||||
# 覆盖率:有效 op_name 里有多少没有 shape 条目(用上游默认 shape,仅提示)
|
||||
uncovered = sorted(valid_op_names - set(kept))
|
||||
print(f"[gen] shapes: 新上游 {len(valid_op_names)} 个 op_name 中 "
|
||||
f"{len(uncovered)} 个无 shape 条目(将用上游默认 shape)")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
args = parse_args()
|
||||
repos = _resolve_repos(args.repo)
|
||||
if not repos:
|
||||
raise SystemExit("没有可扫描的仓库")
|
||||
args.out_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
all_op_names: Set[str] = set()
|
||||
for label, root in repos:
|
||||
rows, op_names = scan_repo(label, root)
|
||||
all_op_names |= op_names
|
||||
if args.verify_collect:
|
||||
verify_collect(label, root, rows)
|
||||
else:
|
||||
carry_over_collected(args.out_dir, label, rows)
|
||||
out = write_inventory(args.out_dir, label, rows)
|
||||
n_skip = sum(1 for r in rows if r["marked_skip"])
|
||||
print(f"[gen] {label}: {len(rows)} 个测试函数 -> {out}"
|
||||
f"(其中 {n_skip} 个带无条件 skip 标记)")
|
||||
|
||||
if args.migrate_shapes:
|
||||
if not args.shapes_out:
|
||||
raise SystemExit("--migrate-shapes 需要同时给 --shapes-out")
|
||||
migrate_shapes(args.migrate_shapes, args.shapes_out, all_op_names, repos)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,109 @@
|
||||
repo,op,op_file,file,marked_skip,collected,op_names
|
||||
vllm,perf_chunk_gated_delta_rule_fwd,FLA/test_chunk_gated_delta_rule_fwd,benchmark/test_FLA/test_chunk_gated_delta_rule_fwd.py,,yes,chunk_gated_delta_rule_fwd
|
||||
vllm,perf_chunk_gated_delta_rule,FLA/test_chunk_gated_delta_rule_perf,benchmark/test_FLA/test_chunk_gated_delta_rule_perf.py,,yes,chunk_gated_delta_rule
|
||||
vllm,chunk_gdn2,FLA/test_chunk_gdn2,benchmark/test_FLA/test_chunk_gdn2.py,,yes,chunk_gdn2
|
||||
vllm,perf_chunk_gla,FLA/test_chunk_gla_perf,benchmark/test_FLA/test_chunk_gla_perf.py,,yes,
|
||||
vllm,chunk_kda,FLA/test_chunk_kda,benchmark/test_FLA/test_chunk_kda.py,,yes,chunk_kda
|
||||
vllm,perf_fused_recurrent_gated_delta_rule,FLA/test_fused_recurrent_gated_delta_rule_perf,benchmark/test_FLA/test_fused_recurrent_gated_delta_rule_perf.py,,yes,fused_recurrent_gated_delta_rule
|
||||
vllm,act_quant_perf,act_quant,benchmark/test_act_quant.py,,yes,act_quant_triton
|
||||
vllm,add_rms_norm,add_rms_norm,benchmark/test_add_rms_norm.py,,yes,add_rms_norm
|
||||
vllm,apply_repetition_penalties,apply_repetition_penalties,benchmark/test_apply_repetition_penalties.py,,yes,apply_repetition_penalties
|
||||
vllm,apply_rotary_pos_emb,apply_rotary_pos_emb,benchmark/test_apply_rotary_pos_emb.py,,yes,apply_rotary_pos_emb
|
||||
vllm,beam_search_score,beam_search_score,benchmark/test_beam_search_score.py,,yes,beam_search_score
|
||||
vllm,beam_search_score_,beam_search_score,benchmark/test_beam_search_score.py,,yes,beam_search_score_
|
||||
vllm,bincount,bincount,benchmark/test_bincount.py,,yes,bincount
|
||||
vllm,bincount_weighted,bincount,benchmark/test_bincount.py,,yes,bincount_weighted
|
||||
vllm,blas_benchmark,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,
|
||||
vllm,perf_w8a8_block_fp8_matmul,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,w8a8_block_fp8_matmul
|
||||
vllm,perf_w8a8_block_fp8_matmul_deepgemm,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,w8a8_block_fp8_matmul_deepgemm
|
||||
vllm,perf_sparse_attention,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,sparse_attention
|
||||
vllm,mv_and_outer_benchmark,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,
|
||||
vllm,addmv_benchmark,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,
|
||||
vllm,vdot_benchmark,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,vdot
|
||||
vllm,addr_benchmark,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,addr
|
||||
vllm,perf_router_gemm,blas_perf_parallel,benchmark/test_blas_perf_parallel.py,,yes,router_gemm
|
||||
vllm,concat_and_cache_mla,concat_and_cache_mla,benchmark/test_concat_and_cache_mla.py,,yes,concat_and_cache_mla
|
||||
vllm,cp_gather_indexer_k_quant_cache_benchmark,cp_gather_indexer_k_quant_cache,benchmark/test_cp_gather_indexer_k_quant_cache.py,,yes,
|
||||
vllm,cross_entropy_loss,cross_entropy_loss,benchmark/test_cross_entropy_loss.py,,yes,cross_entropy_loss
|
||||
vllm,cutlass_scaled_mm_benchmark,cutlass_scaled_mm,benchmark/test_cutlass_scaled_mm.py,,yes,
|
||||
vllm,combine_topk_swa_indices_benchmark,deepseek_v4_attention_combine_topk_swa_indices,benchmark/test_deepseek_v4_attention_combine_topk_swa_indices.py,,yes,
|
||||
vllm,compute_global_topk_indices_and_lens_benchmark,deepseek_v4_attention_compute_global_topk_indices_and_lens,benchmark/test_deepseek_v4_attention_compute_global_topk_indices_and_lens.py,,yes,
|
||||
vllm,dequantize_and_gather_k_cache_benchmark,deepseek_v4_attention_dequantize_and_gather_k_cache,benchmark/test_deepseek_v4_attention_dequantize_and_gather_k_cache.py,,yes,
|
||||
vllm,fused_q_kv_rmsnorm_benchmark,deepseek_v4_attention_fused_q_kv_rmsnorm,benchmark/test_deepseek_v4_attention_fused_q_kv_rmsnorm.py,,yes,
|
||||
vllm,dgeglu,dgeglu,benchmark/test_dgeglu.py,,yes,dgeglu
|
||||
vllm,dreglu,dreglu,benchmark/test_dreglu.py,,yes,dreglu
|
||||
vllm,dswiglu,dswiglu,benchmark/test_dswiglu.py,,yes,dswiglu
|
||||
vllm,flash_attention_forward,flash_attention_forward,benchmark/test_flash_attention_forward.py,,yes,flash_attention_forward
|
||||
vllm,flash_attn_varlen_func,flash_attn_varlen_func,benchmark/test_flash_attn_varlen_func.py,,yes,flash_attn_varlen_func
|
||||
vllm,flash_attn_varlen_opt_func,flash_attn_varlen_opt_init_func,benchmark/test_flash_attn_varlen_opt_init_func.py,,yes,flash_attn_varlen_func
|
||||
vllm,flash_mla,flash_mla,benchmark/test_flash_mla.py,,yes,flash_mla
|
||||
vllm,flash_mla_sparse_fwd,flash_mla_sparse_fwd,benchmark/test_flash_mla_sparse_fwd.py,,yes,
|
||||
vllm,flash_mla_with_kvcache,flash_mla_with_kvcache,benchmark/test_flash_mla_with_kvcache.py,,yes,
|
||||
vllm,fp8_fp4_mqa_logits,fp8_fp4_mqa_logits,benchmark/test_fp8_fp4_mqa_logits.py,,yes,fp8_fp4_mqa_logits
|
||||
vllm,fp8_fp4_paged_mqa_logits,fp8_fp4_paged_mqa_logits,benchmark/test_fp8_fp4_paged_mqa_logits.py,,yes,fp8_fp4_paged_mqa_logits
|
||||
vllm,fused_add_rms_norm,fused_add_rms_norm,benchmark/test_fused_add_rms_norm.py,,yes,fused_add_rms_norm
|
||||
vllm,fused_deepseek_v4_qnorm_rope_kv_rope_quant_insert,fused_deepseek_v4_qnorm_rope_kv_rope_quant_insert,benchmark/test_fused_deepseek_v4_qnorm_rope_kv_rope_quant_insert.py,,yes,
|
||||
vllm,fused_indexer_q_rope_quant,fused_indexer_q_rope_quant,benchmark/test_fused_indexer_q_rope_quant.py,,yes,fused_indexer_q_rope_quant
|
||||
vllm,fused_inv_rope_fp8_quant,fused_inv_rope_fp8_quant,benchmark/test_fused_inv_rope_fp8_quant.py,,yes,fused_inv_rope_fp8_quant
|
||||
vllm,fused_marlin_moe,fused_marlin_moe,benchmark/test_fused_marlin_moe.py,,yes,fused_marlin_moe
|
||||
vllm,fused_moe_impl_gems_vs_vllm,fused_moe,benchmark/test_fused_moe.py,,yes,fused_experts_impl
|
||||
vllm,fused_moe_fp8,fused_moe_fp8,benchmark/test_fused_moe_fp8.py,,yes,fused_experts_impl
|
||||
vllm,fused_moe_fp8_blockwise,fused_moe_fp8_blockwise,benchmark/test_fused_moe_fp8_blockwise.py,,yes,fused_experts_impl
|
||||
vllm,fused_moe_int4_w4a16,fused_moe_int4_w4a16,benchmark/test_fused_moe_int4_w4a16.py,,yes,fused_experts_impl
|
||||
vllm,fused_experts_impl_int8,fused_moe_int8,benchmark/test_fused_moe_int8.py,,yes,fused_experts_impl
|
||||
vllm,fused_experts_impl_int8_w8a16,fused_moe_int8_w8a16,benchmark/test_fused_moe_int8_w8a16.py,,yes,fused_moe_int8_w8a16_gems_vs_bf16_deq
|
||||
vllm,fused_moe_w8a16_mxq,fused_moe_w8a16,benchmark/test_fused_moe_w8a16.py,,yes,fused_moe_w8a16_mxq_gems_vs_bf16_deq
|
||||
vllm,fused_moe_w8a16_mxq_gems_vs_vllm,fused_moe_w8a16,benchmark/test_fused_moe_w8a16.py,,yes,fused_moe_w8a16_mxq_gems_vs_vllm
|
||||
vllm,geglu,geglu,benchmark/test_geglu.py,,yes,geglu
|
||||
vllm,gelu_and_mul,gelu_and_mul,benchmark/test_gelu_and_mul.py,,yes,gelu_and_mul
|
||||
vllm,grouped_topk_no_renorm,grouped_topk,benchmark/test_grouped_topk.py,,yes,grouped_topk
|
||||
vllm,grouped_topk_score_0,grouped_topk,benchmark/test_grouped_topk.py,,yes,grouped_topk
|
||||
vllm,grouped_topk_score_1,grouped_topk,benchmark/test_grouped_topk.py,,yes,grouped_topk
|
||||
vllm,indexer_k_quant_and_cache_benchmark,indexer_k_quant_and_cache,benchmark/test_indexer_k_quant_and_cache.py,,yes,
|
||||
vllm,inplace_fused_experts_gems_vs_vllm,inplace_fused_experts,benchmark/test_inplace_fused_experts.py,,yes,inplace_fused_experts
|
||||
vllm,instance_norm,instance_norm,benchmark/test_instance_norm.py,,yes,instance_norm
|
||||
vllm,mhc_post,mhc,benchmark/test_mhc.py,,yes,mhc_post
|
||||
vllm,mhc_pre,mhc,benchmark/test_mhc.py,,yes,mhc_pre
|
||||
vllm,hc_split_sinkhorn_forward,mhc,benchmark/test_mhc.py,,yes,hc_split_sinkhorn_forward
|
||||
vllm,mhc_bwd,mhc,benchmark/test_mhc.py,,yes,mhc_bwd
|
||||
vllm,hc_head_fused_kernel,mhc,benchmark/test_mhc.py,,yes,hc_head_fused_kernel
|
||||
vllm,moe_align_block_size_triton,moe_align_block_size_triton,benchmark/test_moe_align_block_size_triton.py,,yes,moe_align_block_size_triton
|
||||
vllm,moe_sum,moe_sum,benchmark/test_moe_sum.py,,yes,moe_sum
|
||||
vllm,mrope_gems_vs_torch,mrope,benchmark/test_mrope.py,,yes,mrope
|
||||
vllm,outer,outer,benchmark/test_outer.py,,yes,outer
|
||||
vllm,outplace_fused_experts_gems_vs_vllm,outplace_fused_experts,benchmark/test_outplace_fused_experts.py,,yes,outplace_fused_experts
|
||||
vllm,pack_seq,pack_seq,benchmark/test_pack_seq.py,,yes,pack_seq_triton
|
||||
vllm,pack_seq_fp8,pack_seq,benchmark/test_pack_seq.py,,yes,pack_seq_triton
|
||||
vllm,perf_parallel_nsa,parallel_nsa,benchmark/test_parallel_nsa.py,,yes,parallel_nsa
|
||||
vllm,perf_parallel_nsa_compression,parallel_nsa_compression,benchmark/test_parallel_nsa_compression.py,,yes,parallel_nsa_compression
|
||||
vllm,per_token_group_quant_fp8,per_token_group_quant_fp8,benchmark/test_per_token_group_quant_fp8.py,,yes,per_token_group_quant_fp8
|
||||
vllm,persistent_topk,persistent_topk,benchmark/test_persistent_topk.py,,yes,persistent_topk
|
||||
vllm,reglu,reglu,benchmark/test_reglu.py,,yes,reglu
|
||||
vllm,reshape_and_cache,reshape_and_cache,benchmark/test_reshape_and_cache.py,,yes,reshape_and_cache
|
||||
vllm,reshape_and_cache_flash,reshape_and_cache_flash,benchmark/test_reshape_and_cache_flash.py,,yes,reshape_and_cache_flash
|
||||
vllm,perf_router_gemm,router_gemm,benchmark/test_router_gemm.py,,yes,router_gemm
|
||||
vllm,rwkv_ka_fusion,rwkv_ka_fusion,benchmark/test_rwkv_ka_fusion.py,,yes,rwkv_ka_fusion
|
||||
vllm,rwkv_mm_sparsity,rwkv_mm_sparsity,benchmark/test_rwkv_mm_sparsity.py,,yes,rwkv_mm_sparsity
|
||||
vllm,dynamic_scaled_int8_quant,scaled_int8_quant,benchmark/test_scaled_int8_quant.py,,yes,dynamic_scaled_int8_quant
|
||||
vllm,static_scaled_int8_quant,scaled_int8_quant,benchmark/test_scaled_int8_quant.py,,yes,static_scaled_int8_quant
|
||||
vllm,silu_and_mul,silu_and_mul,benchmark/test_silu_and_mul.py,,yes,silu_and_mul
|
||||
vllm,silu_and_mul_out,silu_and_mul,benchmark/test_silu_and_mul.py,,yes,silu_and_mul_out
|
||||
vllm,silu_and_mul_with_clamp,silu_and_mul_with_clamp,benchmark/test_silu_and_mul_with_clamp.py,,yes,silu_and_mul_with_clamp
|
||||
vllm,silu_and_mul_with_clamp_out,silu_and_mul_with_clamp,benchmark/test_silu_and_mul_with_clamp.py,,yes,silu_and_mul_with_clamp_out
|
||||
vllm,skip_layernorm,skip_layer_norm,benchmark/test_skip_layer_norm.py,,yes,skip_layer_norm
|
||||
vllm,sparse_attn_triton,sparse_attention,benchmark/test_sparse_attention.py,yes,yes,sparse_attention
|
||||
vllm,sparse_mla_fwd_interface,sparse_mla_fwd_interface,benchmark/test_sparse_mla_fwd_interface.py,,yes,sparse_mla_fwd_interface
|
||||
vllm,stage_deepseek_v4_mega_moe_inputs_benchmark,stage_deepseek_v4_mega_moe_inputs,benchmark/test_stage_deepseek_v4_mega_moe_inputs.py,,yes,
|
||||
vllm,swiglu,swiglu,benchmark/test_swiglu.py,,yes,swiglu
|
||||
vllm,top_k_per_row_decode,top_k_per_row_decode,benchmark/test_top_k_per_row_decode.py,,yes,top_k_per_row_decode
|
||||
vllm,top_k_per_row_prefill,top_k_per_row_prefill,benchmark/test_top_k_per_row_prefill.py,,yes,top_k_per_row_prefill
|
||||
vllm,topk_softmax,topk_softmax,benchmark/test_topk_softmax.py,,yes,topk_softmax
|
||||
vllm,topk_softplus_sqrt,topk_softplus_sqrt,benchmark/test_topk_softplus_sqrt.py,,yes,topk_softplus_sqrt
|
||||
vllm,triton_scaled_mm_benchmark,triton_scaled_mm,benchmark/test_triton_scaled_mm.py,,yes,triton_scaled_mm
|
||||
vllm,triton_unified_attention_perf,triton_unified_attention_perf,benchmark/test_triton_unified_attention_perf.py,,yes,
|
||||
vllm,unpack_seq,unpack_seq,benchmark/test_unpack_seq.py,,yes,unpack_seq_triton
|
||||
vllm,unpack_seq_fp8,unpack_seq,benchmark/test_unpack_seq.py,,yes,unpack_seq_triton
|
||||
vllm,weight_norm_dim0,weight_norm,benchmark/test_weight_norm.py,,yes,weight_norm
|
||||
vllm,weight_norm_dim_last,weight_norm,benchmark/test_weight_norm.py,,yes,weight_norm
|
||||
vllm,weight_norm_interface,weight_norm_interface,benchmark/test_weight_norm_interface.py,,yes,weight_norm_interface
|
||||
vllm,weight_norm_interface_backward,weight_norm_interface,benchmark/test_weight_norm_interface.py,,yes,weight_norm_interface_backward
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user