DahoamOS Labs

Architektur- & Setup-Dokumentation

Mac mini M4 (16 GB) Ternary-Bonsai 27B
Status: Erfolgreich verifiziert & im Produktivbetrieb

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.

Generierungsrate
~10.77 t/s
Stabile Token-Eval-Rate
Prompt Processing
~40.87 t/s
24.47 ms / Token
Modell-Footprint
6.71 GB
Ternary PQ2_0 (1.58-Bit)
Kontextfenster
8.192 Tokens
Vollständig im Unified RAM

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:

gguf_init_from_reader: tensor 'output.weight' has invalid ggml type 142. should be in [0, 43)

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

Schritt 1: Fork & Feature-Branch clonen
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
Schritt 2: Mit nativer Metal-Beschleunigung bauen
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.

Konfigurationsdatei: /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>
Dienst registrieren & starten
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