Hi,
I've just started working on a Chess engine project (ANSI C - just for personal fun, nothing serious).
I've completed the first step - board representation, move generation and perft tests ('Kiwi Pete' and some curated set I found online).
I pass all the pert tests. I average around 2.6s for perft of start position to depth 6. I think is likely fine as optimising this any further may not be worth it, I'm assuming the search will be the most important wrt. performance.
I've been thinking about the evaluation function next. It is something I can build and test, before getting onto the tricker elements of search and optimising that.
So, it looks like I have some options:
Firstly, build a hand crafted evaluation function. I've been using the chess programming wiki site, it looks pretty straightforward.
However most engines are now using Neural Nets it seems and I've a lot to learn to even get started there.
Another option would be to utilise the prebuilt model from Leela or NNUE: looking at the source from those projects, it doesn't appear simple to untangle into an API that I can embed in my fledgling engine.
Does anyone know if there are libraries/code snippets that already do this?
My other question is, obviously training a NN to a good standard may require significant resources, has anyone managed to get
a simple example NN playing to a reasonable standard, training on one machine?
Any pointers (no pun intended) or tips on how to get started in NN for chess would be welcome.
Thanks in advance,
Mike Lewis
NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Moderators: hgm, Rebel, chrisw
-
- Posts: 4
- Joined: Sun Sep 22, 2024 9:51 pm
- Full name: Michael Lewis
-
- Posts: 2872
- Joined: Wed Mar 10, 2010 10:18 pm
- Location: Hamburg, Germany
- Full name: Srdja Matovic
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
If fun is the metric I suggest to code at first your own handcrafted eval, "the journey is the reward", then one step further you can implement neural networks.
Re: How to get started with NNUE
viewtopic.php?p=957108#p957108
--
Srdja
Re: How to get started with NNUE
viewtopic.php?p=957108#p957108
--
Srdja
-
- Posts: 516
- Joined: Tue Feb 04, 2014 12:25 pm
- Full name: Colin Jenkins
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Another advantage of doing a HCE first is that you can then use it to add score and win/draw/loss labels to positions generated from self play and use those to train your first net.
-
- Posts: 103
- Joined: Sat Jul 30, 2022 12:12 pm
- Full name: Jamie Whiting
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Training a NN that will beat any HCE you could produce takes incredibly little time on a single consumer machine. We're talking single digit hours of datagen (if you start from your HCE), and <1 hour of total training time (with or without a gpu).
Almost every engine in the top 50 trains its networks on the author's own single machine (although not everyone does their own datagen, which is the most time consuming part).
Using other people's networks (other than for testing your inference works) is strongly, strongly discouraged. And if you want to use one to test inference you should use a simpler network architecture - even the earliest networks of SF NNUE is a terrible reference point for beginners.
This will just save a very minor amount of time over starting from a random network.
-
- Posts: 148
- Joined: Sun Oct 30, 2022 5:26 pm
- Full name: Conor Anstey
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
^^^ in full agreement with JW's post above
I'd also add that "NNUE" is the entire technique, it doesn't refer to specifically Stockfish networks, and Leela nets themselves are not going to work in an a/b engine.
-
- Posts: 4
- Joined: Sun Sep 22, 2024 9:51 pm
- Full name: Michael Lewis
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Thanks for the advise, I'll start with a handcrafted eval. I managed mainly thanks to peppering the code with 'inline __attribute__((always_inline))' to get my perft 6 from startpos to an average of 2.117s which probably could
go a bit quicker... I've assumed that make/undo is going to be faster than copy-make.
go a bit quicker... I've assumed that make/undo is going to be faster than copy-make.
-
- Posts: 103
- Joined: Sat Jul 30, 2022 12:12 pm
- Full name: Jamie Whiting
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
What makes you think that is a valid assumption to make? Copying is extremely fast. In perft it probably depends on the size of your board - for me copy/make has always been faster in perft (and it hardly matters in the actual search).
-
- Posts: 4
- Joined: Sun Sep 22, 2024 9:51 pm
- Full name: Michael Lewis
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
That's a fair point, but I'd be amazed if memcpy of a set of bitboards would be quicker than an in-situ undo, but you are correct, I probably shouldn't assume but test!
-
- Posts: 103
- Joined: Sat Jul 30, 2022 12:12 pm
- Full name: Jamie Whiting
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Even if we allow for your board state to be rather large, e.g. almost 200 bytes, look at what it compiles to on modern CPUs:
https://godbolt.org/z/8q698T4je
But yes, just test.
-
- Posts: 254
- Joined: Thu Jul 21, 2022 12:30 am
- Full name: Chesskobra
Re: NN Eval functions/Embedding Leela/NNUE prebuilt models into Engine
Sorry if I am asking a question that was answered in this or another similar thread. But it was suggested that there are engines that use a very simple architecture like an array of 768 bits for input position and a small hidden layer of 16 neurons. Here viewtopic.php?p=957361#p957361 it was explained by lithander in some detail.
What are some engines that implement a simple network like that? I would like to look at some small engines, preferably for CPU, with easy to understand C or C++ code. I am not interested in creating my own engine. But I would like to create a simple network, plug it into an existing engine and see what happens. Are there any scripts that I can use for data generation and training such a network?
What are some engines that implement a simple network like that? I would like to look at some small engines, preferably for CPU, with easy to understand C or C++ code. I am not interested in creating my own engine. But I would like to create a simple network, plug it into an existing engine and see what happens. Are there any scripts that I can use for data generation and training such a network?