Strix Halo AI Benchmarks
gfx1151closed-sourceOpenAI-kompatible API

Halogen auf Strix Halo

Halogen ist eine proprietäre Inferenz-Engine von peonist-ai, gebaut für gfx1151. Auf dem Ryzen AI Max+ 395 liegt sie beim Prefill klar vor llama.cpp — beim Decode nur knapp. Und sie unterstützt genau ein Modell. Diese Seite sortiert, was davon für den eigenen Betrieb zählt: gemessene Zahlen, die Cache-Fixes der 0.11.x-Reihe, die Fallstricke und der Update-Ablauf.

Einordnung

Lohnt sich, wenn …

  • Langer Kontext, viele Turns, Agenten-Fan-out
  • Prefill-dominierte Workloads (große System-Prompts, Repo-Kontext)
  • Lizenz muss kostenlos und kommerziell nutzbar sein

Lohnt sich nicht, wenn …

  • Mehr als ein Modell nötig
  • Offene Engine, selbst patchbar, nachvollziehbar
  • Kurze Einzel-Chats mit kleinem Kontext

Steckbrief

Engine
Halogen (proprietär, closed-source)
Anbieter
peonist-ai
Image
ghcr.io/peonist-ai/halogen-flash-server
API
OpenAI-kompatible HTTP-API, läuft als Container
Checkpoint-Format
.hgn (eigenes Format); seit 0.11.6 zusätzlich K-Quant GGUF
Gemessen auf
Ryzen AI Max+ 395 · gfx1151 · 128 GB Unified Memory
Lizenz
  • Perpetual-Lizenz, kostenlos
  • kommerzielle Nutzung erlaubt
  • keine Telemetrie
Unterstützte Modelle
  • ·Qwen3.8-Flash-Next

Mehr ist es nicht. Wer ein zweites Modell braucht, bleibt bei llama.cpp oder Ollama.

1

Leistung: Halogen gegen llama.cpp

Identische Prompts, identische Hardware, beide Engines direkt nacheinander gemessen. Absolute Zahlen hängen am Prompt — belastbar ist die Relation zwischen den Engines.
KennzahlKontextHalogenllama.cppFaktor
Prefill12k Tokens Prompt1.340 t/s413 t/s3,2×
DecodeToken-Ausgabe33,5 t/s26,1 t/s1,28×
Prefill · 12k Tokens Prompt
Halogen
1.340 t/s
llama.cpp
413 t/s

Der eigentliche Gewinn. Agenten hängen am ersten Token — hier entscheidet sich, ob ein Turn mit langem System-Prompt Minuten oder Sekunden kostet.

Decode · Token-Ausgabe
Halogen
33,5 t/s
llama.cpp
26,1 t/s

Spürbar, aber nicht dramatisch. Wer nur chattet, merkt davon wenig; der Unterschied summiert sich erst bei langen Antworten.

Qualität: 8 Testfragen, direkter Vergleich Halogen vs. llama.cpp — Ergebnis: Zeile für Zeile identisch. Die Schwächen, die auffallen, kommen vom Modell — nicht von der Quantisierung und nicht von der Engine. Halogen macht dasselbe Modell schneller, nicht besser.
2

Prompt-Cache: der eigentliche Grund für die Updates

Die 0.11.x-Reihe ist im Kern eine Cache-Serie. Wer Halogen nur für einzelne Prompts nutzt, braucht davon wenig. Wer Agenten mit mehreren langen, parallel laufenden Konversationen betreibt, für den war der Stand vor diesen Fixes nicht benutzbar.
0.11.3

Determinismus-Bug im Cache

Ein kalter Request lieferte nicht dasselbe Ergebnis wie derselbe Request mit deaktiviertem Cache.

Vorher

Bei temperature > 0 führte das zu plausibel klingenden Falschantworten. Nichts crasht, nichts loggt — die Antwort ist einfach still falsch.

Nachher

Cache-Pfad und Nicht-Cache-Pfad verhalten sich identisch.

0.11.5 + 0.11.7

Cache-Verdrängung bei parallelen Konversationen

Zwei lange parallele Konversationen und Fan-out-Muster (ein Eltern-Agent mit mehreren Kind-Agenten) passten nicht nebeneinander in den Cache.

Vorher

Bei jedem Turn wurde komplett neu geprefillt: 100 bis 160 Sekunden pro Turn. Eltern und Kinder warfen sich gegenseitig aus dem Cache.

Nachher

99 Prozent Cache-Treffer in denselben Szenarien.

