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
- Set all four backward block sizes explicitly
- 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
- Set backward blocks via one helper that takes all four values together
- Assert cfg.has_backward_blocks before jax.grad calls
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
- Need to specify backward blocks.
- {self.block_q=} must be a multiple of 64
- {self.block_kv=} must be a multiple of 64
- {self.max_concurrent_steps=} must be at least 2
- Causal attention not supported in the backwards pass yet.
AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28).
Data as JSON: /api/errors/99a5dc19e21fbd0b.
Report an issue: GitHub.