Skip to content

DeepGEMM rejects FP8 block-scaled weights with Unknown SF transformation on an unsupported architecture

A block-scaled FP8 checkpoint fails while its weights are being prepared, before the server ever accepts a request. The runtime selected a specialised matrix-multiply library for the detected architecture, and that library does not implement the scale-factor layout this class of device requires, so it refuses the transformation outright.

Quick answer

The runtime picked a kernel library your GPU is not actually supported by, because the support check accepts a whole capability family. Use a general-purpose quantised path, a per-tensor checkpoint, or a data-centre part of the same generation.

Inference#fp8#block-scaled#deepgemm#sm120#blackwell#compressed-tensors

What this failure is

A load-time failure in which a serving runtime selects a specialised FP8 matrix-multiply library for a device inside an accepted compute-capability family, and the library has no scale-factor layout transformation implemented for that architecture.

Why it happens (the mechanism)

Kernel selection has to decide from something, and compute capability is the number available at runtime. Grouping it into families is a reasonable approximation right up until a family contains parts with genuinely different capabilities, which is what happens when a generation spans consumer and data-centre silicon. The runtime then admits a device to a fast path whose library never claimed it, and the refusal comes from the library rather than from the check that should have made it.

What you'll observe

  • The failure is at weight preparation, so nothing serves and there is no partial capability to fall back to
  • The message is from a kernel library's internals and names a layout concept, not a device or a model
  • The same checkpoint loads correctly on data-centre parts of the same generation
  • Both workers fail identically, which makes it look like a model problem rather than a hardware-support one

Common symptoms and what they mean

SymptomWhy it happens
RuntimeError: Assertion error naming a layout header and the text Unknown SF transformationBlock scaling stores a grid of scale factors alongside the weights, and a kernel consumes them in a device-specific arrangement. Transforming the stored grid into that arrangement is a per-architecture routine, and a device family the library has not implemented has no routine to call — hence a refusal naming the transformation rather than the device.
The failure raised from process_weights_after_loading, during load and before any inference requestThe runtime reached that library because its support check groups compute capability into families and accepts the whole family. Consumer and data-centre parts of a generation share a capability family while differing in the tensor-core and memory features these kernels are written against, so the check admits a device the kernel library never claimed.
A call chain descending from the quantisation scheme into a scaled matrix-multiply kernel and then into scale-factor layout transformationIt fails during preparation because that is when the scales are rearranged into the layout the kernel expects. This is fortunate: the alternative would be selecting an unsupported path at request time, after the service had reported itself healthy.
Every tensor-parallel worker failing at the same point, since they all prepare the same weightsBlock scaling stores a grid of scale factors alongside the weights, and a kernel consumes them in a device-specific arrangement. Transforming the stored grid into that arrangement is a per-architecture routine, and a device family the library has not implemented has no routine to call — hence a refusal naming the transformation rather than the device.

Which systems are affected

  • Block-scaled FP8 checkpoints, where each block of weights carries its own scale rather than one scale per tensor
  • Consumer Blackwell parts reporting compute capability 12.0, which the runtime groups with data-centre Blackwell for kernel selection
  • Serving runtimes that choose a specialised GEMM library from a compute-capability family rather than from a tested device list
  • Tensor-parallel deployments, where the identical preparation runs on every worker and fails on all of them

How to confirm this is the problem

Apply the following checklist to a small reproduction: each box below is a positive signal that you are looking at this exact failure rather than a sibling in the same taxonomy.

  • Check the reported compute capability of the device against the parts the kernel library documents. A capability inside an accepted family but outside the implemented list is the whole condition.
  • Load a per-tensor quantised version of the same model. Succeeding where the block-scaled one failed confirms the scale layout rather than the checkpoint.
  • Force a general-purpose quantised path and reload. Starting successfully identifies kernel selection as the decision that failed.

Example training logs (fingerprint)

