Skip to content

Hopper: build joyomni_ops for sm_90a, not sm_90 (FP8 GEMM aborts at launch on H100) - #27

Open
stayinalive181 wants to merge 1 commit into
jd-opensource:mainfrom
stayinalive181:hopper-sm90a
Open

stayinalive181 wants to merge 1 commit into
jd-opensource:mainfrom
stayinalive181:hopper-sm90a

Conversation

@stayinalive181

Copy link
Copy Markdown

Problem

fp8_scaled_mm in deploy/joyomni_ops selects cutlass' KernelTmaWarpSpecializedPingpongFP8FastAccum, whose WGMMA path is arch-conditional. Compiled as plain sm_90 it builds cleanly, imports cleanly and reports has_fp8() == True, then aborts on every kernel launch:

cutlass/gemm/kernel/sm90_gemm_tma_warpspecialized_pingpong.hpp:368:
Assertion `0 && "ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting."' failed.

On the streaming server that shows up as a device-side assert during CUDA graph capture, after which mem_get_info fails and the process exits during FastAPI startup:

#####[GRAPH] capture failed (attempt 1/2), session stays eager: AcceleratorError(...)
#####[STREAM] full-pipeline warmup skipped/failed: AcceleratorError(...)
ERROR:    Application startup failed. Exiting.

Both the default arch list in deploy/joyomni_ops/setup.py and the auto-detect one-liner in DEPLOYMENT.md §2 emit 90 for Hopper, so following the published instructions on an H100 cannot produce a working build. Blackwell is already handled correctly (sm_100a / sm_120a); Hopper needs the same suffix for the same reason.

Change

  • deploy/joyomni_ops/setup.py: -gencode=arch=compute_90a,code=sm_90a instead of compute_90/sm_90, with a comment saying why; the docstring's arch list follows.
  • DEPLOYMENT.md: the auto-detect snippet appends a for compute capability 9.x as well as 10.x and later.

The compute_90 PTX fallback for toolchains older than 12.8 is untouched.

Verification

H100 80GB SXM, CUDA 12.8, torch 2.9.1+cu128, cutlass at the pinned commit. With JOYOMNI_OPS_CUDA_ARCHS=90a the CUDA graph captures, the server starts, and the 480p/24 and 720p/16 profiles run with FP8 on. Without it every run dies at startup with the output above. Nothing changes for Ampere, Ada or Blackwell builds.

The cutlass FP8 GEMM this library provides selects
KernelTmaWarpSpecializedPingpongFP8FastAccum, whose WGMMA path is
arch-conditional. Compiled as plain sm_90 it builds cleanly, imports cleanly,
and reports has_fp8() == True, then aborts on every kernel launch with
"Arch conditional MMA instruction used without targeting appropriate compute
capability". On the streaming server that surfaces as a device-side assert
during CUDA graph capture and the process exits during FastAPI startup.

Both the default arch list and the auto-detect snippet in DEPLOYMENT.md emit
`90` for Hopper, so following the published instructions on an H100 cannot
produce a working build. Blackwell is already handled correctly (sm_100a /
sm_120a); Hopper needs the same suffix for the same reason.

Verified on an H100 80GB SXM (CUDA 12.8, torch 2.9.1+cu128): with
JOYOMNI_OPS_CUDA_ARCHS=90a the graph captures and the server serves; without
it every run dies at startup.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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.

1 participant