ホームページ >テクノロジー周辺機器 >AI >画像前処理ライブラリ CV-CUDA はオープンソースであり、前処理のボトルネックを解消し、推論スループットを 20 倍以上向上させます。
今日の情報化時代において、画像やビジュアル コンテンツは長い間、日常生活における最も重要な情報伝達手段となってきました。深層学習モデルは、ビジュアル コンテンツを理解するその強力な能力に依存しており、さまざまな処理と最適化を行うことができます。
ただし、これまでのビジュアル モデルの開発と適用では、モデル自体の最適化により速度と効果を向上させることに重点を置いていました。それどころか、画像の前処理段階と後処理段階では、画像を最適化する方法についてはほとんど考慮されていません。したがって、モデルの計算効率がますます高くなっているときに、画像の前処理と後処理を振り返ってみると、それらが画像タスク全体のボトルネックになっているとは予想していませんでした。
このようなボトルネックを解決するために、NVIDIA は ByteDance 機械学習チームと協力して、多くの画像前処理オペレーター ライブラリ CV-CUDA をオープンソース化しました。これらは GPU 上で効率的に実行でき、オペレーターの速度は OpenCV の速度に達します。 (CPU上で実行)約100回。 OpenCV と TorchVision を置き換えるバックエンドとして CV-CUDA を使用すると、推論全体のスループットは元の 20 倍以上に達する可能性があります。また、速度の向上だけでなく効果の点でも、CV-CUDAは計算精度においてOpenCVと一致しているため、学習と推論をシームレスに接続することができ、エンジニアの負担を大幅に軽減します。
画像の背景ぼかしアルゴリズムを例に挙げると、CV-CUDA は画像のプリ/ポストのバックエンドとして OpenCV を置き換えます。 -processing を使用すると、推論プロセス全体のスループットを 20 倍以上に向上させることができます。
#高速かつ優れたビジュアル前処理ライブラリを試してみたい場合は、このオープン ソース ツールを試してみてください。 オープンソースアドレス: https://github.com/CVCUDA/CV-CUDA
エンジニアリングや製品に携わる多くのアルゴリズム エンジニアは、私たちはモデル構造やトレーニング タスクなどの「最先端の研究」についてのみ議論することが多いものの、信頼性の高い製品を構築するには、その過程で多くのエンジニアリング上の問題が発生しますが、モデルのトレーニングが最も簡単な部分です。
画像の前処理は工学的な問題です。実験やトレーニング中に画像の幾何学的変換、フィルタリング、色変換などを実行するためにいくつかの API を呼び出すだけで、特に気にする必要はないかもしれません。しかし、推論プロセス全体を再考すると、特に複雑な前処理プロセスを伴う視覚的なタスクの場合、画像の前処理がパフォーマンスのボトルネックになっていることがわかります。
このようなパフォーマンスのボトルネックは主に CPU に反映されます。一般的に、従来の画像処理プロセスでは、最初に CPU で前処理を実行し、次にそれを GPU に配置してモデルを実行し、最後に CPU に戻り、場合によっては後処理を実行する必要があります。
# 画像の背景ぼかしアルゴリズムを例に取ると、従来の画像処理プロセスでは主に予測処理が完了します。 CPU がワークロードの 90% 全体を占有しており、タスクのボトルネックになっています。
ビデオ アプリケーションや 3D 画像モデリングなどの複雑なシーンの場合、画像フレームまたは画像情報の数が十分に大きいため、前処理プロセスは十分に複雑になります。レイテンシー要件が十分に低い場合は、前処理/後処理オペレーターの最適化が差し迫っています。もちろん、より良いアプローチは、OpenCV をより高速なソリューションに置き換えることです。
OpenCV がまだ十分ではないのはなぜですか? CV で最も広く使用されている画像処理ライブラリは、もちろん長年維持されている OpenCV であり、画像処理の範囲が非常に広く、基本的にさまざまなビジュアルに対応できます。タスク。前処理/後処理が必要です。しかし、画像タスクの負荷が増加するにつれて、OpenCV の画像操作のほとんどが CPU によって実装され、GPU 実装が不足していたり、GPU 実装に問題が発生したりするため、その速度が徐々に追いつかなくなりました。
NVIDIA および ByteDance アルゴリズムの学生の研究開発経験では、OpenCV の GPU によって実装されたいくつかの演算子に 3 つの大きな問題があることがわかりました。たとえば、最初の質問の結果の精度を揃えることはできません。 NVIDIA および ByteDance アルゴリズムの学生は、トレーニング中に OpenCV の特定のオペレーターが CPU を使用することに気づくでしょうが、推論段階でのパフォーマンスの問題により、代わりに OpenCV に対応する GPU オペレーターが使用されます。 GPU の結果を調整することができず、推論プロセス全体で精度に異常が発生します。このような問題が発生すると、CPU 実装に戻すか、精度を再調整するために多大な労力を費やす必要があり、対処が難しい問題です。
OpenCV はまだ十分ではないため、読者の中には、Torchvision はどうなるのでしょうか?と尋ねる人もいるかもしれません。実際には、OpenCV と同じ問題に直面します。さらに、モデルをデプロイするエンジニアは、効率化のために推論プロセスの実装に C を使用する可能性が高いため、Torchvision を使用できず、C ビジョン ライブラリに頼る必要があります。これにより、Torchvision の精度を OpenCV と調整するという別のジレンマが生じます。
一般に、現在の CPU 上でのビジュアル タスクの前後処理がボトルネックになっていますが、OpenCV などの従来のツールではこれをうまく処理できません。したがって、演算を GPU に移行し、完全に CUDA に基づいて実装された効率的な画像処理演算子ライブラリである CV-CUDA を使用することが、新しいソリューションになりました。
前処理と後処理をすべて GPU 上で実行することで、画像処理部分の CPU ボトルネックが大幅に軽減されます。 。
CUDA ベースとしてプリプロセッサ / ポストプロセッシング オペレータ ライブラリにおいて、アルゴリズム エンジニアは、十分な速度、十分な汎用性、そして使いやすさという 3 つのことを最も期待しているかもしれません。 NVIDIA と ByteDance の機械学習チームが共同開発した CV-CUDA は、GPU の並列計算能力を利用してオペレーターの速度を向上させ、OpenCV の演算結果を十分に汎用性のあるものに調整し、簡単に使用できるという 3 つのポイントを正確に満たしています。 C/Python インターフェイス。
CV-CUDA の速度
CV-CUDA速度はまず効率的なオペレーターの実装に反映されますが、結局のところ、NVIDIA によって書かれたものであり、CUDA 並列計算コードには多くの最適化が行われているはずです。次に、GPU デバイスの計算能力を最大限に活用できるバッチ操作をサポートしており、CPU 上で画像をシリアル実行する場合と比較して、バッチ操作は確実に高速です。最後に、CV-CUDA が適応している Volta、Turing、Ampere などの GPU アーキテクチャのおかげで、パフォーマンスは各 GPU の CUDA カーネル レベルで高度に最適化され、最良の結果が得られます。言い換えれば、使用する GPU カードが優れているほど、その加速能力はさらに強化されます。
前の背景ブラー スループット加速率のグラフに示されているように、CV-CUDA を使用して OpenCV と TorchVision の前処理と後処理を置き換えると、推論プロセス全体のスループットが 20 倍以上増加します。このうち、前処理は画像に対して Resize、Padding、Image2Tensor などの操作を実行し、後処理は予測結果に対して Tensor2Mask、Crop、Resize、Denoise などの操作を実行します。
#同じコンピューティング ノード (Intel Xeon Platinum 8168 CPU 2 基、NVIDIA A100 GPU 1 基) 上で、プロセスさまざまな CV ライブラリでサポートされている最大数の並列ストリームを使用した、30 fps の 1080p ビデオ。テストでは 4 つのプロセスが使用され、各プロセスのバッチサイズは 64 です。 単一オペレーターのパフォーマンスに関しては、NVIDIA と ByteDance のパートナーもパフォーマンス テストを実施しており、GPU 上の多数のオペレーターのスループットは CPU のスループットの 100 倍に達する可能性があります。 . .
#画像サイズは 480*360、CPU は Intel(R) Core(TM) i9-7900X、BatchSize サイズは 1、プロセス数は 1
前処理/後処理演算子の多くは単純な行列の乗算などの演算ではありませんが、上記の効率的なパフォーマンスを実現するために、CV-CUDA は実際に多くの処理を行っています。オペレーターレベルでの最適化。たとえば、カーネルの起動とグローバル メモリのアクセス時間を短縮するために多数のカーネル フュージョン戦略が採用されており、メモリ アクセスはデータの読み取りと書き込みの効率を向上させるために最適化されており、すべてのオペレータは同期待機時間を短縮するために非同期的に処理されています。 。
##CV-CUDA の汎用的で柔軟な操作
#実際のプロジェクトでは、結果の安定性が非常に重要です。たとえば、一般的なサイズ変更操作、OpenCV、OpenCV-gpu、Torchvision は異なる方法で実装されているため、トレーニングからデプロイメントまで、結果を調整するためにさらに多くの作業が必要になります。 。 CV-CUDAの設計当初は、多くの技術者が現在の画像処理ライブラリのCPU版OpenCVの使用に慣れていると考えられていたため、演算子を設計する際には関数パラメータであっても画像処理であってもその結果、OpenCV のオペレーターの CPU バージョンを可能な限り揃えます。したがって、OpenCV から CV-CUDA に移行する場合、一貫したコンピューティング結果を得るために必要な変更はわずかであり、モデルを再トレーニングする必要はありません。 また、CV-CUDAはオペレータレベルで設計されているため、モデルの前後処理プロセスがどのようなものであっても自由に組み合わせることができ、柔軟性が高いです。
ByteDance 機械学習チームは、企業内には多くのモデルがトレーニングされており、必要な前処理ロジックも多様で、多くのカスタマイズされた前処理ロジック要件があると述べました。 CV-CUDA の柔軟性により、各 OP がストリーム オブジェクトとビデオ メモリ オブジェクト (ビデオ メモリ ポインタを内部的に格納する Buffer クラスと Tensor クラス) の受信を確実にサポートできるため、対応する GPU リソースをより柔軟に構成できます。各オペレーションを設計および開発する際には、汎用性を考慮するだけでなく、画像前処理のさまざまなニーズをカバーするカスタマイズされたインターフェイスもオンデマンドで提供します。
CV-CUDA の使いやすさ
エンジニアは、CV-CUDA には基礎となる CUDA オペレーターが関与するため、使用がより困難になるはずだと考えるでしょう。しかしそうではなく、上位 API に依存しなくても、CV-CUDA の最下層自体が や Allocator クラスなどの構造を提供するので、C で調整するのはそれほど面倒ではありません。さらに、上位レベルに進むと、CV-CUDA は PyTorch、OpenCV、および Pillow 用のデータ変換インターフェイスを提供するため、エンジニアは使い慣れた方法でオペレーターをすぐに交代したり呼び出すことができます。 さらに、CV-CUDA には C インターフェイスと Python インターフェイスの両方があるため、トレーニングとサービス展開シナリオの両方で使用できます。Python インターフェイスはトレーニング中にモデルの機能を迅速に検証するために使用され、C インターフェイスはより効率的な展開のために使用されます。 CV-CUDA は、煩雑な前処理結果の調整プロセスを回避し、プロセス全体の効率を向上させます。
#サイズ変更用の CV-CUDA C インターフェイス 実践的な戦闘、CV-CUDA
使い方 画像分類を例にとると、基本的には前処理段階で画像をテンソルにデコードし、モデルの入力サイズに合わせてトリミングする必要があります。トリミング後、ピクセル値を浮動小数点データ型に変換する必要があります正規化後、順伝播のために深層学習モデルに渡すことができます。以下では、いくつかの簡単なコード ブロックを使用して、CV-CUDA がどのように画像を前処理し、Pytorch と対話するかを体験します。
以下のように、torchvision API を使用して画像を GPU にロードした後、Torch Tensor タイプを as_tensor を通じて CV-CUDA オブジェクト nvcvInputTensor に直接変換できるため、CV の API CUDA の前処理操作を直接呼び出すことができ、画像のさまざまな変換が GPU 内で完了します。 次のコード行は CV-CUDA を使用して、GPU での画像認識の前処理プロセスを完了します。画像を作成し、ピクセルを正規化します。このうち、resize() は画像テンソルをモデルの入力テンソル サイズに変換し、convertto() はピクセル値を単精度浮動小数点値に変換し、normalize() はピクセル値を正規化して値の範囲をモデルの入力テンソル サイズに変換します。模型、電車。 CV-CUDA 各種前処理の使い方はOpenCVやTorchvisionと大きく変わりませんが、方法を簡単に調整するだけで、背後のGPU上ですでに処理が完了しています。 #これで、CV-CUDA のさまざまな API を利用して、画像分類タスクの前処理が完了しました。 GPU 上で並列コンピューティングを効率的に完了でき、PyTorch などの主流の深層学習フレームワークのモデリング プロセスに簡単に統合できます。残りについては、CV-CUDA オブジェクト nvcvPreprocessedTensor をトーチ テンソル タイプに変換してモデルにフィードするだけです。このステップも非常に簡単です。変換には 1 行のコードのみが必要です: この単純な例を通して、CV-CUDA が実際に通常のモデル トレーニング ロジックに簡単に埋め込まれることが簡単にわかります。読者が使用方法の詳細を知りたい場合は、上記の CV-CUDA のオープンソース アドレスを確認できます。 CV-CUDA は実際に実際の業務改善テストを実施しました。ビジュアルタスク、特に比較的複雑な画像前処理プロセスを伴うタスクでは、前処理に GPU の膨大な計算能力を使用することで、モデルのトレーニングと推論の効率を効果的に向上させることができます。 CV-CUDA は現在、Douyin Group 内のマルチモーダル検索、画像分類などの複数のオンラインおよびオフラインのシナリオで使用されています。 ByteDance 機械学習チームは、CV-CUDA の内部使用によりトレーニングと推論のパフォーマンスが大幅に向上すると述べました。たとえば、トレーニングの観点から見ると、ByteDance はビデオ関連のマルチモーダル タスクであり、前処理部分にはマルチフレーム ビデオのデコードと大量のデータ拡張が含まれており、この部分のロジックは非常に複雑になっています。前処理ロジックが複雑なため、トレーニング中に CPU のマルチコア パフォーマンスが追いつかないため、CV-CUDA を使用して CPU 上のすべての前処理ロジックを GPU に移行し、全体のトレーニング速度が 90% 高速化されました。これは前処理部分だけでなく、全体的なトレーニング速度の向上であることに注意してください。 同じことが推論プロセスにも当てはまります。学習チームは、検索マルチモーダル タスクで CV-CUDA を使用した後、前処理に CPU を使用した場合と比較して、全体的なオンライン スループットが 2 倍以上向上したと述べています。ここでの CPU ベースラインの結果はマルチコア向けに高度に最適化されており、このタスクに含まれる前処理ロジックは比較的単純ですが、CV-CUDA を使用した後の高速化効果は依然として非常に明白であることに注意してください。 この速度は、ビジュアル タスクの前処理のボトルネックを解消するのに十分効率的であり、シンプルかつ柔軟に使用できます。CV-CUDA は、実際のアプリケーション シナリオにおけるモデル推論とトレーニング効果を大幅に向上できることが証明されています。 ' 視覚的なタスクも前処理の効率によって制限されるため、最新のオープンソース CV-CUDA を試してください。 実際の業務改善
以上が画像前処理ライブラリ CV-CUDA はオープンソースであり、前処理のボトルネックを解消し、推論スループットを 20 倍以上向上させます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。