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側処理の完了を待たずに次の処理を行うことができる。
推論の処理を実行する際に、
の一連の処理を非同期で呼び出すことで、各処理で完了を待つ際に発生する時間のロスがなくなる。
最後に一回だけ同期を行うことで、一連の処理を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さんプルリクエストありがとうございました!