TensorRT で物体検出・姿勢推定はどれくらい速くなる?

今回は、TensorRT で物体検出・姿勢推定はどれくらい速くなるのかを紹介します。せっかちな人のために、TensorRT による効果を先にかいつまんで書いておきます。

  1. RefineDet という物体検出モデルでは 38 fps が 68 fps に向上 (x1.8 Faster!)
  2. OpenPose という複数人物姿勢推定モデルでは 10 fps が 25 fps に向上 (x2.5 Faster!)
  3. ベンチマークは NVIDIA GeForce GTX 1080 Ti で実施

なぜ TensorRT を使うのか、という導入が長いですが、興味があればどうぞ。

自己紹介

初回ということで、簡単に自己紹介を。オプティムの R&D チームで Deep な画像解析をやっている奥村といいます。

www.optim.co.jp

Semantic Segmentation (領域抽出)、Object Detection (物体検出)、Pose Estimation (姿勢推定) などが中心です。学生のころはアクションゲーム開発、グラフィックエフェクトに興味がありました。

d.hatena.ne.jp

はじめてコードを書いたときから、かれこれ 20 年を超えました。Twitter やってます。

最近やっていること

最近は Google の Edge TPU の外販開始を心待ちにしつつ、ONNXTensorRT で扱えるように C++ でコードを書いたり、TensorRT がビルトインでサポートしていないレイヤーを CUDA で実装したり、それを thurst で再実装したり、fp16 による推論の速度向上に感心したり、TVM が一部で TensorRT の性能に肉薄するのに感心したり、最近発売された Intel Neural Compute Stick 2 の性能を気にしつつ、ブラウザから映像を WebRTC で受信して解析結果画像を WebRTC で送信したり、ONNX を Rust でパースして計算グラフを構築するときにトポロジカルソートの必要性を感じて実装を進めたあとで、ONNX の定義ファイルにグラフはソート済みであるという記述を見つけて愕然としながら、その裏でいろんなモデルを PyTorch で訓練する日々を送っている・・・というエンジニアです。

背景

深層学習モデルの推論とその課題

データを蓄積し、アノテーションをして、モデルとハイパーパラメータを調整しつつ、訓練過程グラフとにらめっこしながらとっておきの学習済みモデルを構築できたとしても、サービスを適用するためには、プロダクション環境にデプロイする必要があります。深層学習ブームが到来し、クラウドで GPU インスタンスが利用できるようになってはや幾星霜ですが、その価格は CPU インスタンスと比較すると高額なので、従来の Web サービスのような感覚でクラウドを利用すると、その費用に驚くことになります。

例えば、ある場所にカメラを設置して 24 時間リアルタイムに解析したい、としましょう。これをクラウドの GPU インスタンスで実現する場合、変動はありますが、Tesla K80 で 7 万円前後、Tesla P100 で 20 万円前後、Tesla V100 だと 25 万円前後の月額費用が必要になります。一方、カメラの設置場所、つまりエッジにワークステーションなどを設置する場合、これらの GPU は 50 ~ 100 万円程度の初期費用が必要になります。提供するサービスの要件によって変わりますが、これらの費用感を押さえておく必要があります。

Web 2.0 の登場あたりで C10K 問題 が叫ばれてから久しいですが、今ではサーバ一台でこれをこなすのは難しいことではありません。

しかし、深層学習モデルによるリアルタイム監視では、これはまだ現実的ではありません。例えば 10 FPS で解析する必要がある場合、1 接続に対して 100 ミリ秒で解析を完了させる必要があります。10 接続だと 10 ミリ秒ですし、100 接続なら 1 ミリ秒です。

例えば、人がきたらアラートを出す、という単純なサービスを考えましょう。これを Object Detection で実現するとします。現在の SOTA なモデルでも、1 ミリ秒で解析を完了できるようなものはありません。10 ミリ秒だとできるものもありますが、精度は落ちます。モデルの精度と速度はトレードオフの関係にあるため、これもサービスの要求に応じて調整が必要になります。