Versionshistorie. Kompakt, nach Bereichen sortiert — die vollständigen Changelog-Details liefert das Projekt selbst.
VersionBereichWas passierte
0.11.0Token-BudgetEngine reserviert selbst Antwortraum (thinking_answer_room) — entschärft das Problem mit den Denk-Tokens gegen max_tokens.
0.11.3CacheDeterminismus-Bug behoben (kalter Request ≠ Ergebnis mit deaktiviertem Cache).
0.11.5 + 0.11.7CacheCache-Verdrängung bei parallelen Konversationen und Fan-out behoben: von 100–160 s pro Turn auf 99 % Treffer.
0.11.6ModellformateLiest zusätzlich K-Quant GGUF, nicht nur das eigene .hgn-Format.
0.11.9SpeicherGTT-Leak behoben: 35 GiB blieben nach unsauberem Abbruch im Kernel hängen.
3

Fallstricke im Alltag

Fünf Dinge, die beim ersten Aufsetzen Zeit kosten. Alle sind reproduzierbar, keiner ist ein Hardware-Problem der APU.
blockierend

KV-Pool kleiner als Kontext

Der Container beendet sich beim Start mit Exit 1. Ohne Meldung, was genau fehlt.

Damit umgehen

HALOGEN_KV_POOL_POSITIONS muss größer oder gleich HALOGEN_CTX sein. Beide Werte gehören zusammen geprüft, bevor der Start überhaupt Sinn ergibt.

tückisch

Denk-Tokens fressen das Antwortbudget

Standard-reasoning_effort ist xhigh. Die Denk-Tokens zählen gegen max_tokens — ohne chat_template_kwargs kommt leerer Content zurück.

Damit umgehen

Entweder reasoning_effort explizit setzen und max_tokens großzügig bemessen, oder ab 0.11.0 auf thinking_answer_room verlassen: die Engine reserviert den Antwortraum selbst.

tückisch

localhost löst auf IPv6 auf

Clients bekommen Connection error. Auf vielen Distributionen löst localhost nur auf ::1 auf, die Engine lauscht aber auf IPv4.

Damit umgehen

In Client-Konfigurationen 127.0.0.1 statt localhost schreiben. Kostet eine Zeile Konfiguration und spart die halbe Stunde Fehlersuche.

wissenswert

Das model-Feld wird ignoriert

Beliebige Werte im model-Feld des Requests funktionieren kommentarlos. Der Client glaubt, mit einem anderen Modell zu reden.

Damit umgehen

Nicht als Modell-Weiche missbrauchen wollen. Was geliefert wird, steht in der Server-Konfiguration, nicht im Request.

blockierend

Kein Parallelbetrieb mit llama.cpp

Halogen und llama.cpp schließen sich gegenseitig aus, wenn beide denselben Port und den Grafikspeicher beanspruchen.

Damit umgehen

Umsteigen heißt abschalten. Ein Side-by-Side-A/B über beide Engines hinweg erfordert getrennte Ports und genug Speicher für beide — oder zwei Startvorgänge nacheinander.

4

Betrieb: Update im laufenden Betrieb

Der Update-Weg ist konventionell: Image ziehen, den alten Container behalten statt löschen, den neuen davorsetzen, prüfen, notfalls zurück. Gemessene Downtime: 26 Sekunden. Der Image-Pull von 4,5 Minuten läuft vorher durch und unterbricht den laufenden Dienst dabei nicht.
  1. 1
    Neues Image ziehen

    Läuft 4,5 Minuten, ohne den laufenden Container zu stören.

  2. 2
    Alten Container parken statt löschen

    Hält den Rollback verfügbar, bis der neue bewiesen ist.

  3. 3
    Neuen Container starten

    /health antwortet — Version, Slots, Pool-Größe und Kontext abgleichen.

  4. 4
    Echten Completion-Request absetzen

    Health allein reicht nicht. Es muss ein echter Prompt durch, der Content muss stimmen.

  5. 5
    Bei Fehlern zurückrollen

    Den geparkten Container wieder starten, Problem am neuen Image suchen.

KennzahlWertKontext
Downtime beim Rolling-Update26 sGemessen von altem Container weg bis neuer Container bedienbar.
Image-Pull4,5 minLäuft parallel zum laufenden Betrieb, unterbricht nichts.
Health-Endpunkt/healthLiefert Version, Slots, Pool-Größe und Kontext.
Alle Werte gemessen auf Ryzen AI Max+ 395 · gfx1151 · 128 GB Unified Memory · Vergleich gegen llama.cpp mit identischen Prompts