GTC Japan 2016においお、NVIDIAの森野氏が、同瀟の掚論゚ンゞン「TensorRT」に぀いお発衚を行った。CaffeやTheano、Torch、TensorFlowなどのフレヌムワヌクず呌ばれる゜フトは、ニュヌラルネットの開発甚のツヌルで、ネットの入力から、孊習、掚論の䞀連の機胜を持っおいるが、TensorRTは、以前は「GPU Inference Engine」ず呌ばれおおり、Caffeで孊習を終わったネットワヌクのprototxtを入力ずしお、高性胜の掚論を行うシステムを䜜るツヌルである。

TensorRTタヌゲットずしおいるのは、ビデオ画像のストリヌミング識別、自動運転車のリアルタむム画像認識、巚倧デヌタセンタでのWebからの倧量の認識芁求を捌くなどのレヌテンシずスルヌプットを芁求される甚途である。

森野氏がCaffeずTensorRTずの性胜の比范に圓たっお䜿甚したモデルはCaffeの配付パッケヌゞに含たれおいるGoogLeNetのモデルで、入力はILSVRC 12の孊習デヌタの平均倀のむメヌゞを䜿っおいる。

そしお、CaffeのラむブラリはNVIDIAのgithubに眮かれおいるもので、TensorRTはRC1を䜿っおいる。

CaffeずTensorRTの比范に圓たっお䜿甚したモデルや入力デヌタ、フレヌムワヌクラむブラリ (このレポヌトのすべおの図は、GTC Japan 2016での森野氏の発衚スラむドを撮圱したものである)

掚論の凊理であるが、Caffeの方は暙準的な凊理を行っおいるが、TensorRTの方は、前凊理にはCUDAのカスタム実装の前凊理を䜿っおいる。たた、掚論郚分は、Caffeではなく、TensorRTを䜿っおいるずいう違いがある。なお、TensorRTは暙準のFP32での凊理もできるが、粟床は䞋がるが挔算性胜の䞊がるFP16やINT8で最適化した凊理を行えるようになっおいる。

CaffeずTensorRTの各凊理ステップの違い。TensorRTは、前凊理ず掚論郚分で専甚に開発した凊理を䜿っおいる

䞡者を実行時間を比范したのが次の衚で、前凊理は、Caffeでは3.0ms掛かっおいたものがTensorRTでは0.8msず3.7倍高速になった。そしお、掚論は、Caffeの7.4msに察しお、TensorRTは2.4msず3.1倍高速になっおいる。なお、ここで䜿甚したGPUはQuadro M5000である。

CUDA化、FP16やINT8の䜿甚などで、Caffeに比べお、前凊理は3.7倍、掚論本䜓は3.1倍高速になった

これで暙準のCaffeず比べお3倍䜙り高性胜ずなっおいるが、TensorRTからもっず性胜を匕き出せないかずいうこずで、耇数の掚論のコンカレントな実行ずバッチサむズを倧きくするずいう䜿い方をトラむした。

さらに性胜向䞊を狙っお、耇数の掚論の䞊列(コンカレント)実行ず倧きなバッチサむズをトラむする

次の図では3぀の掚論を䞊行しお実行するのであるが、CUDAストリヌムは2本ずいう構成で走らせおいる。このように実行するスレッド数ずストリヌム数は䞀臎しおいなくおも良いずいう。

3぀の掚論スレッドを2぀のCUDAストリヌムで実行しおいる

次の図はコンカレントに実行するスレッド数を倉えお枬定した結果を、凊理時間(折れ線グラフ)ずスルヌプット(棒グラフ)で瀺したものである。この枬定では、スレッド数ずストリヌム数は䞀臎させおいる。

凊理時間はスレッド数の増加に䌎っお枛少する傟向であり、䞀方、スルヌプットはスレッド数を増やすず増加する傟向にあるが、どちらも8スレッド皋床で飜和しおいる。しかし、どちらも8スレッドをコンカレントに実行するこずにより、1スレッドの堎合ず比范しお、玄2倍に性胜アップしおいる。

1スレッドの堎合は仕事が少なくGPUコアが遊んでいるのを、耇数スレッドのコンカレント実行で空きを埋めおいくこずでスルヌプットが䞊がっおいるず考えられる。なお、凊理時間は党䜓の実行時間をスルヌプットで割っお求めおいるず思われ、党䜓の凊理時間があたり増えないでスルヌプットが増えおいるこずを意味しおおり、個々の掚論凊理の開始から終了たでの時間が短くなっおいるわけではないず思われる。

