這篇文章,我分享一下如何在我的 macOS 上,把 MiniMax H3 這個模型成功跑起來。

為何我要堅持在 macOS 跑起來這件事呢?

這是因為,8bit 量化永遠比 nvfp4 具備更好的質量,無論在提示詞的遵守能力,以及畫面元素的運動表達下。

weights/
├── tokenizer/tokenizer.json
├── mlx-8bit/te_qwen3vl_a8g32.safetensors
├── mlx-8bit/dit_fl2va_a8g32.safetensors
├── mlx-8bit/dit_ref2va_a8g32.safetensors
├── adapters/minimax-h3-turbo/
│   ├── minimax_h3_turbo_v4_step600_ema.safetensors
│   └── minimax_h3_turbo_4step_ema_ckpt850.safetensors
└── bf16/vae/
    ├── minimax_h3_video_vae_fp16.safetensors
    └── minimax_h3_audio_vae_fp32.safetensors

為了在 M2 Ultra 128g 平穩時間長時間運行,分段和 AGX RELAX 是必不可少的參數。

QKV 2,048/SDPA 512/MLP 2,048 三段 chunking + AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1

然後,我的 4070Ti 12G vRAM 機器,作為快速預覽機。

故事流程

  1. H3.c 成功編譯、通過 1,768 項檢查,也能生成短片。
  2. 真正的長序列正常退出,但畫面與聲音靜默失效。
  3. H3.c 的 MPSGraph SDPA 可以用 2,048-row query chunking 避開部分錯誤,但速度代價與其他畫質問題促使我轉向 mlx-h3。
  4. mlx-h3 先跑通 18,916-row、28,548-row 任務,接着挑戰 1280×736、362-frame Base-20。
  5. 首次 DiT 完成後才在 VAE 發現 non-finite;因為沒有保存 latent,數小時運算無法恢復,於是我加入 rolling checkpoint。
  6. 從 step 4 resume 時,顯示器被喚醒,step 5 出現 ImpactingInteractivity watchdog kill。
  7. 網絡資料顯示,display-active MLX 工作和 65K+ full SDPA 都可能觸發 watchdog;AGX relaxation 只是 workaround,chunked full-attention PR #3307 也已關閉、未合併到我使用的 MLX v0.32.2。
  8. 單獨加入 AGX_RELAX_CDM_CTXSTORE_TIMEOUT=1 後,明確 Metal error 變成全 NaN。它改變了失敗表面,沒有修好 correctness。
  9. block/stage probe 把 non-finite 前移到 raw Q;QKV 2,048 讓前六個 blocks finite,但 block 7 仍被 watchdog 終止。
  10. SDPA 降到 512 後,單次工作變短,但 block 3、chunk 154/205 仍被 display-active watchdog 終止。
  11. DeepSeek Pro Max 根據已有證據,獨立建議用 QKV 2048 + SDPA 512 + AGX=1 + finite guards 做 bounded step-5 qualification,並判斷 chunk 154 沒有特殊數學意義。