AMD Ryzen AIソフトウェアとNPUドライバをインストールした自身初購入のミニパソコンRyzen 7 8845HS搭載AOOSTAR GEM12 Pro MAX/Windows 11 Proにamd / RyzenAI-SWをgit cloneしてAI学習するHello World編。
AMD Ryzen AIソフトウェアチュートリアルの第一歩、hello_worldは、シンプルな機械学習モデルをCPUからNPU/Neural Processing Unitに移植する方法のデモ。
より具体的には、データモデルとしてResNet50(画像認識におけるCNN/Convolutional Neural Network/畳み込みネットワークの1つで50層残差ネットワーク/Residual Networkを使った学習モデル)をONNX形式に変換、量子化、NPU上で推論を実行。
これは、つまり、CPUやGPU(iGPU)の作業を同程度の性能をもつNPUに移植できれば、できるほど、CPUやGPUの負荷を低減させることができ、ハード全体としてパフォーマンス向上に直結することを意味しています。
まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。
ryzen-ai-1.4.0は、Ryzen AIソフトウェアのインストール中に指定時、デフォルトのconda仮想環境名、もしくは、それをベースに変更したconda仮想環境名です。
続いて当該プロジェクトで必要なパッケージのインストール。
こちらは、hello_world実行前のJupyter notebook上のプロジェクト説明ページ(というか*.ipynbファイルに応じたデフォルト)をJupyter notebookのファイルメニューからHTMLとして出力後の全画面なスクショ。
hello_worldフォルダ上でjupyter notebook hello_world.ipynbすれば、Jupyter notebookが表示されます。
開いたら、画面右上のデバッガ用(虫の)アイコンと進捗インジケータとなる白丸(○)の間あたりの文字列がカーネル選択用アイコンとなっているのでconda仮想環境と異なる名称ならクリックして実行したipynbファイル名か、conda仮想環境名に、python3-ipykernelとなっている場合は、前者か否かを確認、違えば変更します。
もしなければ、Anacondaプロンプトからpython -m ipykernel install --user --name ryzen-ai-1.4.0(conda仮想環境名)として(ipkernelコマンドがないエラーに遭遇したらconda install ipykernel後、再実行して)Jupyter Notebookを開き直せば、カーネル選択候補に出てきます。
あとはRunメニューから必要なものを選んで実行するなど、必要に応じて対応します。
久しぶりすぎてnotebook忘れてjupyter hello_world.ipynbして起動できず、仕様が変わったのかと一瞬あたふたしったって話は内緒。
RyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。
PowerShell上でhello_world.pyの実行もしてみました。
Ryzen AIソフトウェアが正常にインストールされた状態のpython hello_world.py実行結果。
特に最終行付近で[Vitis AI EP]が効いている様子で、CPUよりもNPUの方が実行時間が速いのがみてとれます。
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は既に済んでいるものとします。
続いて当該プロジェクトで必要なパッケージのインストール。
こちらは、hello_world実行前のJupyter notebook上のプロジェクト説明ページをJupyter notebookのファイルメニューからHTMLとして出力後の全画面なスクショ。
Jupyter notebookは、pip install jupyterし、hello_worldフォルダ上でjupyter notebook hello_world.ipynbすれば、Jupyter notebookが表示されます。
jupyterインストールして初めての起動時には、どのブラウザ使うか聞かれたかも。
開いたら、画面右上のデバッガ用(虫の)アイコンと進捗インジケータとなる白丸(○)の間あたりの文字列がカーネル選択用アイコンとなっているのでconda仮想環境と異なる名称ならクリックしてconda仮想環境名に変更します。
もしなければ、Anacondaプロンプトからpython -m ipykernel install --user --name ryzen-ai-1.4.0(conda仮想環境名)として(ipkernelコマンドがないエラーに遭遇したらconda install ipykernel後、再実行して)Jupyter Notebookを開き直せば、カーネル選択候補に出てきます。
あとはRunメニューから必要なものを選んで実行するなど。
久しぶりすぎてnotebook忘れてjupyter hello_world.ipynbして起動できず、仕様が変わったのかと一瞬あたふたしったって話は内緒。
(Ryzen AIソフトウェアが正常にインストールされた後、)RyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。
でもってRyzenAI-SW/tutorial/hello_world/にある方法でJupyter notebook上でhello_worldを実行、今回使用した実機での結果がこれ。
コマンドラインでやる方法もあるということで、そうしようと思ったら、はてdisplay_nameってなんぞや?ってなったのでVS Codeでhello_world.ipynbを開いて、元はのこしておくかとrun_hello_world.ipynbみたいにして名前をつけて保存、PowerShellの当該パスからjupyter notebook run_hello_world.ipynbしてブラウザに表示させたあとHTML変換出力、ダウンロードフォルダに出力されたhtmlファイルをブラウザで表示、全画面スクショ。
ファイル名変更は、全く意味なし。なぜ、そんなことしようと思ったのか我ながら謎。ちなみに、あれから、エディタも即、VS CodeからVIMに替え、Anacondaプロンプト(はじめ各プロンプト)上で使用中。
尚、hello_world.ipynbには、hello_world.pyにはないimport vai_q_onnxがあり、ModuleNotFoundErrorとなったものの、pip installはできず、.pyを先行した自身には、にわかに解消法がわからなかったので深追いすることなく、コメントアウトして凌ぎました。
他の同種のエラーは、pip installして再実行。
PowerShell上でhello_world.pyの実行もしてみました。
こちらは、端末上の実行結果のスクショ。
結果、少々、警告やエラーもありつつ、Windows 11 Pro上でRyzen AI Softwareのチュートリアルからhello_worldを実行、完了できました。
こちらが、ターミナル上の実行時の生の出力結果で[QUARK-ERROR]が1件、[QUARK-WARNING]が3件、[QUARK-INFO]でエラーがあったよ情報が1件ありますね。
「fusing Geluスキップしてるよ」という不明な警告1件を除き、他は、一連の出来事としてCPU版custom_ops.dllがないよ、ファイルがなくてCPU版cl用のコンパイラのバージョンチェックに失敗したよ、CPU版カスタムopライブラリのコンパイルに失敗しちゃったよ、コマンド['where', 'cl']でエラー出てるよってことな模様。
さておき、最終行にCPUとNPUでの実行時間がそれぞれ出力されており、どこまでいくのか、少なくとも3回やってみたところ、実行するたびに高速に。
速度は拮抗、処理内容にもよるとは思いますが、実行するごとに共に僅かながらCPUが速かったり、NPUが速かったり。
ただ、NPUで実行すれば、その分、CPUやiGPUの負荷はゼロだったり、大幅に低減されたりするようなので、そういう意味では、CPUとNPUの実行速度が拮抗しているというのは優秀かつ頼もしいと見て良さ気。
というわけで初めの一歩hello worldを実行できたわけですが、この後うまくいったものの、getting_started_resnetでハマって同環境でhello worldが最初になったからでしょう、結構ハマりどころがあり、それもRyzen AIとか、torchとかじゃなく、大変だったのは、あらゆるエラーに見舞われたWindows上の依存関係の調整や環境設定。
hello_world.py内でimportとインストール時のパッケージ名が異なり、PyPiにも似たようなパッケージが並び悩ましいケースがあったり、エラー原因がどうにもわからず、ライブラリを再インストールしてみたり、キャッシュをクリアしてみたり、importしているライブラリに起因するような内容のエラーが、実は、PythonやCMakeのバージョンに起因していたり...。
開発環境もWindows 11 Pro/Visual Studio 2022(Comunityバージョン)/CMake 4.0.0/Anaconda3-2024.10-1(Python 3.12)に加え、一部pip、エディタをVS Codeとして開始。
一時使って即やめた良い思い出がないAnacondaも入れてやってみたわけですが、やはり、これを即捨ててpipでvirtualenvに切り替え、VS/Visual Studio CodeもGUIなVimに替え...、それはそれでユーザー権限と管理者権限のPowerShellターミナルを併用したり...
CMakeは要件上はバージョン3.26以上もpip install amd-quarkの原因不明なコンパイルエラーが、最新の4.0.0から3.31.6にダウングレードしたことで解消したり、python.exeがWindows管理フォルダ内にもあって影響したり、以後、pythonではなく、pyコマンドに替えて上手くいったり...。
Linuxなら、少なくともDebianとか保守的なディストロの安定版なら、自分で他からパッケージを持ってこない限り、いや、仮にそうであっても、ほぼ安定しているソフトウェア間の依存関係、何かあってもdpkg -P --force-remove-reinstreqのような強力なコマンド群があったりする好環境に甘えて、どっぷり、ゆったり、のんびり、のんきに浸かることに慣れてしまっている自身にとって、自分で調達してくる必要のあるWindows上での開発は、異国の地で荒野を彷徨う迷い人のごとく、過酷極まりなく、それもhello worldで...(って過言か)。
初心者にとってはわかりやすいOSながら、IDEを使わない開発者にとっては、過酷な環境だったんだなと、Windowsでの開発と言えば、せいぜいVBやVBAとその辺包含してくれるIDEやアプリ内の狭い環境でしかやったことのなかった、やれることの少なさ窮屈さを感じてWindowsから去った自身は、今回、そんな風に感じました。
良かったことは、hello worldなのに変に達成感があった?こと、CLIなvi慣れした今となっては初めて使ってみたGUIのVIMが超快適であることを知ったこと(ってLinux上では端末で十分ですが)、更にGUIを使うまでもなく、PowerShell上でvim file_name等とすれば、Linux同様にPowerShell内でviが使えることを知ったこと、以前、AIに触れた頃の感覚が少し戻ってきた気がしたこと。
あと、Pythonのvirtualenv(venv、pipenv)、自身の場合、Linux(安定版なDebian)では、ホームディレクトリあたりに仮想環境1個作って何をするにも全部そこで完結といった使い方しかしていなかったのですが、チュートリアルやプロジェクトごとに各アプリのバージョンの互換性がシビアに影響してくる状況では、個別に仮想環境作らないとやってられないこともあるよねと気づいたこと。
この点は、Windowsなら日常茶飯事、AI分野のような進化著しい分野ではOSやディストロに関わらずってところですかね。
尤もDockerとか、Wineとかも同様で、それらはそうやって使ってますし、Anacondaもそうでしょうが。
そんな作業ばかりだと特にAI関連は、データが大きくなりがちでストレージは膨らむ一方なのでTBなディスクであってもマメな管理は必要ながら便利ですよね。
それと、やっぱり、成功体験は大事。