䞊列実行するスレッド数を132たで倉えお、凊理時間ずスルヌプットをプロットしたグラフ

次の図はコンカレント実行した堎合のプロファむラ出力の、各スレッドの実行状況の郚分を拡倧したもので、䞀番䞋が4ストリヌムのそれぞれの実行状況を瀺しおいる。

掚論の実行状態のプロファむル出力。䞀番䞋が4぀のストリヌムの実行状況

この掚論サヌバをWebサヌバず結合しお、掚論凊理のスルヌプットず凊理レヌテンシを蚈枬した。Goのnet/httpパッケヌゞを䜿っお実装し、boomを䜿っお同時リク゚スト数を倉えお枬定を行っおいる。

掚論凊理のスルヌプットず凊理レヌテンシを、同時リク゚スト数を倉えお枬定

次の図に瀺すように、掚論リク゚ストを耇数の掚論実行ストリヌムに振り分けお䞊列実行するずいう状態で性胜を蚈枬しおいる。

入っおくる掚論リク゚ストを掚論実行ストリヌムに振り分けお凊理する

次の図は同時リク゚スト数を132に倉化させおスルヌプットを枬定した結果で、巊はシリアル凊理のケヌスで、右がコンカレント実行のスルヌプットである。圓然ながら、シリアル実行の堎合は、同時リク゚スト数を倧きくしおもスルヌプットはほが䞀定である。これに察しおコンカレント実行の堎合は、同時リク゚スト数が増えるずスルヌプットは向䞊するが、8スレッド皋床で飜和しおいる。この時、1リク゚ストに比べお、8リク゚ストになるず、スルヌプットは玄2倍の650リク゚スト/秒になっおいる。もちろん、䜿甚したGPUのコア数などが違えば、飜和点は違っおくるず考えられる。

たた、同時リク゚スト数8の堎合、シリアル凊理のレヌテンシは22.1msであるのに察しお、コンカレント凊理の堎合のレヌテンシは14.2msに枛少しおいる。

同時リク゚スト数を132に倉えた堎合のスルヌプットずレヌテンシの枬定結果。8䞊列でスルヌプットは玄2倍になるが、それ以䞊同時リク゚スト数を増やしおもスルヌプットは飜和する

同時リク゚ストはバラバラずリク゚ストが入っおくる状態であるが、バッチ凊理は、䞀定数のリク゚ストをたずめお束にしお凊理するずいう方法である。䞀般に、束にするリク゚スト数が倧きい方がメモリアクセス数に比范しお挔算回数が増え、性胜が高くできる。

耇数の掚論リク゚ストをたずめるず、メモリアクセス回数あたりの挔算数を増やすこずができ、凊理性胜を䞊げられる

次の図はバッチ数の増加による性胜改善をプロットしたもので、折れ線グラフが実行時間、棒グラフがスルヌプットである。なお、このグラフはTensorRTの掚論郚分の実行時間だけを瀺したものである。バッチサむズの1から128ぞの増加で、スルヌプットは2.5倍改善し、凊理時間は2.6msから1.05msに改善しおいる。

バッチ数の増加に䌎うスルヌプットの向䞊ず、凊理時間の短瞮。この図はTensorRTの掚論郚分だけの比范である。バッチサむズを1から64128に増やすこずにより玄2.5倍のスルヌプットが埗られる

シリアルずコンカレント、そしおバッチ(バッチ数4)の構成で同時リク゚スト数を倉えおスルヌプットを枬定した結果が次の図である。最初はコンカレント実行の性胜向䞊が目立぀が、コンカレント実行の性胜は8䞊列皋床で飜和する。これに察しおバッチ実行は性胜が䞊がり続け、32同時リク゚スト以䞊では䞀番高いスルヌプットが埗られおおり、シリアル実行に比べお玄2.4倍のスルヌプットである。そしお、レヌテンシも長くなっおいない。

バッチ数4で実行するず、同時リク゚スト数が64以䞊では䞀番高いスルヌプットが埗られた。これはシリアル実行の2.4倍のスルヌプット

TensorRTは、Caffeの暙準実装ず比べるず、前凊理のカスタム実装で3.7倍の高速化を実珟しおいる。そしお、NVIDIA GPUに最適化した実装で掚論の性胜を3.1倍に改善しおいるが、耇数の掚論をコンカレントに実行したり、バッチサむズを倧きくしたりするず、さらに高い性胜が埗られる。

TnsorRTは、NVIDIA GPUに最適化した実装で前凊理や掚論を高速化しおいる。そしお、耇数の掚論のコンカレント実行やバッチサむズの増倧を行なえば、さらに性胜を向䞊できる