liangsu9988's picture
Uploaded using `kernel-builder`.
dc7e967 verified
Raw
History Blame
2.99 kB
#!/usr/bin/env python3
"""Higgs delayed-codebook benchmark against eager/compile and raw op."""
from __future__ import annotations
import argparse
import importlib
import sys
from pathlib import Path
import torch
def elapsed_us(fn, warmup, iterations):
for _ in range(warmup):
fn()
torch.cuda.synchronize()
start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)
start.record()
for _ in range(iterations):
fn()
end.record()
end.synchronize()
return start.elapsed_time(end) * 1000.0 / iterations
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--backend", choices=("source", "installed"), default="source")
parser.add_argument("--artifact")
parser.add_argument("--warmup", type=int, default=50)
parser.add_argument("--iterations", type=int, default=500)
args = parser.parse_args()
if args.backend == "source":
tests = Path(__file__).resolve().parents[1] / "tests"
sys.path.insert(0, str(tests))
from test_audio_codebook_primitives import load_source_ops
ops = load_source_ops()
else:
if args.artifact:
sys.path.insert(0, args.artifact)
ops = importlib.import_module("audio_codebook_primitives")
c, v, h, delay, boc = 8, 1026, 1024, 7, 1024
logits = torch.randn((c, v), device="cuda", dtype=torch.bfloat16)
codebook = torch.randn((c, v, h), device="cuda", dtype=torch.bfloat16)
index = torch.arange(c, device="cuda")
active = index <= delay
boc_tensor = torch.full((c,), boc, device="cuda", dtype=torch.int64)
def eager():
codes = torch.where(active, logits.argmax(dim=1), boc_tensor)
embedding = codebook[index, codes].float().sum(dim=0).bfloat16()
return codes, embedding
compiled = torch.compile(eager, fullgraph=True)
codes = torch.empty(c, device="cuda", dtype=torch.int64)
embedding = torch.empty(h, device="cuda", dtype=torch.bfloat16)
def wrapper():
return ops.delayed_codebook_argmax_embed_bf16(
logits, codebook, delay=delay, boc=boc,
codes=codes, embedding=embedding
)
namespace = ops.ops
def raw():
namespace.delayed_codebook_argmax_embed_bf16(
logits, codebook, delay, boc, codes, embedding
)
expected = eager()
actual = wrapper()
torch.testing.assert_close(actual[0], expected[0], rtol=0, atol=0)
torch.testing.assert_close(actual[1], expected[1], rtol=0, atol=0)
rows = {
"torch_eager_us": elapsed_us(eager, args.warmup, args.iterations),
"torch_compile_us": elapsed_us(compiled, args.warmup, args.iterations),
"hub_wrapper_us": elapsed_us(wrapper, args.warmup, args.iterations),
"raw_native_op_us": elapsed_us(raw, args.warmup, args.iterations),
}
for name, value in rows.items():
print(f"{name}={value:.3f}")
if __name__ == "__main__":
main()