xai-org/x-algorithm · error · ValueError
q, k, and v should all have the same dtype, got: {q.dtype},
Error message
q, k, and v should all have the same dtype, got: {q.dtype}, {k.dtype}, {v.dtype} What it means
_attention_forward requires q, k, v to share one dtype because the kernel does in-register mixed-precision math (tma loads + f32 accumulate) and assumes uniform element width.
Source
Thrown at phoenix/xrex/pallas/ranker_attention_fa3.py:99
v,
config: TuningConfig,
save_residuals: bool = False,
bound=None,
sm_scale: float = 1.0,
cap: float = -1.0,
cap_method: str = "tanh",
):
if q.ndim != 4 or k.ndim != 4 or v.ndim != 4:
raise ValueError(f"q, k, and v should all be 4D, got: {q.ndim=}, {k.ndim=}, {v.ndim=}")
batch_size, q_seq_len, num_q_heads, head_dim = q.shape
_, kv_seq_len, num_kv_heads, _ = k.shape
kv_shape = (batch_size, kv_seq_len, num_kv_heads, head_dim)
if k.shape != kv_shape:
raise ValueError(f"Expected {k.shape=} to be {kv_shape} (inferred from q)")
if v.shape != kv_shape:
raise ValueError(f"Expected {v.shape=} to be {kv_shape} (inferred from q)")
if (dtype := q.dtype) != k.dtype or dtype != v.dtype:
raise ValueError(
f"q, k, and v should all have the same dtype, got: {q.dtype}, {k.dtype}, {v.dtype}"
)
if num_q_heads % num_kv_heads:
raise ValueError(f"{num_q_heads=} must be divisible by and {num_kv_heads=}")
q_heads_per_kv_head = num_q_heads // num_kv_heads
if head_dim % 64:
raise ValueError(f"{head_dim=} must be divisible by 64")
if jnp.dtype(dtype) not in map(jnp.dtype, [jnp.float16, jnp.bfloat16]):
raise NotImplementedError(f"Only f16 and bf16 are supported, got dtype: {dtype}")
max_concurrent_steps = min(config.max_concurrent_steps, kv_seq_len // config.block_kv)
block_q, block_kv = config.block_q, config.block_kv
if kv_seq_len % block_kv:
raise ValueError(f"{kv_seq_len=} must be a multiple of {block_kv=}")
def kernel(q_ref, k_ref, v_ref, bound_ref, out_ref, lse_ref, scoped):
batch = lax.axis_index("batch")
q_head = lax.axis_index("heads")View on GitHub (pinned to 24c60942c5)
Solutions
- Cast all of q, k, v to the same dtype (bf16 or fp16) at the call site
- Pick bf16 as it is the safer default for stability
Example fix
# before out = attention(q.astype(jnp.float32), k, v) # after out = attention(q.astype(k.dtype), k, v)
Defensive patterns
Strategy: validation
Validate before calling
assert q.dtype == k.dtype == v.dtype q, k, v = (x.astype(jnp.bfloat16) for x in (q, k, v))
Prevention
- Cast at the module boundary, not deep inside the model
- Set one global compute dtype constant and use it everywhere
When it happens
Trigger: Passing q in bfloat16 but k (or v) in float16 or float32 — common when q is cast for stability but kv cache stores another dtype.
Common situations: Loading a half-precision kv cache while keeping queries in fp32; mixing params saved under different dtypes after checkpoint conversion.
Related errors
- Only f16 and bf16 are supported, got dtype: {dtype}
- Only int32 is supported for unique.
- Please override this method for specific attention impl.
- Mask dimensionality {mask.ndim} must match logits dimensiona
- Invalid backward pass implementation: {backward_pass_impl}
AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28).
Data as JSON: /api/errors/d97e36a6b265477f.
Report an issue: GitHub.