Stránka predmetu: https://davidmonis.github.io/RocnikovyProjekt/
Tento repozitár obsahuje dve samostatné časti:
-
Snake Game AI (Deep Q-Learning)
Jednoduchší projekt z 1. semestra, kde sa agent učí hrať klasickú hru Snake pomocou Deep Q-Learningu. -
Hungry Geese Agent
Pokročilejší projekt postavený na prostredíkaggle-environments, vlastnom simulátore, neurónovej sieti a Monte Carlo Tree Search.
Pred spustením projektu je potrebné mať nainštalované:
- Python 3.9 alebo novší
- pip
V koreňovom priečinku Snake projektu spusti:
python -m venv venvAktivácia virtuálneho prostredia:
Windows
.\venv\Scripts\activateLinux / macOS
source venv/bin/activateInštalácia závislostí:
pip install torch pygame numpy matplotlibpython agent.pyNajlepší model sa automaticky uloží do:
model/model.pth
python agent.py trainedpython game.pyOvládanie:
- šípka doľava
- šípka hore
- šípka doprava
- šípka dole
python inspect_model.pyTáto časť projektu implementuje agenta pre Kaggle prostredie Hungry Geese.
Agent používa:
- vlastnú reprezentáciu hry cez
GameState, - vlastný lokálny simulátor,
- egocentrické kódovanie stavu hry,
- policy-value neurónovú sieť,
- Monte Carlo Tree Search,
- self-play tréning,
- replay buffer,
- interné aj externé vyhodnocovanie.
Finálny Kaggle agent je v súbore:
submission.py
Lokálne spúšťanie hier je cez:
play_local.py
Táto časť projektu bola vyvíjaná hlavne cez:
- Windows
- WSL 2
- Ubuntu vo WSL
- Python 3
- virtuálne prostredie
.venv
Odporúčané je spúšťať príkazy vo WSL, nie priamo vo Windows PowerShelli.
Vo Windows PowerShelli ako administrátor:
wsl --install -d UbuntuPo prvom spustení Ubuntu si vytvor používateľský účet.
Ak sa projekt nachádza na Windows disku a používa sa cez WSL, je vhodné zapnúť metadata, aby fungovali práva súborov a virtuálne prostredie.
Vo WSL otvor:
sudo nano /etc/wsl.confDo súboru vlož:
[automount]
options = "metadata,umask=22,fmask=11"Potom vo Windows PowerShelli spusti:
wsl --shutdownNásledne znovu otvor Ubuntu.
Príklad:
cd /mnt/c/Users/David/Desktop/RocnikovyProjekt/KaggleAk je projekt inde, použi vlastnú cestu.
python3 -m venv .venvsource .venv/bin/activatePo aktivácii by mal terminál ukazovať niečo ako:
(.venv) user@pc:/mnt/c/.../Kaggle$
python -m pip install --upgrade pip setuptools wheelpython -m pip install torch pygame numpy matplotlib pytest kaggle-environmentsAk chceš hrať proti verejnému Goose Loose agentovi v priečinku winning_agent/, môžu byť potrebné aj:
python -m pip install onnxruntime scikit-learnAk by Goose Loose agent padal na chybe typu np.Inf was removed, najjednoduchšie riešenie je použiť NumPy 1.x:
python -m pip install "numpy<2"Alebo upraviť Goose Loose kód tak, aby používal np.inf namiesto np.Inf.
Spusti:
python -c "from kaggle_environments import make; env = make('hungry_geese'); print('OK')"Ak sa vypíše:
OK
prostredie je pripravené.
Po vypnutí alebo reštarte už netreba znova vytvárať .venv.
Stačí:
Vo Windows PowerShelli:
wslalebo otvor Ubuntu aplikáciu.
cd /mnt/c/Users/David/Desktop/RocnikovyProjekt/Kagglesource .venv/bin/activatewhich python
python --versionwhich python by malo ukazovať na .venv, napríklad:
/mnt/c/Users/David/Desktop/RocnikovyProjekt/Kaggle/.venv/bin/python
config.py # centrálne nastavenia projektu
submission.py # finálny Kaggle agent
play_local.py # lokálne hranie a vizualizácia hry
evaluate_external.py # externé porovnanie proti Goose Loose
other/replay_viewer.py # interaktívny prehrávač uložených JSON replay súborov
core/actions.py # akcie NORTH, SOUTH, EAST, WEST
core/state.py # interný GameState
core/simulator.py # lokálny simulátor hry
core/encoder.py # prevod stavu na vstup neurónovej siete
core/hard_rules.py # legal mask a okamžité zakázané ťahy
core/scoring.py # rank-based value targety
core/utils.py # helper funkcie
model/network.py # policy-value neurónová sieť
model/losses.py # policy loss, value loss, total loss
search/mcts.py # Monte Carlo Tree Search
search/node.py # MCTS node
training/train.py # hlavný tréningový loop
training/self_play.py # generovanie self-play hier
training/trainer.py # optimalizácia neurónovej siete
training/replay_buffer.py # replay buffer
training/evaluation.py # interné vyhodnocovanie
projects_agents/rule_based.py # interný rule-based agent
projects_agents/nn_policy.py # lacná NN policy
bots/clever_bot.py # jednoduchší externý bot
bots/smart_bot.py # silnejší handcrafted bot
bots/stupid_bot.py # slabý testovací bot
winning_agent/kaggle_public_agent.py # Goose Loose agent
checkpoints/latest.pt # najnovší model, používa ho submission.py
checkpoints/best.pt # najlepší model podľa internej evaluácie
checkpoints/iter_XXXX.pt # snapshoty po intervaloch
checkpoints/replay_buffer.pkl # uložený replay buffer
checkpoints/training_history.json # história tréningu
checkpoints/training_history.jsonl
Hlavné nastavenia sú v súbore:
config.py
Typické skupiny nastavení:
ROWS = 7
COLS = 11
N_PLAYERS = 4
MIN_FOOD = 2
HUNGER_RATE = 40
MAX_LENGTH = 99
EPISODE_STEPS = 200Tieto hodnoty by mali zodpovedať Kaggle Hungry Geese prostrediu.
N_CHANNELS = ...
N_SCALARS = ...
N_ACTIONS = 4Tieto hodnoty musia sedieť s tým, čo očakáva StateEncoder a PolicyValueNet.
LEARNING_RATE = 3e-4
WEIGHT_DECAY = 1e-4
BATCH_SIZE = 128
REPLAY_BUFFER_SIZE = 50_000
VALUE_LOSS_WEIGHT = 1.0NUM_SELF_PLAY_GAMES_PER_ITERATION = 100
NUM_TRAIN_STEPS_PER_ITERATION = 500
EVAL_GAMES = 10TRAIN_MCTS_SIMULATIONS = ...
TRAIN_CUTOFF_DEPTH = ...
EVAL_MCTS_SIMULATIONS = ...
EVAL_CUTOFF_DEPTH = ...
SUBMISSION_MCTS_SIMULATIONS = ...
SUBMISSION_CUTOFF_DEPTH = ...
C_PUCT = ...Pri slabšom počítači zníž hlavne:
TRAIN_MCTS_SIMULATIONSEVAL_MCTS_SIMULATIONSSUBMISSION_MCTS_SIMULATIONSNUM_SELF_PLAY_GAMES_PER_ITERATION
Pri silnejšom počítači môžeš tieto hodnoty zvýšiť.
DEVICE = "auto"Podporované možnosti:
auto # použije CUDA, ak je dostupná, inak CPU
cuda # vynúti GPU
cpu # vynúti CPU
Tréning sa spúšťa z priečinka Kaggle:
PYTHONPATH=. python training/train.pyTréning automaticky:
- vytvorí model,
- načíta checkpoint, ak existuje,
- načíta replay buffer, ak existuje,
- generuje self-play hry,
- trénuje neurónovú sieť,
- vyhodnocuje model,
- ukladá checkpointy,
- zapisuje históriu tréningu.
Ak už existuje:
checkpoints/latest.pt
tréning automaticky pokračuje z tohto checkpointu.
Stačí znovu spustiť:
PYTHONPATH=. python training/train.pyPriorita načítania checkpointu je:
latest.ptbest.pt- posledný
iter_XXXX.pt
Súbor play_local.py umožňuje spustiť lokálnu Hungry Geese hru s rôznymi zostavami agentov.
Základný príkaz:
PYTHONPATH=. python play_local.pyDefaultne sa spustí mód:
mcts-vs-bots
Teda:
submission.py vs clever_bot vs smart_bot vs stupid_bot
PYTHONPATH=. python play_local.py --mode mcts-vs-botsZostava:
submission.py
clever_bot.py
smart_bot.py
stupid_bot.py
PYTHONPATH=. python play_local.py --mode mcts-vs-cleverZostava:
submission.py
clever_bot.py
clever_bot.py
clever_bot.py
PYTHONPATH=. python play_local.py --mode mcts-vs-mctsZostava:
submission.py
submission.py
submission.py
submission.py
Toto je dobré na overenie stability submission agenta proti sebe samému.
PYTHONPATH=. python play_local.py --mode mcts-vs-nnZostava:
submission.py
local nn_agent
local nn_agent
clever_bot.py
nn_agent používa rovnaký checkpoint ako submission, ale nehrá MCTS. Používa iba policy head neurónovej siete s legal maskou.
PYTHONPATH=. python play_local.py --mode nn-vs-botsZostava:
local nn_agent
clever_bot.py
smart_bot.py
stupid_bot.py
Tento mód je vhodný na rýchle porovnanie, či samotná neurónová sieť dáva zmysluplné akcie aj bez MCTS.
PYTHONPATH=. python play_local.py --mode goose-looseZostava:
submission.py
winning_agent/kaggle_public_agent.py
clever_bot.py
clever_bot.py
Toto je základný lokálny spôsob, ako si zahrať proti verejnému Goose Loose agentovi.
Predvolený render je Pygame viewer:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --render viewerANSI výpis do terminálu:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --render ansiBez renderovania:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --render noneAk chceš zapnúť debug v Kaggle prostredí:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --debugPre opakovateľnejšie spustenie môžeš použiť seed:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --seed 123Predvolene play_local.py načítava checkpoints/latest.pt. Pomocou --checkpoint môžeš zvoliť konkrétny checkpoint bez toho, aby si ho musel manuálne kopírovať:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0010.ptToto je užitočné najmä pri porovnávaní rôznych fáz tréningu. Pre konzistentné porovnanie použij rovnaký seed:
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0010.pt --seed 42
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0050.pt --seed 42
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0100.pt --seed 42Použi mód custom a zadaj štyroch agentov:
PYTHONPATH=. python play_local.py --mode custom --agents mcts goose clever cleverPodporované aliasy:
mcts -> submission.py
submission -> submission.py
nn -> lokálny NN-only agent
goose -> winning_agent/kaggle_public_agent.py
goose_loose -> winning_agent/kaggle_public_agent.py
clever -> bots/clever_bot.py
smart -> bots/smart_bot.py
stupid -> bots/stupid_bot.py
Príklady:
PYTHONPATH=. python play_local.py --mode custom --agents mcts nn clever smartPYTHONPATH=. python play_local.py --mode custom --agents mcts mcts nn nnPYTHONPATH=. python play_local.py --mode custom --agents mcts goose smart cleverNa väčšie porovnanie slúži:
PYTHONPATH=. python evaluate_external.pyTento skript je vhodnejší než jedna lokálna hra, pretože spustí veľa hier a počíta štatistiky.
Typicky porovnáva:
submission.py
winning_agent/kaggle_public_agent.py
clever/smart baseline botov
Príklad:
PYTHONPATH=. python evaluate_external.pyAk chceš zvýšiť presnosť výsledku, zvýš počet hier v evaluate_external.py, napríklad:
N_GAMES = 1000Pozor: veľký počet hier môže trvať dlho, najmä ak Goose Loose agent používa ONNX modely.
Súbor other/replay_viewer.py umožňuje interaktívne prehrať uloženú hru zo súboru JSON replay.
PYTHONPATH=. python other/replay_viewer.py replays/game_0.jsonOvládanie v prehliadači:
←/→— krok dozadu / dopreduSPACE— spustiť / zastaviť autoplayHOME/END— skok na začiatok / koniec hryESC— zavrieť
Všetky testy:
PYTHONPATH=. pytestVybrané testy:
PYTHONPATH=. pytest tests/test_simulator.pyPYTHONPATH=. pytest tests/test_train.pyPYTHONPATH=. pytest tests/test_evaluation.pyTichší výpis:
PYTHONPATH=. pytest -qZisti, ktorý Python používaš:
which pythonVerzia Pythonu:
python --versionZoznam nainštalovaných balíkov:
python -m pip listOverenie PyTorch:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"Overenie Kaggle environments:
python -c "from kaggle_environments import make; make('hungry_geese'); print('OK')"Ak dostaneš napríklad:
ModuleNotFoundError: No module named 'kaggle_environments'
pravdepodobne nemáš aktivované .venv alebo nemáš nainštalovaný balík.
Riešenie:
source .venv/bin/activate
python -m pip install kaggle-environmentsAk Python nevie nájsť core, training, model a podobne, spúšťaj projekt s:
PYTHONPATH=. python ...Príklad:
PYTHONPATH=. python play_local.pyAk dostaneš:
Checkpoint not found: checkpoints/latest.pt
najprv natrénuj model:
PYTHONPATH=. python training/train.pyalebo skopíruj existujúci checkpoint do:
checkpoints/latest.pt
Ak Goose Loose padá na:
ModuleNotFoundError: No module named 'onnxruntime'
nainštaluj:
python -m pip install onnxruntime scikit-learnAk Goose Loose padá na:
np.Inf was removed in the NumPy 2.0 release
použi:
python -m pip install "numpy<2"alebo uprav Goose Loose kód na np.inf.
Prvé nastavenie Hungry Geese projektu:
cd /mnt/c/Users/David/Desktop/RocnikovyProjekt/Kaggle
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
python -m pip install torch pygame numpy matplotlib pytest kaggle-environmentsOpätovné spustenie:
cd /mnt/c/Users/David/Desktop/RocnikovyProjekt/Kaggle
source .venv/bin/activate
PYTHONPATH=. python play_local.pyTréning:
PYTHONPATH=. python training/train.pyLokálna hra proti Goose Loose:
PYTHONPATH=. python play_local.py --mode goose-looseMCTS proti botom:
PYTHONPATH=. python play_local.py --mode mcts-vs-botsMCTS proti NN:
PYTHONPATH=. python play_local.py --mode mcts-vs-nnMCTS proti MCTS:
PYTHONPATH=. python play_local.py --mode mcts-vs-mctsPorovnanie rôznych fáz tréningu (rovnaký seed):
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0010.pt --seed 42
PYTHONPATH=. python play_local.py --mode mcts-vs-bots --checkpoint checkpoints/iter_0100.pt --seed 42Externé vyhodnotenie:
PYTHONPATH=. python evaluate_external.pyReplay Viewer:
PYTHONPATH=. python other/replay_viewer.py replays/game_0.jsonTesty:
PYTHONPATH=. pytestČasti projektu vytvorené autorom Dávidom Monišom sú licencované pod licenciou MIT.
Kód je možné používať, upravovať a šíriť za podmienky, že zostane zachované pôvodné copyright oznámenie a text licencie.
Projekt alebo jeho významné časti nie je vhodné prezentovať ako vlastné pôvodné dielo bez uvedenia autora.
Pozri súbor LICENSE.
Tento repozitár môže obsahovať aj externý kód použitý iba na porovnanie, testovanie alebo lokálne vyhodnocovanie agentov.
Súbor:
winning_agent/kaggle_public_agent.py