Zum Inhalt

Engines

Für die Analyse braucht es eine Engine. Engines sind Zeilen in der Datenbank, keine Konfigurationsdateien: Du gibst einen Pfad an, Blunderbase startet die Datei, liest aus, welche Optionen sie meldet, und behält die Zeile. Beim Start wird nichts aus einer Datei gelesen, und nichts braucht einen Neustart.

Das Docker-Image bringt Stockfish unter /usr/games/stockfish mit; stockfish im PATH führt zur selben Datei, und beide Schreibweisen funktionieren im Pfadfeld. Maia ist in jedem Fall ein eigener Download.

Die Engines-Seite

Rechenleistung › Engines ist, was installiert ist, in zwei Teilen von oben nach unten.

Was läuft womit: je eine Zeile für Analyse und Menschliche Züge, mit der Engine, die die Rolle hält, und, wenn sie nicht laufen kann, dem Grund in Worten.

Engines: jede eingerichtete Engine – ihre Art, die Maschine, auf der sie läuft, ihre Threads und ihr Hash, welche Aufgaben sie hält und ob sie eingeschaltet ist. Ein Klick auf eine Zeile öffnet darunter die Karte der Engine, und die offene Zeile ist hervorgehoben. Der Schalter Aktiviert auf der Karte schaltet die Engine ein und aus; Änderungen speichern übernimmt einen geänderten Namen, Pfad oder eine Option; Engine entfernen …, rot umrandet, fragt nach, bevor die Zeile gelöscht wird, und erst Entfernen an ihrer Stelle löscht sie. Threads und Hash stehen auf der Zeile, weil sie sind, was ein Prozess der Engine kostet; wie viele Prozesse eine Maschine gleichzeitig laufen lässt, wird nicht hier entschieden, sondern unter Maschinen, der Seite daneben.

Eine Engine hinzufügen

Engine hinzufügen, in der Titelleiste der Engines-Seite, fragt drei Dinge. Eine Engine über ihren Pfad ist immer die dieses Servers: Die Engines eines Remote Runners kommen aus dessen eigenem yaml, und die Engine in deinem Browser ist eine Installation mit einem Klick unter Maschinen.

Feld Was hineingehört
Name Deine Wahl. Eindeutig, und so heißt die Engine überall sonst
Pfad Eine Datei, eine vollständige Kommandozeile mit Argumenten oder ein Name im PATH
Art uci für eine Suchengine, maia für ein Modell menschlicher Züge

Blunderbase fragt die Datei ab, bevor die Zeile gespeichert wird; ein falscher Pfad oder eine Option, die die Engine nicht meldet, wird also jetzt abgelehnt und nicht erst bei der Analyse. UCI-Optionen bearbeitest du auf der Karte der Engine unter Mehr Einstellungen, geprüft gegen das, was die Datei gemeldet hat.

Die erste Engine ihrer Art, die registriert wird, übernimmt die Rollen, zu denen sie passt, damit eine frische Installation ohne einen Besuch im Rollen-Formular funktioniert. Eine bereits vergebene Rolle übernimmt sie nie.

Die zwei Rollen

Rolle Was sie ausführt
Analyse Den Durchlauf, den jede importierte Partie bekommt; außerdem schlagen Analysieren … in einer Partie und die Auswahl im Fernschach diese Engine vor
Menschliche Züge Maia – was ein Spieler deiner Wertung gezogen hätte

Eine Analyse, die du mit Analysieren … anforderst, darf jede eingeschaltete UCI-Engine nehmen; die Rolle entscheidet nur, mit welcher der Dialog öffnet.

Vergeben werden sie oben auf der Engines-Seite. Es gibt keinen Ersatz. Ist die Engine, die eine Rolle hält, abgeschaltet, gelöscht oder auf einer Maschine, die nicht verbunden ist, läuft diese Rolle nicht, und die App sagt, welche Engine und warum. Keine andere Engine übernimmt stillschweigend.

Eine Installation ohne Maia verliert etwas, statt zu scheitern: Dir fehlen die Vorhersagen menschlicher Züge, nicht die Bewertung.

Was jede Rolle kostet und wann sie läuft, steht unter Analyse.

Eine Engine testen

Öffne auf der Karte einer Engine Mehr Einstellungen.

  • Abfragen liest die gemeldeten Optionen der Datei neu ein. Nimm das, nachdem die Engine aktualisiert wurde. Das Suchfeld über der Liste filtert nach Namen, und Nur gesetzte zeigt nur die Optionen, die für diese Engine gespeichert sind.
  • Testlauf lässt diese Engine eine Stellung rechnen und zeigt, was zurückkam. Stell Stellung, Knoten und Varianten ein; eine Maia-Engine bietet stattdessen Wertungen.

