TadaoYamaokaの日記

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

PythonからC#へポインタ渡しする

C#からPythonへポインタ渡しするとは逆に、Python for .NETを使ってPythonからC#へポインタ渡しする方法について紹介する。 Python for .NET Python for .NETを使用すると、PythonからC#のコードを呼び出すことができる。 Pythonと同じプロセスで、.NETのラ…

dlshogiのdf-pnのテスト方法

dlshogiのdf-pnだけを動かす手順を書いておきます。 テスト局面追加 testプロジェクトのtest.cppの 「// DfPnテスト」と書いてあるところのmain()の vector<string> sfens = { // 詰み "9/9/+N8/p1p4p1/6p1p/1P7/3k3PP/2+p5L/6+rGK w R2B2G3Sgs3n3l9p 1", "1n1g3+Pl/</string>…

df-pnの関連記事

TLでdf-pnの話が上がっていたので、以前書いた記事のリンクをまとめておきます。局面ループ周りの処理はガチで発狂するレベルで面倒でdf-pnが凄いと言い張ってる人が本当にこの問題を解決できてるのかを少し疑うレベルで面倒なんすよね orz— Ryoto_SawadaQha…

dlshogiでMagic Bitboardを有効にする

やねうら王が飛車と角の利きに、PEXTの代わりにMagic Bitboardを使用することで、Threadripperで高速化できたとのことなので、dlshogiでも高速化できるか試してみた。dlshogiは合法手生成にAperyのソースを使用しており、AperyはMagic Bitboardを実装してい…

C#からPythonへポインタ渡しする

以前に、Python for .NETを使用することで、C#とPythonを同一プロセスで動かせることを紹介した。C#からPythonへの呼び出し時に、引数と戻り値は、自動的にマーシャリングが行われる。 ここで、C#の型からPythonのネイティブな型に変換されるのは、スカラ型…

【将棋AI】N駒関係をMulti-Head Self-Attentionで学習する 続き3

前回、入力特徴量の与え方でMulti-Head Self-Attentionの精度を向上できることを確認したが、DCNN(Resnet 10ブロック)に比べて精度がでないことが分かった。今回は、Multi-Head Self-Attentionの出力をDCNNに入力して、Multi-Head Self-AttentionとDCNNを組…

【将棋AI】N駒関係をMulti-Head Self-Attentionで学習する 続き2

前回に引き続き、将棋AIへのMulti-Head Self-Attentionの適用を試してみた。前回は、dlshogiと同じ入力特徴量を使用したが、Multi-Head Self-Attentionに合わせて以下の変更を行った。 各位置の特徴ベクトルに位置の情報を入力する 持ち駒の枚数の特徴ベクト…

【将棋AI】N駒関係をMulti-Head Self-Attentionで学習する 続き

前回考察した将棋AIへのMulti-Head Self-Attentionの適用を試してみた。実装を簡単するために、dlshogiで使用している入力特徴量と出力をそのまま使用した。 入力特徴量 各駒の配置 持ち駒の枚数 駒の種類ごとの利き マスごとの効き数 ※王手の特徴量は除いた…

【将棋AI】N駒関係をMulti-Head Self-Attentionで学習する

こないだ参加したハースストーンのAIコンペの関連論文を読んでいて、個人的に興味深い論文があった。Helping AI to Play Hearthstone using Neural Networksこの論文では、ハースストーンのゲーム状態からニューラルネットワークを使って勝率を予測する方法…

ハースストーンのAIコンペ

不完全情報ゲームのAIの論文を調べていて、たまたまハースストーンのAIコンペがあることを知ったので、試したいこともあったのでさくっとMCTSのプログラムを作って提出してみた。ハースストーンは、相手の手札や山札は見ることができない不完全情報ゲームで…

C#のオブジェクトをダンプする

C#

C#のオブジェクトに格納されている値を調べたいときに、VS Codeなどのデバッガを使えば確認することができるが、オブジェクトの階層が深い場合は、テキストファイルにダンプして確認したくなる。 ObjectDumper.NET 方法がないか調べたところ、「ObjectDumper…

ONNX Runtimeを使ってみる その3(DirectML)

ONNX RuntimeでDirectMLを使ってdlshogiのモデルの推論を行い、処理時間を比較してみた。DirectMLを使えばAMDのGPUでも推論が実行できるようになる。 DirectMLプロバイダの使用 NuGetからビルド済みバイナリが取得できる。 Microsoft.ML.OnnxRuntime.DirectM…

ONNX Runtimeを使ってみる その2(性能測定)

先日、ONNX Runtimeを使って、MNISTの推論を試した。今回は、dlshogiのResnet 10ブロック、192フィルタのモデルを使って、GPUで実行した場合の速度と、CPUで実行した場合の速度を比較した。 測定条件 GPUでのONNXの推論にはTensorRT(FP16)を使用する。 CPUの…

C#からPythonを呼び出す

以前にC#からPythonのディープラーニングフレームワークを呼び出すいくつかの方法を記事にした。 gRPCでC#とPythonを連携する - TadaoYamaokaの日記 SocketでC#とPythonを連携する - TadaoYamaokaの日記 TensorFlowのC#バインディング - TadaoYamaokaの日記 …

