TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

将棋AIの進捗 その17(AWS対応を検討)

世界コンピュータ選手権の参加者のマシンスペックをみると、マシンスペック高すぎです( ゚Д゚)GPUを2枚詰んだ個人のPCで参加しようと思っていましたが、GPU8枚とかで来られたらモデルと探索の性能ではどうにもならなそうです。 モンテカルロ木探索は並列化の効…

将棋AIの進捗 その16(マルチGPU)

将棋AIをChainerを使用した実装からcuDNNを使用した実装に変更できたので、マルチGPUでの性能を測定した。 Chainerを使用した場合 Python経由でChainerを使用しているPythonのGIL機構によってマルチスレッドの性能に制限がある。 Chainerを使用した場合の、…

将棋AIの進捗 その15(cuDNNを使用)

モデルの学習にディープラーニングフレームワークのChainerを使用していますが、対局時にChainerで推論を行うと、Python経由で呼び出すためマルチGPUで動かす際、Python経由だとGILによってマルチスレッドの性能が出なくなる。 また、実行環境にPythonが必要…

Chainerで学習したモデルを使ってcuDNNで推論する(マルチGPU)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードを、マルチGPUで並列に動作するようにした。cuDNNをマルチスレッドで、スレッドに別々のGPUを割り当てて使用する場合、それぞれのスレッドでcudaSetDevice()を呼び出し、GPU IDを指定…

Chainerで学習したモデルを使ってcuDNNで推論する(ResNet)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードを、Residual Network(ResNet)構成にした。推論時には、テンソルの加算を行うだけで特に難しいことはない。 ネットワーク定義(Chainer) ResNetは1ブロックのみで、ブロック内の畳み込…

Chainerで学習したモデルを使ってcuDNNで推論する(dropout)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、dropoutを追加した。dropoutは学習時のみ処理を行うため、推論時には何もしなくてよい。 つまり、推論のネットワーク定義にはdropoutは必要ない。 学習用ネットワーク定義 学習用…

Chainerで学習したモデルを使ってcuDNNで推論する(BatchNormalization)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、BatchNormalizationを追加した。BatchNormalizationも、cuDNNにAPIが用意されているため、簡単に使用できる。 ネットワーク定義(Chainer) まず、Chainerで学習するモデルにBatchNo…

Chainerで学習したモデルを使ってcuDNNで推論する(時間計測)

昨日の日記の続きです。C++のコードでcuDNNを直接使用して推論を行った場合と、Chainerを使用して推論を行った場合の実行時間の比較を行った。 測定条件 MNISTのtest set images(1000画像)のすべてを推論するのに要する時間を測定 ミニバッチサイズは、100 …

Chainerで学習したモデルを使ってcuDNNで推論する

ディープラーニングを使ったモデルを学習する際、ディープラーニングフレームワークを使うと使わないとでは生産性に大きな差がある。 多少のオーバーヘッドは許容して、ディープラーニングフレームワークを使う方がトータルでメリットがあると思う。しかし、…

将棋AIの進捗 その14(自己対局による強化学習)

自己対局による強化学習の検証をはじめた。強化学習の手法は、以前の日記で書いた通りで、Alpha Zeroの手法を参考にして、1手800シミュレーションで自己対局を行う。自己対局→学習のサイクルを繰り返してモデルを成長させる。 1回のサイクルで、どれだけの自…

【書籍】将棋AIで学ぶディープラーニング

「将棋AIで学ぶディープラーニング」という本を出版します。昨年10月に技術書典3で「ディープラーニングを使った将棋AIの作り方」という技術系同人誌を出したことをきっかけに書籍化のお話をいただきました。技術書典で出した本は、方策ネットワークを使った…

【Tips】Visual Studio 2015で保存時に改行コードをLFにする

Visual Studioで開発してLinuxでもビルドや実行できるソースにしようとすると、改行コードをLFにそろえたい。Visual Studio 2015では保存時の改行コードを設定できる。 エンコーディングと改行しかし、いったんLFにして保存しても改行コードが異なるソースか…

MCTSnetの論文を読む

DeepMindからarXivに投稿された論文「Learning to Search with MCTSnets」についてです。Redditの投稿が簡潔に要約しています。 Learning to Search with MCTSnets : cbadukAlphaGo ZeroのPUCTアルゴリズムは、PolicyとValueと訪問回数を使って、固定の計算…

将棋AIの進捗 その13(自己対局のマルチGPU対応 その2)

前回マルチスレッドで2つのCPUを使用して自己対局を行うプログラムを作成したが、局面生成の速度はGPU1つの場合と変わらなかった。 ChainerをPython経由で使用しているため、GILのために効率が上がらなかったためと考えている。そこで、プロセスを分けてマル…

TensorFlowをWindowsでGPU有効でビルドしてC++で使う

TensorFlowは公式でWindowsに対応しているが、C++のAPIはLinuxとMacでしかサポートされていない。 Installing TensorFlow for C | TensorFlowdllをダウンロードして、defを作成してリンクする方法もあるようだが、CPUでしか使えない。 visual studioでtensor…

将棋AIの進捗 その12(自己対局のマルチGPU対応)

