TadaoYamaokaの日記

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

メモリの非同期転送対応

Mizarさんからプルリクエストを頂き、CPU<->GPU間のメモリの非同期転送に対応した。
TensorRT: 転送・推論を非同期に行う by mizar · Pull Request #67 · TadaoYamaoka/DeepLearningShogi · GitHub

これは第2回世界将棋AI電竜戦のふかうら王に実装されていた改善である。
ふかうら王 アピール文章:
https://drive.google.com/file/d/1aO0gLSYvhph1uL_gaaohLYWTMpe1BdA8/view

非同期処理

CUDAは、ストリームという機能を使うことで、非同期処理に対応している。
CUDAの非同期関数を呼び出すことで、CPU側はGPU側処理の完了を待たずに次の処理を行うことができる。

推論の処理を実行する際に、

  1. CPUからGPUへのメモリ転送
  2. 推論処理
  3. GPUからCPUへのメモリ転送

の一連の処理を非同期で呼び出すことで、各処理で完了を待つ際に発生する時間のロスがなくなる。
最後に一回だけ同期を行うことで、一連の処理をGPU側で連続して実行できるようになる。

改善効果測定

NPSがどれくらい改善するか測定した。
floodgateからサンプリングした100局面を1秒思考した際のNPSを3回ずつ測定した(GPUはRTX3090 1枚)。

master pr pr/master
count 300 300 1.000
mean 28111 29139 1.037
std 2662 2829 1.063
min 17555 18086 1.030
25% 27465 28424 1.035
50% 29050 30227 1.041
75% 29820 30890 1.036
max 31023 32409 1.045

※masterが改善前、prが改善後

平均で3.7%、中央値で4.1% NPSが改善した。

まとめ

CPU<->GPU間のメモリの非同期転送に対応することで、NPSが約4%改善した

Mizarさんのアピール文章には、ストリームを複数使った並列実行についても提案している。

↓この資料によると、並列実行により、スループットが2倍に向上するらしい。
TensorRTをもっと高性能に使う
NPSの大幅な向上が期待できるかもしれない。
今後、dlshogiも並列実行に対応を行う予定である。

Mizarさんプルリクエストありがとうございました!