Gemini 3.0 に、NPUについて解説してもらいました。
生成AIの回答にはハルシネーションにより間違いが含まれている可能性があります。
それを踏まえてこの回答を読んでください。
最新のAIパソコンは「AIパソコン」という名目で、NPUが搭載されているそうですが、 このNPUというものが何物で、コンピュータのどこに組み込まれどのような役割を果たしているのか、教えてください。
特に、CPU、メモリー、ストレージの間で、どのように機能しているのかイメージできないので、この点を解説してください。
CPUや命令セット(アセンブラ)の基礎知識はあるという前提でお願いします。
CPUがNPUを操るようですが、ソフトウェア側で「どこでNPUに処理を任せるか」を制御するのでしょうか。
それともCPUが自動的にNPUに処理を振り分けるのでしょうか。
結論から申し上げますと、CPUがハードウェアレベルで勝手に判断してNPUに処理を投げる(アウトオブオーダ実行のように自動で振り分ける)ことはありません。
基本的には「ソフトウェア側(アプリケーションやドライバ)で明示的に『この処理はNPUで行う』と指定する」必要があります。GPUで3D描画をするために、プログラマがDirectXやOpenGLで「これはGPUで描画せよ」と指示するのと全く同じ構図です。
ただし、プログラマがNPUのアセンブラを直接書くわけではなく、「推論エンジン(ランタイム)」と呼ばれる中間層がその役割を担います。
アセンブラの知識をお持ちですので、「コンパイル」と「APIコール」の階層で考えると非常に分かりやすいです。以下に解説します。
1. なぜCPUは自動で振り分けられないのか?
CPU(x86/ARM)とNPUでは、理解する言語(命令の粒度)が根本的に異なるためです。
- CPUの視点: 「レジスタAとBを足せ」「メモリCからロードせよ」というスカラー/ベクター命令(命令単位)を実行します。
- NPUの視点: 「このメモリ領域にある100万個のデータを、この重み行列と畳み込み演算(Convolution)せよ」というグラフ/演算子(レイヤー単位)を実行します。
コンパイルされた通常のC++プログラム(x86バイナリ)には「畳み込み演算せよ」という命令は存在しないため、CPUが実行中のバイナリを見て「お、これは行列演算だからNPUに投げよう」と動的に判断することは不可能です。
2. 実際の制御フロー:誰が「NPUを使え」と決めるのか?
現代のAIアプリ開発では、以下の3層構造で制御が行われます。
第1層:アプリケーション開発者(意図の明示)
開発者はPythonやC++でコードを書く際、「ONNX Runtime」や「OpenVINO」といったAI推論フレームワークのAPIを使用します。 ここで開発者は、以下のいずれかの方法で指定します。
- 明示的指定:
session.set_providers(['NPUExecutionProvider'])のように、「NPUを使え」とハードコードする。 - 自動(Auto)モード:
device='AUTO'と指定し、フレームワーク側に判断を委ねる(後述)。
第2層:推論ランタイム(翻訳と最適化)
ここが「司令塔」の実体です。 アプリから「このAIモデルを実行して」と渡されると、ランタイムは以下の処理を行います。
グラフの解析: AIモデル(ニューラルネットワークの計算グラフ)を読み込みます。
パーティショニング(切り分け):
- 「この畳み込み層はNPUが得意だ」→ NPU用バイナリに変換(JITコンパイル等)。
- 「この特殊な活性化関数はNPUが非対応だ」→ そこだけCPUにフォールバックさせる。
命令発行: OSのドライバを通じてNPUにジョブを投げます。
第3層:OSとドライバ(ハードウェア抽象化)
WindowsであればWDDM(Windows Display Driver Model)の拡張であるMCDM(Microsoft Compute Driver Model)などが仲介します。 これにより、アプリ側は「IntelのNPUか、AMDのNPUか」を意識せず、共通のAPI(DirectMLなど)を叩けば、OSとドライバが適切なハードウェア命令に変換してくれます。
3. 「自動振り分け」の現状
先ほど「基本は明示的」と言いましたが、最近は「ソフトウェアレベルでの自動化」が進んでいます。
Heterogeneous Computing: Intelの「OpenVINO」などのランタイムにおいて、「AUTO」設定にしておくと、ランタイムが起動時にシステムをスキャンします。
- 「初期応答速度(レイテンシ)が必要なら、起動の速いCPUでとりあえず最初の推論を行う」
- 「その裏でNPUモデルのコンパイル(ロード)を済ませ、準備ができ次第NPUに切り替えて、高スループット・低電力で回す」 といった高度な制御をランタイム(ライブラリ)が自動で行ってくれるようになっています。
まとめ:イメージ図
プログラマ(アセンブラ視点)としては、以下のように捉えると正確です。
- 通常のコード: CPUがそのままx86命令として実行。
- AI処理部分: プログラムコードの中に「NPUドライバへのシステムコール(API呼び出し)」が含まれている。
- 実行時: そのAPIが呼ばれると、CPUは計算グラフ(データの塊)をドライバ経由でNPUのメモリにDMA転送し、「キック」する。
つまり、CPUは「NPUという外部装置に仕事を投げるコマンド」を実行しているだけであり、処理の中身を自動判定しているわけではありません。
次のアクション
NPUを制御する具体的な「API」や「ライブラリ」の世界(DirectML, OpenVINO, ONNX Runtimeなど)について、もう少し具体的に知りたいですか? それとも、ハードウェア寄りの話に戻って、メモリ共有の仕組みなどを深掘りしますか?
まず、NPUを制御する具体的な「API」や「ライブラリ」の世界の解説をお願いします。
NPUを制御するソフトウェアスタック(階層構造)について解説します。
アセンブラやCPUの知識をお持ちですので、「アプリケーションからハードウェア(NPU)までの距離」を意識していただくと非常に分かりやすいです。 グラフィックスにおいて「ゲームソフト → DirectX/Vulkan → GPUドライバ → GPU」という階層があるのと全く同じ構造が、AIの世界にも構築されています。
1. アプリケーション・フレームワーク層(Python/C++)
開発者が直接触れる「ソースコード」の世界です。
- PyTorch / TensorFlow: AIモデルを作成・学習させるためのフレームワークです。 これらは通常、Pythonで記述されますが、そのままでは実行速度が遅いため、最終的な実行(推論)の段階では、次の中間表現に変換されることが一般的です。
2. 中間表現・ランタイム層(ここが制御の要)
ここが、前回ご質問いただいた「NPUに処理を任せる制御」を行う実質的な司令塔です。
A. ONNX (Open Neural Network Exchange)
- 役割: AIモデルの「共通フォーマット」です。 アセンブラで言えば、ソースコードをコンパイルした後の「オブジェクトファイル(.obj)」や「実行ファイル(.exe)」に相当します。「入力Aと重みBで行列演算をし、結果をCに渡す」といった計算グラフが定義されています。
B. ONNX Runtime / OpenVINO / TensorRT
役割: ONNXなどのモデルファイルを読み込み、実際にハードウェアで動かすための「推論エンジン(ランタイム)」です。
NPUの指定: ここでプログラマは「Execution Provider(実行プロバイダ)」を指定します。
- コード例(イメージ):
session = InferenceSession("model.onnx", providers=['openvino_npu', 'cpu']) - この一行によって、ランタイムは「NPUドライバ経由で処理を行う」パスを選択します。
- コード例(イメージ):
3. API・抽象化層(OSとの窓口)
WindowsなどのOS上で、異なるメーカーのNPUを統一的に扱うための層です。
DirectML (Direct Machine Learning)
- 解説: Microsoftが提供するAPIで、「AI版のDirectX」です。
- 機能: アプリ側がDirectMLの命令(例:
DML_OPERATOR_CONVOLUTION)を叩けば、裏にあるのがIntelのNPUだろうが、NVIDIAのGPUだろうが、QualcommのNPUだろうが、DirectMLが良しなに吸収してハードウェアに命令を投げます。 - メリット: プログラマはハードウェアごとのアセンブラを意識する必要がありません。
4. ドライバ・コンパイラ層(ハードウェアの翻訳者)
ここから先はハードウェアベンダー(Intel, AMD, Qualcomm)の領域です。
グラフコンパイラ: ここが非常に重要です。CPUのコンパイラは「C言語→機械語」への1行ずつの翻訳に近いですが、NPUのコンパイラは「計算グラフ全体の最適化」を行います。
- Operator Fusion(融合): 「畳み込み」の直後に「ReLU(活性化関数)」がある場合、これらを2回の命令に分けず、1回のハードウェア処理でまとめて実行するように命令を合成します(メモリアクセスを減らすため)。
- Tiling(タイリング): NPU内部のキャッシュサイズに合わせて、巨大な画像を小さなブロックに分割するスケジュールを組みます。
5. ハードウェア層(NPU)
最終的に、コンパイルされたバイナリ(コマンドリスト)がNPUに渡されます。
まとめ:プログラマ視点での実行フロー
具体的な処理の流れを、アセンブラ知識のある方向けに翻訳すると以下のようになります。
- ソースコード: Python等で
Run()を呼ぶ。 - ランタイム: モデル(計算グラフ)を解析し、「このグラフはNPUで動かす」と判断。
- API (DirectML等): OSに対して「この計算グラフを実行するコマンドリストを作れ」と指示。
- ドライバ/JIT: 抽象的なグラフを受け取り、その場のNPUの仕様(SRAMサイズや演算器の数)に合わせて、専用のVLIW命令列やDMA転送ディスクリプタを生成(コンパイル)し、メモリに配置。
- Kick: CPUがNPUのドアベルレジスタを叩く。
- NPU: メモリ上の命令列を読み込み、実行開始。
代表的なライブラリ/SDK一覧
開発者が「どれを選ぶか」によって、制御の深さが変わります。
| 名称 | 提供元 | 特徴 | アセンブラ・HW知識の必要度 |
|---|---|---|---|
| DirectML | Microsoft | Windows標準。DirectX感覚で使える。互換性重視。 | 低~中 |
| OpenVINO | Intel | Intel製CPU/GPU/NPUに特化。NPU性能を極限まで引き出せる。 | 中 |
| QNN (Qualcomm Neural Network SDK) | Qualcomm | Snapdragon専用。スマホやPC(Surface)向け。HWに密接。 | 高 |
| ONNX Runtime | Microsoft / Community | 上記すべてを包み込むラッパー。今の業界標準。 | 低(通常はこれを使う) |
基本的には、多くのアプリ開発者はONNX Runtimeを使用し、その裏側でOpenVINOやDirectMLが黒子として動き、最終的にNPUを叩く、という構成が主流です。
では、ソフトウェアがDirectMLなどのAI-APIを呼び出さなければ、NPUは機能しないということですよね。
Windows 11 や、最新の Mac OS となどは、AI-APIを内部で呼び出しているということですよね。
Linux系OSの場合は、対応しているのでしょうか。
多くのアプリケーションは、AI-APIを活用しているのでしょうか。
ご認識の通りです。非常に鋭いポイントです。
NPUは、CPUのように「OSが起動しているだけで常に何らかの割り込み処理をしている」汎用デバイスとは異なり、明確なAPIコール(命令)がない限り、完全にアイドル状態(Power Gated / 電源遮断に近い状態)になります。
ご質問の3点(OSの内部利用、Linuxの対応、アプリの普及状況)について、技術的な現状を解説します。
1. Windows 11 や macOS の内部利用について
おっしゃる通り、最新のOSはそれ自体が巨大な「AIアプリ」となりつつあり、OSのバックグラウンドプロセスが頻繁にAI-APIを叩いています。
macOS (Apple Silicon)
Appleはハード・ソフトを垂直統合しているため、NPU(Apple Neural Engine)の活用が最も進んでいます。OS標準のCore MLというフレームワークを通じて、以下の機能がNPUを常時使用しています。
- Spotlight検索: 画像内の文字認識(OCR)や物体の認識。
- FaceTime: 背景ぼかし、ポートレートライティング。
- 写真アプリ: 人物の分類、思い出の自動生成。
- Siri: 音声認識の一部をオンデバイスで処理。
Windows 11 (特に Copilot+ PC)
MicrosoftはNPU搭載機を「Copilot+ PC」と定義し、OSレベルでの活用を急ピッチで進めています。これらはWindows Studio Effectsなどの内部モジュールがNPUドライバを叩いています。
- Windows Studio Effects: Webカメラの「自動フレーミング」「視線補正(カメラを見ていないのに目線を合わせる)」「背景ぼかし」。これをCPU/GPUでやるとバッテリーが激減しますが、NPUなら数ワットで済みます。
- Recall (リコール): 画面のスクショを定期的に撮り、NPUで解析・検索可能にする機能(セキュリティ懸念で話題になりましたが、技術的にはNPUフル活用です)。
- ライブキャプション: 動画の音声をリアルタイムで字幕化する処理。
2. Linux系OSの対応状況
LinuxでもNPUは「使えます」が、WindowsやMacのように「OSが勝手に魔法のように使ってくれる」段階にはまだ至っていません。「開発者がドライバを入れて叩けば動く」というフェーズです。
カーネルとドライバの状況
CPUアーキテクチャごとに状況が異なります。
- Intel (Core Ultra / Meteor Lake以降):
状況は良好です。IntelはOpenVINOツールキットを強力に推進しており、Linux向けのNPUドライバも提供しています。カーネル(Linux Kernel 6.10以降など)にIntel NPUのドライバ(
intel_vpu)がマージされ始めており、標準サポートに向かっています。 - AMD (Ryzen AI): オープンソースのドライバスタック(XDNAドライバ)の開発が進んでいますが、Intelに比べるとまだ環境構築の手間がかかる場合があります。
- Qualcomm (Snapdragon X Elite等): ARM版Linuxにおいて、Linaroなどが中心となってカーネルへのアップストリーム(取り込み)作業を行っていますが、まだ発展途上です。
Linuxにおける課題
Windowsの「DirectML」やMacの「Core ML」のような、「全ベンダー共通の標準AI API」がLinuxにはまだ確立されていません。 そのため、アプリ開発者は「IntelならOpenVINO、AMDなら別のライブラリ…」といった使い分け(あるいはVulkanのコンピュートシェーダー経由での利用)を迫られることが多く、OSとしての統合感は薄いです。
3. 一般アプリケーションのAI-API活用状況
ここが現状の最大のボトルネックです。「多くのアプリが活用しているか?」という問いへの答えは、「Adobeなどのトップクリエイティブソフトは使っているが、一般的な事務ソフトやフリーソフトはまだこれから」です。
活用しているアプリ(先進層)
重い処理を持つアプリは、NPUへのオフロードに積極的です。
- Adobe Creative Cloud (Photoshop, Premiere, Lightroom): 「ニューラルフィルター」や「被写体選択」、「自動リフレーム」などでNPU/GPUを活用しています。
- Zoom / Microsoft Teams: ノイズキャンセリングや背景処理にNPUを利用し、CPU負荷を下げてPCが重くなるのを防いでいます。
- Audacity (Intel版プラグイン): オープンソースの音声編集ソフトですが、IntelがNPUを使って「楽曲からボーカルだけ抽出」などの機能を追加するプラグインを出しています。
- DaVinci Resolve: 動画編集ソフト。「Magic Mask」などのAI機能で活用。
活用していないアプリ(多数派)
- Webブラウザ: ChromeやEdgeはNPU対応を進めていますが、Webサイト側のJavaScript(WebNNなど)からNPUを直接叩く規格はまだ標準化・普及の途中です。
- 一般的な業務アプリ: ExcelやテキストエディタなどがNPUを使う場面は現状ほとんどありません(Copilot機能がクラウドベースであるため)。
4. なぜ「すべてのアプリ」がNPUを使わないのか?(技術的背景)
アセンブラの知識がある視点で見ると、理由は明確です。
- データ転送コスト: 「1+1」のような簡単な計算なら、CPUでやった方が速いです。NPUを使うには、メモリからDMA転送して、キックして、割り込みを待って…というオーバーヘッドがあります。「巨大な行列演算」が発生しない限り、NPUを使うメリットがないのです。
- プログラミング難易度:
if (a > b)と書けば動くCPUと違い、AIモデルを用意し、ONNXランタイムを組み込み、推論を実行するコードを書くのは、開発者にとってまだハードルが高いです。 - 互換性: 「NPUがない古いPC」も市場には大量にあります。開発者は結局CPU/GPUでも動くコードを書く必要があるため、「NPU専用」の最適化は後回しにされがちです。
まとめ
- NPUはAPIが叩かれない限り、ただの石(シリコン)です。
- Windows/Mac: OS自体がヘビーユーザーであり、カメラや検索機能で常にNPUを叩いています。
- Linux: ドライバレベルでは動きつつありますが、OS機能としての統合はこれからです。
- アプリ: 動画・画像編集系は対応済みですが、それ以外はまだ「過渡期」です。
次のアクション
少し技術的な方向に話を戻して、「じゃあ、Chromeブラウザの中からJavaScriptでNPUを叩く仕組み(WebNN)」はどうなっているのか、あるいは「NPUが実際に動いている時のタスクマネージャーの挙動(どうやって負荷を計測しているのか)」などにご興味はありますか?
「Chromeブラウザの中からJavaScriptでNPUを叩く仕組み(WebNN)」はどうなっているのか」 これは聞いておきたいです。
また、Safari や Edge も参考までに補足的解説をお願いします。
Chromeブラウザ(およびEdgeなどのChromium系)からJavaScriptを使ってNPUを叩くための標準規格案、それが**「WebNN (Web Neural Network API)」**です。
アセンブラや低レイヤーの知識をお持ちですので、「Webブラウザという巨大なサンドボックスの中から、どうやって特権的なハードウェア(NPU)にアクセスするのか」という、**「パススルー(Pass-through)」**の仕組みとして理解すると非常にスッキリします。
WebGLやWebGPUが、JavaScriptからGPUのシェーダーを叩く仕組みであるのと同様に、WebNNはNPUの計算グラフ構築命令を叩く仕組みです。
1. WebNNのアーキテクチャ(Chromeの裏側)
JavaScriptが直接NPUのレジスタを触るわけではありません。ブラウザが「翻訳者」となり、OSのネイティブAPI(前回解説した第3層)にブリッジします。
以下のような階層構造で命令が流れます。
① JavaScript層(命令の発行)
開発者はJSで「計算グラフ(Graph)」を定義します。
// 擬似コード的なイメージ
const builder = new MLGraphBuilder(context);
const input = builder.input('input', {type: 'float32', dimensions: [1, 224, 224, 3]});
const filter = builder.constant(weights); // 重みデータ
const conv = builder.conv2d(input, filter); // 畳み込み命令
const graph = await builder.build({conv}); // グラフのコンパイル
ここで行われているのは、「NPUへの命令リスト(コマンドバッファ)」の雛形作成です。
② ブラウザエンジン層(Blink / Chromium)
Chrome内部の実装です。JSから受け取ったグラフ構造を検証し、OSごとのバックエンドに振り分けます。ここがこの仕組みの肝です。
- Windowsの場合: Chromeは受け取ったグラフをDirectMLの命令に変換します。
- Androidの場合: NNAPI (Android Neural Networks API) に変換します。
- Linux/ChromeOSの場合: OpenVINO や XNNPACK に変換します。
③ OS・ドライバ層(ハードウェア実行)
Windowsの場合、DirectMLがさらにIntel/AMD/Qualcommのドライバを呼び出し、最終的にNPUが実行します。
2. アセンブラ視点で見る「WebNN」の技術的要点
アセンブラやハードウェアの基礎がある場合、以下の2点が気にかかるはずです。これらがWebNNの設計思想の核心です。
A. メモリコピー問題 (Zero-Copy)
JSの変数は「V8エンジンのヒープ領域(ガベージコレクション管理下)」にありますが、NPUは「専用のSRAMやDMAアクセス可能な物理メモリ」を要求します。 毎回データをコピーしていると、バス帯域が死にます。
- 解決策: WebNNやWebGPUでは、
ArrayBufferや SharedMemory といった仕組みを使い、JS側とハードウェア側でメモリ領域を共有(または効率的なマッピング)しようと試みます。入力画像をテクスチャとしてVRAMに置いたまま、CPUを経由せずにNPUで処理させるような最適化も研究されています。
B. 命令の粒度 (OpCode)
WebNNは「add」「mul」といったプリミティブな命令だけでなく、「conv2d(畳み込み)」「gemm(行列積)」といった高レベルなオペレータを定義しています。 これにより、ブラウザは「conv2d」という1つのJS命令を受け取った際、ドライバに対して「NPU固有の最適化されたコマンドセット(アセンブラ)」を生成させる余地を残しています。
3. 各ブラウザの対応状況と戦略
Google Chrome
- 現状: 最も積極的です。WebNNの実装を進めており、現在は「Origin Trial」やフラグ付き設定で利用可能です。
- 戦略: TFLite (TensorFlow Lite) のWebアセンブリ版(Wasm)が現在の主流ですが、これはCPU(SIMD)実行がメインです。これをWebNN経由でNPUにオフロードさせることで、劇的な高速化と省電力を狙っています。
Microsoft Edge
- 現状: 実はWebNNの影の支配者です。
- 解説: Edgeの中身はChromium(Chromeと同じ)ですが、WebNNのバックエンドである「DirectML」を開発しているのはMicrosoft自身です。そのため、Windows上のEdge(およびChrome)でWebNNが動くのは、MicrosoftがChromiumプロジェクトにコードをコントリビュートして、自社のDirectMLに繋げているからです。「OS屋がブラウザも作っている」強みを生かしています。
Apple Safari (WebKit)
- 現状: 独自路線ですが、規格には追従しつつあります。
- 解説: AppleのWebエンジンであるWebKitでもWebNNの実装が進められています。
- バックエンド: SafariにおけるWebNNの裏側は、当然Core MLに繋がります。これにより、Webページ上のJSからApple Silicon(M1/M2/M3…)のNeural Engineを叩くことが可能になります。
- 現状の代替案: Appleは現在、Web標準としてはWebGPUを推しています。WebGPUのコンピュートシェーダーを使って行列演算を行い、強力なGPU側で処理させるアプローチが現状では安定しています(NPUへのアクセスはCore ML経由の方が効率が良い場合も多いため、WebNNの実装は慎重です)。
4. まとめ:ブラウザでAIが動く仕組み
- これまで (Wasm): C++で書かれた推論エンジンをWebAssemblyにコンパイルし、ブラウザ上でCPUを使って無理やり動かしていた(遅い・重い)。
- これから (WebNN): JavaScriptが「NPUを使って!」と指令を出し、ブラウザがOSのネイティブAPI(DirectML/Core ML)へのパススルーを行う(速い・軽い)。
PC上で、ブラウザを開いただけで「ローカルにある高性能なAI(LLMや画像生成)」がサクサク動く未来が、このWebNNによって実現しようとしています。
次のアクション
WebNNの話が出ましたが、これと対をなす技術として**「WebGPU」があります。 実は現在のWeb AI(Google Meetの背景ぼかしなど)の多くは、NPU(WebNN)がまだ標準化途中であるため、「WebGPUを使ってGPUで計算させる」**手法を取っています。
「NPU(WebNN)とGPU(WebGPU)、Webブラウザ上でAIを動かすなら結局どっちが覇権を握るのか?」 という、プロセッサの使い分けやアーキテクチャの違いについての比較に関心はありますか?
「Chromeブラウザの中からJavaScriptでNPUを叩く仕組み(WebNN)」はどうなっているのか」
これは聞いておきたいです。
また、Safari や Edge も参考までに補足的解説をお願いします。
Chromeブラウザ(およびEdgeなどのChromium系)からJavaScriptを使ってNPUを叩くための標準規格案、それが**「WebNN (Web Neural Network API)」**です。
アセンブラや低レイヤーの知識をお持ちですので、「Webブラウザという巨大なサンドボックスの中から、どうやって特権的なハードウェア(NPU)にアクセスするのか」という、**「パススルー(Pass-through)」**の仕組みとして理解すると非常にスッキリします。
WebGLやWebGPUが、JavaScriptからGPUのシェーダーを叩く仕組みであるのと同様に、WebNNはNPUの計算グラフ構築命令を叩く仕組みです。
1. WebNNのアーキテクチャ(Chromeの裏側)
JavaScriptが直接NPUのレジスタを触るわけではありません。ブラウザが「翻訳者」となり、OSのネイティブAPI(前回解説した第3層)にブリッジします。
以下のような階層構造で命令が流れます。
① JavaScript層(命令の発行)
開発者はJSで「計算グラフ(Graph)」を定義します。
// 擬似コード的なイメージ
const builder = new MLGraphBuilder(context);
const input = builder.input('input', {type: 'float32', dimensions: [1, 224, 224, 3]});
const filter = builder.constant(weights); // 重みデータ
const conv = builder.conv2d(input, filter); // 畳み込み命令
const graph = await builder.build({conv}); // グラフのコンパイル
ここで行われているのは、「NPUへの命令リスト(コマンドバッファ)」の雛形作成です。
② ブラウザエンジン層(Blink / Chromium)
Chrome内部の実装です。JSから受け取ったグラフ構造を検証し、OSごとのバックエンドに振り分けます。ここがこの仕組みの肝です。
- Windowsの場合: Chromeは受け取ったグラフをDirectMLの命令に変換します。
- Androidの場合: NNAPI (Android Neural Networks API) に変換します。
- Linux/ChromeOSの場合: OpenVINO や XNNPACK に変換します。
③ OS・ドライバ層(ハードウェア実行)
Windowsの場合、DirectMLがさらにIntel/AMD/Qualcommのドライバを呼び出し、最終的にNPUが実行します。
2. アセンブラ視点で見る「WebNN」の技術的要点
アセンブラやハードウェアの基礎がある場合、以下の2点が気にかかるはずです。これらがWebNNの設計思想の核心です。
A. メモリコピー問題 (Zero-Copy)
JSの変数は「V8エンジンのヒープ領域(ガベージコレクション管理下)」にありますが、NPUは「専用のSRAMやDMAアクセス可能な物理メモリ」を要求します。 毎回データをコピーしていると、バス帯域が死にます。
- 解決策: WebNNやWebGPUでは、
ArrayBufferや SharedMemory といった仕組みを使い、JS側とハードウェア側でメモリ領域を共有(または効率的なマッピング)しようと試みます。入力画像をテクスチャとしてVRAMに置いたまま、CPUを経由せずにNPUで処理させるような最適化も研究されています。
B. 命令の粒度 (OpCode)
WebNNは「add」「mul」といったプリミティブな命令だけでなく、「conv2d(畳み込み)」「gemm(行列積)」といった高レベルなオペレータを定義しています。 これにより、ブラウザは「conv2d」という1つのJS命令を受け取った際、ドライバに対して「NPU固有の最適化されたコマンドセット(アセンブラ)」を生成させる余地を残しています。
3. 各ブラウザの対応状況と戦略
Google Chrome
- 現状: 最も積極的です。WebNNの実装を進めており、現在は「Origin Trial」やフラグ付き設定で利用可能です。
- 戦略: TFLite (TensorFlow Lite) のWebアセンブリ版(Wasm)が現在の主流ですが、これはCPU(SIMD)実行がメインです。これをWebNN経由でNPUにオフロードさせることで、劇的な高速化と省電力を狙っています。
Microsoft Edge
- 現状: 実はWebNNの影の支配者です。
- 解説: Edgeの中身はChromium(Chromeと同じ)ですが、WebNNのバックエンドである「DirectML」を開発しているのはMicrosoft自身です。そのため、Windows上のEdge(およびChrome)でWebNNが動くのは、MicrosoftがChromiumプロジェクトにコードをコントリビュートして、自社のDirectMLに繋げているからです。「OS屋がブラウザも作っている」強みを生かしています。
Apple Safari (WebKit)
- 現状: 独自路線ですが、規格には追従しつつあります。
- 解説: AppleのWebエンジンであるWebKitでもWebNNの実装が進められています。
- バックエンド: SafariにおけるWebNNの裏側は、当然Core MLに繋がります。これにより、Webページ上のJSからApple Silicon(M1/M2/M3…)のNeural Engineを叩くことが可能になります。
- 現状の代替案: Appleは現在、Web標準としてはWebGPUを推しています。WebGPUのコンピュートシェーダーを使って行列演算を行い、強力なGPU側で処理させるアプローチが現状では安定しています(NPUへのアクセスはCore ML経由の方が効率が良い場合も多いため、WebNNの実装は慎重です)。
4. まとめ:ブラウザでAIが動く仕組み
- これまで (Wasm): C++で書かれた推論エンジンをWebAssemblyにコンパイルし、ブラウザ上でCPUを使って無理やり動かしていた(遅い・重い)。
- これから (WebNN): JavaScriptが「NPUを使って!」と指令を出し、ブラウザがOSのネイティブAPI(DirectML/Core ML)へのパススルーを行う(速い・軽い)。
PC上で、ブラウザを開いただけで「ローカルにある高性能なAI(LLMや画像生成)」がサクサク動く未来が、このWebNNによって実現しようとしています。
次のアクション
WebNNの話が出ましたが、これと対をなす技術として**「WebGPU」があります。 実は現在のWeb AI(Google Meetの背景ぼかしなど)の多くは、NPU(WebNN)がまだ標準化途中であるため、「WebGPUを使ってGPUで計算させる」**手法を取っています。
「NPU(WebNN)とGPU(WebGPU)、Webブラウザ上でAIを動かすなら結局どっちが覇権を握るのか?」 という、プロセッサの使い分けやアーキテクチャの違いについての比較に関心はありますか?
「NPU(WebNN)とGPU(WebGPU)、Webブラウザ上でAIを動かすなら結局どっちが覇権を握るのか?」 この話は、興味があります。
結論から申し上げますと、「どちらか一方が他方を駆逐する」という未来にはなりません。
アセンブラやハードウェアの視点で見ると、この2つは「汎用性と効率のトレードオフ」の関係にあり、明確な「住み分け」が進むと考えられます。
- WebGPU: 「力こそパワー」。電力を使ってでも、今のハードウェアで最大風速を出すための技術(今の覇権)。
- WebNN: 「柔よく剛を制す」。専用回路を使い、最小のエネルギーで持続的に処理するための技術(未来の標準)。
それぞれの技術的特性と、なぜ「覇権争い」ではなく「住み分け」になるのか、アセンブラ/ハードウェア視点で解説します。
1. WebGPU:今の主役(汎用的な並列演算)
WebGPUは、WebGL(OpenGL ES)の後継であり、現代のGPU(Vulkan, Metal, D3D12)の機能をブラウザから直接叩けるようにしたものです。
仕組み(Compute Shader): GPUの数千個あるコア(ALU)に対して、「このデータを並列で計算せよ」という命令(コンピュートシェーダー)を送ります。AI専用ではなく、あくまで「汎用的な数値計算」としてAIを実行します。
メリット:
- 今すぐ動く: NPUがない古いPCでも、GPUさえあれば動きます。
- FP32が得意: 精度の高い浮動小数点演算(FP32)はGPUの独壇場です。
アセンブラ視点: 巨大なSIMD命令(AVX-512を数千並列にしたようなもの)を手動で制御するイメージです。メモリ管理やスレッド同期をプログラマ(ライブラリ開発者)が管理する必要があります。
弱点:
- 電力バカ食い: チャットAIを動かすだけでファンが全開になり、ノートPCのバッテリーがみるみる減ります。
2. WebNN:未来の主役(推論特化の抽象化)
WebNNは、「AIを動かすこと」に特化したAPIです。
仕組み(Graph Execution): 「畳み込み」「活性化」といった高レベルな意味を持つ命令を投げます。バックエンドがNPU(あるいはGPU, CPU)に最適な命令に変換します。
メリット:
- 圧倒的なワットパフォーマンス: 行列演算専用のNPUを使うため、GPUの数分の一の電力で同じ処理ができます。
- ハードウェア隠蔽: Intel, AMD, Qualcomm, Apple… バラバラなNPUの仕様(アセンブラ)をWebNNが吸収してくれます。
アセンブラ視点: 「AES暗号化命令」や「動画デコード命令」のような、専用回路を叩くマクロ命令を呼ぶイメージです。中身がどう動いているかはブラックボックスですが、極めて高速かつ省電力です。
弱点:
- 量子化(Quantization)が必須: NPUは「INT8(8ビット整数)」などを好むため、モデルをFP32から変換(劣化)させる手間が必要です。
- 対応待ち: ブラウザとドライバの実装がまだ追いついていません。
3. 覇権を左右する「ユースケース」による勝者判定
では、どちらを使うべきか? それは「何をさせるか」で決まります。
ケースA:生成AI(画像生成・LLMなど)
- 勝者:WebGPU
- 理由: Stable Diffusionのような画像生成や、大規模な言語モデルは、計算量が膨大かつ、精度(FP16/FP32)が重要です。現状のNPUではメモリ帯域や精度が不足する場合があり、GPUの「暴力的な並列演算能力」が必要です。「ファンが回ってもいいから、速く絵を出してくれ」という場面です。
ケースB:常駐機能(背景ぼかし・音声ノイズ除去・顔認識)
- 勝者:WebNN (NPU)
- 理由: Web会議(Meet/Zoom)で背景をぼかす処理にGPUをフル稼働させると、会議中にバッテリーが切れてしまいます。こういう「裏でずっと回っている処理」こそ、NPU(WebNN)の出番です。「静かに、省電力に動いてほしい」場面です。
4. 開発者視点の「現実解」:実はWebNNがWebGPUを使う?
ここがややこしいですが、非常に重要なポイントです。
WebNNは「API(インターフェース)」であり、WebGPUは「バックエンド(実装)」にもなり得ます。
WebNNの設計思想は以下のようになっています:
プログラマは
webnn.conv2d()を呼ぶ。ブラウザがPCをチェックする。
- NPUがある場合: NPUドライバ(DirectML等)経由でNPUを叩く(最高効率)。
- NPUがない場合: WebGPUを使ってGPUで計算する(フォールバック)。
- GPUもない場合: CPUで頑張る(Wasm / SIMD)。
つまり、将来的には「開発者はWebNNを書いておけば、勝手に最適なハードウェア(NPU or WebGPU)が使われる」 という形が理想とされています。
この意味で、プログラミングインターフェースとしての「覇権」は WebNN が握る(握るべき)ですが、裏側で実際に汗をかくハードウェアとしての「実効支配」は、当面の間 GPU (WebGPU技術) が担うことになります。
まとめ:アセンブラ知識のある方への結論
- WebGPU: 「汎用並列演算プロセッサ」へのアクセス権。自分でガリガリチューニングしたい、パワーリミット解除で最大性能を出したいならこれ。
- WebNN: 「AI専用アクセラレータ」へのアクセス権。OSやハードウェアにお任せして、省電力・高効率に推論を回したいならこれ。
現状はWebGPUが先行していますが、ノートPCでのバッテリー持ちが重視される昨今、「WebNN経由でNPUを叩く」フローが、コンシューマー向けWebアプリの最終的なゴール(覇権)になるでしょう。

