AMD Ryzen AIソフトウェアとNPUドライバをインストールした自身初購入のミニパソコンRyzen 7 8845HS搭載AOOSTAR GEM12 Pro MAX/Windows 11 Proにamd / RyzenAI-SWをgit cloneしてAI学習するQuark Quantization編。
詳細は、検索しても、なかなか見当たらないのでquark_quantizationルート直下のdocディレクトリのquark_quant_readme.md参照。
NPU/Neural Processing Unit上でディープラーニングモデルを効率的にデプロイするための量子化の例。
(ここでは、)AMD QuarkによるQuark Quantizationは、量子化APIを使ったCNN/Convolution Neural Network/畳み込みネットワークモデルの量子化。
AMD Quarkは、深層学習モデルの量子化を簡素化しつつ、強化するクロスプラットフォームのツールであり、精度を損なうことなく、モデルの最適化、事後訓練・事後学習タイプの量子化技術による量子化後の精度回復支援も行うとのこと。
このチュートリアルの、おおまなか手順としては、
requirement.txtの修正が必要、そうしないとパッケージの不足エラーとは別に依存関係の干渉が発生、順繰りpip install -Uしていっても堂々巡りでハマります。
修正箇所は、唯一バージョン指定されているonnxiruntimeの少なくともバージョン上限の削除(今となっては下限も不要でしょうが)、少なくとも今日時点では、onnxrutimeのバージョン絡みで依存関係上の警告・エラーが発生、onnxrutime 1.20.1で通りました。
まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。
ryzen-ai-1.4.0は、Ryzen AIソフトウェアのインストール中に指定時、デフォルトのconda仮想環境名、もしくは、それをベースに変更したconda仮想環境名です。
続いて普通は必要のないrequirements.txtの編集と、これによる当該プロジェクトで必要なパッケージのインストール。
ただ、前述の通り、警告・エラーが表示されるかと。
その場合、今日時点では、requirements.txt内のonnixruntimeのバージョン指定を外し、一度、pip install -r requirements.txt、エラーが出ると思うのでonnxruntime==1.20.1とバージョン指定してpip install、その後、再度、pip install -r requirements.txtすれば、依存関係を調整してくれつつ、警告・エラーも表示されることなく、インストールが完了しました。
更に訓練前のResNet50モデルをmodels/フォルダにダウンロードするために一度、models/フォルダに移動してpython download_ResNet.pyを実行します。
次の作業のためにquark_quantizationフォルダに戻っておきます。
次にHugging FaceのILSVRC/imagenet-1kからval_images.tar.gzファイルをダウンロードします。
尚、今日時点では、この時、Hugging Faceへの会員登録とログイン後に表示される規約をAccept(許諾)する必要がありました。
会員登録については、当該ページの少し下に[Log in] or [Sign up]というボタンがあり、登録なら後者をクリックします。
登録後、同じ位置あたりに規約と[Accept]といったボタンがあると思うのでクリックしてから、その下にあるリストからダウンロードします。
ちなみにダウンロードリスト自体は、[Sign up]/[Login]/[Accept]する前にも表示されており、チェックもできますが、ログイン後、初回なら規約に[Accept]してからでないとダウンロードできません。
プロジェクトルートのquark_quantization上でHugging Faceからダウンロードしたval_images.tar.gzをこのようにval_dataフォルダに展開し、prepare_data.pyを実行、val_dataを処理した結果をcalib_dataというフォルダに保存します。
ちなみに自身は、これ以前に現時点で、まだ終わっていないyolov8やtorchvision_inferenceもいじっていて後者でval_dataにあたるものをcalib_dataとしてダウンロードしてしまい、「フォルダ分けしてねーじゃん!」エラーを食らっており、ここでダウンロードするまでもなく、そのフォルダをmv、val_dataフォルダとして保存したというのは内緒。
ということは、もしかして、ここで作ったcalib_dataがそっちで使えるのか?と思ってみたりもしますが、いくつかフォルダを覗いてみてもJpeg画像1つしか入ってなかったりで、はて違うかな?と思ってみたり。
[2025/04/04] やはり、このcalib_dataを使ってみたら、torchvision_inferenceも上手く実行できました。
「fusing Geluスキップしてるよ」という不明な警告1件があるくらいですね。
尚、ふとタスクマネージャに目をやると、このquark_quantization.py --quantize --evalute実行時のCPU使用率が、なんと100%。
8コア16スレッドなRyzen 8845HSで...。
先の量子化と評価に加え、ベンチマークをとるべく、quark_quantization.py --quantize --evalute --benchmarkを実行してみると最後の数行に結果が表示されました。
CPUの方は、floatモデルもあって値が小さいので、より速いってことですかね?INT(INT8)と比べるとってこと?量子化モデルの方は、CPU、NPU競ってますね。
これってホントに競ってるのかな?どっちもCPUってことはないよね?
そっか、INT8より、Float32の方が精度?が高い?割に大雑把な?INT8でも精度ロス少なめで、かなり頑張れてるでしょってことかな?
量子化と評価の時もそうだったのか、当初、そうでもなかったCPU使用率が最後の方で100%となっていた模様。
こうしてみると今回は、メモリも結構使ってますね。
ベンチマークをとっている時に、なぜか、たまたまGPUタブが表示されていたため、判明しただけで詳細未確認というか不明というか...。
ちなみにGPU0自体は、ほとんど使われていないながら、384MBな[専用GPU]は、常時90%以上使用しているかと思いきや、処理が終わって何もしていなくても同じレベルなので、そういうものなようです。
condaの仮想環境での作業が一通り終わったら、conda deactivate(activateの反対語deactivate)しましょう。
これを忘れると、たいてい痛い目にあうので要注意。
conda deactivateしたら、都度、conda info -eで[*]のついた仮想環境がないことを確認しておくと安心です。
なぜなら、一見、作業ディレクトリパス先頭から(ryzen-ai-1.4.0)といった仮想環境の表記が消えてもconda info -eで確認すると、まだ[*]が付いているなんてことがあったり、なぜか、代わりに(base)という仮想環境に入ってしまっていたり、知らずにAnacondaコマンドプロンプトを閉じて戻っても同様だったりすることもあったりするので。
仮想環境baseになってしまう場合、ディレクトリパス先頭に表示されるとは言え、本来の仮想環境については、deactivateコマンドを実行した確信が手伝うのか、意外と気づかないことも多く...。
何れにせよ、condaの仮想環境にいることを、知らずに、そのまま作業し続けると何かとハマりやすいので要注意。
ページを分けた関係で改めて書くと、まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。
ここでは、condaではなく、pipを使いますが、pip install virtualenvは既に済んでいるものとします。
続いて当該プロジェクトで必要なパッケージのインストール。
更に訓練前のResNet50モデルを取得するためにmodel/フォルダに移動してpython download_ResNet.pyを実行します。
次の作業のためにquark_quantizationフォルダに戻っておきます。
次にHugging FaceのILSVRC/imagenet-1kからval_images.tar.gzファイルをダウンロードします。
尚、今日時点では、この時、Hugging Faceへの会員登録とログイン後に表示される規約をAccept(許諾)する必要がありました。
会員登録については、当該ページの少し下に[Log in] or [Sign up]というボタンがあり、登録なら後者をクリックします。
登録後、同じ位置あたりに規約と[Accept]といったボタンがあると思うのでクリックしてから、その下にあるリストからダウンロードします。
プロジェクトルートのquark_quantization上でHugging Faceからダウンロードしたval_images.tar.gzをこのようにval_dataフォルダに展開し、prepare_data.pyを実行、val_dataを処理した結果をcalib_dataというフォルダに保存します。
ちなみに自身は、これ以前に現時点で、まだ終わっていないyolov8やtorchvision_inferenceもいじっていて後者でval_dataにあたるものをcalib_dataとしてダウンロードしてしまい、「フォルダ分けしてねーじゃん!」エラーを食らっており、ここでダウンロードするまでもなく、そのフォルダをmv、val_dataフォルダとして保存したというのは内緒。
ということは、もしかして、ここで作ったcalib_dataがそっちで使えるのか?と思ってみたりもしますが、いくつかフォルダを覗いてみてもJpeg画像1つしか入ってなかったりで、はて違うかな?と思ってみたり。
ここまでで準備が整ったので量子化と評価をすべく、PowerShell上でquark_quantization.py --quantize --evaluateを実行します。
が、ModuleNotFoundError: No module named 'quark'となったのでamd-quarkをpip installして再実行。
こちらが、ターミナル上の実行時の生の出力結果で完了はしているものの、hello_worldと全く同じ、[QUARK-ERROR]が1件、[QUARK-WARNING]が3件、[QUARK-INFO]でエラーがあったよ情報が1件ありますね。
「fusing Geluスキップしてるよ」という不明な警告1件を除き、他は、一連の出来事としてCPU版custom_ops.dllがないよ、ファイルがなくてCPU版cl用のコンパイラのバージョンチェックに失敗したよ、CPU版カスタムopライブラリのコンパイルに失敗しちゃったよ、コマンド['where', 'cl']でエラー出てるよってことな模様。
尚、ふとタスクマネージャに目をやると、このquark_quantization.py --quantize --evalute実行時のCPU使用率が、なんと100%。
8コア16スレッドなRyzen 8845HSで...。
先の量子化と評価に加え、ベンチマークをとるべく、quark_quantization.py --quantize --evalute --benchmarkを実行してみると最後の数行に結果が表示されました。
CPUの方は、floatモデルもあって値が小さいので、より速いってことですかね?INT(INT8)と比べるとってこと?量子化モデルの方は、CPU、NPU競ってますね。
量子化と評価の時もそうだったのか、当初、そうでもなかったCPU使用率が最後の方で100%となっていた模様。
こうしてみると今回は、メモリも結構使ってますね。
ベンチマークをとっている時に、なぜか、たまたまGPUタブが表示されていたため、判明しただけで詳細未確認というか不明というか...。
ちなみにGPU0自体は、ほとんど使われていないながら、384MBな[専用GPU]は、常時90%以上使用しているかと思いきや、処理が終わって何もしていなくても同じレベルなので、そういうものなようです。