{"record":{"id":"5203588b0eaea842","repo":"huggingface/transformers","slug":"deepgemm-sf-must-be-2d-or-3d-got-sf-dim-d","errorCode":null,"errorMessage":"DeepGEMM SF must be 2D or 3D, got {sf.dim()}D","messagePattern":"DeepGEMM SF must be 2D or 3D, got (.+?)D","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/transformers/integrations/deepgemm.py","lineNumber":400,"sourceCode":"    When `expected_mn` is set and the SF's M-dim is smaller (block-quantized\n    UE8M0, e.g. DSv4-Flash compressor weights with `(N/128, K/128)` SFs), we\n    repeat the SF on the M-axis to per-row before packing — the `(INT, 1, gran_k)`\n    DeepGEMM kernel branch is the only UE8M0 path on SM100; for `gran_mn > 1`\n    the kernel only handles FP32 SFs and would otherwise reject our INT SF here.\n    \"\"\"\n    if sf.dtype == torch.float8_e8m0fnu:\n        if expected_mn is not None and sf.size(-2) < expected_mn:\n            gran_mn = expected_mn // sf.size(-2)\n            sf = sf.repeat_interleave(gran_mn, dim=-2)\n        if is_sm100:\n            sf = sf.contiguous().view(torch.int32)\n        else:\n            sf = sf.float()\n    elif sf.dtype == torch.float32 and is_sm100:\n        sf = _ceil_to_ue8m0(sf)\n\n    if sf.dim() not in (2, 3):\n        raise ValueError(f\"DeepGEMM SF must be 2D or 3D, got {sf.dim()}D\")\n\n    # SM90 dispatch transforms SFA and only checks SFB (`sm90_sfb_check`), which needs\n    # an unpadded contiguous layout — DeepGEMM does the MN-major alignment itself.\n    if not is_sm100:\n        return sf.contiguous()\n\n    mn = sf.size(-2)\n    kf = sf.size(-1)\n    align_to = 16 // sf.element_size()  # `get_tma_aligned_size`: align(mn, 16 / element_size)\n    aligned_mn = -(-mn // align_to) * align_to\n    target_strides = (1, aligned_mn) if sf.dim() == 2 else (kf * aligned_mn, 1, aligned_mn)\n\n    if tuple(sf.stride()) == target_strides:\n        return sf\n    out = torch.empty_strided(sf.shape, target_strides, dtype=sf.dtype, device=sf.device)\n    out.copy_(sf)\n    return out\n","sourceCodeStart":382,"sourceCodeEnd":418,"githubUrl":"https://github.com/huggingface/transformers/blob/a597f974857b3d92939971296bc0deb93d33d780/src/transformers/integrations/deepgemm.py#L382-L418","documentation":"Error \"DeepGEMM SF must be 2D or 3D, got {sf.dim()}D\" thrown in huggingface/transformers.","triggerScenarios":"Raised in DeepGEMM scale-factor validation when the SF tensor is neither 2D nor 3D.","commonSituations":"Malformed or wrongly reshaped FP8 scale tensors in a DeepGEMM-quantized checkpoint.","solutions":["Reshape the DeepGEMM scale-factor tensor to 2D or 3D as expected by the kernel."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a597f974857b3d92939971296bc0deb93d33d780","analyzedAt":"2026-08-14T18:24:08.354Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}