training.log (synthetic fingerprint)
RuntimeError: Assertion error (/workspace/.deps/deepgemm-src/csrc/apis/layout.hpp:60): Unknown SF transformation
compressed_tensors_w8a8_fp8.py:169  process_weights_after_loading
  -> kernels/linear/scaled_mm/deep_gemm.py:96  process_weights_after_loading
    -> quantization/utils/fp8_utils.py:1077  deepgemm_post_process_weight_scale_block
      -> utils/deep_gemm.py:494  transform_sf_into_required_layout

Timestamps and exact values vary across runs, but the pattern. An info-level start, an early WARN, an ERROR carrying the symptom. Is the actual fingerprint you should alert on. The Denpex platform flags this combination automatically.

Root cause, fix & prevention, signed in

Sign up free to see why this failure really happens, the exact remediation steps, and the production-grade prevention pattern. You also get 3 free full diagnoses for your own training logs.

Sign up free. Unlock the full analysis

No credit card · 3 free diagnoses · Instant access

Why the recommended fix works

A general-purpose quantised kernel is written against the baseline features of the architecture rather than against a specific product's tensor cores, so it covers the device at a lower throughput. Moving to per-tensor scaling removes the requirement entirely, because a single scale per tensor needs no layout transformation. Both replace an unimplemented routine with one that exists, which is the only thing standing between the checkpoint and a running server.

Code examples

typical reference pattern
// Typical pattern:
import torch.optim as optim
optimizer = optim.AdamW(model.parameters(), lr=3e-4)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_training_steps)
for step in range(num_training_steps):
    optimizer.zero_grad()
    loss = model(batch)
    loss.backward()
    optimizer.step()
    scheduler.step()

Adapt the snippet to your framework. The same pattern holds for PyTorch Lightning, Hugging Face Trainer, DeepSpeed, Megatron-LM, and vLLM training wrappers. Where the wrapper exposes a config flag (for examplelr_scheduler_type in Trainer), prefer the flag over the imperative API to keep the schedule declarative and reproducible.

Best practices by model family

Model / StackRecommendationNotes
Consumer Blackwell, block-scaled FP8General-purpose quantised pathLower throughput, but the kernel exists.
Consumer part, any FP8Per-tensor scaled checkpointNo scale-factor layout transformation required.
Data-centre partKeep the specialised libraryThis is the hardware the fast path targets.
Memory permitsServe in half precisionAvoids quantised kernel selection altogether.

With the fix vs without the fix

DimensionWith the fixWithout the fix
What decided the kernelA compute-capability familyAssumed to be a tested device list
Where it failsWeight preparation, before servingExpected at request time
Is the checkpoint at faultNo, the kernel path isInvestigated as a bad download

Real engineering notes

Worth internalising: a support check that reasons about a capability family is a guess about hardware, and the guess is wrong exactly where a generation spans market segments. When a quantised model refuses to load on a consumer card of an otherwise supported generation, look at the kernel selection logic before you look at the checkpoint. The checkpoint is usually fine and will load the moment a different path is chosen.

Visual fingerprint

A capability family is not a support matrix
  device reports capability 12.0
        |
        v
  runtime: family 100 or 120 -> select specialised FP8 library
        |
        v
  library: transform block scales into required layout
        |
        v
  no routine for this architecture -> Unknown SF transformation
The runtime admits the device on the strength of its capability family, then the kernel library is asked for a per-architecture routine it never implemented. The refusal comes from the library, one level below the decision that caused it.

Root cause, fix & prevention

Frequently asked questions

Twelve targeted questions that engineers and on-call staff most commonly ask about this failure.

Is my checkpoint corrupt?
No. It loads on hardware where the specialised kernel library is implemented. The failure is in kernel selection, not in the weights.
My GPU is the right generation. Why is it unsupported?
Compute capability groups consumer and data-centre parts into one family while their tensor-core features differ. The runtime accepts the family; the kernel library implements specific parts.
What does the fallback cost?
Throughput. A general-purpose quantised kernel is written against baseline architecture features rather than a specific product's fast paths.
Would a newer runtime fix it?
Only if it narrows the support check or the kernel library adds the architecture. Both are upstream changes; neither is something the checkpoint can express.

Don't just read the fix, diagnose your run

The encyclopedia tells you what went wrong. Denpex tells you what went wrong in YOUR training run. With your logs, your config, and your stack.