というわけで、深層学習モデルによる Object Detection は、C10K ならぬ C10 ~ C100 問題という段階にあります。この速度を上げることができれば、より精度の高い解析ができるようになったり、多くの同時接続数をさばけるようになり、費用対効果を向上できます。これはクラウドでもエッジでも同様です。

とにかく、推論速度を上げたいわけです。高速化ですね。

ハードウェアの動向

まずはハードウェアを眺めてみましょう。エッジでの推論を支えるハードウェアでは、

  1. NVIDIA の GPU
  2. AMD の GPU
  3. Intel の Neural Compute Stick
  4. RasPi の Video Core IV
  5. Google の Edge TPU

などが気になるところです。

Google の Edge TPU はまだリリースされていませんが、2W という消費電力で高解像度なビデオを 30 fps 以上で推論可能だという噂1があり、その性能と価格が気になるところです。

aiyprojects.withgoogle.com

Facebook は、2018/10/02 に PyTorch Developer Conference で Cloud TPU のサポートについて触れました。Edge TPU のサポートはどうなっていくのかも気になるところです。

venturebeat.com

NVIDIA は、2018/11/14 に Quadro RTX 4000 を 12 月に発売すると発表しました。$900 という比較的お手頃な価格で、Turing アーキテクチャの性能を体験できる、よい GPU なので発売が待ち遠しいです。以前の Quadro P4000 と比べると、CUDA コア数が 1,702 から 2,304 と 1.35 倍、価格は $1 高くなっただけです。

コストパフォーマンスがどんどん変化していくので、今後も目が離せない状況が続きそうです。

ソフトウェアの動向

次はソフトウェアを眺めてみましょう。今やさまざまな深層学習フレームワークがあり、それらを使って推論を行うことは容易です。しかし、モデルの訓練に力が入っているものが多く、推論に特化したものはそこまで多くありません。例えば、NVIDIA の TensorRT は推論に特化していて、結果として推論速度がおおよそ 1.2 ~ 1.5 倍向上します(モデルにもよります)。TensorFlow でも TensorRT の対応が進んでいます。一方、MXNet の開発者たちは TVM で推論に特化させようとしています。こちらは NVIDIA の GPU はもちろん、AMD の GPU や iOS/macOS でサポートされている Metal にも対応しようとしています。これらの推論特化型では、深層学習モデルに含まれるレイヤーの合成を行うなどして速度向上を図っています。2018/11/29 の AWS:reInvent 2018 では、Amazon Sagemaker Neo で TVM が深層学習モデルのコンパイラとして使われることが発表され、NVIDIA だけでなく ARM や Intel のプロセッサに最適化していくということがアナウンスされています。TVM はとても興味深いので、いつか取り上げたいと思います。Idein は Video Core IV に注力していて、よくデモ動画を公開されています。

とにかくみんな、推論速度を上げたいわけです。高速化です。私は TensorRT と TVM に注目していますが、今回は TensorRT についてもう少し紹介したいと思います。

TensorRT

TensorRT は、深層学習を高速に推論するためのプラットフォームで、NVIDIA が提供しています。

TensorRT は、モデルをコンパイルしてコンパイル済みモデル2を作成し、それを読み込んで高速に推論する機能を C++ ライブラリとして提供しています。Volta 以降のアーキテクチャの GPU では、fp16 で推論すると推論時間がおおよそ半分になったりします。

バージョン 5 時点では 64-bit の CentOS、Ubuntu、Windows で動作します。

バージョン 4 あたりから IConstantLayerIShuffleLayer がサポートされて、ちょっとくせのあるモデルでも、少しの手間で対応できるようになってきました。特に、Object Detection では少し変わったレイヤーに出会うことが珍しくないので、こうした対応はとても助かります。

物体検出・姿勢推定をベンチマーク

NVIDIA は ResNet での画像分類のベンチマーク記事を公開していますが、Object Detection などのモデルの推論速度がどうなるのかというものは見かけたことがないので、ベンチマークしてみました。

Object Detection のモデルは、SSD や YOLO をはじめとする Single-Stage Detectors と、Faster R-CNN をはじめとする Two-Stage Detectors に大別できます。SSD や YOLO、Faster R-CNN はよく紹介されていますので省きますが、一年前に登場した RefineDet を紹介したいと思います。これは SSD の派生系で、高速で、かつ小さい物体の検出にも強いという特徴を持っています。あとは、一世を風靡した OpenPose も紹介します。

