TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

C++

C++の再現性の低いバグを解析する

C++

先日、dlshogiをfloodgateでテストした際に、goコマンドに対して結果を返さずタイムアップするという事象が発生した。再現性が低く、全く同じ局面を手動でコンソールからコマンドを入力して何度も探索させても再現しなかった。 スレッドプールの処理に問題が…

WindowsでPyTorchをC++(Visual C++)で動かす【更新】

以前にWindowsでLibTorchをC++から使う方法について記事を書いたが、内容が古くなったので書き直す。基本的な手順は以前と同じだが、リリースビルドとデバッグビルドの使い分けができるようになっている。最新のLibTorch 1.3は、Release用のバイナリと、Debu…

高速なPythonのリバーシ(オセロ)ライブラリ

将棋で強化学習のアルゴリズムをいろいろ試そうとしたが、DQNが全く学習しないので、もう少し簡単なゲームを先に試そうと思う。 ということで、リバーシ(オセロ)で試すことにした。Pythonで使えるリバーシのライブラリがないか探したが良さそうなのが見つか…

dlshogiのLinuxでのビルド/自己対局の実行方法

dlshogiのビルドや自己対局の実行方法について今まで文章化していなかったので、解説用のJupyter Notebookを作成した。 Google Colabで実行できる。colab.research.google.com dlshogiは学習に初期局面集や評価局面集を使っていたり、メモリを大量に消費する…

C#からLibTorchを使ってMNISTデータセットを学習する

C#からディープラーニングフレームワークを使用する方法について、以前にいくつかの方法を検討した。 gRPCでC#とPythonを連携する - TadaoYamaokaの開発日記 SocketでC#とPythonを連携する - TadaoYamaokaの開発日記 TensorFlowのC#バインディング - TadaoYa…

LinuxでC#からC++で作成した共有ライブラリを呼び出す

cmakeでC++の共有ライブラリプロジェクトを作成する CMakeLists.txt cmake_minimum_required(VERSION 3.8) project(SampleDll) enable_language(CXX) add_library(SampleDll SHARED sample_dll.cpp ) sample_dll.cppに、C++で処理を記述する。 Windowsでも使…

高速なPythonの将棋ライブラリを作る

python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。 公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。しかし、機械学習の用途に使用しようと…

C++の引数解析ライブラリ

c++

Pythonではargparseという引数解析ライブラリが標準で使用できる。 バッテリー同梱なだけはある。C++にはそのような便利なライブラリは用意されていないため、同じような引数解析を行おうとする煩雑な処理を実装する必要がある。 有名な引数解析ライブラリと…

タスクマネージャーのメモリ使用量

C++

将棋AIの学習のためにGPUを増やしたところ、まったく速度が上がらないどころか低下するという事象が起きて、ここ数日原因を調べていました。 メモリスワップが起きていたことが原因で、わかってしまえば単純な話でしたが、Windowsのタスクマネージャーの仕様…

LinuxとWindowsのマルチスレッド性能

将棋AIをAWSで動かそうとLinux対応しましたが、Linuxでマルチスレッドの性能がでないため、いろいろ実験してみました。検証している将棋AIではGPUの計算が終わったら、待機中の複数の探索スレッドに通知する処理を行っています。 それを、以下のような処理で…

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で推論する

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

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

TensorFlowは公式でWindowsに対応しているが、C++のAPIはLinuxとMacでしかサポートされていない。 https://www.tensorflow.org/install/install_cdllをダウンロードして、defを作成してリンクする方法もあるようだが、CPUでしか使えない。 visual studioでte…

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

C++

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

将棋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…

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…

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

C++

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

C++でディリクレ分布による乱数生成

C++

C++にディリクレ分布で乱数生成する標準関数は用意されていない。ガンマ分布で乱数生成する標準関数std::gamma_distributionが用意されているので、 Dirichlet distribution - Wikipedia に書かれている方法を使って、ガンマ分布で乱数y1,...,yKを生成し、 …

PythonからC++を呼び出してnumpyを使う

将棋でディープラーニングを試しているが、Pythonで入力データの加工を行うと処理速度が問題になっている。そこで、PythonからC++で作成したモジュールを呼び出して、その中でnumpyのオブジェクトの加工を行いたい。 PythonからC++の呼び出しはオーバーヘッ…

cuDNNでAlphaGoのSL policy networkの順伝播を実装する

Chainerを使って学習したAlphaGoのSL policy networkのモデルを使用して、C++のプログラムからcuDNNを使用して順伝播を実装してみた。SL policy networkを囲碁のプログラムに組み込んで使おうとすると、PythonとChainerが必要になるのでは実行環境の敷居が高…

コンパイラによるFFTの速度比較(再測定)

以前の日記で、コンパイラごとのFFTの実行速度を比較した結果を記載しましたが、この記事を見て、gccがVisual C++に比べて速いという内容が以前の私の測定と違っていたので再測定を行いました。この記事で使用しているgccは、MSYS2のものを使用しているよう…

CaffeでSL policy networkを学習

前回の日記で定義した、AlphaGoのSL policy networkをCaffeで学習してみた。以前にChainerを使って学習した結果と速度、精度を比較するため、条件を合わせている。 インターネットから入手したプロの棋譜を使用 特徴はAlphaGoの論文のExtended Data Table 2…

Caffeを使ってC++で3層パーセプトロンを学習する

前回の日記でCaffeをC++から使うことができたので、3層パーセプトロンを学習させてみた。Caffeではモデルをprototxt形式で記述する。 学習方法を記述したsolver.prototxtとネットワークを記述したnet.prototxtの2つのファイルを作成する。 ファイル名は別の…

WindowsでビルドしたCaffeをC++から使う

前回の日記でWindowsでビルドしたCaffeをC++から使うことができたので方法を書いておきます。Windows版caffeをビルドしたVisual Studio 2013のソリューションにプロジェクトを追加する形でプロジェクトを作成します。 はじめソリューションを新規作成して、…