Ce que fait la fonction go () de mcts_player.py
mcts_player.py Apportez les modifications suivantes avant d'exécuter réellement le programme.
Correction de PolicyValueResnet (blocs = 5) car une erreur se produira si les blocs d'argument ne sont pas entrés dans PolicyValueResnet () qui charge le modèle. 5 est le même nombre de blocs que lors de l'entraînement de ce modèle.
pydlshogi/player/mcts_player.py
def isready(self):
#Modèle de charge
if self.model is None:
self.model = PolicyValueResnet(blocks=5)
Laissez l'adresse IP déterminer quel PC est en cours d'exécution. Utilisez l'indicateur gpu_en pour choisir d'utiliser ou non le GPU. Le chemin du fichier modèle est également commuté avec l'indicateur env.
pydlshogi/player/mcts_player.py
#Cadre environnemental
#-----------------------------
import socket
host = socket.gethostname()
#Obtenir l'adresse IP
# google colab :Aléatoire
# iMac : xxxxxxxx
# Lenovo : yyyyyyyy
# env
# 0: google colab
# 1: iMac (no GPU)
# 2: Lenovo (no GPU)
# gpu_en
# 0: disable
# 1: enable
if host == 'xxxxxxxx':
env = 1
gpu_en = 0
elif host == 'yyyyyyyy':
env = 2
gpu_en = 0
else:
env = 0
gpu_en = 1
#-----------------------------
À l'importation
pydlshogi/player/mcts_player.py
if gpu_en == 1:
from chainer import cuda, Variable
def init(self):
pydlshogi/player/mcts_player.py
#Chemin du fichier modèle
if env == 0:
self.modelfile = '/content/drive/My Drive/・ ・ ・/python-dlshogi/model/model_policy_value_resnet'
elif env == 1:
self.modelfile = r'/Users/・ ・ ・/python-dlshogi/model/model_policy_value_resnet'
elif env == 2:
self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_policy_value_resnet"
self.model = None #modèle
def eval_node()
pydlshogi/player/mcts_player.py
if gpu_en == 1:
x = Variable(cuda.to_gpu(np.array(eval_features, dtype=np.float32)))
elif gpu_en == 0:
x = np.array(eval_features, dtype=np.float32)
with chainer.no_backprop_mode():
y1, y2 = self.model(x)
if gpu_en == 1:
logits = cuda.to_cpu(y1.data)[0]
value = cuda.to_cpu(F.sigmoid(y2).data)[0]
elif gpu_en == 0:
logits = y1.data[0]
value = F.sigmoid(y2).data[0]
def isready()
pydlshogi/player/mcts_player.py
#Modèle de charge
if self.model is None:
self.model = PolicyValueResnet(blocks=5)
if gpu_en == 1:
self.model.to_gpu()
J'ai lancé le programme au début. En conséquence, 7 6 étapes visitées 143 fois et 2 6 étapes visitées 77 fois. Cela semble bon pour le moment. Je pourrais le faire sur Google Colab.
move_count: nombre de visites sur ce nœud de déplacement nnrate: probabilité prédite du réseau politique win_rate: taux de réussite moyen du déplacement (= taux de réussite total / nombre de visites) nps : node/time time: Temps requis pour une seule fois () nœuds: nombre de visites sur le nœud actuel (current_node.move_count) hashfull: Occupation des tableaux node_hash et uct_node. Indique combien des 4096 éléments ont été utilisés. Une valeur numérique exprimée en 1000 lorsqu'elle est occupée à 100%. score cp: valeur d'évaluation pv: déplacer les coordonnées
D'après les résultats ci-dessus, le temps requis pour chaque exécution était de 3524 ms pour le CPU et de 2020 ms pour le GPU. Par conséquent, le rapport de vitesse GPU / CPU est de 3524/2020 = 1,7. C'est environ deux fois plus rapide.
Le nombre de visites (nœuds) du nœud actuel est le même que 235 pour le GPU et le CPU. Vous pouvez simplement voir que la vitesse par visite est plus rapide sur le GPU.
Pour chaque recherche, une fonction appelée interruption_check () est utilisée pour déterminer s'il faut terminer la recherche au milieu. Le nombre de recherches est défini sur 300, mais si le meilleur coup ne peut pas être dépassé même si toutes les recherches restantes sont consacrées au meilleur coup suivant, la recherche est arrêtée même si le nombre de recherches n'a pas atteint 300. Puisque le résultat ci-dessus est des nœuds 235, on peut voir qu'il a été terminé après 235 fois.
Pour référence, j'ai exécuté go () en continu pour tracer le nombre de visites sur le nœud actuel. On peut voir que le nombre de visites sur le nœud actuel n'augmente pas à mesure que le nombre d'exécutions de go () augmente. Au fur et à mesure que le nombre d'exécutions de go () augmente, le nombre de visites sur le nœud enfant augmente également, de sorte que la recherche peut être terminée plus tôt.
J'ai essayé de comprendre comment le nombre de visites sur le nœud actuel change en fonction du nombre de recherches. Si le nombre de visites est défini sur 6000 ou plus, le résultat ne passera pas de 4057. Ce n'est que le résultat du début. Les résultats varieront en fonction de la situation.
Vidéo de jeu https://youtu.be/H0jD76R2PAM Self (Ama 1st Stage) vs Chapitre 12-5 AI Policy Network & Value Network & Monte Carlo Tree Search. Il n'y a pas de parallélisation. C'était plus faible que ce que j'avais imaginé car je faisais souvent des mouvements étranges.
Carte finale
Recommended Posts