個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。C++C++2020-05-13C++の再現性の低いバグを解析するC++先日、dlshogiをfloodgateでテストした際に、goコマンドに対して結果を返さずタイムアップするという事象が発生した。再現性が低く、全く同じ局面を手動でコンソールからコマンドを入力して何度も探索させても再現しなかった。PyTorch以前にWindowsでLibTorchをC++から使う方法について記事を書いたが、内容が古くなったので書き直す。基本的な手順は以前と同じだが、リリースビルドとデバッグビルドの使い分けができるようになっている。Python将棋で強化学習のアルゴリズムをいろいろ試そうとしたが、DQNが全く学習しないので、もう少し簡単なゲームを先に試そうと思う。いうことで、リバーシ(オセロ)で試すことにした。Notebookを作成した。Colabで実行できる。C#C#からディープラーニングフレームワークを使用する方法について、以前にいくつかの方法を検討した。sample_dll.cppに、C++で処理を記述する。C++python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。機械学習の用途に使用しようと...2019-01-30C++の引数解析ライブラリc++Pythonではargparseという引数解析ライブラリが標準で使用できる。バッテリー同梱なだけはある。C++にはそのような便利なライブラリは用意されていないため、同じような引数解析を行おうとする煩雑な処理を実装する必要がある。有名な引数解析ライブラリと...2018-11-21タスクマネージャーのメモリ使用量C++将棋AIの学習のためにGPUを増やしたところ、まったく速度が上がらないどころか低下するという事象が起きて、ここ数日原因を調べていました。マルチスレッド将棋AIをAWSで動かそうとLinux対応しましたが、Linuxでマルチスレッドの性能がでないため、いろいろ実験してみました。検証している将棋AIではGPUの計算が終わったら、待機中の複数の探索スレッドに通知する処理を行っています。cuDNN前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードを、マルチGPUで並列に動作するようにした。Network(ResNet)構成にした。推論時には、テンソルの加算を行うだけで特に難しいことはない。cuDNN前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、dropoutを追加した。dropoutは学習時のみ処理を行うため、推論時には何もしなくてよい。推論のネットワーク定義にはdropoutは必要ない。cuDNN前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、BatchNormalizationを追加した。BatchNormalizationも、cuDNNにAPIが用意されているため、簡単に使用できる。DeepLearning昨日の日記の続きです。C++のコードでcuDNNを直接使用して推論を行った場合と、Chainerを使用して推論を行った場合の実行時間の比較を行った。Chainerディープラーニングを使ったモデルを学習する際、ディープラーニングフレームワークを使うと使わないとでは生産性に大きな差がある。多少のオーバーヘッドは許容して、ディープラーニングフレームワークを使う方がトータルでメリットがあると思う。C++TensorFlowは公式でWindowsに対応しているが、C++のAPIはLinuxとMacでしかサポートされていない。https://www.tensorflow.org/install/install_cdllをダウンロードして、defを作成してリンクする方法もあるようだが、CPUでしか使えない。studioでte...2018-02-24C++でemplace_backを使う際の注意点C++STLのvectorのemplace_backを使うと要素の追加時にコンストラクタで初期化できる。コンストラクタとデストラクタで副作用のある処理をしている場合、注意が必要だ。以下のようなコードはうまく動作しない。dlshogiGPUが2つになったので、dlshogiをマルチGPUに対応させました。C++C/C++からPythonの処理をマルチスレッドで使うには、C/C++側でもGILの制御が必要になる。マルチスレッドでGILを取得せずにPythonの処理を呼び出すとメモリ例外などで異常終了する。Pythonの仮想マシンはスレッドセーフではなくマルチスレッドでは動かせない...2018-02-20C++でメンバ関数をスレッドで実行するC++C++で静的メンバ関数をスレッドで実行するには、以下のように記述する。メンバ関数をスレッドで実行するにはどうすればよいだろうか。LTSのaptでインストールできるBoostのバージョンは1.58なのでBoost.Numpyが使えない。そこで、最新バージョンのBoostをソースからビルドした。wge...2018-02-10C++のログ出力ライブラリC++電王トーナメントのときに将棋所のログ出力が同期処理で非常に遅いこと知らずに時間切れ負けを起こしてしまった。その後、速度優先でログ出力を行わないように修正したが、ログ出力がないと探索の状況がわからず不便である。そこでログをファイルに出力する...2017-12-10C++でディリクレ分布による乱数生成C++C++にディリクレ分布で乱数生成する標準関数は用意されていない。C++将棋でディープラーニングを試しているが、Pythonで入力データの加工を行うと処理速度が問題になっている。そこで、PythonからC++で作成したモジュールを呼び出して、その中でnumpyのオブジェクトの加工を行いたい。networkのモデルを使用して、C++のプログラムからcuDNNを使用して順伝播を実装してみた。C++に比べて速いという内容が以前の私の測定と違っていたので再測定を行いました。networkをCaffeで学習してみた。以前にChainerを使って学習した結果と速度、精度を比較するため、条件を合わせている。Caffe前回の日記でCaffeをC++から使うことができたので、3層パーセプトロンを学習させてみた。Caffeではモデルをprototxt形式で記述する。学習方法を記述したsolver.prototxtとネットワークを記述したnet.prototxtの2つのファイルを作成する。Caffe前回の日記でWindowsでビルドしたCaffeをC++から使うことができたので方法を書いておきます。2013のソリューションにプロジェクトを追加する形でプロジェクトを作成します。はじめソリューションを新規作成して、...次のページプロフィールid:TadaoYamaokaスマホアプリ開発とディープラーニングを使った将棋ソフトの開発を行っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。