xai-org/x-algorithm · error · ValueError

Backward block sizes (block_q_dkv, block_kv_dkv, block_q_dq,

Error message

Backward block sizes (block_q_dkv, block_kv_dkv, block_q_dq, block_kv_dq) must either all be specified or all be None.

What it means

TuningConfig allows overriding the four backward-pass tile sizes (block_q_dkv, block_kv_dkv, block_q_dq, block_kv_dq) only as a complete set. __post_init__ raises if some are set and others are None, to prevent half-configured backward kernels.

Source

Thrown at phoenix/xrex/pallas/ranker_attention_fa3.py:68

    compute_wgs_bwd: int = 1

    block_q_dkv: int | None = None
    block_kv_dkv: int | None = None
    block_q_dq: int | None = None
    block_kv_dq: int | None = None

    def __post_init__(self):
        if self.block_q % 64:
            raise ValueError(f"{self.block_q=} must be a multiple of 64")
        if self.block_kv % 64:
            raise ValueError(f"{self.block_kv=} must be a multiple of 64")
        if self.max_concurrent_steps < 2:
            raise ValueError(f"{self.max_concurrent_steps=} must be at least 2")

        backward_blocks = [self.block_q_dkv, self.block_kv_dkv, self.block_q_dq, self.block_kv_dq]
        block_is_set = [blk is not None for blk in backward_blocks]
        if any(block_is_set) and not all(block_is_set):
            raise ValueError(
                "Backward block sizes (block_q_dkv, block_kv_dkv, block_q_dq, "
                "block_kv_dq) must either all be specified or all be None."
            )

    @property
    def has_backward_blocks(self) -> bool:
        return self.block_q_dkv is not None


def _attention_forward(
    q,
    k,
    v,
    config: TuningConfig,
    save_residuals: bool = False,
    bound=None,
    sm_scale: float = 1.0,
    cap: float = -1.0,

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Set all four backward block sizes explicitly
  2. Or remove all backward block overrides to use defaults

Example fix

# before
cfg = TuningConfig(..., block_q_dkv=128)
# after
cfg = TuningConfig(..., block_q_dkv=128, block_kv_dkv=64, block_q_dq=128, block_kv_dq=64)
Defensive patterns

Strategy: type-guard

Validate before calling

null

Type guard

def has_all_backward_blocks(cfg) -> bool:
    blocks = (cfg.block_q_dkv, cfg.block_kv_dkv, cfg.block_q_dq, cfg.block_kv_dq)
    return all(b is None for b in blocks) or all(b is not None for b in blocks)

Prevention

When it happens

Trigger: Constructing TuningConfig with, e.g., block_q_dkv=128 but leaving block_kv_dkv/block_q_dq/block_kv_dq as None.

Common situations: Incrementally tuning only the dkv kernel's tiles; config files updated for some fields but not others after a version that added the dq overrides.

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/99a5dc19e21fbd0b. Report an issue: GitHub.