xai-org/x-algorithm · error · ValueError

Expected {v.shape=} to be {kv_shape} (inferred from q)

Error message

Expected {v.shape=} to be {kv_shape} (inferred from q)

What it means

Same inference check as for k: v must match the kv shape (batch_size, kv_seq_len, num_kv_heads, head_dim) inferred from q and k. v's batch, kv seq length, kv head count, and head_dim must all line up.

Source

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

    q,
    k,
    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):

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Make v exactly the same shape as k
  2. Check the value projection output features equals head_dim * num_kv_heads
  3. Re-run shape checks after any slicing/padding of kv cache

Example fix

# before
v = proj_v(x[:, :kv_len - 1])  # off-by-one slice
# after
v = proj_v(x[:, :kv_len])
Defensive patterns

Strategy: validation

Validate before calling

assert v.shape == k.shape, f"v {v.shape} != k {k.shape}"

Prevention

When it happens

Trigger: v with a different head count or head_dim than k (e.g. v projected with a different value width), or mismatched sequence length after truncation/padding.

Common situations: Mismatched K and V projections in custom attention layers; slicing bugs that trim v's sequence but not k's.

Understand the failure class

Background: Tensor shape mismatch errors ("must have shape", "expected shape ... got ..."): when tensor dimensions disagree with what an op or layer was told to expect — this error's family across 6 libraries.

Related errors


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