2a3f0d6be3
Build & Test (NowChessSystems) TeamCity build failed
Training: for Black-to-move positions, mirror the board (ranks flipped,
colours swapped) before feature extraction so the model always sees the
position from the side-to-move's perspective. Eval label is negated to
match. Implemented in fen_to_features (board.mirror()) and __getitem__
(' b ' check in FEN string).
Inference (legacy evaluate()): applies the same flip for Black so the
model receives features in the format it was trained on. The
scoreFromOutput negation converts back to White's absolute perspective.
Incremental accumulator path is unchanged — it uses the raw HalfKP
features with the existing sign-negation at output; the quality gain comes
from the richer training distribution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NNUE Python Pipeline
Central CLI for training and exporting chess evaluation neural networks (NNUE).
Directory Structure
python/
├── nnue.py # Main CLI entry point
├── src/ # Python modules
│ ├── generate.py # Generate random chess positions
│ ├── label.py # Label positions with Stockfish
│ ├── train.py # Train NNUE model
│ └── export.py # Export weights to Scala
├── data/ # Training data (gitignored)
│ ├── positions.txt
│ └── training_data.jsonl
└── weights/ # Model weights (gitignored)
├── nnue_weights_v1.pt
├── nnue_weights_v1_metadata.json
└── ...
Quick Start
# Train a new model (500k positions, auto-detect checkpoint)
python nnue.py train
# Train from specific checkpoint
python nnue.py train --from-checkpoint 2
# Train with custom games count
python nnue.py train --games 200000
# Train with custom positions file
python nnue.py train --positions-file my_positions.txt
# Export specific version to Scala
python nnue.py export 2
# List all checkpoints
python nnue.py list
CLI Commands
train - Train NNUE model
python nnue.py train [OPTIONS]
Options:
--from-checkpoint N- Resume from checkpoint version N (default: uses latest)--games N- Number of games to generate (default: 500000)--positions-file FILE- Use existing positions file instead of generating--stockfish PATH- Path to Stockfish binary (default:$STOCKFISH_PATHor/usr/games/stockfish)
Examples:
# Train with latest checkpoint
python nnue.py train
# Train from v2 with 100k games
python nnue.py train --from-checkpoint 2 --games 100000
# Train with custom positions
python nnue.py train --positions-file my_games.txt --stockfish /opt/stockfish/sf15
export - Export weights to Scala
python nnue.py export WEIGHTS [output_path]
Arguments:
WEIGHTS- Version number (e.g.,2) or full filename (e.g.,nnue_weights_v2.pt)
Examples:
# Export version 2
python nnue.py export 2
# Export with full filename
python nnue.py export nnue_weights_v3.pt
Output goes to ../src/main/scala/de/nowchess/bot/bots/nnue/NNUEWeights_vN.scala
list - List available checkpoints
python nnue.py list
Shows all available model versions with file sizes.
Data Flow
-
Generate →
data/positions.txt- Random chess positions from 8-20 move openings
- Filters out checks, game-over states, and captures
-
Label →
data/training_data.jsonl- Evaluates each position with Stockfish at depth 12
- Stores FEN + evaluation in JSONL format
-
Train →
weights/nnue_weights_vN.pt- Trains neural network on labeled positions
- Auto-versioning (v1, v2, v3, etc.)
- Saves metadata alongside weights
-
Export →
NNUEWeights_vN.scala- Converts weights to Scala object
- Ready for integration into bot
Versioning
- Models are automatically versioned (v1, v2, v3, etc.)
- Each version gets a
_metadata.jsonfile with training info - Training from checkpoint uses latest version unless specified with
--from-checkpoint
Files
data/andweights/are gitignored (local artifacts)- Documentation in
docs/explains training, debugging, and incremental improvements - Source modules in
src/are independent and can be imported for custom workflows