Eine Engine, die ein Runner anbietet, ist hier nur lesbar, und ihr Testlauf wird abgelehnt, statt zu starten, was dieser Host unter dem Pfad liegen hat. Maßgeblich ist die Konfigurationsdatei des Runners.

Kapazität

Wie viele Engine-Prozesse eine Maschine gleichzeitig laufen lässt, ist eine Eigenschaft der Maschine, und sie steht unter Maschinen: die Warteschlangenprozesse dieses Servers, die Slots jedes Remote Runners, und eine Bilanzzeile, die das gegen die Kerne aufrechnet, mit den Threads, die jede Zeile hier verlangt. Diese Seite legt nur fest, was ein Prozess kostet.

Eine Engine fürs Fernschach

Eine Fernschachsuche ist kein Auftrag aus der Warteschlange: Sie ist eine Engine, die stunden- oder tagelang auf einer Stellung sitzt. Sie belegt einen der Warteschlangenprozesse dieses Servers unter Maschinen, solange sie läuft – dieselben Plätze, die die Analysedurchläufe nutzen; eine Suche, die tagelang läuft, ist also ein Platz, ohne den die Warteschlange auskommt, bis du sie pausierst oder stoppst. Die Karte unter Maschinen und die Kapazitätsleiste der Fernschachseite zählen sie beide, das Warten der Warteschlange hinter einer Suche ist also nie ein Rätsel. Gib dem Fernschach eine eigene Engine-Zeile statt der, die deine Durchläufe benutzen: eine Zeile mit hohem Threads und so viel Hash, wie du entbehren kannst, und wähl sie unter Suchen mit … an der Stellung. Ändern der Optionen startet ohnehin einen frischen Prozess, die beiden Zeilen kommen sich also nie in die Quere.

Weil jeder Platz gerade die Fernschach-Engine halten kann, bemisst die Bilanzzeile auf der Karte des Servers jeden Platz mit der schwersten hier eingeschalteten Engine, solange der Modus an ist: Vier Prozesse einer Zeile mit acht Threads sind zweiunddreißig Threads, und die Zeile sagt, wann das mehr ist, als die Maschine hat. Setz Threads in der Fernschach-Zeile mit dieser Summe im Kopf, oder senk die Obergrenze.

Zwei Dinge zum Speicher, bevor du Hash groß setzt. Eine pausierte Suche behält ihren Prozess samt Hash, damit das Fortsetzen Sekunden statt Stunden kostet – die Kapazitätsleiste der Fernschachseite sagt, wie viele geparkt sind und was jede hält, und Stoppen ist, was den Speicher zurückgibt. Und ein Neustart verliert jeden Hash: Die Suchen kommen wieder, die Bewertungen im Baum kommen wieder, aber jede Engine beginnt bei der Tiefe, die ihr letzter Checkpoint festgehalten hat. Am Baum geht so oder so nichts verloren; das Ganze steht unter Fernschach.

Eine GPU-Engine wird genauso gezählt und teilt sich anders. Zwei Leela-Suchen gleichzeitig sind zwei lc0-Prozesse auf einer Karte; sie teilen sich deren Speicher und deren Zeit, jede ist also langsamer als eine allein, und eine Karte, die ein Netz bequem hält, hält zwei vielleicht nicht. Verhindert wird es nicht – für eine lokale Engine gibt es keine Grenze, wie viele Kopien laufen –, aber der Aufbau, der funktioniert, ist eine CPU-Engine und eine GPU-Engine, die gleichzeitig suchen, jede auf ihrer eigenen Hardware.

Aufgaben sind die andere Hälfte des Modus, und sie sind gewöhnliche Warteschlangenarbeit. Eine Aufgabe – ein begrenzter Blick auf eine Stellung, und das, woraus eine Erweiterung besteht – ist ein AnalysisRun wie jeder andere: Sie zählt zusammen mit den Analysedurchläufen und den Suchen gegen die Warteschlangenprozesse, gibt ihren Platz nach ein, zwei Minuten zurück, wo eine Suche ihn behält, und sie läuft auf dem Host, dem die Warteschlange sie gibt – Remote Runner eingeschlossen. Die Engine, die du für eine Aufgabe wählst – in Aufgabe einreihen …, Erweitern … oder Teilbaum auffrischen … –, darf also auf einem Runner liegen, und wo du einen Runner hast, gehört sie dorthin: Die Aufgaben gehen auf die andere Maschine, und diese behält ihre Kerne für die Suchen und die Durchläufe. Aufgaben stehen in der Mitte der Warteschlange, vor der Analyse jeder importierten Partie und hinter einer, die jemand mit Analysieren … angefordert hat und auf die er wartet, und untereinander gilt: die nächste Frist zuerst. Warteschlange leeren auf der Analyseseite wirft die noch wartenden Aufgaben mit allem anderen hinaus, und jeder betroffene Knoten sagt es.

