253 lines
13 KiB
INI
253 lines
13 KiB
INI
# Example config for C++ (non-python) gtp bot
|
|
|
|
# RUNNING ON AN ONLINE SERVER OR IN A REAL TOURNAMENT OR MATCH:
|
|
# If you plan to do so, you may want to read through the "Rules" section
|
|
# below carefully for proper handling of komi and handicap games and end-of-game cleanup
|
|
# and various other details.
|
|
|
|
# NOTES ABOUT PERFORMANCE AND MEMORY USAGE:
|
|
# You will likely want to tune one or more the following:
|
|
#
|
|
# numSearchThreads:
|
|
# The number of CPU threads to use. If your GPU is powerful, it can actually be much higher than
|
|
# the number of cores on your processor because you will need many threads to feed large enough
|
|
# batches to make good use of the GPU.
|
|
#
|
|
# nnMaxBatchSize:
|
|
# The maximum GPU batch size. Should often be at least as large as numSearchThreads.
|
|
# Larger won't do anything, but also won't hurt except use a little bit more GPU memory.
|
|
# Smaller can be fine if you have more than one GPU, since the GPUs will be sharing the work
|
|
# of servicing the CPU threads.
|
|
#
|
|
# cudaUseFP16 and cudaUseNHWC:
|
|
# These have a good chance of improving peformance at larger threads/batch sizes if
|
|
# you are using the CUDA implementation with an NVIDIA GPU with FP16 tensor cores.
|
|
#
|
|
# nnCacheSizePowerOfTwo:
|
|
# This controls the NN Cache size, which is the primary RAM/memory use.
|
|
# Each neural net entry takes very approximately 1.5KB, except when using whole-board
|
|
# ownership/territory visualizations, each entry will take very approximately 3KB.
|
|
# The number of entries is (2 ** nnCacheSizePowerOfTwo), for example 2 ** 18 = 262144.
|
|
# Increase this if you don't mind the memory use and want better performance
|
|
# for searches with tens of thousands of visits or more (due to birthday paradox
|
|
# it can start mattering well before cache actually fills entirely up).
|
|
# Decrease this if you want to limit memory usage.
|
|
#
|
|
# OTHER NOTES:
|
|
# If you have more than one GPU, take a look at "OpenCL GPU settings" or "CUDA GPU settings" below.
|
|
#
|
|
# If using OpenCL, you will want to verify that KataGo is picking up the correct device!
|
|
# (e.g. some systems may have both an Intel CPU OpenCL and GPU OpenCL, if KataGo appears to pick
|
|
# the wrong one, you correct this by specifying "openclGpuToUse" below).
|
|
#
|
|
# You may also want to adjust "maxVisits", "ponderingEnabled", "resignThreshold", and possibly
|
|
# other parameters depending on your intended usage.
|
|
|
|
|
|
# Logs------------------------------------------------------------------------------------
|
|
|
|
# Where to output log?
|
|
logFile = gtp.log
|
|
# Logging options
|
|
logAllGTPCommunication = true
|
|
logSearchInfo = true
|
|
logToStderr = false
|
|
|
|
# KataGo will display some info to stderr on GTP startup
|
|
# Uncomment this to suppress that and remain silent
|
|
# startupPrintMessageToStderr = false
|
|
|
|
# Chat some stuff to stderr, for use in things like malkovich chat to OGS.
|
|
# ogsChatToStderr = true
|
|
|
|
# Configure the maximum length of analysis printed out by lz-analyze and other places.
|
|
# Controls the number of moves after the first move in a variation.
|
|
# analysisPVLen = 9
|
|
|
|
# Report winrates for chat and analysis as (BLACK|WHITE|SIDETOMOVE).
|
|
# Default is SIDETOMOVE, which is what tools that use LZ probably also expect
|
|
# reportAnalysisWinratesAs = SIDETOMOVE
|
|
|
|
# Rules------------------------------------------------------------------------------------
|
|
|
|
# koRule = SIMPLE #Simple ko rules (triple ko = no result)
|
|
koRule = POSITIONAL #Positional superko
|
|
# koRule = SITUATIONAL #Situational superko
|
|
# koRule = SPIGHT #Spight superko - https://senseis.xmp.net/?SpightRules
|
|
|
|
scoringRule = AREA #Area scoring
|
|
# scoringRule = TERRITORY #Territory scoring (uses a sort of special computer-friendly territory ruleset)
|
|
|
|
multiStoneSuicideLegal = false #Is multiple-stone suicide legal? (Single-stone suicide is always illegal).
|
|
|
|
# Make the bot capture stones that are part of pass-alive territory
|
|
# This is necessary to get correct play under tromp-taylor rules since the bot otherwise assumes (and is trained under)
|
|
# a ruleset where those stones need not be captured. It obviously should NOT be enabled if playing under territory scoring.
|
|
cleanupBeforePass = false
|
|
|
|
# Uncomment this to make it so that if the game seems to be a handicap game, assume that white gets +1 point per
|
|
# black handicap stone. Some Go servers like OGS will silently give white such points without including it in the komi.
|
|
# whiteBonusPerHandicapStone = 1
|
|
|
|
# Resignation occurs if for at least resignConsecTurns in a row,
|
|
# the winLossUtility (which is on a [-1,1] scale) is below resignThreshold.
|
|
allowResignation = false
|
|
resignThreshold = -0.98
|
|
resignConsecTurns = 3
|
|
|
|
# Assume that if black makes many moves in a row right at the start of the game, then the game is a handicap game.
|
|
# This is necessary on some servers and for some GUIs and also when initializing from many SGF files, which may
|
|
# set up a handicap games using repeated GTP "play" commands for black rather than GTP "place_free_handicap" commands.
|
|
# However, it may also lead to incorrect undersanding of komi if whiteBonusPerHandicapStone = 1 and a server does NOT
|
|
# have such a practice.
|
|
# Defaults to true. Uncomment and set to false to disable this behavior.
|
|
# assumeMultipleStartingBlackMovesAreHandicap = false
|
|
|
|
# Search limits-----------------------------------------------------------------------------------
|
|
|
|
# If provided, limit maximum number of root visits per search to this much. (With tree reuse, visits do count earlier search)
|
|
maxVisits = 1000
|
|
# If provided, limit maximum number of new playouts per search to this much. (With tree reuse, playouts do not count earlier search)
|
|
# maxPlayouts = 1000
|
|
# If provided, cap search time at this many seconds (search will still try to follow GTP time controls)
|
|
# maxTime = 60
|
|
|
|
# Ponder on the opponent's turn?
|
|
ponderingEnabled = false
|
|
|
|
# Same limits but for ponder searches if pondering is enabled
|
|
# maxVisitsPondering = 1000
|
|
# maxPlayoutsPondering = 1000
|
|
# maxTimePondering = 60
|
|
|
|
# Number of seconds to buffer for lag for GTP time controls
|
|
lagBuffer = 1.0
|
|
|
|
# Number of threads to use in search
|
|
numSearchThreads = 1
|
|
|
|
# Play a little faster if the opponent is passing, for friendliness
|
|
searchFactorAfterOnePass = 0.50
|
|
searchFactorAfterTwoPass = 0.25
|
|
# Play a little faster if super-winning, for friendliess
|
|
searchFactorWhenWinning = 0.40
|
|
searchFactorWhenWinningThreshold = 0.95
|
|
|
|
# GPU Settings-------------------------------------------------------------------------------
|
|
|
|
# Maximum number of positions to send to GPU at once. Note that you will also need to increase numSearchThreads
|
|
# to make use of this, as every thread in KataGo is synchronous, so with 1 thread max batch will only be 1 anyways.
|
|
nnMaxBatchSize = 16
|
|
# Cache up to 2 ** this many neural net evaluations in case of transpositions in the tree.
|
|
nnCacheSizePowerOfTwo = 18
|
|
# Size of mutex pool for nnCache is 2 ** this
|
|
nnMutexPoolSizePowerOfTwo = 14
|
|
# Randomize board orientation when running neural net evals?
|
|
nnRandomize = true
|
|
# If provided, force usage of a specific seed for nnRandomize instead of randomizing
|
|
# nnRandSeed = abcdefg
|
|
|
|
# How many threads should there be to feed positions to the neural net?
|
|
# Server threads are indexed 0,1,...(n-1) for the purposes of the below GPU settings arguments
|
|
# that specify which threads should use which GPUs.
|
|
# NOTE: This parameter is probably ONLY useful if you have multiple GPUs, since each GPU will need a thread.
|
|
# If you're tuning single-GPU performance, use numSearchThreads instead.
|
|
numNNServerThreadsPerModel = 1
|
|
|
|
# CUDA GPU settings--------------------------------------
|
|
# These only apply when using CUDA as the backend for inference.
|
|
# (For GTP, we only ever have one model, when playing matches, we might have more than one, see match_example.cfg)
|
|
|
|
# Default behavior tries to guess the 'best' GPU or device
|
|
# You will want to uncomment and adjust one or more of these lines to take advantage of a multi-gpu machine
|
|
# cudaDeviceToUse = 0 #use device 0 for all server threads (numNNServerThreadsPerModel) unless otherwise specified per-model or per-thread-per-model
|
|
# cudaDeviceToUseModel0 = 3 #use device 3 for model 0 for all threads unless otherwise specified per-thread for this model
|
|
# cudaDeviceToUseModel1 = 2 #use device 2 for model 1 for all threads unless otherwise specified per-thread for this model
|
|
# cudaDeviceToUseModel0Thread0 = 3 #use device 3 for model 0, server thread 0
|
|
# cudaDeviceToUseModel0Thread1 = 2 #use device 2 for model 0, server thread 1
|
|
|
|
# Uncomment these on NVIDIA devices with FP16 tensor cores for probably a speedup, at the cost of introducing some precision loss in the nn calculation.
|
|
# cudaUseFP16 = true
|
|
# cudaUseNHWC = true
|
|
|
|
# OpenCL GPU settings--------------------------------------
|
|
# These only apply when using OpenCL as the backend for inference.
|
|
# (For GTP, we only ever have one model, when playing matches, we might have more than one, see match_example.cfg)
|
|
|
|
# Default behavior tries to guess the 'best' GPU or device
|
|
# You will want to uncomment and adjust one or more of these lines to take advantage of a multi-gpu machine
|
|
# openclDeviceToUse = 0 #use device 0 for all server threads (numNNServerThreadsPerModel) unless otherwise specified per-model or per-thread-per-model
|
|
# openclDeviceToUseModel0 = 3 #use device 3 for model 0 for all threads unless otherwise specified per-thread for this model
|
|
# openclDeviceToUseModel1 = 2 #use device 2 for model 1 for all threads unless otherwise specified per-thread for this model
|
|
# openclDeviceToUseModel0Thread0 = 3 #use device 3 for model 0, server thread 0
|
|
# openclDeviceToUseModel0Thread1 = 2 #use device 2 for model 0, server thread 1
|
|
|
|
# Uncomment to tune OpenCL for every board size separately, rather than only the largest possible size
|
|
# openclReTunePerBoardSize = true
|
|
|
|
# Search randomization------------------------------------------------------------------------------
|
|
# Note that multithreading can also introduce a significant amount of nondeterminism.
|
|
|
|
# If provided, force usage of a specific seed for various things in the search instead of randomizing
|
|
# searchRandSeed = hijklmn
|
|
|
|
# Temperature for the early game, randomize between chosen moves with this temperature
|
|
chosenMoveTemperatureEarly = 0.5
|
|
# Decay temperature for the early game by 0.5 every this many moves, scaled with board size.
|
|
chosenMoveTemperatureHalflife = 19
|
|
# At the end of search after the early game, randomize between chosen moves with this temperature
|
|
chosenMoveTemperature = 0.10
|
|
# Subtract this many visits from each move prior to applying chosenMoveTemperature
|
|
# (unless all moves have too few visits) to downweight unlikely moves
|
|
chosenMoveSubtract = 0
|
|
# The same as chosenMoveSubtract but only prunes moves that fall below the threshold, does not affect moves above
|
|
chosenMovePrune = 1
|
|
|
|
# Use dirichlet noise for the root node policy?
|
|
rootNoiseEnabled = false
|
|
# Dirichlet noise alpha is set to this divided by number of legal moves. 10.83 produces an alpha of 0.03 on an empty 19x19 board.
|
|
rootDirichletNoiseTotalConcentration = 10.83
|
|
# Proportion of root policy that is noise
|
|
rootDirichletNoiseWeight = 0.25
|
|
|
|
# Using LCB for move selection?
|
|
useLcbForSelection = true
|
|
# How many stdevs a move needs to be better than another for LCB selection
|
|
lcbStdevs = 5.0
|
|
# Only use LCB override when a move has this proportion of visits as the top move
|
|
minVisitPropForLCB = 0.15
|
|
|
|
# Internal params------------------------------------------------------------------------------
|
|
|
|
# Scales the utility of winning/losing
|
|
winLossUtilityFactor = 0.0
|
|
# Scales the utility for trying to maximize score
|
|
staticScoreUtilityFactor = 0.6
|
|
dynamicScoreUtilityFactor = 0.4
|
|
# Adjust dynamic score center this proportion of the way towards zero, capped at a reasonable amount.
|
|
dynamicScoreCenterZeroWeight = 0.20
|
|
# The utility of getting a "no result" due to triple ko or other long cycle in non-superko rulesets (-1 to 1)
|
|
noResultUtilityForWhite = 0.0
|
|
# The number of wins that a draw counts as, for white. (0 to 1)
|
|
drawEquivalentWinsForWhite = 0.5
|
|
|
|
# Exploration constant for mcts
|
|
cpuctExploration = 2.0
|
|
# FPU reduction constant for mcts
|
|
fpuReductionMax = 0.2
|
|
# Use parent average value for fpu base point instead of point value net estimate
|
|
fpuUseParentAverage = true
|
|
# Amount to apply a downweighting of children with very bad values relative to good ones
|
|
valueWeightExponent = 0.5
|
|
# Slight incentive for the bot to behave human-like with regard to passing at the end, filling the dame,
|
|
# not wasting time playing in its own territory, etc, and not play moves that are equivalent in terms of
|
|
# points but a bit more unfriendly to humans.
|
|
rootEndingBonusPoints = 0.5
|
|
# Make the bot prune useless moves that are just prolonging the game to avoid losing yet
|
|
rootPruneUselessMoves = true
|
|
|
|
# How big to make the mutex pool for search synchronization
|
|
mutexPoolSize = 8192
|
|
# How many virtual losses to add when a thread descends through a node
|
|
numVirtualLossesPerThread = 1
|