Skip to content

Deterministic temp=0 generation differs across Apple Silicon targets #1280

Description

@ivanfioravanti

I am seeing different generated outputs and token counts from the same OpenAI-compatible server/engine when running the same model and request parameters on different Apple Silicon machines.

Specifically, I tested M3 Ultra and M5 Max producing different completions even with:

  • temperature: 0
  • same model
  • same prompt
  • same seed
  • same max_tokens
  • same OpenAI-compatible /v1/chat/completions request shape

M5 Max results:
• aime25: 5/5 passed, 0 failed, runtime 00h:02:18s

# State Prompt Gen Total Given Correct Test
1 PASSED 86 928 1014 70 70 aime25/aime25_0000
2 PASSED 215 7857 8072 588 588 aime25/aime25_0001
3 PASSED 171 1815 1986 16 16 aime25/aime25_0002
4 PASSED 113 1609 1722 117 117 aime25/aime25_0003
5 PASSED 140 5982 6122 279 279 aime25/aime25_0004

M3 Ultra results:
aime25: 5/5 passed, 0 failed, runtime 00h:02:29s

# State Prompt Gen Total Given Correct Test
1 PASSED 86 927 1013 70 70 aime25/aime25_0000
2 PASSED 215 6145 6360 588 588 aime25/aime25_0001
3 PASSED 171 1790 1961 16 16 aime25/aime25_0002
4 PASSED 113 1575 1688 117 117 aime25/aime25_0003
5 PASSED 140 3940 4080 279 279 aime25/aime25_0004

This is visible with the standalone repro script available in this gist:

python3 aime25_repro.py
--base-url http://127.0.0.1:8080/v1
-m mlx-community/Qwen3.6-35B-A3B-4bit
--temperature 0
--cases 5
--max-tokens 8192
--seed 1
--no-think

The script sends five embedded AIME25 prompts and prints a summary table with prompt tokens, generated tokens, extracted answer, expected answer, and pass/fail status.

Expected behavior:

With temperature=0, the same model and same request should produce identical outputs, or at least identical generated-token counts and final answers, across M3 Ultra and M5 Max.

Actual behavior:

M3 Ultra and M5 Max generate different outputs/token counts for the same cases. In some runs, one machine reaches the correct final answer while the other either produces a different answer or continues until max_tokens.

This matters because AIME-style evals become inconsistent across hardware: the same eval can pass on one Apple Silicon target and fail on another, despite using deterministic settings.

It would be useful to know whether this is expected due to backend/kernel/numerical differences (I bet this is the way to get more performance out of M5 Neural Accelerators), or whether deterministic decoding should be guaranteed across these Apple Silicon targets.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions