強い将棋ソフトの創りかた(その2)

ここら辺の続編である。

bleu48.hatenablog.com

bleu48.hatenablog.com

 

もうちょっと間をおいてから本格的な試行をする予定でしたが書店に並び始めたとのことで以下のやつ公開しておきます。

 

後半のdlshogiの学習の部分ですが,加納さんは限られたリソースで学習できるように教師データを分割してスクリプトで連続学習できるようにしています。

加納さんはColabでもシェルスクリプトを使うスタイルですが,私のWindows主な環境とは違います。

そもそも学習をPythonでやってるので皆環境は整っているはずということで,シェルスクリプトPythonに書き換えてみました。学習部を呼ぶところをモジュール呼びにしていたのですが,これだとログファイルが更新されなかったり,教師データが追加読みになっているために積算されたりしたために結局subprocessで落ち着きました。

思ったよりダサい落ちですがシェルスクリプト未経験者が今から学ぶより有用かと思って公開しておきます。

 

もちろん,Windows環境で動くようになります。(主目的)

 

# 強い将棋ソフトの創りかた
# 学習用スクリプトをPythonで書き直したもの
import sys
import os
import glob
import subprocess

# 学習するエポックの閾値の上限値。72エポック(24分割した教師データ*3サイクル)学習する。
last = 72

# 引数がひとつある場合は上書きする
if len(sys.argv) > 1:
    last = int(sys.argv[1])

# 変数設定
name = "resnet10_swish"
log_dir = "./log"
model_dir = "./model"
data_dir = "./data"

# 最新のチェックポイント+1から学習を再開する。
chkp =[int(i[-7:-4]) for i in glob.glob(model_dir+"/checkpoint_"+name+"-???.pth")]
if len(chkp) > 0:
    start = max(chkp) + 1
else:
    start = 1

for i in range(start, last + 1):
    j = i - 1
    k = (i - 1) % 24 + 1

    # floodgate、水匠3改、dlshogi_with_gctの教師データ(24分割)を順番に学習する。
    src="{0}/floodgate_2019-2021_r3500-{1:03d}.hcpe {0}/suisho3kai-{1:03d}.hcpe {0}/dlshogi_with_gct-{1:03d}.hcpe ".format(data_dir,k)
    # print(src)

    # チェックポイントが存在する場合、最新のチェックポイントから学習を継続する。
    if i == 1:
        resume = ""
    else:
        resume = "-r {0}/checkpoint_{1}-{2:03d}.pth".format(model_dir, name, j)
    # print(resume)

    # 最終エポックの学習のみモデルファイルを保存する。
    if i != last:
        model = ""
    else:
        model = "--model {0}/model_{1}-{2:03d}".format(model_dir, name, i)

    # チェックポイントファイル名
    checkpoint = "{0}/checkpoint_{1}-{2:03d}.pth".format(model_dir, name, i)

    # ログファイル名
    log = "{0}/{1}-{2:03d}.txt".format(log_dir, name, i)

    print("epoch",i,"start")

    # 学習
    subprocess.call("python -m dlshogi.train "+
              src +                                                     
              data_dir + "/floodgate_test_2017-2018_r3500_eval5000.hcpe " + 
              "--network "+ name + " " +                                       
              resume +                                                
              " --checkpoint " + checkpoint + " " +                               
              model +                                                 
              " --lr_scheduler StepLR(step_size=24,gamma=0.1) " +          
              "--use_swa " +                                                
              "--swa_start_epoch 10 " +                                     
              "--use_average " +                                         
              "--use_evalfix " +                                           
              "--lr 0.04 --batchsize 4096 --use_amp " + # 非力GPUでは一行コメントアウトしてください
              "--log " + log
    )
#               コマンドラインオプション省略