自己対局のプログラムをマルチGPUに対応させました。処理方式は、対局プログラムのマルチGPU対応とほとんど同じです。マルチGPU対応により局面生成の速度がどれくらいあがるか測定しました。 測定条件 シングルGPUは、TitanV 1枚。200スレッドで対局。 マル…

C++でemplace_backを使う際の注意点

C++

STLのvectorのemplace_backを使うと要素の追加時にコンストラクタで初期化できる。しかし、コンストラクタとデストラクタで副作用のある処理をしている場合、注意が必要だ。 以下のようなコードはうまく動作しない。 #include <iostream> #include <vector> using namespace st</vector></iostream>…

Windowsでクリップボードをsortしてuniqする

Windowsのコマンドラインでテキストの加工を行うとき、クリップボードと連携できると便利である。コマンドの結果をクリップボードにコピーするには、clip.exeコマンドにパイプで渡せばよい。 dir /b | clip逆に、クリップボードのテキストを加工したい場合も…

将棋AIの進捗 その11(マルチGPU対応)

GPUが2つになったので、dlshogiをマルチGPUに対応させました。ニューラルネットワークの計算要求をキューにためてミニバッチで推論を行う仕組みにしていたので、キューをGPUごとに用意して、探索スレッドを一方のキューに対応させて、キューを監視してニュ…

C/C++からPythonをマルチスレッドで使う

C/C++からPythonの処理をマルチスレッドで使うには、C/C++側でもGILの制御が必要になる。マルチスレッドでGILを取得せずにPythonの処理を呼び出すとメモリ例外などで異常終了する。Pythonの仮想マシンはスレッドセーフではなくマルチスレッドでは動かせない…

C++でメンバ関数をスレッドで実行する

C++

C++で静的メンバ関数をスレッドで実行するには、以下のように記述する。 class A { public: static void f() {}; }; int main() { thread th(A::f); th.join(); return 0; } では、メンバ関数をスレッドで実行するにはどうすればよいだろうか。 class A { pu…

ChainerでマルチGPUを試す

GPUが2枚になったので、ChainerでマルチGPUによる学習を試してみた。MNISTサンプルを使って、実行時間を測定した。 測定条件 CUDA v9.0 cuDNN 7.0.5 ChainerのGitHubレポジトリのexamples/mnistを使用 単体の実行時間はtrain_mnist.pyの実行時間 マルチGPUの…

将棋AIの進捗 その10(Linux対応)

ChainerのMNISTサンプルをUbuntuで動かすとWindowsよりも早いことがわかったので、dlshogiの自己対局をUbuntuで行えるようにした。AperyのMakefileを参考に、g++でビルドできるようにした。Windowsで32スレッドで1手800シミュレーションで自己対局を行うと、…

UbuntuでBoostをビルドしてBoost.PythonとBoost.Numpyを使う

Ubuntu 16.04 LTSのaptでインストールできるBoostのバージョンは1.58なのでBoost.Numpyが使えない。 そこで、最新バージョンのBoostをソースからビルドした。手順は、 Boost Getting Started on Unix Variants - 1.66.0 を参照した。 ソースダウンロード wge…

音声スペクトルモニター(Audio Spectrum Monitor)のバージョンアップ

久しぶりに音声スペクトルモニター(Audio Spectrum Monitor)をバージョンアップしました٩( 'ω' )و play.google.comベータ版で公開したままにしていた機能を正式にリリースしました。 ピッチホールド機能を追加 waveファイルをインポートする機能を追加(44.1k…

Android Studio 3にアップデート

将棋ソフトの開発ばかりしていたので、しばらくスマホアプリの更新ができていませんでした。 要望はちょくちょくもらっていたのですが、返信もおこたってました・・(・´ω・`)ゞ 時間の使い方を見直して、アプリ開発にも少し時間をとることにしようと思いま…

将棋でディープラーニングする その52(自己対局で教師局面生成)

AlphaZeroと同様の方式で、自己対局で教師局面を生成するプログラムを作成した。 自己対局の仕様 以下の仕様はAlphaZeroと同じとした。 自己対局を行う双方のプレイヤーは、同一のモデルを使用する。 プレイアウトは固定プレイアウト数 以下の点は変更した。…

C++のログ出力ライブラリ

C++

電王トーナメントのときに将棋所のログ出力が同期処理で非常に遅いこと知らずに時間切れ負けを起こしてしまった。 その後、速度優先でログ出力を行わないように修正したが、ログ出力がないと探索の状況がわからず不便である。そこでログをファイルに出力する…

第28回世界コンピュータ将棋選手権申し込み

しばらく忙しかったのでコンピュータ将棋の開発できていませんでした。 ぼちぼち再開します。12月くらいにブートストラップのバグを修正してelmoの深さ8で生成した局面を使って学習をやり直しましたが、強さはあまり変わりませんでした。5.8億局面くらいでte…

Ubuntu Serverを後からDesktopにする

先日、Ubuntu Serverを使うとCUDA+cuDNN+Chainerが動かせたという記事を書きましたが、以前にUbuntu DesktopでうまくNvidiaのドライバをインストールできなかった原因がわかりました。Ubuntu Desktopでうまくインストールできなかった原因は、ドライバインス…