FLA KDA kernel workflow and public technical notes. Use when modifying or reviewing fla/ops/kda/**, KDA gate modes, chunk intra/inter kernels, safe_gate behavior, KDA backends, or KDA-specific tests and benchmarks.
68
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Use this skill for KDA-specific work under fla/ops/kda/** and tests that
exercise KDA behavior.
fla.ops.kda.chunk_kda, fla.ops.kda.fused_recurrent_kda.naive_kda_gate, naive_kda_lowerbound_gate,
kda_gate_fwd, kda_gate_bwd, fused_kda_gate,
kda_gate_chunk_cumsum in fla/ops/kda/gate.py.chunk_kda_fwd in chunk_fwd.py.chunk_kda_fwd_intra,
chunk_kda_fwd_kernel_intra_sub_chunk,
chunk_kda_fwd_kernel_inter_solve_fused in chunk_intra.py.chunk_kda_fwd_intra_token_parallel in
chunk_intra_token_parallel.py.recompute_w_u_fwd and recompute_w_u_fwd_kda_kernel in
wy_fast.py.chunk_kda_bwd, chunk_kda_bwd_intra,
chunk_kda_bwd_wy_dqkg_fused.FlashKDABackend, KDATileLangBackend.chunk_kda has two gate input contracts:
use_gate_in_kernel=False.
g is already the log-space decay tensor.A_log, dt_bias, and lower_bound are not part of the gate activation.use_gate_in_kernel=True.
g is raw gate input.A_log is required and dt_bias is optional.safe_gate, activation is -exp(A_log) * softplus(g + dt_bias).safe_gate, activation is
lower_bound * sigmoid(exp(A_log) * (g + dt_bias)).safe_gate=True requires use_gate_in_kernel=True, lower_bound is not None,
and -5 <= lower_bound < 0.
With lower_bound=-5, every per-token gate value is in [-5, 0) before the
RCP_LN2 conversion used by chunk_kda_fwd. A 16-token sub-chunk can therefore
accumulate -80 in natural-log units. Directly feeding the full span to exp2
would be larger in base-2 units, so the safe intra path relies on offsetting.
chunk_kda_fwd_kernel_intra_sub_chunk uses a midpoint offset before
exponentiation:
b_gm = b_g - b_gn;exp2(b_gm) and exp2(-b_gm).With the midpoint offset, each exponent operand covers at most about half of the
16-token sub-chunk. Under lower_bound=-5, this is about 40 / ln(2), which is
below the kernel's exp2 safety comment threshold. The important invariant is
not the raw cumulative value alone; it is that each exponentiation uses a local
offset rather than the full chunk cumsum directly.
For inter-subchunk work, chunk_kda_fwd_kernel_inter_solve_fused computes decay
ratios with paired offsets such as:
exp2(b_g1 - b_gn1) and exp2(b_gn1 - b_g0);exp2(b_g2 - b_gn2) and exp2(b_gn2 - b_g1).Both terms are non-positive under monotonic accumulated decay, so the off-diagonal inter path avoids positive exponent growth. The triangular solve operates on masked lower-triangular blocks, so it does not introduce an unbounded exponent path.
chunk_kda_fwd_intra(..., safe_gate=True) calls
chunk_kda_fwd_kernel_intra_sub_chunk for 16-token diagonal blocks, then
calls chunk_kda_fwd_kernel_inter_solve_fused with USE_SAFE_GATE=True.safe_gate=False calls chunk_kda_fwd_intra_token_parallel
for diagonal blocks, then calls the same inter/solve kernel with
USE_SAFE_GATE=False.Before finishing a KDA behavior change, use fla-correctness-coverage and cover
only axes affected by the change:
use_qk_l2norm_in_kernel=True/False where relevant;HV > H);D != Dv when value dimension is involved;return_intermediate_states, and CP paths when touched;lower_bound=-5, a lower bound close to 0, large positive and negative
g + dt_bias, extreme A_log, long-sequence cumulative decay, chunk
boundaries, and ragged varlen boundaries.fla.utils (device, device_platform, IS_NVIDIA,
IS_NVIDIA_HOPPER, IS_NVIDIA_BLACKWELL, IS_AMD, IS_INTEL) instead of
adding new direct torch.cuda platform checks in tests or public code. If no
helper covers the condition, add one in fla.utils first.27967b9
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.