コンテンツにスキップ

AMD - Vitis AI

Vitis AIは、Ryzen AI、AMD Adaptable SoC、Alveo Data Center Acceleration Cardsを含むAMDプラットフォーム上でハードウェア加速AI推論を行うためのAMDの開発スタックです。

以下の表は、Vitis AI ONNX Runtime実行プロバイダーでサポートされているAMDターゲットを示しています。

アーキテクチャファミリーサポートされているターゲットサポートされているOS
AMD64Ryzen AINPU搭載AMD RyzenプロセッサーWindows
Arm® Cortex®-A53Zynq UltraScale+ MPSoCZCU102, ZCU104, KV260Linux
Arm® Cortex®-A72Versal AI Core / PremiumVCK190Linux
Arm® Cortex®-A72Versal AI EdgeVEK280Linux

NPU搭載AMD Ryzenプロセッサーの完全なリストについては、プロセッサー仕様ページを参照してください(表の右側にある「AMD Ryzen AI」列を探し、プルダウンメニューから「Available」を選択してください)。

AMD Adaptable SoC開発者は、Vitis AI ONNX Runtime実行プロバイダーを活用してカスタム(チップダウン)設計をサポートすることもできます。

AMD Ryzen AIプロセッサー用インストール

Section titled “AMD Ryzen AIプロセッサー用インストール”

AMD Ryzen AIプロセッサーをターゲットとするMicrosoft WindowsでVitis AI ONNX Runtime実行プロバイダーを有効にするには、開発者はRyzen AI Softwareをインストールする必要があります。Ryzen AI Softwareのダウンロードとインストールに関する詳細な手順は、https://ryzenai.docs.amd.com/en/latest/inst.html で確認できます。

AMD Ryzen AIプロセッサーをターゲットとする完全な例については、開発者はRyzenAI-SW Githubリポジトリを参照してください。

AMD Adaptable SoCターゲットの場合、組み込みLinux上でONNXモデルをデプロイするためのプリビルドパッケージが提供されています。ユーザーは、ターゲット上でVitis AIを有効にするために標準のVitis AI ターゲットセットアップ手順を参照してください。ターゲット上でVitis AIが有効になったら、開発者はインストールとAPIの詳細についてVitis AIドキュメントのこのセクションを参照できます。

AMD Adaptable SoCをターゲットとする完全な例については、開発者はONNX Runtime Vitis AI実行プロバイダーの例を参照してください。

Ryzen AI Vitis AI ONNX Runtime実行プロバイダーをソースからビルドするには、ビルド手順を参照してください。

量子化は、モデルの精度を維持しながら高精度の重みや活性化を低精度フォーマットにマッピングするプロセスです。この技術により、NPUデバイス上でのデプロイメント用にモデルの計算効率とメモリ効率が向上します。これは訓練後に適用でき、既存のモデルを再訓練することなく最適化できます。

Vitis AI EPは、INT8またはBF16フォーマットに量子化された入力モデルをサポートしています。

Ryzen AIモデルの量子化は、AMD Quark量子化器、Vitis AI量子化器、またはOliveで実行できます。

AMD Quarkは、深層学習モデルの量子化を簡素化し強化するために設計された包括的なクロスプラットフォーム深層学習ツールキットです。PyTorchとONNXモデルの両方をサポートし、Quarkは開発者が幅広いハードウェアバックエンドでのデプロイメント用にモデルを最適化し、精度を損なうことなく大幅なパフォーマンス向上を実現できるようにします。

完全な詳細については、Ryzen AI用AMD Quarkドキュメントを参照してください。

Vitis AI量子化器は、PyTorch、TensorFlow、ONNXモデルの量子化をサポートしています。

PyTorchとTensorFlowモデルの量子化をサポートするために、PytorchTensorflow 2.xTensorflow 1.xのDockerが利用可能です。Vitis AI ONNX Runtime実行プロバイダーをサポートするために、Vitis AI量子化器では量子化後にONNXフォーマットで量子化されたモデルをエクスポートするオプションが提供されています。

完全な詳細については、モデルの量子化に関するVitis AIドキュメントを参照してください。

Microsoft Oliveの実験的サポートも有効になっています。Vitis AI量子化器はOliveにプラグインとして統合されており、アップストリームされる予定です。これが完了すると、ユーザーはOlive Vitis AI例ディレクトリで提供される例を参照できます。

