Files
NowChessSystems/modules/official-bots/python
Janis Eccarius 2a3f0d6be3
Build & Test (NowChessSystems) TeamCity build failed
feat(official-bots): perspective-independent training via board flip for Black (NCS-116)
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>
2026-06-24 19:30:22 +02:00
..
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00
2026-04-29 22:06:01 +02:00

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_PATH or /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

  1. Generatedata/positions.txt

    • Random chess positions from 8-20 move openings
    • Filters out checks, game-over states, and captures
  2. Labeldata/training_data.jsonl

    • Evaluates each position with Stockfish at depth 12
    • Stores FEN + evaluation in JSONL format
  3. Trainweights/nnue_weights_vN.pt

    • Trains neural network on labeled positions
    • Auto-versioning (v1, v2, v3, etc.)
    • Saves metadata alongside weights
  4. ExportNNUEWeights_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.json file with training info
  • Training from checkpoint uses latest version unless specified with --from-checkpoint

Files

  • data/ and weights/ 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