diff --git a/KataGo/analysis_config.cfg b/KataGo/analysis_config.cfg index 6cebae5..40523e4 100644 --- a/KataGo/analysis_config.cfg +++ b/KataGo/analysis_config.cfg @@ -55,14 +55,14 @@ maxVisits = 500 # number of visits, and thread contention will reduce efficiency, so cross-position parallelization is preferable # to numSearchThreads, but numSearchThreads is preferable if you want to reduce latency, and have individual # searches complete faster by doing fewer of them at a time. -numSearchThreads = 2 +numSearchThreads = 6 # GPU Settings------------------------------------------------------------------------------- # Maximum number of positions to send to GPU at once. -nnMaxBatchSize = 128 +nnMaxBatchSize = 64 # Cache up to 2 ** this many neural net evaluations in case of transpositions in the tree. -nnCacheSizePowerOfTwo = 23 +nnCacheSizePowerOfTwo = 21 # Size of mutex pool for nnCache is 2 ** this nnMutexPoolSizePowerOfTwo = 17 # Randomize board orientation when running neural net evals? diff --git a/bots/settings.py b/bots/settings.py index 016a74f..0db6b04 100644 --- a/bots/settings.py +++ b/bots/settings.py @@ -1,5 +1,6 @@ bot_strategy_names = { "dev": "P:Noise", + "dev-beta": "P:Weighted", "strong": "Policy", "influence": "P:Influence", "territory": "P:Territory", @@ -11,7 +12,8 @@ bot_strategy_names = { greetings = { - "dev": "Experimental!", + "dev": "Policy+Dirichlet noise.", + "dev-beta": "Play a policy-weighted move.", "strong": "Play top policy move.", "influence": "Play an influential style.", "territory": "Play a territorial style.", diff --git a/bots/start_bot.py b/bots/start_bot.py index 35e4df0..0dd1499 100755 --- a/bots/start_bot.py +++ b/bots/start_bot.py @@ -15,7 +15,10 @@ if True or bot in ["dev", "local"]: else: GTP2OGS = "node ../stable-gtp2ogs" BOT_SETTINGS = f" --maxconnectedgames {MAXGAMES} --maxhandicapunranked 25 --maxhandicapranked 1 --boardsizesranked 19 --boardsizesunranked all --komisranked automatic,5.5,6.5,7.5 --komisunranked all" - +if 'beta' in bot: + BOT_SETTINGS += " --beta" +else: + BOT_SETTINGS += " --rankedonly" username = f"katrain-{bot}" @@ -40,6 +43,6 @@ if settings: GREETING += f" Settings: {settings_dump}." BYEMSG = "Thank you for playing. If you have any feedback, please message my admin! Play with these bots at any time by downloading KaTrain at github.com/sanderland/katrain" -cmd = f'{GTP2OGS} --debug --apikey {APIKEY} --username {username} --greeting "{GREETING}" --farewell "{BYEMSG}" {BOT_SETTINGS} --farewellscore --aichat --noclock --nopause --speeds blitz,live --persist --minrank 25k -- python bots/ai2gtp.py {bot} {port}' +cmd = f'{GTP2OGS} --debug --apikey {APIKEY} --rejectnewfile ~/shutdown_bots --username {username} --greeting "{GREETING}" --farewell "{BYEMSG}" {BOT_SETTINGS} --farewellscore --aichat --noclock --nopause --speeds blitz,live --persist --minrank 25k -- python bots/ai2gtp.py {bot} {port}' print(f"starting bot {username} using server port {port} --> {cmd}") os.system(cmd) diff --git a/core/engine.py b/core/engine.py index 5fb6915..4579f77 100644 --- a/core/engine.py +++ b/core/engine.py @@ -43,9 +43,9 @@ class KataGoEngine: try: self.katrain.log(f"Starting KataGo with {self.command}", OUTPUT_DEBUG) self.katago_process = subprocess.Popen(self.command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - except FileNotFoundError: + except FileNotFoundError as e: self.katrain.log( - f"Starting kata with command '{self.command}' failed. If you are on Mac or Linux, please change the settings or configuration file (config.json) to point to the correct KataGo executable.", + f"Starting kata with command '{self.command}' failed with error {e}. Please make sure the 'katago' value under 'engine' in settings points to the correct KataGo executable.", OUTPUT_ERROR, ) diff --git a/profile.py b/profile.py new file mode 100644 index 0000000..a0a36c0 --- /dev/null +++ b/profile.py @@ -0,0 +1,42 @@ +# This is a stand-alone script that generates a review for an SGF +import json +import sys +import time + +from core.common import OUTPUT_INFO +from core.engine import KataGoEngine +from core.game import Game, KaTrainSGF + +if len(sys.argv) < 2: + exit(1) +inputfile = sys.argv[1] + +with open("config.json") as f: + settings = json.load(f) + sgf_settings = settings["sgf"] + engine_settings = settings["engine"] + game_settings = settings["game"] + trainer_settings = settings["trainer"] + +#engine_settings['threads'] = 32 +engine_settings["max_time"] = 1000 + +class Logger: + def log(self, msg, level): + if level <= OUTPUT_INFO: + print(msg) + + +logger = Logger() + +engine = KataGoEngine(logger, engine_settings) +move_tree = KaTrainSGF.parse_file(inputfile) +game = Game(logger, engine, game_settings, move_tree=None, analyze_fast=True) +game.root=move_tree +reverse_nodes = game.root.nodes_in_tree[::-1] + +for n in reverse_nodes[::10]: + n.analyze(engine=engine) + while not n.analysis_ready: + time.sleep(0.01) + print(n.single_move,'done') \ No newline at end of file diff --git a/review.py b/review.py new file mode 100644 index 0000000..c61d3c8 --- /dev/null +++ b/review.py @@ -0,0 +1,47 @@ +# This is a stand-alone script that generates a review for an SGF +import json +import sys +import time + +from core.common import OUTPUT_INFO +from core.engine import KataGoEngine +from core.game import Game, KaTrainSGF + +if len(sys.argv) < 2: + exit(1) +inputfile = sys.argv[1] + +with open("config.json") as f: + settings = json.load(f) + sgf_settings = settings["sgf"] + engine_settings = settings["engine"] + game_settings = settings["game"] + trainer_settings = settings["trainer"] + +#engine_settings['threads'] = 32 +engine_settings["max_time"] = 1000 + +class Logger: + def log(self, msg, level): + if level <= OUTPUT_INFO: + print(msg) + + +logger = Logger() + +engine = KataGoEngine(logger, engine_settings) +move_tree = KaTrainSGF.parse_file(inputfile) +game = Game(logger, engine, game_settings, move_tree=move_tree, analyze_fast=False) +nodes = game.root.nodes_in_tree +remaining = len(nodes) +while remaining > 0: + remaining = sum(not n.analysis_ready for n in nodes) + print(f"Waiting for {remaining} queries") + time.sleep(0.1) + +msg = game.write_sgf( + sgf_settings["sgf_save"], + trainer_config=trainer_settings, + save_feedback=sgf_settings["save_feedback"], + eval_thresholds=trainer_settings["eval_thresholds"], +)