Vitis AI ONNX Runtimeは、モデルグラフと重みをマイクロコード化された実行可能ファイルとしてコンパイルするコンパイラーを統合しています。この実行可能ファイルは、ターゲットアクセラレーター(Ryzen AI NPUまたはVitis AI DPU)上にデプロイされます。

モデルは、ONNX Runtimeセッションが開始されたときにコンパイルされ、最初の推論パスの前にコンパイルが完了する必要があります。コンパイルに必要な時間は異なりますが、完了まで数分かかる場合があります。モデルがコンパイルされると、モデル実行可能ファイルがキャッシュされ、後続の推論実行では、キャッシュされた実行可能モデルをオプションで使用できます(詳細は以下)。

以下の表は、推論セッションの設定に使用できるプロバイダーオプションと環境変数の概要を示しています。

AMD Ryzen AIプロセッサー上でBF16およびINT8モデルの推論セッションを設定する方法の詳細な手順については、Ryzen AI Softwareドキュメントを参照してください。

プロバイダーオプションデフォルト値詳細
cache_dirLinux: “/tmp/{user}/vaip/.cache/”
Windows: “C:\temp\{user}\vaip\.cache”
オプション、キャッシュディレクトリ
cache_key{onnx_model_md5}オプション、キャッシュキー、異なるモデルを区別するために使用
log_level”error”有効な値は infowarningerrorfatal

最終的なキャッシュディレクトリは {cache_dir}/{cache_key} です。 使用方法については、以下のC++の例を参照してください。

C++ APIを活用するには、以下の例を参考にしてください:

// ...
#include <onnxruntime_cxx_api.h>
// ユーザーヘッダーファイルをインクルード
// ...
std::basic_string<ORTCHAR_T> model_file = "resnet50.onnx" // resnet50.onnxをあなたのモデル名に置き換えてください
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "resnet50_pt");
auto session_options = Ort::SessionOptions();
auto options = std::unorderd_map<std::string,std::string>({});
// オプション、例:キャッシュパス : /tmp/my_cache/abcdefg // abcdefgをあなたのモデル名(例:onnx_model_md5)に置き換えてください
options["cache_dir"] = "/tmp/my_cache";
options["cache_key"] = "abcdefg"; // abcdefgをあなたのモデル名(例:onnx_model_md5)に置き換えてください
options["log_level"] = "info";
// Vitis AI実行プロバイダーを使用して推論セッションを作成
session_options.AppendExecutionProvider_VitisAI(options);
auto session = Ort::Session(env, model_file.c_str(), session_options);
// 入力と出力を取得
Ort::AllocatorWithDefaultOptions allocator;
std::vector<std::string> input_names;
std::vector<std::int64_t> input_shapes;
auto input_count = session.GetInputCount();
for (std::size_t i = 0; i < input_count; i++) {
input_names.emplace_back(session.GetInputNameAllocated(i, allocator).get());
input_shapes = session.GetInputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape();
}
std::vector<std::string> output_names;
auto output_count = session.GetOutputCount();
for (std::size_t i = 0; i < output_count; i++) {
output_names.emplace_back(session.GetOutputNameAllocated(i, allocator).get());
}
// 入力テンソルを作成し、入力データを設定
std::vector<Ort::Value> input_tensors;
...
auto output_tensors = session.Run(Ort::RunOptions(), input_names.data(), input_tensors.data(),
input_count, output_names.data(), output_count);
// 出力データを後処理
// ...

Python APIを活用するには、以下の例を参考にしてください:

import onnxruntime
# ユーザーのインポートを追加
# ...
# 入力を読み込み、前処理を実行
# ...
# Vitis AI実行プロバイダーを使用して推論セッションを作成
session = onnxruntime.InferenceSession(
'[model_file].onnx',
providers=["VitisAIExecutionProvider"],
provider_options=[{"log_level": "info"}])
input_shape = session.get_inputs()[0].shape
input_name = session.get_inputs()[0].name
# input_shapeに基づいて入力を読み込み、前処理を実行
input_data = [...]
result = session.run([], {input_name: input_data})

AMD Ryzen AIプロセッサーをターゲットとする完全な例については、開発者はRyzenAI-SW Githubリポジトリを参照してください。

AMD Adaptable SoCをターゲットとする完全な例については、開発者はONNX Runtime Vitis AI実行プロバイダーの例を参照してください。