Views
No views yet
fdtn-ai/antares-1b,
Cisco Foundation AI's file-level vulnerability-localization model.mlx-lm as published.mlx_lm.load("fdtn-ai/antares-1b") fails twice:rope_theta. The upstream config.json (exported with Transformers 5.x) carries
the RoPE base only inside the nested rope_parameters block. mlx_lm's
granitemoehybrid.ModelArgs requires a top-level rope_theta, which is a required field with
no default — so construction fails. Here the top-level key is present with the correct value
(10000000). This matters for quality, not just loading: silently falling back to a default
base would wreck long-context attention.lm_head.weight.ValueError: Received 1 parameters not in model: lm_head.weight.tie_word_embeddings: true, so the MLX model has no separate lm_head module,
but the checkpoint still ships the tensor. Transformers ties it to the embedding at load time;
mlx-lm loads weights strictly and rejects the extra key.model.embed_tokens.weight over all
100,352 rows as raw uint16 — bitwise identical, confirming the weights are genuinely tied
and nothing is lost. Transformers agrees: it reports
lm_head.weight.data_ptr() == model.embed_tokens.weight.data_ptr().tokenizer.json, tokenizer_config.json, generation_config.json,
chat_template.jinja — is copied unchanged from upstream.GraniteMoeHybridForCausalLM, transformers==5.14.1, CPU) on a 1,020-token prompt,
across all 1,020 positions and the full 100,352-token vocabulary:| Comparison | top-1 agreement | mean abs Δlogit | mean KL |
|---|---|---|---|
| MLX float32 vs HF float32 | 99.31 % | 0.0296 | 2.70e-04 |
| MLX bfloat16 vs HF float32 | 97.26 % | 0.2361 | 1.50e-02 |
| HF bfloat16 vs HF float32 (bf16 noise floor) | 96.37 % | 0.2338 | 1.41e-02 |
pip install mlx-lmmlx_lm.generate --model dkavocado/antares-1b-mlx-bf16 --prompt "def add(a, b):" --ignore-chat-templatePOST /v1/completions endpoint and builds the Granite prompt itself, so it needs the raw
completion text including the <tool_call>…</tool_call> blocks.mlx_lm.server infers a json_tools tool-call parser from chat_template.jinja and strips those
blocks out of the text field. Antares then sees an empty answer and every scan ends as
Model ended without an explicit final submission with zero tool calls. Override the template
with a neutral one to disable that parser:1mlx_lm.server --model dkavocado/antares-1b-mlx-bf16 \
2 --host 127.0.0.1 --port 8001 \
3 --decode-concurrency 8 \
4 --chat-template "{% for m in messages %}{{ m['content'] }}{% endfor %}"~/.antares/profiles.toml):1[profiles.mlx]
2model = "dkavocado/antares-1b-mlx-bf16"
3backend = "remote"
4endpoint = "http://127.0.0.1:8001/v1/completions"
5context_window = 32768
6
7[profiles.mlx.generation]
8max_tokens = 8192
9temperature = 0.3
10top_p = 1.0
11frequency_penalty = 0.3
12stop_tokens = ["<|end_of_text|>", "<|start_of_role|>"]
13use_completions_api = truemlx_lm.server resolves the request's model field as a path or repo id, so the profile's
model value must be the same string the server was started with (or default_model).fdtn-ai/antares-1b
for the authoritative model card, evaluation results, and intended-use guidance. The upstream
repository is gated behind an acceptance click; please read its terms there.