見出し画像

今話題のNPUを使ってAvatarianしてみた

以前Lenovo Pro Communityでお借りしたNPU搭載PC(AI PC)で本格的にNPUを使ってみたレポートです。

AI PCとは

AI PCとは、NPU(Neural Network Processing Unit)を搭載したPCのことで、Intel Core UltraシリーズはこのNPUを搭載している。

お借りしたモデルは
ThinkBook 13x Gen4 Core Ultra 5 125H・16GBメモリー・512GB SSD・13.5型2.8K液晶搭載 21KR0009JP
です。
価格は、
ThinkBook 13x Gen 4 |プレミアム13.5型インテル® Core™ Ultra プロセッサー搭載ビジネスノートPC | レノボ・ ジャパン (lenovo.com) の公式サイトで¥154,440 (2024年9月8日時点)
でした。

前回の記事はこちら

そのままではNPUは使えない

NPUを使うためには、NPUを使うようにプログラムを作る必要があります。
なので、従来のアプリをそのまま使ってもNPUの使用量はゼロです。

実験:AvatarianはNPUを使うのか
NPUはAI用の計算をするので、顔検出、顔認識のライブラリのdlibを使ったPythonアプリは自動的にNPUを使うのか試してみた。
Avatarianはdlibを使って、画面上に映る顔を画像に変換する自作アプリです。
参考:Avatarianを公開しました|Mat'zの好奇心爆発 (note.com)
早速環境構築して使って見た結果…。
ゼロ!
想像していた通り、ゼロでした。

NPUを使わないAvatarian

NPUが使えるようにプログラミングする

IntelのNPUを使うには、2通りの方法があります。
1. OpenVINOを使う
2. Intel® NPU Acceleration Library を使う

今回はAvatarianでNPUを使う実験ではOpenVINOを使い、
大規模言語モデルの実験でIntel NPU Acceleration Libraryを使いました。

OpenVINOを使ってAvatarianを動かす

Avatarianは、オンライン会議の相手をアバターにする #Python - Qiita に記載しているアプリです。このアプリはdlibという顔認識のAIを使っていますが、これをNPUに対応させるところから始めます。

  1. AIモデルの準備

Avatarianで使っている顔認識はdlibを使っていますが、dlibはNPUに対応しないので、モデルを用意する必要があります。

流れとしては、OpenVINOの形式のAIモデルを用意し、NPU用にコンパイルして実行することになります。

OpenVINOの形式に変換するのには、TensorFlowのモデルや、汎用AIモデル形式(どんなデバイスでも動かせるAIモデルの形式)である、ONNX形式があればOKです。

dlibのdatファイル>TensorFlowファイル/ONNXファイル>OpenVINOファイル

の流れです。

1.1 アジア人の顔を追加したdlibの顔認識モデルを入手https://github.com/davisking/dlib-models
taguchi_face_recognition_resnet_model_v1.dat.bz2

モデル作成の詳細はTaguchiさんの記事を参照
dlib に 私の顔認証モデルが採用された #Python - Qiita

1.2 dlib-to-tf-keras-converterを使って、dlibのモデルをTensorflowのモデルに変換
ksachdeva/dlib-to-tf-keras-converter: A set of scripts to convert dlib's face recognition network to tensorflow, keras, onnx etc (github.com)

※これをWindowsで実行するとなぜかKernel Errorが出てしまったので、WSLで実施。TensorFlowのバージョンに注意

Python 3.7
pip install tensorflow=2.14
pip install numpy
pip install xmltodict
pip uninstall protobuf
pip install protobuf==3.20
python main.py --xml-weights xml_generator/build/taguchi_face_recognition_resnet_model_v1.xml

手順通りやれば、expoertedフォルダと、TensorFlowモデルのpbファイル、Kerasのh5ファイルができる。

1.3 PythonでOpenVINOを用いてpbファイルをOpenVINO IR形式に変換して保存
Converting a TensorFlow Model — OpenVINO™ — Version(2024)
openvino.save_model — OpenVINO™ documentationCopy to clipboard — Version(2024)

import openvino as ov


# 1. Convert model created from TersorFlow model
core = ov.Core()
ov_model = core.read_model("/home/matz/dlib-to-tf-keras-converter/taguchi_face_recognition_resnet_model_v1.pb")

# 2. Save model as OpenVINO IR
ov.save_model(ov_model, './taguchi_face_recognition_resnet_model_v1_FP16.xml', compress_to_fp16=True) # enabled by default


おまけ
1.4 exportedフォルダからonnx形式のファイルも作れます

pip install openvino
pip install packaging
pip install git+https://github.com/onnx/tensorflow-onnx
python -m tf2onnx.convert --saved-model "/home/matz/dlib-to-tf-keras-converter/dlib_exported" --output dlib_face_recognition_resnet_model_v1.onnx

なお、わざわざDlibを使わなくても、顔認識のONNX形式のモデルも存在していました。

あとはこれをNPU向けにコンパイルすればNPUが使える。

NPU vs CPU vs GPU

Avatarianの対象として、人が多く動きのあるAKB48の「恋 詰んじゃった」で実験した。


CPUでAvatarian

CPUでは1.4FPSほどでていた。
まずはここがベンチマーク。なお、OpenVINOを使うことで、dlibの時よりはるかに高速になった。


GPUでAvatarian

内臓GPUでも1.48FPSほどでていた。なかなかよい。


NPUでAvatarian

本命のNPUは…1.25-1.30FPSほど。あれ…。

最大でもNPUは 4%ほどしか利用せず、アプリとしての処理速度は上がらなかった。

考察

Face recognitionはCPUでも高速に処理できていて、わざわざNPUに処理を回す効果がなかったようだ。
dlibを使ったときは、CUDA対応にすることでCPUに比べて相当早くなっていたのでNPUでも同様の効果を期待したけど、OpenVINO形式にする(そしてそのタイミングでFP16に変換した)ことで、計算負荷が下がったのだと思う。
WindowsでdlibをCUDA対応にする #dlib - Qiita

LLavaを動かす

AvatarianではNPUの効果がほとんどなかった。むしろ遅かった。
そこで、次は、intel/intel-npu-acceleration-library: Intel® NPU Acceleration Library (github.com)のexamplesにある、llava.pyを動かして画像の説明をさせてみた。

効果はこのとおり、NPUを20-30%つかって、ローカルノートPCで画像を認識して説明できている。

速度は2-3単語/秒 程度とそれほど早くないし、説明も特徴を捉えている。

処理スピードは遅いけれど、夜間に処理をかけるなどして使うには十分な能力があると感じた。


結論

NPUは複雑なAIモデルの利用で効果的(と思われる)
今後Copilot+ PCという、NPUの性能がさらに高いものが出てくると、軽量な生成AIはローカルPCでサクサク動くはず。
夜間に機密情報の処理を動かしておくなど、業務用途での活用も期待できる。

NPU搭載のAI PC、Copilot+ PCは今後注目です!

Lenovoからは最新CPUのCore Ultraプロセッサ(シリーズ2)搭載モデルが9月6日に発売されたばかりです。Yoga Slim 7i Aura Edition Gen 9、ぜひ使ってみたいですね。



この記事が気に入ったらサポートをしてみませんか?