The problem
A personal chess engine with limited compute cannot pretend to be AlphaZero. Pure self-play from random weights needs a training budget this project did not have. The useful question was how to get competent play quickly, then improve it.
What it does
Stage one is supervised: a convolutional network trained on more than 5,000 master-level games, learning to judge positions from labeled play. Stage two is self-play on top of that baseline — the model plays itself and moves past what supervised learning alone reached. Inference is wrapped in FastAPI and deployed on Modal’s GPU cloud.
Three decisions
Supervised pretraining before self-play. Starting from real master games reaches competent play much faster than random-init self-play, especially on a solo compute budget. AlphaZero-style training from scratch mostly makes sense at a scale this project did not have.
A CNN as a position evaluator, not an LLM agent. This is classical supervised learning plus reinforcement learning. If the interesting part is agents, that work lives in SPYDRWEB and Braid.
Deploy inference separately from training. Training runs where the GPUs are; the API is a thin FastAPI wrapper in front of a Modal endpoint.
What’s unfinished
There is no published Elo. Self-play improved on the supervised baseline; that is the claim, not a rating. A proper held-out evaluation set and more self-play iterations would make the improvement quantitative instead of mostly qualitative.