Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Stockfish Verbatim Net Patch
- - By Stefan Pohl Date 2025-11-03 08:24
Endlich!
Über ein Jahr nach Torch und Monate nach PlentyChess hat es nun auch das Stockfishteam geschafft, den Verbatim Net Patch zu integrieren, der bei Ranglisten-Testruns einen sehr deutlichen speedup verspricht. Und somit (hoffentlich) einen meßbaren Celo-Progress von Stockfish. Meinen Testrun für meine UHO-Top15 Ranglist habe ich soeben gestartet.

Author: Tomasz Sobczyk
Date: Sun Nov 2 16:04:09 2025 +0100
Timestamp: 1762095849

Use shared memory for network weights

This enables different Stockfish processes that use the same weights to use the
same memory. The approach establishes equivalence by memory content, and is
compatible with NUMA replication. The benefit of sharing is reduced memory usage
and a speedup thanks to improved (inter-process) caching of the network in the
CPUs cache, and thus reduced bandwidth usage to main memory. Even though this
change doesn't benefit a user running a single process, this helps on fishtest
or e.g. for Lichess, when multiple games run concurrently, or multiple
positions are analyzed in parallel.

This concept was probably first introduced in the Monty engine
(https://github.com/official-monty/Monty/pull/62), after a discussion in
https://github.com/official-stockfish/fishtest/issues/2077 on the issue of
memory pressure. Measurements based on Torch
(https://github.com/user-attachments/files/21386224/verbatim.pdf) further
suggested that large gains were possible. Multiple other engines have
adopted this 'verbatim' format as well.

The implementation here adds the flexibility needed for SF, for example, retains
the ability to bundle compressed networks with the binary, to load nets by uci
option, and to distribute the shared nets to the proper NUMA region. This
flexibility comes with a fair amount of complexity in the implementation, such
as OS specific code, and fallback code.

For most users this should be transparent. However, for example, those running
docker containers should ensure the `--ipc` flag is set correctly, and
`--shm-size` is sufficiently large.

The benefits of this patch significantly depend on hardware, with systems with
many cores and a large (O(150MB), the net size) L3 cache benefitting typically
most. On such systems SF speedups (as measured via nps playing games with
large concurrency but just 1 thread) can be 38%, which results in master vs.
patch Elo which gains about 25 Elo.

```
# PLAYER : RATING ERROR POINTS PLAYED (%)
1 shared_memoryPR : 24.8 1.9 39432.0 73728 53
2 master : 0.0 ---- 34296.0 73728 47
```

In a multithreaded setup, where weights are already shared, that benefit is smaller,
for example on the same HW as above, but with 8t for each side.
```
# PLAYER : RATING ERROR POINTS PLAYED (%)
1 shared_memoryPR : 5.2 3.5 9351.0 18432 51
2 master : 0.0 ---- 9081.0 18432 49
```

On fishtest with a typical hardware mix of our contributors, the following was measured:

STC, 60k games
https://tests.stockfishchess.org/tests/view/69074a49ea4b268f1fac236c
Elo: 4.69 ± 1.4 (95%) LOS: 100.0%
Total: 60000 W: 16085 L: 15275 D: 28640 Elo +4.69
Ptnml(0-2): 154, 6440, 16053, 7148, 205
nElo: 9.38 ± 2.8 (95%) PairsRatio: 1.12

To verify correctness with a single process on a NUMA architecture,
speedtest was used, confirming near equivalence:
```
master: Average (over 10): 296236186
shared_memory: Average (over 10): 295769332
```
Currently, using large pages for the shared network weights is not always possible,
which can lead to a small slowdown (1-2%), in case a single process is run.

closes https://github.com/official-stockfish/Stockfish/pull/6173

No functional change
Parent - - By Jörg Oster Date 2025-11-03 10:19 Upvotes 1
Endlich?

Ca. 1600 Zeilen an Code, die für den normalen User nichts bringen.
Und ich würde mir an deiner Stelle nicht zu viel davon versprechen.
Und ein Elo-Fortschritt ist das auch nicht, denn es ist letzten Endes nur eine Optimierung für Tester oder Frameworks wie Fishtest, wo mehrere Instanzen gleichzeitig laufen.

Statt dass jede Instanz sein eigenes Netz in den Speicher lädt, wird dieses nun einmal in einen bestimmtem Bereich geladen, und alle Instanzen können dann von dort die Werte (die Wichtungen und Biases, die im Netz gespeichert sind) lesen. Die eigentlichen Berechnungen laufen weiterhin per Instanz.
Es wird weniger Speicher gebraucht. That's it.

Der normale Anwender, der Stockfish in einer Benutzeroberfläche laufen lässt, hat davon absolut nichts!
Da sind mit den Maintainern/Entwicklern eindeutig die Pferde durchgegangen.
Oder anders ausgedrückt, hat das meiner Meinung nach nichts in den offiziellen Sourcen zu tun.
Das hätte man besser in einen separaten Entwicklungszweig gepackt und für Tester und fürs Framework dann darauf zugegriffen.

Just my 2 cents ...
Parent - - By Stefan Pohl Date 2025-11-03 10:24
Jörg Oster schrieb:

Endlich?

Ca. 1600 Zeilen an Code, die für den normalen User nichts bringen.
Und ich würde mir an deiner Stelle nicht zu viel davon versprechen.
Und ein Elo-Fortschritt ist das auch nicht, denn es ist letzten Endes nur eine Optimierung für Tester oder Frameworks wie Fishtest, wo mehrere Instanzen gleichzeitig laufen.



Ein Ressourcenfortschritt ist es. Darum hat es absolut Sinn: Gewinnt man ein paar Prozent Speedup, so hat das in Fishtest durchaus positive Effekte, denn (reiner Beispielwert) +10% speedup in Fishtest entspricht logischerweise einer Erhöhung der genutzten Cores in Fishtest um 10%.

Ein großer Celo-Fortschritt wird es in den Ranglisten sicher nicht. Aber ein paar Celo haben oder nicht haben, sage ich mal. Und die Konkurrenz hat das Feature bereits verbaut, insofern entfernt der Patch ein kleines Handicap von Stockfish gegenüber der Konkurrenz.
Parent - By Jörg Oster Date 2025-11-03 11:00
Erstens, habe ich nicht gesagt, dass es sinnlos ist.
Und zweitens, jedwede Elo die du misst, ist nur virtuell vorhanden.
Parent - - By Andreas Kuntze Date 2025-11-03 10:28
Es gibt für dieses Feature auch für "normale Anwender" wie mich sinnvolle Anwendungsfälle.

Meine FS-Analysen führe ich mit Aquarium-IDeA durch und dort laufen etliche Stockfish-Instanzen gleichzeitig. Ich spare also deutlich Speicher und kann den Cache für die einzelnen Instanzen erhöhen.
Parent - By Jörg Oster Date 2025-11-03 10:58 Upvotes 1
Damit bist du aber schon nicht mehr der 'normale' Anwender ...

Und für solche Fälle könnte man ja auch diese Version zur Verfügung stellen.
Parent - By Max Siegfried Date 2025-11-03 11:51
Besser ein Speedup haben als nicht haben.
Am Ende summieren sich immer diese kleinen Vorteile und Stockfish ist jedes Jahr stärker.
Selbst wenn der Patch nur hauptsächlich für die Entwickler gut ist, im Endeffekt erhalten wir nach einem Jahr mit dem Patch einen Stockfish der (+5 ELO) stärker ist als der Stockfish den wir eigentlich erhalten hätten.
Die Endanwender bekommen also mehr Elo zu einem späteren Zeitpunkt.
Ob das jetzt nötig ist, sei dahingestellt.
Parent - - By Thomas Plaschke Date 2025-11-04 19:37
Verstehe ich das richtig, es geht nur darum, die Netzdatei unter den Prozessen/Instanzen zu teilen?
Würde man mehrere Instanzen mit eingebetteten Netzen starten (die "fetten" Exes), bringt das gar nichts, oder?

Viele Grüße
Th. Plaschke
Parent - By Jörg Oster Date 2025-11-04 23:41
Doch, genau darum geht es ja.
Nehmen wir an, du lässt unter cutechess-cli oder fastchess mit concurrency=4 spielen.
Dann teilen sich diese 4 Instanzen ein Netz, welches eine der Instanzen vorher in den Speicher geladen hat.
Die anderen Instanzen erkennen das quasi. Frag mich aber bitte nicht, wie das technisch realisiert ist. 
Parent - By Andreas Matthies Date 2025-11-05 07:32
Thomas Plaschke schrieb:

Verstehe ich das richtig, es geht nur darum, die Netzdatei unter den Prozessen/Instanzen zu teilen?
Würde man mehrere Instanzen mit eingebetteten Netzen starten (die "fetten" Exes), bringt das gar nichts, oder?

Viele Grüße
Th. Plaschke

Klar bringt das etwas für die "fetten" Exes. Gibt es bei Stockfish exe'e ohne eingebettetes Netz? Nicht dass ich wüsste.
In der Exe liegt ja eine komprimierte Version des Netzes, das dann beim Start der Engine im Hauptspeicher entpackt werden muss und dann dort von der NNUE Bewertung genutzt wird.
Und dieses Entpacken passiert jetzt in einer Variante, dass es nur durch die erste Instanz gemacht werden muss, hierbei shared memory verwendet wird und die Instanzen 2 bis n dieses im shared memory entpackte Netz dann mitnutzen statt selbst erneut zu entpacken.

So habe ich es zumindest verstanden.

Gruß, Andreas
Up Topic Hauptforen / CSS-Forum / Stockfish Verbatim Net Patch

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill