Ascend (アセンド) CANN (Compute Architecture for Neural Networks) は、さまざまな AI アプリケーションの開発と展開をサポートするために Huawei が発売した AI プロセッサー用のソフトウェア開発キットです。ディープ ニューラル ネットワーク アプリケーションの開発プロセスは、次の主なステップに分割できます。
AscendCL アプリケーション開発、深層学習ネットワーク推論アプリケーション開発プロセスの主な手順は次のとおりです。
- モデルの準備: まず、TensorFlow、PyTorch、Caffe などの主流の深層学習フレームワークを使用してディープ ニューラル ネットワーク モデルをトレーニングします。トレーニング後、モデルを TensorFlow の *.pb ファイル、PyTorch の *.pth ファイル、Caffe の *.prototxt および *.caffemodel ファイルなどの対応する形式にエクスポートします。
- モデル変換: Ascend CANN の ATC (AI Tensor Compiler) ツールを使用して、トレーニングされたモデルを、Ascend プロセッサによって認識および実行できるオフライン モデル (OM ファイル) に変換します。このプロセス中に、Ascend プロセッサでの実行効率を向上させるために、モデルの最適化と量子化が必要になる場合があります。
- アプリケーション プログラムの開発: 実際のアプリケーション要件に従って、Ascend が提供するソフトウェア コンポーネント (AscendCL、AICPU など) と API を使用して、ディープ ニューラル ネットワーク アプリケーションを開発します。これには、入力データの前処理、モデルの読み込み、モデルの入出力、推論の実行、出力データの後処理などの操作が含まれる場合があり、そのプロセスを次の図に示します。
- コンパイルとデプロイ: 開発したアプリケーションを実行可能ファイルにコンパイルし、変換されたオフライン モデル (OM ファイル) とともに Ascend AI プロセッサ デバイスにデプロイします。Ascend プロセッサ デバイスは、クラウド サーバー、エッジ デバイスなどになります。
- 実行と最適化: デプロイされたディープ ニューラル ネットワーク アプリケーションを Ascend AI プロセッサ上で実行します。実行中に、分析およびデバッグ ツールを通じてパフォーマンスのボトルネックを見つけることができ、対応する最適化を行ってアプリケーションのパフォーマンスと効率をさらに向上させることができます。
上記の 5 つのステップを通じて、ユーザーは Ascend CANN ツールキットを使用して、Ascend AI プロセッサ用のディープ ニューラル ネットワーク アプリケーションを開発、展開、最適化できます。
本文では主にATCの一部とアプリケーション開発について説明しています。
2023 CANN トレーニング キャンプ シーズン 1: AscendCL アプリケーション開発の詳細な説明学習ノート
モデル変換 (ATC)
ATC (AI Tensor Compiler) は、Ascend CANN ツールキットの重要なコンポーネントであり、主に、さまざまな深層学習フレームワークのモデルを、Ascend AI プロセッサが認識して実行できるオフライン モデル (OM ファイル) に変換するために使用されます。
ATC の主な機能と特徴は次のとおりです。
- さまざまな深層学習フレームワークのサポート: ATC は、TensorFlow、PyTorch、Caffe、ONNX などの主流の深層学習フレームワークのモデルを、Ascend プロセッサで実行できるモデルに変換することをサポートします。
- モデルの最適化: モデル変換プロセス中に、ATC はモデルを最適化して、Ascend AI プロセッサーでのモデルの実行効率を向上させることができます。最適化手法には、演算融合、演算子最適化などが含まれます。
- 量子化のサポート: ATC は、浮動小数点モデルから低精度の固定小数点モデル (int8 など) への変換をサポートし、モデル サイズとコンピューティング リソース要件を削減し、同時に Ascend AI プロセッサ上のモデルを改善しながら維持します。高い推論精度の実行速度。
- オフライン モデルの生成: ATC 変換後、ユーザーは Ascend AI プロセッサに適したオフライン モデル (OM ファイル) を取得します。このモデルは、推論計算のために Ascend シリーズ デバイスに直接展開できます
。
モデル変換に ATC を使用するには、ユーザーはソース モデルのディープ ラーニング フレームワークと変換要件に基づいて、適切な変換パラメーターを選択する必要があります。変換が完了すると、ユーザーは Ascend が提供する他のソフトウェア コンポーネント (AscendCL、AICPU など) を使用して、Ascend AI プロセッサ上でオフライン モデルを実行および展開できます。ATC ツールの機能アーキテクチャ図は次のとおりです
。解析して中間状態の IR グラフに変換します。グラフの準備、グラフの分割、グラフの最適化、グラフのコンパイルなどの一連の操作の後、中間状態の IR は Ascend AI プロセッサに適合したオフライン モデルに変換されます。 AscendCL インターフェイス ソフトウェアを介してモデルをロードし、推論を実装します。
ATC変換プロセス
ATC のプロセスは次の手順に要約できます。
- 環境の準備: ATC ツールの入手、環境変数の設定
- ソース モデルを準備する: まず、TensorFlow、PyTorch、Caffe などの主流の深層学習フレームワークを使用して、ディープ ニューラル ネットワーク モデルをトレーニングします。トレーニング後、モデルを対応する形式 (TensorFlow の *.pb ファイル、PyTorch の *.onnx ファイル、Caffe の *.prototxt および *.caffemodel ファイルなど) にエクスポートします。
- ATC ツールをインストールする: ATC ツールを含む Ascend CANN ツールキットがインストールされていることを確認してください。通常、CANN ツールキットがインストールされると、ATC ツールが対応するパスに自動的にインストールされます。
- 変換パラメータの構成: モデル変換に ATC ツールを使用するには、入力ノードと出力ノード、データ型、最適化オプションなど、ソース モデルのいくつかの変換パラメータを設定する必要があります。これらのパラメーターは、ソース モデルの深層学習フレームワーク、ネットワーク構造、変換要件によって異なります。
- モデル変換を実行する: ATC コマンドを実行し、正しい変換パラメーターを指定してモデル変換プロセスを開始します。変換プロセス中、ATC は、(必要に応じて) モデルの最適化と量子化を実行しながら、ソース モデルを Ascend AI プロセッサに適したオフライン モデル (OM ファイル) に変換します。
- 変換結果を検証する: 変換が完了したら、変換されたオフライン モデル (OM ファイル) を推論テストに使用して、モデルの変換が正しく、パフォーマンスが期待どおりであることを確認します。必要に応じて、変換パラメーターを調整し、モデル変換を再実行して、最高の推論パフォーマンスを得ることができます。上記の 5 つの手順を通じて、ユーザーは ATC ツールを使用して、さまざまな深層学習フレームワークのモデルを Ascend AI プロセッサ上で実行可能なオフライン モデル (OM ファイル) に変換できます。
アプリケーションを開発する
データの前処理
ほとんどのニューラル ネットワーク モデルは、ネットワーク構造やトレーニング方法などの影響を受け、入力データのデータ形式に制限があり、コンピューター ビジョンの分野では、この制限は主に画像サイズ、色域、正規化パラメータなどに反映されます。ソース画像またはビデオのサイズと形式がネットワーク モデルの要件と一致しない場合、ソース画像またはビデオをモデルの要件を満たす画像またはビデオに処理する必要があります。
CANN は、AIPP と DVPP という 2 つのデータ前処理メソッド セットを提供します。次の表は、AscendCL データ前処理メソッド AIPP と推論 DVPP の主な特性と相違点を説明しています。
前処理方法 | AIPP | DVPP |
---|---|---|
目的 | AIモデル推論前の画像前処理 | ビデオ処理における画像の前処理 |
処理オブジェクト | 静止画 | ダイナミックなビデオシーケンス |
装置 | Ascend AI プロセッサー (Ascend) | Ascend AI プロセッサー (Ascend) |
関数 | 色域変換 | 色域変換 |
画像のトリミング | 画像のトリミング | |
データフォーマット変換(FP32→FP16など) | データフォーマット変換(FP32→FP16など) | |
チャンネルの再配置 | チャンネルの再配置 | |
アプリケーションシナリオ | AIモデル推論 | ビデオ処理 (ビデオのデコード、エンコードなど) |
DVPP は、単独で使用することも、組み合わせて使用することもできます。組み合わせたシナリオでは、DVPP は通常、最初に写真/ビデオをデコード、切り出し、ズームするために使用されます。ただし、DVPP ハードウェアの制約により、DVPP 処理後の画像フォーマットと解像度が反映されない場合があります。モデルの要件を満たしているため、色域変換、マット化、塗りつぶしなどのさらなる処理のために AIPP を通過する必要があります。
以下はシナリオの例です。JPEG 画像ファイル (ソース画像形式は YUV420) を入力し、JEPGD+VPC の後、YUV420SP 形式の画像を出力し、AIPP を通じて画像形式を RGB に変換し、正規化構成を実行します。推論のために画像をモデルに送信します
DVPP の主な機能
DVPP (デジタル ビデオ処理プラットフォーム) は、Ascend AI プロセッサーでのデジタル ビデオ処理を担当します。その主な機能モジュールには、デコードとエンコード、画像処理などが含まれます。ここでは、JPEGD 画像デコード、VPC ビジュアル前処理、および JPEGD+VPC モジュールの機能について詳しく紹介します。
1.JPEGD画像デコード
JPEGD (JPEG Decoder) は、DVPP における JPEG 画像のデコードを担当する機能モジュールです。JPEGD は、JPEG でエンコードされた画像データを、YUV420SP、YUV422SP、RGB などの他のピクセル形式にデコードできます。画像データは JPEG 形式で保存および送信されることが多いのに対し、AI モデルでは他のピクセル形式のデータが必要となるため、JPEG 画像デコードは多くの AI アプリケーションで一般的です。
2. VPC の視覚的な前処理
VPC (Visual Processing Component) は、DVPP における視覚的な前処理を担当する機能モジュールです。VPC は、次のようなさまざまな画像処理機能を提供します。 色域変換: 画像を 1 つの色域から別の色域に変換します (YUV から RGB など)。画像ズーム: 画像のサイズを変更して画像を拡大または縮小します。画像のトリミング: 特定のサイズまたは比率の要件を満たすために、元の画像から特定の領域をトリミングします。チャネルの並べ替え: モデル入力のチャネル順序要件を満たすように画像チャネルを並べ替えます。
VPC は、ビデオ処理および AI アプリケーションの前処理にとって非常に重要です。これは、後続の処理と分析のニーズを満たすために生の画像データを前処理する必要があるためです。
3.JPEGD+VPCモジュール
JPEGD+VPC モジュールは、JPEGD 画像デコード機能と VPC ビジュアル前処理機能を組み合わせた複合モジュールです。このモジュールを使用すると、開発者は JPEG でエンコードされた画像データを他のピクセル形式に簡単にデコードでき、デコード プロセス中に VPC が提供する画像処理機能を直接適用できます。この統合されたアプローチは、データの前処理プロセスを簡素化し、処理効率を向上させるのに役立ちます。
ホストとデバイスのメモリ管理とデータ送信
AscendCL では、推論タスクで連携するために、ホスト (つまり、メモリと CPU) とデバイス (つまり、Ascend AI プロセッサ (NPU とデバイス メモリ)) の間でメモリ管理とデータ送信が必要です。
アプリケーション開発コードで入力データを読み込む際には、ホストメモリへの保存申請が必要となり、入力データの処理後、処理後のデータをホストメモリからデバイスのモデル入力メモリへコピーする必要がありますので、デバイスがモデル推論を実行できること。
メモリ管理とデータ転送を実装する主な方法は次のとおりです。
メモリ管理
ホスト側のメモリのアプリケーションとリリース:
aclrtMallocHost および aclrtFreeHost を使用して、ホスト側でメモリを適用および解放します。これらは、ホストとデバイス間で送信する必要があるデータを保存するために、ホスト側で利用可能なメモリ領域を割り当てるために使用されます。
void* hostBuffer;
size_t bufferSize = ...; // 分配所需内存大小
aclError ret = aclrtMallocHost(&hostBuffer, bufferSize);
// 使用 hostBuffer 进行一些操作,如数据加载等
...
aclrtFreeHost(hostBuffer); // 在不再需要时释放分配的内存
デバイス側のメモリ管理:
aclrtMalloc および aclrtFree を使用して、デバイス側でメモリの割り当てと解放を行います。これらは、ホストとデバイス間で送信する必要があるデータを保存するために、デバイス側で利用可能なメモリ領域を割り当てるために使用されます。
void* deviceBuffer;
size_t bufferSize = ...; // 分配所需内存大小
aclError ret = aclrtMalloc(&deviceBuffer, bufferSize);
// 使用 deviceBuffer 进行一些操作,如数据传输、模型推理等
...
aclrtFree(deviceBuffer); // 在不再需要时释放分配的内存
データ送信
データ送信とは、ホストとデバイス間のデータの送信を指し、通常、モデル推論のために入力データをデバイスに送信し、推論結果をホストに送信するために使用されます。
ホストからデバイスへのデータ送信
aclrtMemcpy 関数を使用して、ホスト メモリからデバイス メモリにデータをコピーします。この関数では、コピー元アドレス、宛先アドレス、およびコピーするデータのサイズを指定する必要があります。
aclError ret = aclrtMemcpy(deviceBuffer, bufferSize, hostBuffer, bufferSize, ACL_MEMCPY_HOST_TO_DEVICE);
デバイスからホストへのデータ送信
aclrtMemcpy 関数を使用して、デバイス メモリからホスト メモリにデータをコピーします。この関数では、コピー元アドレス、宛先アドレス、およびコピーするデータのサイズを指定する必要があります。
aclError ret = aclrtMemcpy(hostBuffer, bufferSize, deviceBuffer, bufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
上記のメモリ管理とデータ送信方法を通じて、AscendCL はホストとデバイス間のデータ対話とコラボレーションを実現し、それによって AI アプリケーションの推論タスクを完了できます。