dlshogiの学習則

dlshogiを改造して遊びたい方のために、dlshogiの学習則についてちゃんと書いてなかったので書いておく。主に、学習部のソースtrain_rl_policy_with_value_using_hcpe_bootstrap.pyの解説になっている。 AlphaZeroの学習則 AlphaZeroの学習則は、 となってい…

Agent57: Outperforming the Atari Human Benchmarkを読む その15

付録H. 実験結果 H.1. Atari 10:アブレーションのスコア表 H.2. Backpropウィンドウの長さの比較 図12. 難易度の高い10ゲームのセットでの、Backpropウィンドウの長さが短い場合と長い場合のパフォーマンスの比較 H.3. アイデンティティとh変換の組み合わせ…

ONNX Runtimeを使ってみる

dlshogiはCUDAに対応したNvidiaのGPUが必須になっているが、AMDのGPUやCPUのみでも動かせるようにしたいと思っている。Microsoftがオープンソースで公開しているONNX Runtimeを使うと、様々なデバイスでONNXモデルの推論を行うことができる。 TensorRT対応で…

Agent57: Outperforming the Atari Human Benchmarkを読む その14

付録G. ハイパーパラメータ G.1. との値 セットの選択の間の直感は次のとおりです。 については、非常に活用的である方策と探索的である方策を奨励したいので、図11(a)に示すようにシグモイドを選択する。 については、活用方策(の値が小さい)には長期的な…

Agent57: Outperforming the Atari Human Benchmarkを読む その13

付録F. ネットワークアーキテクチャ 図9. Agent57のスケッチ 図10. Agent57の詳細

Agent57: Outperforming the Atari Human Benchmarkを読む その12

付録E. 分散設定の実装の詳細 リプレイバッファー 固定長の遷移のシーケンスと優先度を格納する。 遷移はの形式である。 このような遷移はタイムステップとも呼ばれ、シーケンスHの長さはトレース長と呼ばれる。 さらに、リプレイバッファー内の隣接するシー…

Agent57: Outperforming the Atari Human Benchmarkを読む その11

付録D. マルチアームバンディット形式 この節では、マルチアームバンディット(MAB)パラダイム、上限信頼限界(UCB)アルゴリズム、およびスライディングウィンドウUCBアルゴリズムについて簡潔に説明する。 より完全な説明と分析については、Garivier & Mo…

Agent57: Outperforming the Atari Human Benchmarkを読む その10

付録C.リトレースおよび変換されたリトレース リトレースは、評価または制御のための方策オフのRLアルゴリズムである。 評価設定の目標は、行動方策から引き出された軌跡からターゲット方策の状態行動価値関数を推定することである。 制御設定では、を近似す…

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

C++

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

将棋AIの進捗 その48(NPS改善)

ノード再利用の方式見直しを行った後、強くなっているかApery(WCSC28)と1手3秒100局で確認を行った。結果、勝利は62%で、変更前は69%だったので、強くなっていないことがわかった。 考察 理由としては、以下が考えられる。 Ponderなしの秒読みではノード再利…

将棋AIの進捗 その48(PV表示対応)

Qhapaqさんからプルリクをいただいたので、dlshogiをPV表示に対応しました。プルリクにはなかったのですが、USIオプション「PV_Interval」を追加しました。 「0」にするとPV表示なし、0以上にすると、設定したms間隔でPVを表示します。masterブランチに反映…

将棋AIの進捗 その47(Linuxのマルチスレッド排他処理)

昨日の記事で、dlshogiのゲーム木の管理をロックレス方式に見直しを行った。Windowsでは、ノード単位の排他制御をmutexを用いずに、atomic_flag (TAS機能)で実現することで10%NPSが向上したが、Linuxで測定すると800NPSくらいしかでないという悲惨な結果にな…

将棋AIの進捗 その46(ノード再利用の見直し)

世界コンピュータ将棋オンライン大会でノード再利用の処理に問題があることがわかったので、見直した。先日の記事で、Leela Chess Zeroのゲーム木の管理方法を調査して、合流を処理しないでC++のヒープ管理を利用してツリー状にノードを管理していることが分…

Leela Chess Zeroのノード再利用の方法

世界コンピュータ将棋オンライン大会で、dlshogiのノード再利用の方法に問題があることが明らかになったので、見直すことにする。 現在のハッシュ管理 dlshogiのハッシュ管理は、Ray+Rnのゾブリストハッシュの実装を参考にしていた。 Ray+Rnのノード再利用の…

dlshogiの環境構築手順

世界コンピュータ将棋オンライン大会でdlshogiライブラリを使用していたGCTは、AWSのWindows Serverで環境構築されていました。構築手順を共有いただいたので、参考にしてください。AWSでのGPU環境の構築手順について · Issue #12 · TadaoYamaoka/DeepLearni…

dlshogi(wcsoc2020)のWindows版ビルド済みファイル公開

dlshogiの世界コンピュータ将棋オンライン大会バージョンのWindows版ビルド済みファイルを公開します。Release 世界コンピュータ将棋オンライン大会バージョン · TadaoYamaoka/DeepLearningShogi · GitHub実行には、CUDA 10.2に対応したGPUが必要です。 イン…