Source: github.com/wudixzy/competition (1527 files, BI-V100 competition reference)
Imported assets:
- 12 prebuilt CoreX .so extensions (corex-3.2.3-ivcore10):
corex_gdn_{beta_decay,causal_conv,gated_norm,packed_decode,qk_map}.so
corex_moe_{direct_routed,exact_reduce,weight_gather}.so
corex_attn_head_rms_norm.so, corex_paged_kv_gather.so
corex_block_major_kv_transfer.so, corex_fused_paged_prefill.so
- 13 CUDA kernel sources (.cu) for above extensions
- 11 build scripts (build_corex_*.sh)
- install_prebuilt_corex.sh (SHA256-verified .so deployment)
- qwen3_5.py (2615 lines) with FULL corex kernel integration
- 9 vllm vendor override files (block manager, sampler, etc)
- 19 patch scripts (model_runner, xformers, block_major, etc)
- Complete serving layer (serving_chat, protocol, api_server, etc)
- bi100_env.py, bi100_profile.py, gdn_prefix.py, block_major_kv_cache.py
- Dockerfile aligned with reference build chain
- computility-run.yaml with BI100_MOE_COREX_DIRECT_ROUTED=1
Call chain verified:
Dockerfile COPY → patch_ops.sh → install_prebuilt_corex.sh → 12 .so to $VLLM_ROOT
qwen3_5.py imports: from vllm import corex_gdn_* / corex_moe_* / corex_attn_*
238 lines
7.4 KiB
Python
238 lines
7.4 KiB
Python
import contextlib
|
|
import fnmatch
|
|
import functools
|
|
import json
|
|
import os
|
|
import re
|
|
import threading
|
|
import time
|
|
|
|
from vllm.logger import init_logger
|
|
|
|
logger = init_logger(__name__)
|
|
_EVENT_SCHEMA = "bi100-profile-event-v1"
|
|
_EVENT_VERSION = 1
|
|
_NAME_RE = re.compile(r"^[A-Za-z][A-Za-z0-9_.-]{0,63}$")
|
|
_FILTER_RE = re.compile(r"^[A-Za-z][A-Za-z0-9_.*?-]{0,63}$")
|
|
|
|
|
|
def _strict_bool(name: str, default: str = "0") -> bool:
|
|
value = os.getenv(name, default).strip()
|
|
if value not in {"0", "1"}:
|
|
raise RuntimeError(f"{name} must be exactly 0 or 1, got {value!r}")
|
|
return value == "1"
|
|
|
|
|
|
_ENABLED = _strict_bool("BI100_PROFILE")
|
|
_INCLUDE_STARTUP = _strict_bool("BI100_PROFILE_INCLUDE_STARTUP")
|
|
_MODE = os.getenv("BI100_PROFILE_MODE", "sync").strip().lower()
|
|
_FILTERS = tuple(
|
|
item.strip()
|
|
for item in os.getenv("BI100_PROFILE_FILTER", "").split(",")
|
|
if item.strip()
|
|
)
|
|
if _ENABLED and _MODE not in {"sync", "event"}:
|
|
raise RuntimeError(f"unsupported BI100_PROFILE_MODE={_MODE!r}")
|
|
if _ENABLED and any(_FILTER_RE.fullmatch(pattern) is None
|
|
for pattern in _FILTERS):
|
|
raise RuntimeError("BI100_PROFILE_FILTER contains an invalid pattern")
|
|
|
|
_EVENT_RECORDS = []
|
|
_COUNTERS = {}
|
|
_LOCK = threading.Lock()
|
|
_FORWARD_INDEX = 0
|
|
_LAST_FLUSH_NS = None
|
|
_ACTIVE_FORWARD_TOKEN = None
|
|
_NEXT_FORWARD_TOKEN = 0
|
|
|
|
|
|
def _enabled_for(name: str) -> bool:
|
|
return (_ENABLED
|
|
and (not _FILTERS
|
|
or any(fnmatch.fnmatchcase(name, pattern)
|
|
for pattern in _FILTERS)))
|
|
|
|
|
|
def _skip_startup() -> bool:
|
|
return (not _INCLUDE_STARTUP
|
|
and os.getenv("BI100_IN_STARTUP_PROFILE") == "1")
|
|
|
|
|
|
def bi100_profile_event_enabled() -> bool:
|
|
return _ENABLED and _MODE == "event" and not _skip_startup()
|
|
|
|
|
|
def _begin_profile_forward():
|
|
global _ACTIVE_FORWARD_TOKEN, _NEXT_FORWARD_TOKEN
|
|
if not bi100_profile_event_enabled():
|
|
return None
|
|
with _LOCK:
|
|
_EVENT_RECORDS.clear()
|
|
_COUNTERS.clear()
|
|
token = _NEXT_FORWARD_TOKEN
|
|
_NEXT_FORWARD_TOKEN += 1
|
|
_ACTIVE_FORWARD_TOKEN = token
|
|
return token
|
|
|
|
|
|
def _abort_profile_forward(token) -> None:
|
|
global _ACTIVE_FORWARD_TOKEN
|
|
if token is None:
|
|
return
|
|
with _LOCK:
|
|
if _ACTIVE_FORWARD_TOKEN != token:
|
|
return
|
|
_EVENT_RECORDS.clear()
|
|
_COUNTERS.clear()
|
|
_ACTIVE_FORWARD_TOKEN = None
|
|
|
|
|
|
def bi100_profile_transaction(function):
|
|
"""Keep one top-level model forward isolated from failed forwards."""
|
|
@functools.wraps(function)
|
|
def wrapped(*args, **kwargs):
|
|
token = _begin_profile_forward()
|
|
if token is None:
|
|
return function(*args, **kwargs)
|
|
try:
|
|
result = function(*args, **kwargs)
|
|
except BaseException:
|
|
_abort_profile_forward(token)
|
|
raise
|
|
with _LOCK:
|
|
was_flushed = _ACTIVE_FORWARD_TOKEN != token
|
|
if not was_flushed:
|
|
_abort_profile_forward(token)
|
|
raise RuntimeError(
|
|
"BI100 profile transaction completed without a flush")
|
|
return result
|
|
|
|
return wrapped
|
|
|
|
|
|
def _normalize_metadata(metadata):
|
|
normalized = {}
|
|
for key, value in metadata.items():
|
|
if not isinstance(key, str) or _NAME_RE.fullmatch(key) is None:
|
|
raise TypeError("profile metadata keys must be bounded names")
|
|
if isinstance(value, bool):
|
|
normalized[key] = value
|
|
elif isinstance(value, int) and not isinstance(value, bool):
|
|
normalized[key] = value
|
|
elif isinstance(value, str) and len(value) <= 64:
|
|
normalized[key] = value
|
|
else:
|
|
raise TypeError(
|
|
"profile metadata values must be bool, int, or short strings")
|
|
return normalized
|
|
|
|
|
|
def bi100_profile_count(name: str, **metadata) -> None:
|
|
"""Record privacy-safe path metadata for the current model forward."""
|
|
if not bi100_profile_event_enabled() or not _enabled_for(name):
|
|
return
|
|
if not isinstance(name, str) or _NAME_RE.fullmatch(name) is None:
|
|
raise TypeError("profile counter name must be a bounded name")
|
|
normalized = _normalize_metadata(metadata)
|
|
encoded = json.dumps(
|
|
{"name": name, **normalized}, sort_keys=True, separators=(",", ":"))
|
|
with _LOCK:
|
|
_COUNTERS[encoded] = _COUNTERS.get(encoded, 0) + 1
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def bi100_timer(name: str):
|
|
if not _enabled_for(name) or _skip_startup():
|
|
yield
|
|
return
|
|
import torch
|
|
|
|
if _MODE == "event":
|
|
started = torch.cuda.Event(enable_timing=True)
|
|
finished = torch.cuda.Event(enable_timing=True)
|
|
host_started_ns = time.monotonic_ns()
|
|
started.record()
|
|
try:
|
|
yield
|
|
finally:
|
|
finished.record()
|
|
with _LOCK:
|
|
_EVENT_RECORDS.append(
|
|
(name, started, finished, host_started_ns))
|
|
return
|
|
|
|
torch.cuda.synchronize()
|
|
t0 = time.perf_counter()
|
|
try:
|
|
yield
|
|
finally:
|
|
torch.cuda.synchronize()
|
|
logger.info("[BI100_PROFILE] %s %.3f ms", name,
|
|
(time.perf_counter() - t0) * 1000)
|
|
|
|
|
|
def bi100_profile_flush(*, tp_rank, **metadata):
|
|
"""Synchronize once and emit one aggregate event record per model forward."""
|
|
global _ACTIVE_FORWARD_TOKEN, _FORWARD_INDEX, _LAST_FLUSH_NS
|
|
if not bi100_profile_event_enabled():
|
|
return None
|
|
if (not isinstance(tp_rank, int) or isinstance(tp_rank, bool)
|
|
or not 0 <= tp_rank < 256):
|
|
raise TypeError("profile TP rank must be an integer in [0, 255]")
|
|
normalized_metadata = _normalize_metadata(metadata)
|
|
|
|
with _LOCK:
|
|
records = list(_EVENT_RECORDS)
|
|
counters = dict(_COUNTERS)
|
|
_EVENT_RECORDS.clear()
|
|
_COUNTERS.clear()
|
|
_ACTIVE_FORWARD_TOKEN = None
|
|
if not records:
|
|
return None
|
|
|
|
import torch
|
|
|
|
torch.cuda.synchronize()
|
|
flushed_ns = time.monotonic_ns()
|
|
regions = {}
|
|
model_started_ns = []
|
|
for name, started, finished, host_started_ns in records:
|
|
stats = regions.setdefault(name, {"count": 0, "total_ms": 0.0})
|
|
stats["count"] += 1
|
|
stats["total_ms"] += float(started.elapsed_time(finished))
|
|
if name == "model.forward":
|
|
model_started_ns.append(host_started_ns)
|
|
|
|
counter_rows = []
|
|
for encoded, count in sorted(counters.items()):
|
|
row = json.loads(encoded)
|
|
row["count"] = count
|
|
counter_rows.append(row)
|
|
|
|
first_model_started_ns = (
|
|
min(model_started_ns) if model_started_ns else None)
|
|
payload = {
|
|
"schema": _EVENT_SCHEMA,
|
|
"version": _EVENT_VERSION,
|
|
"tp_rank": tp_rank,
|
|
"forward_index": _FORWARD_INDEX,
|
|
"metadata": normalized_metadata,
|
|
"event_count": len(records),
|
|
"model_forward_event_count": len(model_started_ns),
|
|
"regions": regions,
|
|
"counters": counter_rows,
|
|
"host_model_start_to_flush_ms": (
|
|
(flushed_ns - first_model_started_ns) / 1_000_000
|
|
if first_model_started_ns is not None else None),
|
|
"host_gap_since_previous_flush_ms": (
|
|
(first_model_started_ns - _LAST_FLUSH_NS) / 1_000_000
|
|
if first_model_started_ns is not None
|
|
and _LAST_FLUSH_NS is not None
|
|
else None),
|
|
}
|
|
_FORWARD_INDEX += 1
|
|
_LAST_FLUSH_NS = flushed_ns
|
|
logger.info("[BI100_PROFILE_EVENT] %s",
|
|
json.dumps(payload, sort_keys=True, separators=(",", ":")))
|
|
return payload
|