Ideal ist eine eigene Maschine, und ein Remote Runner ist der Weg dorthin: Aufgaben werden ihm wie jeder Durchlauf zugeteilt, und eine Suche, die auf eine seiner Engines gesetzt wird, läuft ebenfalls dort drüben und belegt einen seiner Slots. Nur ein Runner, der über Polling verbunden ist, oder ein Browser-Tab nimmt keine Suche – seine Verbindung trägt Warteschlangenarbeit und sonst nichts –, und die Auswahl sagt es. Gib dem Runner dieselbe Sorgfalt wie einer lokalen Fernschach-Engine: eine Zeile in seiner runner.yaml mit Threads und Hash für eine lange Suche bemessen, und Slots, bei denen die Suchen mitgezählt sind.

Die Engine im Browser

Gibt es gar keine Engine, bietet der Partiebildschirm Browser-Engine einrichten an – anstelle des Dialogs Analysieren … und wenn du die fortlaufende Analyse einschaltest. Das richtet diesen Browser als Runner ein, wartet, bis sein Stockfish registriert ist, und gibt ihm die Rolle Analyse, falls sie noch frei ist. Die fortlaufende Analyse startet dann von selbst; für eine eigene Analyse öffnet sich der Dialog Analysieren … mit der neuen Engine, und eingereiht wird erst, wenn du darin Analysieren drückst. Du verlässt das Brett dabei nie.

Eine Browser-Engine will Cross-Origin-Isolation, um mit mehreren Threads zu laufen. Hinter einem Proxy ist das BLUNDERBASE_CROSS_ORIGIN_ISOLATION.

Maia

Maia ist ein Modell menschlicher Züge im Stil von lc0: Es antwortet mit dem, was ein Spieler einer bestimmten Wertung tatsächlich ziehen würde, nicht mit dem Besten. Es ist bewusst nicht mitgeliefert, denn es ist ein Python-Paket samt Gewichten, die heruntergeladen und nicht paketiert werden.

So verwendest du es:

  1. Installier einen Maia-Build auf der Maschine, die ihn ausführen soll. In einem Container mountest du ihn hinein.
  2. Registrier ihn mit Art maia und im Pfadfeld mit der ganzen Kommandozeile – einschließlich des Verzeichnisses mit den Gewichten, damit er seinen Cache liest und nie ins Netz geht:
/engines/maia3/bin/maia3-5m --use-uci-history --cache-dir /engines/maia3/models --local-files-only
  1. Gib ihm die Rolle Menschliche Züge.

Die Wertung, nach der Maia gefragt wird, ist eine einzige Einstellung der Anwendung, Analyse › Maia, und keine je Engine, damit nie nach zwei verschiedenen Spielern gefragt wird. Sie ist auf 1100–2000 begrenzt, und eine Engine, die eigene Grenzen meldet, engt das weiter ein.

Eine Maia steuert nie das Analysebrett – sie liefert eine Verteilung von Zügen, keine Suche.

Von der Kommandozeile

Dasselbe ohne Browser, für eine Maschine ohne Bildschirm oder für ein Skript.

$ blunderbase engines add sf-local stockfish --option Threads=4 --role analysis
engine 'sf-local' Stockfish 18 registered: uci at stockfish
serves the analysis role
$ blunderbase engines list
$ blunderbase engines remove sf-local

add fragt die Datei genauso ab wie die Seite. --replace aktualisiert die Engine dieses Namens, statt abzulehnen; damit lässt sich der Befehl gefahrlos erneut ausführen, und so folgst du einer Datei, die umgezogen ist. --role nimmt eine Rolle dem weg, der sie hält; ohne die Option werden nur freie Rollen besetzt. Eine Engine, die ein Runner anbietet, lässt sich hier nicht ändern.

Alle Optionen stehen unter Kommandozeile.

Engines auf einer anderen Maschine

Eine Maschine mit freien Kernen kann Engines für diese Installation ausführen, ohne eine zweite Installation zu sein. Siehe Maschinen.