Copilot+ PCに搭載されている高性能NPUを使って、Pythonによる処理を行う手順と結果をまとめました。
NPU(Neural Processing Unit)はAI処理に特化したプロセッサです。従来、AI処理は高性能なサーバーが提供するサービス(例えば、ChatGPTなど)にインターネットを介して接続するか、高性能なGPU(ただし消費電力が大きい)を使用して処理していましたが、NPUを活用することで、より効率的に推論を行い、省電力を実現することが可能です。
特に、Copilot+ PCに搭載されているNPUは45TOPSという高性能を誇り、様々なAI処理をローカルで実行できることが期待できます。
なお、Copilot+ PCに関する詳細な記事も本サイトに掲載していますので、興味のある方は「Copilot+PCでできること」をご覧ください。
本記事では対象者を特に限定していませんが、Pythonによるプログラミング経験があるとスムーズに進めることができると思います。
今回の検証には、Lenovo IdeaPad 5x 2-in-1 Gen 9を使用しました。
NPUの現状
Copilot+ PCが発売されてからそれほど長い時間は経っておらず、NPUを活用した処理の実装例はまだ非常に少ない状況です。
特に、Snapdragon内蔵のARM版 Copilot+ PCに関する情報は、インターネット上でもほとんど見つかりませんでした。また、多くのAI関連企業や団体でも、現時点でNPUを活用する準備が整っていないようで、既存のAI処理をNPUで行うのは少し難しいか手間がかかるのが現状です。
そこで、ひとまず実装例のあった超解像度の技術デモを用いて、PythonでNPUを使用できることを確認しました。この技術デモ自体は現段階では実用性は高くありませんが、今後のNPUの可能性を期待できるのではないでしょうか。
環境構築
以下の環境で検証を行いました。
• Lenovo IdeaPad 5x 2-in-1 Gen 9 (Copilot+ PC対応)
• Windows 11 Home 24H2 (OS Build 26100.1742)
• Python 3.11.9 (64-bit) ←注意 ARM版ではない
• Visual Studio Code – Insiders 1.94.0
• Qualcomm Neural Processing SDK for AI
• QuickSRNetLarge-Quantized
Python 3.11ではARM版のインストーラーもサポートされていますが、使用するライブラリの関係上64-bit版、つまり通常版をインストールしてください。
Python 3.11.9 (64-bit)
エディタは筆者の趣味でVSCodeのInsiders版を使用していますが、今回の実装においてInsiders版である必要は全くありません。安定版でも問題なく使用できますし、他のエディタでも問題ありません。ただし、環境構築はVSCodeを使用している前提で進めていきます。
<Qualcomm Neural Processing SDK for AI>
また、以下のリンクからQualcomm Neural Processing SDK for AIをダウンロードし、任意の場所に展開してください。今回はこの中に含まれている1ファイルのみ使います。
Qualcomm Neural Processing SDK for AI
推論に使うモデルはQuickSRNetLarge-Quantizedです。以下のリンクからダウンロードできます。
では環境構築に入っていきますが、結論だけ知りたい方は飛ばしてください。
まずはVSCodeでプロジェクトフォルダを開き、venvを使ってPythonの仮想環境を立てます。コマンドパレットから Python: Create Environment… → Venv を選択してください
Pythonのバージョンは Python 3.11.9 を選択してください。筆者の環境では複数のバージョンがインストールされているためこのように表示されます。インストール時に特に変更していなければパスは~\AppData\Local\Programs\Python\Python311\python.exe になります。
右下に完了の通知が表示されたらターミナルを開き以下のコマンドを入力して実行してください。
pip install onnx onnxruntime numpy pillow
初回インストール時は少し時間がかかります。
上記ライブラリのインストールが完了したことを確認して、以下のコマンドを入力して実行してください。
pip install onnxruntime-qnn
pipでは同時に複数のライブラリをインストール可能ですが、onnxruntime-qnnだけ後からインストールするようにしてください。先に インストールしてしまった場合はonnxruntime-qnnを一度削除した後、再度インストールしてください。
ダウンロードしたファイルは以下の通りに配置してください。
• Qualcomm Neural Processing SDK for AI
プロジェクトフォルダに \lib を作って qairt\2.26.0.240828\lib\arm64x-windows-msvc にある QnnHtp.dll をコピーする。
• QuickSRNetLarge-Quantized
プロジェクトフォルダに \models\ を作ってダウンロードした quicksrnetlarge_quantized.onnx をコピーする。
これで環境構築は完了です。
最終的にはこのようになります。サンプルコードはこのディレクトリ構成を想定しているためディレクトリ名を変更した場合は適宜読み替えてください。
.
├── .venv/
│ └── …
├── lib/
│ └── QnnHtp.dll
└── models/
└── quicksrnetlarge_quantized.onnx
実装例
サンプルコードを用意しました。
低解像度、一般に言う画質の悪い画像を入力とし、画質を向上させた画像を出力するスクリプトになります。
tkinter.filedialog.askopenfilenames() を使って入力ファイルを選択します。
(↑GitHub Gistというサービスでソースコードをウェブページに埋め込めます)
実装にあたりRunning models using NPU with Copilot+ PC を参考にしました。また、コードレビューにはGPT-4oを使用しています。
実行結果
夜景の画像から128×128pxでクロップした画像に対して超解像処理を行います。
処理前(128×128px) → 処理後(512×512px)
全体的にぼやけていたのが、はっきりとした印象になったと思います。同様に森林の画像からクロップした画像に対しても超解像処理を行いました。
こちらも、ぱっと見ではっきりとしたように感じられるのではないでしょうか。
実行時にタスクマネージャーを確認すると、一瞬だけ僅かにNPU使用率が上がっていることが確認できます。実行時に複数ファイルを選択すると、継続的にNPUが使用されていることが分かります。
まとめ
以上、NPUを使ってPythonで超解像処理を行う手順と実行結果をまとめました。
先述の通り、特にQualcomm製NPUでの実装例はまだ少ないのが現状です。Copilot+ PCの普及とともに、NPUの知名度が向上し、より多くの人が関心を持って取り組んでくれることを期待しています。
私もせっかく実機のCopilot+ PCを手に入れたので、これからもさまざまなNPUの活用を模索していきたいと思っています。
現状、利用可能なAI機能はMicrosoftによって提供されているペイントやフォトなどの生成AI機能のみですが、これらはオフラインで使用できず、生成内容にも制限があります。自分でスクリプトを作成すれば、オフラインで自由に生成が可能となり、より幅広い活用が期待できます。
せっかく45TOPSの高性能NPUを搭載しているので、Microsoftのアプリだけにしか使わないのはもったいないと思いませんか?
今回は超解像を取り上げましたが、今後はテキスト生成、画像生成、物体検知、音声認識など、さまざまなAI処理にも取り組んでみようと思います。
関連リンク
今回使用したSoCです