CPUや命令セット(アセンブラ)の基礎知識をお持ちとのことですので、その知識を前提に、ハードウェア構成とデータフローの観点からNPU(Neural Processing Unit)について技術的に解説します。
結論から言うと、NPUは「行列演算に特化した専用コプロセッサ」であり、現代のモバイルPCにおいてはSoC(System on Chip)の一部としてCPUのすぐ隣に物理的に配置されています。
以下に、物理的な位置づけと、メモリ・バス・CPUとの連携フローを詳しく解説します。
1. 物理的な配置:どこにあるのか?
かつての「数値演算コプロセッサ(FPU)」や、オンボードの「統合GPU」をイメージしていただくのが最も近いです。
2. メモリ・ストレージ・CPUとの連携フロー
ここが最も疑問に思われている点かと思います。NPUは独立して勝手に動くわけではなく、あくまでCPUが司令塔(ホスト)となり、NPUはDMA(Direct Memory Access)を駆使して動作します。
AIモデル(推論処理)を実行する際のデータフローを、命令セットレベルの概念を交えて追ってみましょう。
フェーズ1:準備(CPUの仕事)
フェーズ2:命令発行(CPU → NPU)
CPUはNPUに対して、「計算しろ」という命令を出しますが、これはx86/ARM命令セットに「NPU演算命令」が直接追加されているわけではありません(一部の拡張命令を除く)。
フェーズ3:NPUによる演算(NPU ↔ メモリ)
ここからCPUは解放され、別のタスク(OSの維持やUI処理)に戻ります。
フェーズ4:完了通知(NPU → CPU)
3. なぜCPUやGPUではなくNPUなのか?(アーキテクチャの違い)
アセンブラの知識がある場合、「SIMD命令(AVXやNEON)を使えばCPUでも計算できるのでは?」と思われるかもしれません。その通りですが、「効率」と「データパス」が決定的に異なります。
CPU (Scalar / Wide Vector)
GPU (SIMT / Vector)
NPU (Tensor / Systolic Array / Dataflow)
4. プログラマ(アセンブラ視点)でのイメージまとめ
命令セット: NPU自体もVLIW(Very Long Instruction Word)などの独自の命令セットを持っていますが、通常プログラマがこれを直接書くことはありません(ファームウェアやドライバが隠蔽します)。
CPUとの関係:
このように、「CPUの汎用レジスタやALUを使わず、メモリ上のデータをDMAで吸い上げて、専用回路で加工してメモリに戻す」という、オフロードエンジンの役割を果たしているのがNPUです。