clef-serve.yaml: Service selector -> app: clef-candle
kustomization: clef-candle.yaml added
Why one GPU
The GDN recurrent state is per-sequence and cannot be sharded the way attention KV can.
Image
forgejo.riotpiao.com/riotpiao-poimen/candle-vllm:sm70, built by .gitea/workflows/candle-vllm-sm70.yaml on merge to main.
IMPORTANT: it must be a build containing the GDN conv fix (candle-vllm PR #5). Older :sm70 images zero the key channel band in causal_conv1d_fwd, which starves the delta rule and makes every linear-attention layer return zero. That failure is silent: the response is well formed, just wrong.
Verification vs reference
token ids 420/420 identical
beta 8647.021 vs 8646.982
delta-rule and gated-norm absmax equal to six decimals
all three head answers agree (medium / no rollback / bucket 2)
Keep the reference pytorch clef-serve Deployment at replicas 0
Serves clef-flash on candle-vllm (1 V100) and repoints the clef-serve Service at it. Service name and ClusterIP do not move, so clients are unchanged.
## What
- clef-candle.yaml: clef-flash, hybrid Qwen3_5 (8 attention + 24 GDN layers), 1 GPU, --dtype f16, --kv-fraction 0.30 (~66.8K KV tokens)
- clef-serve.yaml: Service selector -> app: clef-candle
- kustomization: clef-candle.yaml added
## Why one GPU
The GDN recurrent state is per-sequence and cannot be sharded the way attention KV can.
## Image
forgejo.riotpiao.com/riotpiao-poimen/candle-vllm:sm70, built by .gitea/workflows/candle-vllm-sm70.yaml on merge to main.
IMPORTANT: it must be a build containing the GDN conv fix (candle-vllm PR #5). Older :sm70 images zero the key channel band in causal_conv1d_fwd, which starves the delta rule and makes every linear-attention layer return zero. That failure is silent: the response is well formed, just wrong.
## Verification vs reference
- token ids 420/420 identical
- beta 8647.021 vs 8646.982
- delta-rule and gated-norm absmax equal to six decimals
- all three head answers agree (medium / no rollback / bucket 2)
## Merge order
1. Merge candle-vllm PR #5 and let CI publish :sm70
2. Merge this
3. Keep the reference pytorch clef-serve Deployment at replicas 0
Creates coder-predictor selecting app=candle-vllm on ports 80 and 8080, so
clients keep one stable host name across the vLLM -> candle-vllm handoff and
only this selector changes from now on.
The retired KTML predictor requested two V100s and never reached Ready.
clef-serve was parked at 0 while candle-vllm took a card. worker-1 holds
four V100s, so the coder takes one and clef takes one, leaving two free
for a TP=2 candle run.
The gateway already routes the clef-flash model to clef-serve:80 on
/v1/systemone, so this single replica count is what turns that route on.
Replace the GPTQ W4A16 30B-A3B coder with Qwen2.5-Coder-14B-Instruct at
fp16 on TP=2.
The V100 has FP16 tensor cores and no INT4 ones, so the 4-bit path paid a
dequantisation pass on the SM. Profiling showed SM at 98% with the memory
controller at 19%, and the batch-1 step cost matched a full-model read.
Same harness, 16 streams: ITL 71.5 -> 39.7 ms, 215 -> 287 tok/s.
The deployment keeps the candle-vllm name and the app: candle-vllm label,
so coder-service.yaml and every client keep working unchanged.
Without it the container runs under runc, libcuda.so is never injected and
candle-vllm panics in cudarc at startup. The pod reached Running but crashed
on every restart.
Verified live: pod Ready, coder-predictor endpoints populated, /v1/models
reports coder-14b-fp16 and a completion returns OK.
Adds clef-candle.yaml: clef-flash (hybrid Qwen3_5, 8 attention + 24 GDN
layers) on one V100 via candle-vllm, and repoints the clef-serve Service
selector at it. The Service name and ClusterIP do not move, so no client
changes.
Runs on one card because the GDN recurrent state is per-sequence and cannot
be sharded the way attention KV can. --kv-fraction 0.30 gives about 66.8K KV
tokens, which is ample for a single-shot classifier-style endpoint.
The image is candle-vllm:sm70, built by .gitea/workflows/candle-vllm-sm70.yaml
on every merge to main. It must be a build containing the GDN conv fix: older
images zero the key channel band in causal_conv1d_fwd, starve the delta rule
and make every linear-attention layer return zero. That failure is silent -
the response is well formed, just wrong.
Verified against the reference implementation: token ids 420/420 identical,
beta 8647.021 vs 8646.982, delta-rule and gated-norm absmax equal to six
decimals, all three head answers agree.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Serves clef-flash on candle-vllm (1 V100) and repoints the clef-serve Service at it. Service name and ClusterIP do not move, so clients are unchanged.
What
Why one GPU
The GDN recurrent state is per-sequence and cannot be sharded the way attention KV can.
Image
forgejo.riotpiao.com/riotpiao-poimen/candle-vllm:sm70, built by .gitea/workflows/candle-vllm-sm70.yaml on merge to main.
IMPORTANT: it must be a build containing the GDN conv fix (candle-vllm PR #5). Older :sm70 images zero the key channel band in causal_conv1d_fwd, which starves the delta rule and makes every linear-attention layer return zero. That failure is silent: the response is well formed, just wrong.
Verification vs reference
Merge order