ACRi ルームでは AMD VCK5000 Versal 開発ボードを搭載する as005 サーバと、AMD Instinct MI210 アクセラレータを搭載する as006 サーバの無償利用環境を提供しています(詳細はこちら)。これらのサーバを利用することで、AI モデルの学習から Vitis AI によるモデルの量子化、コンパイル、実行までを行うことができます。
ROCm を使用した AI モデルの学習
ROCm は AMD GPU を使って AI などの計算を高速化するソフトウェアです。as006 サーバには ROCm がインストールされており、ROCm を利用した高速な AI モデルの学習ができます。
PyTorch のインストール方法
as006 に SSH またはリモートデスクトップでログインしターミナルを開きます。
作業ディレクトリ内に venv 環境を作成し、ROCm に対応した PyTorch をインストールするには次のようにします。
mkdir /scratch/$USER/my-pytorch-project
cd /scratch/$USER/my-pytorch-project
python -m venv .venv
source .venv/bin/activate
pip install --find-links=/tools/pip/pytorch torch==2.2.2+rocm5.7 torchvision==0.17.2+rocm5.7 torchaudio==2.2.2+rocm5.7
ROCm が有効であることを確認します。
python -c "import torch ; print(torch.cuda.is_available())"
あとは PyTorch を使用して AI モデルの学習を行うことができます。
ACRi ルームのサーバではインターネットへのアクセスができませんが、pip を使用した pypi.org からのパッケージのインストールはユーザーが自由にできるようになっています。例えば numpy をインストールするには次のようにします。
pip install numpy
PyTorch による画像分類チュートリアル
CIFAR10 データセットの画像分類を ResNet モデルで学習するチュートリアルを実行してみましょう。as006 にログインし、スクラッチ領域にチュートリアルのリポジトリをコピーします。
cd /scratch/$USER
cp -a /tools/repo/acri-room/vai-tutorial .
cd vai-tutorial
venv 環境を作成し PyTorch をインストールします。
python -m venv .venv
source .venv/bin/activate
pip install --find-links=/tools/pip/pytorch torch==2.2.2+rocm5.7 torchvision==0.17.2+rocm5.7 torchaudio==2.2.2+rocm5.7
他に必要となるパッケージをインストールします。
pip install -r requirements.txt
CIFAR10 データセットを data ディレクトリ以下に展開します。
mkdir data
tar xf /tools/data/cifar-10-python.tar.gz -C data
モデルを学習するには次のスクリプトを実行します。
./scripts/train.sh
デフォルト設定では200エポックの学習を行い、15分ほど時間がかかります。時間短縮のために8エポックだけ学習させたい場合は次のようにします。
./scripts/train.sh trainer.max_epochs=8
学習中の GPU の使用状況を確認するには、別のターミナルを開いて rocm-smi コマンドを実行します。次のように出力されます。
$ rocm-smi
======================================= ROCm System Management Interface =======================================
================================================= Concise Info =================================================
Device [Model : Revision] Temp Power Partitions SCLK MCLK Fan Perf PwrCap VRAM% GPU%
Name (20 chars) (Edge) (Avg) (Mem, Compute)
================================================================================================================
0 [0x0c34 : 0x02] 51.0°C 222.0W N/A, N/A 1675Mhz 1600Mhz 0% auto 300.0W 12% 100%
Instinct MI210
================================================================================================================
============================================= End of ROCm SMI Log ==============================================
学習の進み具合は TensorBoard を使用して確認できます。TensorBoard を起動するには別のターミナルを開いて次のようにします。
cd /scratch/$USER/vai-tutorial
source .venv/bin/activate
tensorboard --logdir ./logs/train/runs/
リモートデスクトップで as006 に接続し、Firefox または Chrome で http://localhost:6006
を開くと TensorBoard の画面にアクセスできます。学習が進むにつれロスが下がり精度が上がっていることが分かります。
200エポック学習させたときの精度は95.1%となりました。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Test metric ┃ DataLoader 0 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ test/acc │ 0.9510999917984009 │
│ test/loss │ 0.1570771187543869 │
└───────────────────────────┴───────────────────────────┘
Vitis AI による量子化、コンパイル
Vitis AI による量子化は GPU により高速に行うことができます。上記のチュートリアルで学習したモデルを量子化、コンパイルしてみましょう。学習済みのモデルは ./logs
ディレクトリの下に保存されています。
./logs/train/runs/2024-04-10_18-01-47/checkpoints/
├── epoch_196.ckpt
└── last.ckpt
この例ではテスト用のデータセットに対する精度が最も高かったモデルが epoch_196.ckpt として保存されています。以降の手順ではこのファイルを対象に量子化を行います。
量子化の手順
Vitis AI の PTQ (Post Training Quantization) による量子化の手順は次のとおりです。
- キャリブレーション
- モデルにデータを入力し、各層の出力の分布を調べることで量子化係数を決定します
- テスト
- 量子化後のモデルの精度を確認します
- デプロイ
- 量子化したモデルを xmodel 形式でエクスポートします
- xmodel ファイルはコンパイラへの入力になります
Vitis AI による量子化は正式には Docker 環境で行いますが、公式の Docker イメージにインストールされている PyTorch のバージョンが古いため、ここでは Docker は使用せず量子化に必要なツールをソースコードからビルドして使用します。次のコマンドでビルドを実行します。
cd /scratch/$USER/vai-tutorial
source .venv/bin/activate
./scripts/build_quantizer.sh
キャリブレーションを実行します。ckpt_path=
のパスはご自身の環境に合わせて変更してください。
./scripts/quant_calib.sh ckpt_path=./logs/train/runs/2024-04-10_18-01-47/checkpoints/epoch_196.ckpt
量子化に関する情報は quantized ディレクトリ以下に保存されます。
次に量子化後のモデルの精度をテストします。
./scripts/quant_test.sh ckpt_path=./logs/train/runs/2024-04-10_18-01-47/checkpoints/epoch_196.ckpt
量子化前の95.1%からわずかに下がり94.7%となりました。問題ないためこのまま進めます。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Test metric ┃ DataLoader 0 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ test/acc │ 0.9473000168800354 │
│ test/loss │ 0.16378344595432281 │
└───────────────────────────┴───────────────────────────┘
最後にモデルを xmodel 形式でエクスポートします。
./scripts/quant_deploy.sh ckpt_path=./logs/train/runs/2024-04-10_18-01-47/checkpoints/epoch_196.ckpt
./quantized/ResNet9_int.xmodel
に量子化したモデルが保存されます。
コンパイルの手順
Vitis AI のコンパイラはオープンソースではないため Docker 環境から使用する必要があります。as006 および as005 では Rootless Docker をセットアップすることでユーザーが Docker を利用できます。
Rootless Docker のセットアップ方法
初めて Rootless Docker を使用する際に以下を実施する必要があります。
1. Rootless Docker の設定ファイルを作成します。
mkdir -p ~/.config/docker
echo "{ \"data-root\" : \"/docker-data/$(id -un)\" }" > ~/.config/docker/daemon.json
2. Rootless Docker をインストールします。
dockerd-rootless-setuptool.sh install
上記を実施しても Docker デーモンに接続できない場合は次のようにしてサービスの再起動を行ってみてください。
systemctl --user restart docker.service
Docker イメージのロード
Vitis AI の Docker イメージをロードします。モデルのコンパイルには GPU は使用しないため CPU のみのイメージを使用します。これには2分ほど時間がかかります。
docker load -i /tools/docker/xilinx/vitis-ai-pytorch-cpu/ubuntu2004-3.5.0.306.tar
docker images
コマンドでイメージがロードされたことが確認できます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xilinx/vitis-ai-pytorch-cpu ubuntu2004-3.5.0.306 10667a5b7322 9 months ago 11.7GB
Docker コンテナを立ち上げるには次のスクリプトを実行します。
./docker/run.sh
うまく立ち上がると次のように表示されます。
==========================================
__ ___ _ _ _____
\ \ / (_) | (_) /\ |_ _|
\ \ / / _| |_ _ ___ ______ / \ | |
\ \/ / | | __| / __|______/ /\ \ | |
\ / | | |_| \__ \ / ____ \ _| |_
\/ |_|\__|_|___/ /_/ \_\_____|
==========================================
Docker Image Version: ubuntu2004-3.5.0.306 (CPU)
Vitis AI Git Hash: 6a9757a
Build Date: 2023-06-26
WorkFlow: pytorch
root@as006:/workspace#
xmodel 形式のモデルのコンパイルには vai_c_xir コマンドを使用します。VCK5000 をターゲットにコンパイルするには次のようにします。
vai_c_xir \
--xmodel ./quantized/ResNet9_int.xmodel \
--arch /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK50008PE/arch.json \
--output_dir ./compiled \
--net_name ResNet9_Cifar10
VCK5000 向けの DPU 実装は PE のインスタンス数やサポートレイヤーの違いから以下のバリエーションがあります。使用したい DPU 実装に合わせて上記コマンドの --arch
オプションへ渡すパスを変更してください。
DPU アーキ | PE 数 | タイプ | arch.json のパス |
---|---|---|---|
DPUCVDX8H | 4 | miscdwc | /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK50004PE/arch.json |
DPUCVDX8H | 6 | dwc | /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK50006PEDWC/arch.json |
DPUCVDX8H | 6 | misc | /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK50006PEMISC/arch.json |
DPUCVDX8H | 8 | normal | /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK50008PE/arch.json |
特に問題がなければ ./compiled
ディレクトリ以下にコンパイル後のモデルが出力されます。Docker コンテナは閉じてしまって構いません。
コンパイルされたモデルがどのように DPU に割り付けられたかを Netron を使って確認します。ホスト側のターミナルに戻り、次のコマンドを実行します。
cd /scratch/$USER/vai-tutorial
source .venv/bin/activate
netron ./compiled/ResNet9_Cifar10.xmodel
リモートデスクトップのブラウザで http://localhost:8080
を開きます。
upload と download はホストとデバイスの間のデータ転送を意味します。モデルの中に DPU がサポートしていないレイヤーが含まれているとホスト CPU で処理する必要があり、余計なデータ転送が発生してしまいます。今回使用したモデルの元の実装では nn.MaxPool2d(4) が使用されていてこれに DPU が対応していなかったため、連続するふたつの nn.MaxPool2d(2) に置き換えることで対策しました。
Vitis AI によるモデルの実行
Vitis AI で量子化、コンパイルしたモデルを VCK5000 で動作させてみましょう。ここからは as005 にログインして作業を進めます。
as005 のスクラッチ領域にチュートリアルのリポジトリをコピーします。
cd /scratch/$USER
cp -a /tools/repo/acri-room/vai-tutorial .
cd vai-tutorial
venv 環境を作成し、PyTorch をインストールします。as005 では GPU は使用できないため CPU 版のPyTorch を指定します。
python -m venv .venv
source .venv/bin/activate
pip install --find-links=/tools/pip/pytorch torch==2.2.2+cpu torchvision==0.17.2+cpu torchaudio==2.2.2+cpu
他に必要となるパッケージをインストールします。
pip install -r requirements.txt
モデルの実行に必要となる Vitis AI Runtime 関連のソフトウェアをビルドします。
./scripts/build_runtime.sh
ターゲットの DPU 実装を指定するための環境設定を行います。
source ./docker/setup_vck5000.sh DPUCVDX8H_8pe_normal
最後の引数にはコンパイル時に指定した DPU 実装を次の中から指定します。
- DPUCVDX8H_4pe_miscdwc
- DPUCVDX8H_6pe_dwc
- DPUCVDX8H_6pe_misc
- DPUCVDX8H_8pe_normal
as006 でコンパイルしたモデルを as005 にコピーします。予約不要の as106 が as006 とスクラッチ領域を共有しているためこれを利用します。
scp -r as106:/scratch/$USER/vai-tutorial/compiled .
入力データとして CIFAR10 データセットを展開します。
mkdir data
tar xf /tools/data/cifar-10-python.tar.gz -C data
以上でモデルを実行する準備が整いました。
次のように xmodel=
にコンパイルしたモデルのパスを渡して実行します。初回は少し時間がかかります。
./scripts/run.sh xmodel=./compiled/ResNet9_Cifar10.xmodel
成功すると次のように表示されます。ターミナルによって画像がうまく表示されない場合はリモートデスクトップで接続して Ubuntu のターミナルから実行してみてください。
より多くの結果を確認したい場合は num_batches=
オプションを指定します。
./scripts/run.sh xmodel=./compiled/ResNet9_Cifar10.xmodel num_batches=100