|
Download README.md from mlboydaisuke/Kev-4B-CoreAI: direct link, hf CLI and curl.
- Browser
- Download file 25.6 kB
-
https://huggingface.co/mlboydaisuke/Kev-4B-CoreAI/resolve/main/README.md
- Command line
-
hf download hf://mlboydaisuke/Kev-4B-CoreAI/README.md
-
curl -L -o README.md https://huggingface.co/mlboydaisuke/Kev-4B-CoreAI/resolve/main/README.md
25.6 kB
| license: apache-2.0 | |
| base_model: jaredpalmer/kev-4b | |
| base_model_relation: quantized | |
| pipeline_tag: text-classification | |
| library_name: coreai | |
| language: | |
| - en | |
| tags: | |
| - coreai | |
| - core-ai | |
| - apple | |
| - on-device | |
| - decision-model | |
| - systemone | |
| - typed-decisions | |
| - structured-output | |
| # Kev-4B — Core AI | |
| Apple Core AI (`.aimodel`) conversion of [jaredpalmer/kev-4b](https://huggingface.co/jaredpalmer/kev-4b/tree/6cfce5c2fa4b4bd64026336ab649c5ca78857d52) (tag `v1.0`, Apache-2.0): a state and typed questions in, the probability of every option of every question out. | |
| | Variant | Path | Size | Requires | Tested on | | |
| |---|---|---:|---|---| | |
| | Decoder, fp16, with the host's pointer head | `gpu-pipelined/kev_4b_decode_fp16_metal_pf128/` | 8,431 MB | macOS 27 | M4 Max, macOS 27.0 (26A428), 2026-10-04 | | |
| One question of 94 tokens takes 100.2 ms on the M4 Max, in Swift ([measured below](#time-per-decision-on-the-mac)). | |
| ```swift | |
| import Kev | |
| let bundle = URL(filePath: "Kev-4B-CoreAI/gpu-pipelined/kev_4b_decode_fp16_metal_pf128") | |
| let kev = try await KevDecider(bundle: bundle) // asset: nil = the .aimodel, specialized here (GPU, frequent reshapes) | |
| let response = try await kev.decide(requestJSON: requestData, shared: true) // shared: the state's whole calls run once | |
| print(PythonFormat.dumps(response, asciiOnly: false)) | |
| ``` | |
| The snippet uses the [`Kev`](https://github.com/john-rocky/coreai-model-zoo/tree/main/apps/Kev) Swift package from the model zoo. The zoo card and the gate scripts live in [coreai-model-zoo](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/README.md); the rest of this page is the same text with repository links. | |
| Source [jaredpalmer/kev-4b](https://huggingface.co/jaredpalmer/kev-4b/tree/6cfce5c2fa4b4bd64026336ab649c5ca78857d52) (tag `v1.0`, commit `6cfce5c`) · base [Qwen/Qwen3.5-4B-Base](https://huggingface.co/Qwen/Qwen3.5-4B-Base/tree/1001bb4d826a52d1f399e183466143f4da7b741b) (revision `1001bb4`) | |
| A **decision model**. Give it a state (text, or a JSON object or array) and typed questions: `noul` | |
| (yes / no), `choice` (named options) or `score` (ordered levels). It returns a probability for every | |
| option of every question. It never generates text. Requests and responses use the SystemOne-compatible | |
| request shape: `{model, state, questions}` in, `{model, answers, usage}` out, one typed decision per | |
| question. | |
| Jared Palmer trained it as a rank-16 LoRA adapter and a pointer head on Qwen3.5-4B-Base (32 layers: | |
| 24 Gated DeltaNet and 8 full attention, hidden size 2,560). The author's card: "It is intended for | |
| developers who classify, route, triage or check documents and who need probabilities that can be | |
| thresholded, for example to send uncertain cases to human review." Each question is its own row: the | |
| state, then the question and its options. The head scores each option's closing token against the | |
| question's last token. The author's card reports benchmark results; none of them are re-measured here. | |
| This port merges the adapter into the base with the author's own merge script and exports the text | |
| backbone as one Core AI graph. The graph takes 128 token ids per call and returns the final-norm hidden | |
| state at every position; it has no vocabulary head. Each Gated DeltaNet layer runs its recurrence in an | |
| fp32 Metal kernel, one GPU dispatch per layer per call. Weights are fp16 (8.41 GB). The host runs the | |
| pointer head from the author's head weights. The gate is probability parity with the author's own fp32 | |
| code, on every option of every question, on a fixture of 434 questions and on a held-out set of 130. | |
| It runs on the Mac GPU. This release is for the Mac: the one load of an iPhone AOT asset of an earlier | |
| graph on an iPhone 18 Pro crashed (below). [Kev-0.8B](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-0.8b/README.md), the same port at 0.8B, is | |
| measured on the iPhone 18 Pro. | |
| ## Readout contract | |
| The contract is Kev-0.8B's, with this checkpoint's head and temperature; the full description is in the | |
| [Kev-0.8B card](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-0.8b/README.md#readout-contract). In short: | |
| ``` | |
| [<|fim_prefix|>] + render(state) + [<|fim_middle|>] + render(instructions) | |
| + for each option: [<|box_start|>] + option_text + [<|box_end|>] | |
| + [<|fim_suffix|>] | |
| ``` | |
| - One row per question, zeroed states, positions 0..L − 1. Delimiters from the base tokenizer: 248060, | |
| 248061, 248049 / 248050, 248062; pad = eos = 248044; no bos. The 4B base's `tokenizer.json` is | |
| byte-identical to the 0.8B base's; its `tokenizer_config.json` differs in the chat template's thinking | |
| default, which this readout does not use. The `kev-4b` repository still carries Qwen3-era | |
| `vocab.json`, `merges.txt` and `added_tokens.json` (other delimiter ids); the author's loader reads the | |
| tokenizer from the base, and so does this port. | |
| - The head: `z_k = ((W_k h_opt_k + b_k) · (W_q h_decide + b_q)) / 16`, `p = softmax(z / T)` within the | |
| question, T = 2.406050072164233 (`head.pt`); `W_q`, `W_k` are `[256, 2560]` with biases, fp32. | |
| - A row holds at most **3,968 tokens**. The last call is padded to 128 tokens and must end at or below | |
| the graph's position bound of 4,095. | |
| - Shared prefix (optional, exact): the state's whole 128-token calls run once and the four states are | |
| copied per question. Every row's hidden state equals its direct run bit for bit (below). | |
| The fixture and the held-out set are Kev-0.8B's (434 and 130 questions), with this checkpoint's own fp32 | |
| oracle run (the author's package, one CPU thread): [`fixtures-kev-4b.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/fixtures-kev-4b.json). It has | |
| twelve near-ties on the fixture and four on the held-out set. | |
| ## Core AI shape | |
| The same module as Kev-0.8B, `conversion/kev/qwen3_5_kev_decoder.py`, with no code change: the overlay's | |
| stateful Qwen3.5 text decoder on the merged weights, no vocabulary head. One function, `main`, at a | |
| static 128 tokens. Each Gated DeltaNet layer runs its recurrence in the overlay's fp32 Metal chunk kernel | |
| (`qwen3_5_gdn_metal`): one GPU dispatch per layer per call, the recurrent state kept in fp32 through the | |
| call. | |
| | | name | shape, type | | |
| |---|---|---| | |
| | inputs | `input_ids` | [1, 128] int32 | | |
| | | `position_ids` | [1, seq] int32, the ramp 0 .. seq − 1 | | |
| | states | `keyCache`, `valueCache` | [8, 1, 4, ctx, 256] fp16, ctx up to 4,096 | | |
| | | `convState`, `recState` | [24, 1, 8192, 3], [24, 1, 32, 128, 128] fp16 | | |
| | output | `hidden` | [1, 128, 2560] fp16, every position | | |
| Per row of T ids, from zeroed states: ⌈T / 128⌉ calls, the last padded with `<|endoftext|>` (248044) and | |
| its padded rows dropped. `metadata.json` says `kind: decision-backbone` and `language.prefill_chunk: 128`, | |
| and carries the readout contract. The host (`conversion/kev/decide.py`, [`apps/Kev`](https://github.com/john-rocky/coreai-model-zoo/tree/main/apps/Kev)) is | |
| Kev-0.8B's: the head in float64 from `head/head.safetensors`, p rounded to fp32 once, the | |
| SystemOne-compatible response, the shared prefix and the prepared state. No engine, no runtime patch. | |
| ## Measured (Apple M4 Max, macOS 27.0 26A428, 2026-10-03 – 10-04) | |
| The bar is Kev-0.8B's, fixed before any graph ran: the argmax equal to the oracle's on every question | |
| whose oracle top-2 margin is above 0.02 (near-ties listed apart), max |Δp| ≤ 0.02 over every option of | |
| every question, the mean over rows of each row's mean |Δp| ≤ 0.002, every process's re-run bit-equal. | |
| The Python gates load the AOT `.aimodelc` (h16c, `--expect-frequent-reshapes`) with | |
| `SpecializationOptions.default()`; their times are on a GPU shared with other work. | |
| ### Before any graph: the merge and fp32 torch | |
| - The merged checkpoint (`scripts/merge_lora_checkpoint.py`, tag `kev-1.0`; fp32, four shards of | |
| 16.8 GB, 426 tensors, 248 of them adapted) answers through the author's loader as the adapter | |
| checkpoint does: 434/434 questions, logits bit-equal. `W + (B @ A) × 2` reproduces three merged | |
| tensors bit for bit (the adapter moves them by 1.4–2.0 %) | |
| ([`gate-kev-4b-merge.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-merge.json)). | |
| - The decoder module in fp32 on the CPU, driven like the graph with the recurrence unrolled, read through | |
| the author's head: 434/434 argmax (the 12 near-ties included), max |Δp| 6.6e-6, lowest per-position | |
| hidden cosine 0.9999999965 on 21 rows; the module's loader reads all 426 keys and leaves none; it equals | |
| the overlay's plain text decoder bit for bit (3 rows, one of 1,518 tokens) | |
| ([`gate-kev-4b-torch-parity.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-torch-parity.json)). | |
| - The Metal kernel has no torch values: its `torch_defn` returns zeros of the right shapes. The GPU gate | |
| below is its parity check. | |
| ### The graph alone on the Mac GPU | |
| | set | questions | argmax (margin > 0.02) | near-ties agreeing | max \|Δp\| | mean of row means | bar | | |
| |---|---:|---:|---:|---:|---:|---| | |
| | **fixture** | 434 | **422/422** | **10/12** | **0.0153** | **0.00077** | **PASS** | | |
| | held out | 130 | 126/126 | 3/4 | 0.0096 | 0.00069 | PASS | | |
| The near-ties that flip have oracle margins of 0.0005–0.0024 and move by at most 0.0029. The worst | |
| fixture row is a SemIf item (0.0153), the worst held-out row a `score` item (0.0096). The lowest | |
| per-position hidden cosine on the 21 recorded rows is 0.9921. Every value is finite and every process's | |
| re-run is bit-equal. The red arms move p: a swapped state moves 5 of 5 argmaxes (max |Δp| 0.988), a | |
| grammatical "not" 3 of 5 (0.957). Transcript: [`gate-kev-4b-readout.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-readout.json). | |
| ### From the request: Python and Swift | |
| - `conversion/kev/host.py`, without the author's package, rebuilds every oracle row from the raw request | |
| (ids, `<|fim_suffix|>` / `<|box_end|>` indices, keys): 434/434 and 130/130 rows with two tokenizer | |
| implementations. `decide.py` on the AOT graph: hidden rows bit-equal to the gate's on 434/434 and | |
| 130/130 rows, and the shared prefix equal to the direct run on every row | |
| ([`gate-kev-4b-host.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-host.json)). | |
| - The Swift host ([`apps/Kev`](https://github.com/john-rocky/coreai-model-zoo/tree/main/apps/Kev), Release): the ids from the raw request equal the | |
| oracle's on 434/434 and 130/130 rows. On the same AOT asset every row's hidden state equals the Python | |
| gate's bit for bit (434/434 and 130/130), and its float64 head gives p within 4.5e-7 of the gate's fp32 | |
| head. The bar is the gate's (fixture 0.0153 / 0.00077, held out 0.0096 / 0.00069). With the shared | |
| prefix every row's hidden state and p equal the direct run's (434/434 and 130/130). | |
| - **JIT = AOT.** The `.aimodel` specialized by the Swift runtime (GPU preferred, | |
| `expectFrequentReshapes`) gives the AOT asset's hidden state and p bit for bit on 25 rows of 10 records. | |
| The specialization took 16.6 s in `AIModel(contentsOf:)` (18.4 s with the tokenizer and the head) | |
| and left a 15.55 GB entry in the runtime's cache; a later load took 1.74 s | |
| ([`gate-kev-4b-swift.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-swift.json)). | |
| ### Time per decision on the Mac | |
| Swift, Release CLI, the AOT asset, in one machine-wide GPU lock window (2026-10-04 14:05–14:30 JST). Two | |
| processes per graph counted only when no other GPU job ran and the one-minute load average was at most 12; | |
| each made 6 decisions per item after one warm-up, and the table gives the median (p10–p90) over the 12. | |
| The earlier unrolled graph (16 tokens per call) ran in the same window: | |
| | request | tokens | calls | ms | p10–p90 | unrolled S = 16, ms | | |
| |---|---:|---:|---:|---|---:| | |
| | one question | 94 | 1 | 100.2 | 99.3–101.2 | 269.5 | | |
| | one question | 380 | 3 | 298.0 | 296.1–304.5 | 1,075.4 | | |
| | one question | 1,518 | 12 | 1,189.0 | 1,182.9–1,194.9 | 4,341.9 | | |
| | one question | 1,802 | 15 | 1,488.1 | 1,484.3–1,498.5 | 5,200.2 | | |
| | five questions on one 137-token state, each row from zero | 240 | 10 | 986.7 | 983.0–990.2 | 2,367.9 | | |
| | the same five questions, the state run once (shared) | 240 | 6 | 615.6 | 613.3–624.5 | 894.7 | | |
| | eight questions on that state, each row from zero | 320 | 16 | 1,578.7 | 1,574.2–1,591.6 | 3,776.0 | | |
| | the same eight questions, shared | 320 | 9 | 920.0 | 916.9–930.6 | 1,262.4 | | |
| | four questions on one 1,477-token state, each row from zero | 1,622 | 49 | 4,851.7 | 4,839.2–4,870.6 | 17,087.7 | | |
| | the same four questions, shared | 1,622 | 16 | 1,614.5 | 1,607.5–1,647.8 | 4,713.7 | | |
| Loading the AOT asset took 9.90 / 9.91 s at the start of each process and 1.30 / 1.22 s when loaded | |
| again. The two processes ended at 0.89 and 0.95 GB of footprint. Transcript: | |
| [`gate-kev-4b-timing-mac.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-timing-mac.json). | |
| ### iPhone 18 Pro: not in this release | |
| An earlier graph of this port (the recurrence unrolled, 16 tokens per call) compiled for the iPhone 18 | |
| Pro's GPU (h19p, `--expect-frequent-reshapes`) is 15,557,759,365 bytes. Loaded once in the headless gate | |
| app (iOS 27.0 24A437, `.default` options, no increased-memory-limit entitlement), the app died inside | |
| `AIModel(contentsOf:)` with `EXC_BAD_ACCESS (SIGSEGV)` in the on-device compile for delegates | |
| (`-[MPSGraphAICodeCompilerDelegate getInitializedAICodeBytecodeWithPayloadPrefix:delegateId:]`). Its last | |
| memory sample, 0.32 s in, read a footprint of 175.9 MB with 3,364.1 MB available. The cause is not | |
| isolated and the load was not retried; the graph of this release was not loaded on the phone | |
| ([`../kev-0.8b/gate-kev-0.8b-iphone.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-0.8b/gate-kev-0.8b-iphone.json) | |
| `round8.device.summary.load_4b`, `round8.load_4b_memory_samples`). | |
| ## Forms measured | |
| Every form below was exported and compiled the same way and read against the same oracle: the full gate, | |
| or the 130-row subset where the table says so. The times come from different windows, so compare forms only | |
| within one window. Full records: [`gate-kev-4b-forms.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-forms.json). | |
| Mac (Swift Release CLI, the 94-token question, median of the counted processes): | |
| | form | 94-token decision, ms | window | fixture max \|Δp\| | note | | |
| |---|---:|---|---:|---| | |
| | Gated DeltaNet unrolled, S = 16 | 269.5 | round 12 | 0.0154 | | | |
| | unrolled, S = 32 / 64 | — | — | 0.0078 / 0.0070 (130 rows) | not timed in a lock window (104.8 / 174.1 ms per call on a shared GPU) | | |
| | Metal kernel, S = 32 | — | — | 0.0074 (130 rows) | not timed in a lock window (48.4 ms per call on a shared GPU) | | |
| | Metal kernel, S = 64 | 118.0 | round 12 | 0.0170 | five questions shared: 435.9 ms (S = 128: 615.6) | | |
| | **Metal kernel, S = 128 (this release)** | **100.2** | round 12 | **0.0153** | | | |
| | Metal kernel, query length 2..512, host calls of at most 512 ids | 83.3 | round 12 | 0.0132 | not shipped: memory grows (below) | | |
| | in-graph chunk scan | — | — | — | not run at 4B; on Kev-0.8B it fails from S = 32 | | |
| | int8, every linear (unrolled S = 16) | — | — | 0.0601 | fails the bar (Precision) | | |
| | any form on the Neural Engine | — | — | — | not run: the recurrence's fp32 state is not an ANE element type ([`qwen3.5-static-ane.md`](https://github.com/john-rocky/coreai-model-zoo/blob/main/knowledge/qwen3.5-static-ane.md)) | | |
| **S = 64 for several short questions on one state.** In the same window, five questions on one | |
| 137-token state, shared, took 435.9 ms with S = 64 and 615.6 ms with S = 128; one 94-token question took | |
| 118.0 and 100.2 ms. This release ships S = 128. | |
| **Why the dynamic-length graph does not ship.** It passed the gate and decided the 94-token question in | |
| 83.3 ms in the same window. Its two timing processes ended at 6.31 and 6.32 GB of footprint, against 0.89 | |
| and 0.95 GB for S = 128. On Kev-0.8B the same form keeps growing while the call length keeps changing, | |
| until the `AIModel` is created again ([Kev-0.8B card](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-0.8b/README.md#forms-measured)). | |
| ## Precision | |
| **int8 was measured and is not shipped.** It was measured on the unrolled S = 16 graph; the Metal-kernel | |
| graphs were not measured in int8. int8 per block of 32 over every decoder linear fails the bar: | |
| | decoder (unrolled S = 16) | fp16 kept | `main.mlirb` bytes | fixture max \|Δp\| / mean | held out max \|Δp\| / mean | bar | | |
| |---|---:|---:|---|---|---| | |
| | fp16 | 100 % | 8,414,007,636 | 0.0154 / 0.00078 | 0.0109 / 0.00072 | PASS | | |
| | int8lin: every linear int8 (`symmetric_with_clipping`) | 0 % | 5,068,103,201 | 0.0601 / 0.00192 | 0.0285 / 0.00169 | FAIL | | |
| | asymmetric int8, `in_proj_qkv` + `out_proj` + `v_proj` fp16 | 21.7 % | 5,882,832,315 | 0.0175 / 0.00135 | 0.0277 / 0.00123 | FAIL | | |
| | asymmetric int8, `in_proj_qkv` + `out_proj` fp16 | 21.2 % | 5,863,831,482 | 0.0174 / 0.00138 | not run | — | | |
| The two asymmetric sets are the ones an fp32 torch bisect chose under a rule written before any result | |
| (at most 25 % of the linear weights fp16, the target worst row ≤ 0.006 met by none; the two best by mean | |
| taken). The one with `v_proj` fp16 passes the fixture and fails the held-out set on one `score` row, the row that also | |
| breaks int8lin and is fp16's held-out worst. A set built before the rule's last stage (layers 0–3 and | |
| `out_proj` fp16) fails both (0.0272, 0.0293). The quantizer's `qscheme` accepts `symmetric`, | |
| `asymmetric` and `symmetric_with_clipping`; block 16 and an int8 embedding table also compile | |
| ([`gate-kev-4b-int8.json`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/gate-kev-4b-int8.json)). | |
| **What the compiled asset holds.** `--expect-frequent-reshapes` adds an fp16 copy of every linear weight: | |
| for the unrolled graph the h19p asset of the fp16 bundle is 15,557,759,365 bytes with it and 8,413,701,860 | |
| without, and the int8 sets above compile to 13,026,670,589 and 13,007,670,689 bytes with it. This | |
| release's Mac h16c asset is 15,552,786,962 bytes against an 8,412,500,461-byte `main.mlirb`. Without the | |
| flag the runtime specializes the unrolled graph again for every new position length: 9.6–14.6 s per new | |
| length on the Mac GPU (calls at a length already seen: 46.4 ms median, 33 rows); an int8 asset without the | |
| flag had not finished specializing its opening length after 12 minutes. A Mac gate worker on the efr fp16 | |
| asset of the unrolled graph showed up to 16.6 GB rss, up to 16.4 GB of it clean mapped file, and a | |
| phys_footprint of at most 1.15 GB. | |
| ## ⬇️ Bundle | |
| [mlboydaisuke/Kev-4B-CoreAI](https://huggingface.co/mlboydaisuke/Kev-4B-CoreAI), one folder under | |
| `gpu-pipelined/`: | |
| | file | what | bytes | sha256 | | |
| |---|---|---:|---| | |
| | `kev_4b_decode_fp16_metal_pf128.aimodel/main.mlirb` | the decoder, fp16 | 8,412,500,461 | `da529dd4…413eb17f` | | |
| | `metadata.json` | `kind: decision-backbone`, the readout contract, the gate | 12,643 | `e641e44f…c9039b08` | | |
| | `tokenizer/tokenizer.json` | the base model's, verbatim | 12,807,196 | `fe000e3e…d50d2927` | | |
| | `tokenizer/tokenizer_config.json` | the base model's, verbatim | 16,713 | `3891e840…b6b9f89c` | | |
| | `head/head.safetensors` | the pointer head: q / k weight `[256, 2560]` and bias, fp32 | 5,245,304 | `36c392f7…54157106` | | |
| | `head/kev_head.json` | head size, scale, temperature, delimiter ids, provenance | 2,038 | `5ff071ff…cfba7416` | | |
| The repository root carries the base model's `config.json`, the adapter's `adapter_config.json` and the | |
| Apache-2.0 `LICENSE`, verbatim. `SHA256SUMS` lists every file. Its Hub revision is | |
| [`ee978c7`](https://huggingface.co/mlboydaisuke/Kev-4B-CoreAI/tree/ee978c72ad20f98d8548b5ef5a28e7e7e1102389) (2026-10-04). | |
| No AOT asset ships: the Swift runtime's specialization of the `.aimodel` equals the AOT asset bit for bit | |
| (above). To compile one for the Mac anyway (15.55 GB, the flag is required): | |
| ```bash | |
| xcrun coreai-build compile kev_4b_decode_fp16_metal_pf128.aimodel --output aot --preferred-compute gpu \ | |
| --platform macOS --architecture h16c --expect-frequent-reshapes | |
| ``` | |
| ## Use it | |
| Swift, with the [`Kev`](https://github.com/john-rocky/coreai-model-zoo/tree/main/apps/Kev) package (macOS 27; the system CoreAI framework, Accelerate and | |
| swift-transformers' tokenizer), on a download of the repository: | |
| ```swift | |
| import Kev | |
| let bundle = URL(filePath: "Kev-4B-CoreAI/gpu-pipelined/kev_4b_decode_fp16_metal_pf128") | |
| let kev = try await KevDecider(bundle: bundle) // the .aimodel, specialized here (GPU, frequent reshapes) | |
| let response = try await kev.decide(requestJSON: requestData, shared: true) // shared: the state's whole calls run once | |
| // questions that arrive later, on the same state | |
| let prepared = try await kev.prepare(state: try JSONParser.parse(stateData)) // the state's whole calls, once | |
| let later = try await kev.decide(prepared: prepared, questionsJSON: questionsData) // only the questions' rows run | |
| ``` | |
| Loading the bundle specializes the graph once (16.6 s on the M4 Max) and caches it; later loads read the cache. | |
| The Mac CLI: `kev run --bundle Kev-4B-CoreAI/gpu-pipelined/kev_4b_decode_fp16_metal_pf128 --asset jit | |
| --request req.json --shared --out resp.json` (`swift build -c release --package-path apps/Kev`). The | |
| request shape and the Python read-out (`conversion/kev/decide.py run --model kev-4b …`, AOT assets only) | |
| are as in the [Kev-0.8B card](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-0.8b/README.md#use-it). | |
| ## Reproduce | |
| Environment: the zoo overlay venv (coreai-core 1.0.0b2, coreai-torch 0.4.1, torch 2.9.0, transformers | |
| 4.57.6), Xcode 27.0 RC; the author's code (the oracle and the merge) in its own venv from the author's | |
| `uv.lock` at tag `kev-1.0`. Order and flags: [`conversion/kev/README.md`](https://github.com/john-rocky/coreai-model-zoo/blob/main/conversion/kev/README.md). | |
| ```bash | |
| (cd $ZOO_WORK_ROOT/_kev/kev-src && python scripts/merge_lora_checkpoint.py \ | |
| --lora jaredpalmer/kev-4b@591dcb5bd6d05eb0b5131ea6608f93f10243335c --out $ZOO_WORK_ROOT/_kev/merged/kev-4b-v1.0) | |
| # the decoder (--aot adds the h16c .aimodelc the Python gates load) | |
| python conversion/kev/export_decoder.py fp16 --model kev-4b --gdn-scan metal --prefill-chunk 128 --aot | |
| # the published bundle: the gated .aimodel bytes and their metadata, without exporting again | |
| python conversion/kev/export_decoder.py fp16 --model kev-4b --gdn-scan metal --prefill-chunk 128 --metadata-only \ | |
| --from-aimodel <bundles>/kev_4b_decode_fp16_metal_pf128/kev_4b_decode_fp16_metal_pf128.aimodel \ | |
| --bundle-dir <ship>/kev_4b_decode_fp16_metal_pf128 | |
| ``` | |
| Recipe: [`recipe.toml`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/kev-4b/recipe.toml). Port notes: [`knowledge/kev-port.md`](https://github.com/john-rocky/coreai-model-zoo/blob/main/knowledge/kev-port.md). | |
| ## Other formats | |
| On the Hub (2026-10-04), not run here: | |
| - ONNX: [`midudev/kev-4b-ONNX`](https://huggingface.co/midudev/kev-4b-ONNX) (ONNX Runtime Web, int4 | |
| weights, the pointer head as `head.bin`); | |
| [`onnx-community/kev-4b-ONNX`](https://huggingface.co/onnx-community/kev-4b-ONNX) (Transformers.js, | |
| `q4` / `q4f16`, the pointer head in the graph; its card names Qwen/Qwen3-4B-Base as the base, the | |
| Qwen3 generation of Kev-4B before Kev 1.0). | |
| - GGUF: [`ggml-org/Kev-4B-GGUF`](https://huggingface.co/ggml-org/Kev-4B-GGUF) ("a decision model, to be | |
| used via `/v1/systemone` API", per its card). | |
| - MLX: [`RoderickQiu/kev-4b-mlx-8bit`](https://huggingface.co/RoderickQiu/kev-4b-mlx-8bit) (merged, 8-bit, | |
| `head.pt` fp32) and [`aselea/Kev-4B-MLX-Serve-8bit`](https://huggingface.co/aselea/Kev-4B-MLX-Serve-8bit) | |
| (for mlx-serve, the head as `kev_head.safetensors`); the author's repository also serves Kev through | |
| MLX on Apple silicon. | |
| No other Core AI conversion of Kev was listed on the Hub on 2026-10-04. | |
| ## License | |
| Apache-2.0: the adapter and the head (jaredpalmer/kev-4b) and the base (Qwen/Qwen3.5-4B-Base); the bundle | |
| inherits it, and the Hugging Face repository carries the base's `LICENSE`. The author's package runs only | |
| in the oracle and the merge, at gate time. The fixture file's terms are Kev-0.8B's: SemIf authored144 | |
| under MIT with its notice, transfer-v4 records by reference, 11 of the 20 records written for the port | |
| published and 9 withheld (an invented name in each was found in use on the web). | |
| ## Limits | |
| From the [author's card](https://huggingface.co/jaredpalmer/kev-4b): English only; text generation, chat | |
| and fully automated consequential decisions about people are out of scope; questions that need facts | |
| that are neither in the state nor general knowledge are out of scope; the temperature was fitted on the | |
| author's development rows (the card explains how to measure and refit it). This port adds: | |
| - A row holds at most 3,968 tokens, while the author's server accepts states up to 65,536. | |
| - The release is for the Mac. | |
| - A process's opening call is slower. On the Mac the opening 128-token call of each Python gate process | |
| took 1,121–9,881 ms, against a median of 99.0 ms for its later calls. | |
| - If you export this decoder with a dynamic query length yourself, keep the call lengths to one or two | |
| values. A process that cycles more lengths grows its memory until the `AIModel` is created again | |
| (measured on Kev-0.8B on the Mac and the iPhone; which runtime layer keeps the memory is not isolated). | |