10月13日、InfoWorldが「Local AI on NPUs: Building a zero-cloud photo deduplicator with OpenCLIP」と題した記事を公開した。ノートPCに搭載されたNPUをOpenCLIPと組み合わせ、クラウド不要で写真の重複削除パイプラインを構築する方法について詳しく紹介されている。
「AI PC」と銘打たれたノートPCが溢れているが、搭載されたNPU(Neural Processing Unit)を実用的な用途に活かせているエンジニアは少ない。InfoWorldのこの記事は、100GB超の家族写真アーカイブの重複削除という具体的な課題を題材に、NPUを活用したローカルAI処理の実装手順を詳述している。ソースコードはGitHubで公開済みだ。
なぜクラウドではなくローカルなのか
記事が指摘する背景は単純な「プライバシー」論ではない。データグラビティ(data gravity)、つまり大量データをクラウドに送り出すことの物理的コストが問題だ。テラバイト規模の写真・動画アーカイブをクラウドAPIに投げるのは帯域的に非現実的である。
さらに大局的な視点として、記事は米国のデータセンター電力不足にも言及している。2030年までに電力不足が100ギガワット超に達するという業界予測があり、バージニア州では25MW超の新規ハイパースケールデータセンターへの州支援を制限する法令が2026年9月に発効するという(※元記事の法令種別の表記を確認の上、「大統領令」という訳語は使用を避けた)。「クラウドの物理的な余地が尽きつつある」というのが記事の前提認識だ。
CPU・GPU・NPUの役割分担
記事はまず、モダンなシリコンの特性を整理している。
- CPU:ロジック処理やファイルI/Oは得意だが、ニューラルネットの行列演算を連続で回すと使用率100%・消費電力は35W超になる
- GPU:スループットは高いが電力消費が大きく、グラフィックスや大規模モデルの学習・推論向け
- NPU:行列演算に特化した低消費電力プロセッサ。消費電力は約6Wという省エネ設計
なお、Apple SiliconのNPUについても言及があり、qwen-aneプロジェクトでは32コアNPUを使い27Bモデルをわずか8Wで動かす実験が進んでいるとのことだが、推論速度はまだ実用段階にないと記されている。
OpenCLIPによるセマンティック重複削除の仕組み
記事の核心はここだ。使用するモデルは**OpenCLIPのViT-B/32(OpenAIのオリジナルCLIP実装をオープンソース化したもの)。CLIPは2021年3月にOpenAIが発表したモデルで、4億枚の画像とテキストペアを学習したデュアルエンコーダアーキテクチャ**だ。事前定義カテゴリに縛られる従来の分類器とは異なり、汎用的な視覚概念を学習しているため、「少し角度の違う同じ被写体の写真」を同一と判断できる。
ViT-B/32を選んだ理由は「エッジハードウェアのスイートスポット」に位置するから。NPUメモリに直接コンパイルできる小ささと、セマンティックな類似性を認識できる精度を両立している。
前処理パイプライン:
- 短辺を256pxにリサイズ
- 224×224にセンタークロップ
- OpenAIの定数で正規化
これを全画像に同一の変換で適用することで、比較の数学的な安定性を保つ。
必要なライブラリのセットアップ:
python3.14 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
# PyTorch(ホスト側はCPUホイールで十分)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
# OpenCLIP(OpenAIのViT-B/32事前学習済みウェイト同梱)
pip install open_clip_torch
# Intelのモデルコンパイラとランタイム
pip install openvino
# ONNXツールチェーン
pip install onnx onnxscript
# 画像処理
pip install numpy pillow
# 並列前処理(ImageMagick)
# Linux: sudo apt-get install -y imagemagick
# macOS: brew install imagemagick
# Windows: winget install ImageMagick
ベンチマーク:CPU→NPU(同期)→NPU(バッチ)の3段階比較
記事のハイライトはここだ。OpenVINO(IntelのモデルコンパイラでPyTorchモデルをCPU/GPU/NPUで動かせる中間表現IRに変換するツール)を使い、3つの構成でベンチマークを取っている。
| 構成 | 1枚あたりの推論時間 | スループット | 消費電力 |
|---|---|---|---|
| CPU(PyTorch) | 約35ms | 28枚/秒 | 35W超 |
| NPU(同期・batch=1) | 約25ms | 65枚/秒 | 27.3W |
| NPU(バッチ16・THROUGHPUT) | 約13ms | 92.6枚/秒 | 22.7W |
※消費電力の数値は元記事のベンチマーク結果に準拠。CPU欄は本文中の「35W超」という記述に合わせて記載している。
CPUで実行すると使用率がほぼ100%に張り付き、ファンが即座に回転する。NPUに切り替えただけで消費電力が大幅に下がるが、記事が強調するのはバッチ処理の効果だ。
NPUを同期ループで1枚ずつ処理すると、NPUが行列演算を終えてもPythonが次の画像を渡すまでアイドル状態になるというディスパッチオーバーヘッドが発生する。16枚のバッチで処理し、OpenVINOのTHROUGHPUTパフォーマンスヒントを適用することで実行ユニットを飽和させ、このボトルネックを解消している。
最終的なスループットはCPU比で3倍超、消費電力は22.7W。バッテリー駆動のまま大規模アーカイブを処理できる構成だ。なお、NPU使用時のファン動作はシステム構成や負荷状況によって異なる場合がある。
ONNXエクスポート時の注意点として、バッチサイズをグラフ内部にベイクする(固定する)ため、バッチサイズごとに別のIRをエクスポートする必要がある。
$ python export_ov.py --batch 16
IR: ~/photo-dedup/dedup/models/clip-vitb32-b16.xml
input : [16,3,224,224] <Type: 'float32'>
output: [16,512] <Type: 'float32'>
コサイン類似度によるクラスタリング
エンベディング生成後は、OpenCLIPが出力する512次元ベクトルをユニット長に正規化し、コサイン類似度(実質的にはドット積)をアーカイブ全体で一括計算する。閾値は0.92。Union-Findアルゴリズムで推移的にクラスタリングするため、5枚の連続バースト写真が「隣同士でかろうじて閾値を超える」場合でも1クラスタにまとまる。
$ python cluster.py ~/scan
2 cluster(s), 9 photo(s), threshold 0.92:
dup_0001/ (5)
IMG_0412.jpg ~ IMG_0416.jpg
dup_0002/ (2)
IMG_0788.jpg
IMG_0789.jpg
moved 9 photo(s) into 2 cluster folder(s)
重複クラスタはそれぞれdup_XXXX/フォルダに移動される。--dry-runフラグで実際のファイル移動なしにクラスタを確認することもできる。
この実装が示す本質は、「AI PCのNPUは飾りではない」という点だ。OpenVINOとOpenCLIPという既存のオープンソースツールを組み合わせるだけで、クラウドAPIもGPUサーバーも使わずに実用的なセマンティック検索・重複削除パイプラインが動く。写真整理に限らず、ドキュメント類似検索や動画サムネイルのクラスタリングなど、同じ構成を転用できる場面は広い。手元のAI PCにNPUが搭載されているなら、まず試す価値のあるアーキテクチャだ。
詳細はLocal AI on NPUs: Building a zero-cloud photo deduplicator with OpenCLIPを参照していただきたい。