AIモデルの利用は急速に拡大しており、その多様性もまた増しています。同じアーキテクチャのモデルであっても異なるランタイム環境で実行すると、驚くほどのパフォーマンスの違いが現れることがあります。これは主にモデル変換やランタイム、ハードウェアへの最適化によるものです。
モデル変換とは、同じ機能や結果を提供する異なる形式のAIモデルへの変換を指します。例えば、TensorFlowからONNXへの変換や、PyTorchからTensorRTへの変換などがあります。これは、異なるフレームワークやハードウェアでの利用を可能にするものであり、効率的なリソース利用や高速な推論が期待されます。
しかしながら、同じ結果を返すモデルでも、変換された後の性能は大きく異なることがあります。これは主に、変換後のモデルがオリジナルとは異なる最適化や実装を持っているためです。たとえば、GPUで効率的に動作するモデルが、CPU上で変換された後は遅延が発生し、パフォーマンスが低下することがあります。
過去にあった事例として2022年9月に、画像生成AIのStable DiffusionがTensorFlowとKerasCVによる実装で約30%高速になったという報告がありました。それまでのStable DiffusionはPyTorchベースで実装されており、アーキテクチャを異なるフレームワークに移植したことでこれだけの高速化が達成されたそうです。
参照:https://keras.io/guides/keras_cv/generate_images_with_stable_diffusion/
そこで今回はYOLOv8を例に、実際にパフォーマンスを比較してみたいと思います。 モデルはYOLOv8n.pt
を使用し、公式ドキュメントを参考にモデルの変換と推論を実行します。
モデルの変換:
1 2 3 4 5 6 7 |
from ultralytics import YOLO # Load a model model = YOLO('yolov8n.pt') # load an official model # Export the model model.export(format='onnx') |
推論:
1 2 3 4 5 6 7 |
from ultralytics import YOLO # Load a model model = YOLO('yolov8n.pt') # load an official model # Predict with the model results = model('https://ultralytics.com/images/bus.jpg') # predict on an image |
使用したCPU:
Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
比較した結果
ランタイム
PyTorch(defualt)
ONNX
OpenVINO
TensorFlow
TensorFlow Lite
preprocess(ms)
18.0
22.0
7.2
19.4
21.0
inference(ms)
242.1
158.2
60.5
390.9
233.7
postprocess(ms)
1.9
31.7
2.8
2.7
2.5
※使用したCPUがIntel製のため、macOS用のCoreML、CUDA用TensorRTは未検証
※デフォルトのPyTorchの場合、letterboxと呼ばれる32ピクセルの倍数かつ余計な余白をなるべく作らないように画像サイズを自動で調整されるため、すべてのモデルで640✕640サイズに固定
OpneVINOはIntelが開発・提供しているランタイムであり、Intel製CPUに最適化されているため、今回の検証で最も早い速度を記録しました。
preprocessやpostprocessで差が発生している理由に、numpy ⇔ Tensorといったフォーマットの変換による影響が考えられます。例えば、PyTorchの場合、一部のpreprcessを除くその他の処理をTorch Tensorとして処理されます。OpenVINOの場合は、すべての処理でnumpy配列として処理されます。
この他にもGPUを用いる場合や複数画像で検証する場合、最適化を考慮すべき箇所が増えます。
GPUを用いるとき、前処理の一部をGPUメモリ上で行うように変更することで高速化が可能です。さらに複数の画像をバッチ化して処理することで、1枚の画像を推論するときとほぼ同じ速度で複数の画像を同時に処理することができます。これはCPUよりも並列処理能力の高いGPUを効率的に活用するための最適化ともとれます。
まとめ
AIモデルの最適化は、異なるランタイム環境やハードウェアでの実行において重要な役割を果たします。同じモデルでも、適切な変換や最適化を行うことで性能が大幅に向上する場合があります。例えば、異なるフレームワークやランタイム環境に変換することで、処理速度の改善やリソースの効率的な利用が可能になります。
この比較では、YOLOv8モデルをPyTorchからONNX、OpenVINO、TensorFlow、TensorFlow Liteに変換し、それぞれのランタイム環境での性能を評価しました。その結果、異なるランタイム環境によって処理速度に大きな差が現れることが明らかになりました。特に、Intel製CPU向けに最適化されたOpenVINOが最も高速であることが確認されました。
最適なランタイム環境の選択は、特定のユースケースや利用環境に依存します。また、前処理や後処理のフォーマット変換などの要因も性能に影響を与えることがあります。最終的には、特定のニーズや制約に応じて、最適なランタイム環境を選択することが重要です。
Avintonでは、ITエンジニアリングトレーニングとチームメンバーの継続的な教育に特に重点を置いています。この分野でのスキルの活用、最先端のテクノロジーへの取り組み、国際的なクライアントへのソリューション提供に興味がある場合は、採用情報のページをご覧ください。ご連絡をお待ちしております!