ベンチマークの実行環境は以下のとおりです。

  • NVIDIA GeForce GTX 1080 Ti
  • Ubuntu 16.04
  • CUDA 9.2
  • cuDNN 7.2.1
  • TensorRT 4.0.1.6

ベンチマークの指標として、FPS を計測しました。FPS は画像をモデルに入力してから出力されるまでの時間の平均から算出しています。この時間には、HWC を NCHW を変換し、平均を引いたり、640x480 の解像度をモデルが受け取れる適切なサイズに Bilinear フィルタでリサンプリングするという前処理の時間も含んでいます。

RefineDet のベンチマーク結果

RefineDet はソースコードと学習済みモデルが公開されています。

github.com

Caffe で実装されているので *.caffemodel*.prototxt をお手製スクリプトで ONNX に変換して TensorRT で実行しました3

# Model Backbone Dataset Size Batch Size FPS
1 RefineDet VGG-16 VOC 512x512 1 68
2 RefineDet VGG-16 VOC 512x512 2 74
3 RefineDet VGG-16 VOC 512x512 4 76
4 RefineDet VGG-16 VOC 320x320 1 130
5 RefineDet VGG-16 VOC 320x320 2 150
6 RefineDet VGG-16 VOC 320x320 8 170
7 RefineDet ResNet-101 COCO 512x512 1 50
8 RefineDet ResNet-101 COCO 512x512 2 60
9 RefineDet ResNet-101 COCO 512x512 4 63
10 RefineDet ResNet-101 COCO 320x320 1 82
11 RefineDet ResNet-101 COCO 320x320 2 105
12 RefineDet ResNet-101 COCO 320x320 8 140

#1 は、Caffe で推論すると 38 fps ですが、TensorRT を使うと 68 fps を観測できました。約 1.8 倍の速度向上です。遅延でいうと、26 ミリ秒が 15 ミリ秒になるわけです。素晴らしいですね。一番高速な #6 は 170 fpsですが、これでようやく C17 接続です。C10K は遥か彼方ですね。

OpenPose のベンチマーク結果

OpenPose もソースコードと学習済みモデルが公開されています。

github.com

こちらも Caffe で実装されているので *.caffemodel*.prototxt をお手製スクリプトで ONNX に変換して TensorRT で実行しました。OpenPose のモデルは一般的なレイヤーで完結されているので変換は容易ですが、実際には推論結果として出てきた各ヒートマップの後処理に時間がかかるので、CUDA で後処理を実装したものになります。モデルに与える画像の解像度は OpenPose 1.1.0 benchmark に合わせて 656x368 としました。

Caffe で推論すると 10 fps ですが、TensorRT を使うと 25 fps を観測できました。約 2.5 倍の速度向上です。遅延でいうと、100 ミリ秒が 40 ミリ秒になるわけです。こちらも素晴らしいですね。CUDA で後処理をがんばらない場合、15 fps 程度です。

まとめ

TensorRT で物体検出・姿勢推定はどれくらい速くなるのかを駆け足で紹介しました。手元では、他にも R-FCNRFBNetFSSDYOLOv2S3FD などを TensorRT で推論して、同様な性能向上を確認しています。使わない理由がないですね。

実際にエッジで推論を行う場合、NVIDIA DeepStream SDK などで効率よく映像を処理するパイプラインを構築する必要がありますが、それについてはまた次の機会に紹介したいと思います。

また、NVIDIA の GPU 以外で推論を行う場合、TVM が有望になりますが、それについてもまた次の機会に紹介したいと思います。

github.com

オプティムでは、こうした技術に興味がある・作ってみたい、というエンジニアを募集しています。興味のある方は、こちらをご覧ください。

www.optim.co.jp


  1. Backbone が MobileNet でなければ驚愕です

  2. onnx-tensorrt ではシリアライズ済みエンジンと呼ばれていて *.trt としてファイルに保存される

  3. DetectionOutput レイヤーがオリジナルの SSD とは少し違うので、TensorRT のプラグインを実装する必要がある