Ternary-Bonsai-2-27B (PQ2_0) auf Apple Silicon M4
Vollständige Implementierungsdokumentation zur Ausführung eines 27-Milliarden-Parameter Reasoning-LLMs mit ternären 1.58-Bit-Gewichten. Offloaded zu 100% in den Metal Unified Memory des Mac mini M4.
1. Die Herausforderung: GGML Typ 142 & Metal Shader
Das Upstream-Problem
Das offizielle Upstream-Repository von llama.cpp unterstützt Quantisierungsformate nur bis Typ 42. Das Modell Ternary-Bonsai-2-27B-PQ2_0 verlangt den experimentellen Typ 142:
Die Lösung
Nutzung des spezialisierten PrismML-Eng/llama.cpp-Forks auf dem Branch prism. Dieser implementiert:
- Direkte Dekodierung von 2-Bit gepackten Trits ohne FP16-Rekonstruktion
- Spezifische Metal Compute Shader für Apple Silicon M-Series GPUs
- Unterstützung für das Denken/Reasoning über den Template-Parser
2. Build & Kompilierung auf dem Mac mini M4
cd ~/llama.cpp
git remote add prism https://github.com/PrismML-Eng/llama.cpp.git 2>/dev/null || git remote set-url prism https://github.com/PrismML-Eng/llama.cpp.git
git fetch prism
git checkout -B ternary-bonsai prism/prism
rm -rf build
cmake -B build -DGGML_METAL=ON -DGGML_BLAS=OFF
cmake --build build --config Release -j$(sysctl -n hw.ncpu)
3. Persistenter Autostart (macOS LaunchDaemon)
Da User-LaunchAgents in reinen SSH-Sessions oft durch macOS-Berechtigungen (Error 5 / 125) blockiert werden, läuft der Server als systemweiter LaunchDaemon mit dediziertem Benutzerkontext.
/Library/LaunchDaemons/com.adrian.llama-server.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.adrian.llama-server</string>
<key>UserName</key>
<string>adrian</string>
<key>WorkingDirectory</key>
<string>/Users/adrian/llama.cpp</string>
<key>ProgramArguments</key>
<array>
<string>/Users/adrian/llama.cpp/build/bin/llama-server</string>
<string>-m</string>
<string>/Users/adrian/models/Ternary-Bonsai-2-27B-PQ2_0.gguf</string>
<string>--host</string>
<string>0.0.0.0</string>
<string>--port</string>
<string>8080</string>
<string>-ngl</string>
<string>99</string>
<string>-c</string>
<string>8192</string>
<string>-np</string>
<string>1</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/Users/adrian/llama-server.log</string>
<key>StandardErrorPath</key>
<string>/Users/adrian/llama-server.err</string>
</dict>
</plist>
sudo chown root:wheel /Library/LaunchDaemons/com.adrian.llama-server.plist
sudo chmod 644 /Library/LaunchDaemons/com.adrian.llama-server.plist
sudo launchctl load -w /Library/LaunchDaemons/com.adrian.llama-server.plist
4. Verifizierter Inferenz-Benchmark
prompt eval time = 2251.23 ms / 92 tokens ( 24.47 ms per token, 40.87 tokens per second)
eval time = 59635.89 ms / 643 tokens ( 92.89 ms per token, 10.77 tokens per second)
total time = 61887.12 ms / 735 tokens