Phi-4-mini-instruct β€” ExecuTorch XNNPACK 8da4w + 8-bit embedding

phi_4_mini_xnnpack_8da4w_e8.pte (2597.9 MB)

  • Source: Qwen/Phi-4-mini-instruct
  • License: Apache-2.0
  • Quantization: 8da4w linear + 8-bit embedding (embedding_quantize: "8,0")
  • Export: executorch 1.4.0 export_llm, static shape (seq_len=1), max_seq_length 2048, XNNPACK extended_ops
  • Config: llm_params/phi_4_mini_xnnpack_8da4w_e8.yaml

Verification (Mac arm64, 2026-08-21)

llm_params/gen_static.py, token-by-token prefill then greedy decode, a fresh process per prompt so no answer is read through the previous one's cache:

prompt answer decode
capital of France? "The capital of France is Paris." then keeps going 49.3 tok/s
17 times 4? "17 times 4 is equal to 68." and stops 49.7 tok/s

Stopping is the part worth looking at. Chat template is <|user|>...<|end|><|assistant|>, bos 199999, eos [200020, 199999] β€” the model's own generation_config.json. The upstream example config (examples/models/phi_4_mini/config/phi_4_mini_xnnpack.yaml) carries 151643 for both, which is Qwen's, and a model that never sees its end token does not stop.

Not measured on a phone. Worth noting against the rest of the shelf: this decodes at 49 tok/s where Qwen3.5-4B manages 8.6 at a comparable 2.8 GB. The Qwen3.5 exports run with use_sdpa_with_kv_cache: False and this one with it on.

Converting it

python convert/export_phi_4_mini.py

Not export_llm directly, because its download path cannot reach this model: load_checkpoint_from_pytorch_model reads pytorch_model.bin and this repository ships safetensors only, so the code falls back to torchtune's checkpointer β€” a dependency with its own torch pin, for a key rename and two splits. The script reads the safetensors, calls upstream's own phi_4_hf_to_meta, and ties the output embedding back on: input and output embeddings are tied here, so there is no lm_head.weight to map to output.weight, and the model refuses a checkpoint without it. The torchtune converter beside it ties them; the safetensors one does not.

Running it

python llm_params/gen_static.py \
  --pte phi_4_mini_xnnpack_8da4w_e8.pte \
  --tokenizer tokenizer.json \
  --prompt '<|user|>What is the capital of France?<|end|><|assistant|>' \
  --eos_ids "[200020,199999]"

The 8-bit embedding needs from executorch.kernels import quantized before the program is loaded. Without it the method will not even load β€” kernel 'quantized_decomposed::embedding_byte.dtype_out' not found β€” which reads like a broken export rather than a runtime missing its kernels.

(conversion scripts: executorch-models Β· iOS sample: executorch-samples)

Downloads last month
3
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for mlboydaisuke/Phi-4-mini-instruct-ExecuTorch

Quantized
(172)
this model