HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: Npunlock – Intel NPUでカスタムCカーネルを実行する

Show HN: Npunlock – Run custom C kernels for Intel NPUs (github.com)

6 pointsby hsfzxjy2 コメント

要約

Npunlockは、Intel NPUのプログラマブルなSHAVEコア上でカスタムCコードをカーネルとして実行できるようにするツールです。Intelの公式スタックではグラフレベルのプログラミングしか公開されていませんが、Npunlockはこのギャップを埋め、カスタムCコードから実行可能なNPUカーネルへのパスを再構築します。現在はWindows x64のMeteor Lake / NPU3720で検証されており、FP32およびFP16のカスタムカーネル実行をサポートしています。

全文翻訳

npunlock Intelは、そのNPU内にプログラマブルなSHAVEコアを搭載していますが、公開されているスタックはグラフレベルのプログラミングのみを公開しています。npunlockは、カスタムCコードから実行可能なNPUカーネルへの欠落したパスを再構築します。現在の実装は、Windows x64のMeteor Lake / NPU3720で検証済みです。最新のブレークスルー — 2026-09-23: 1つのネイティブグラフで独立したFP32-unaryおよびFP16-binaryカスタムブランチを実行できます。明示的なACT-groupプリフライトがコンパイラのブランチ再編成を処理します。証拠と限界。簡単な例この完全なFP32 GELUの例は、CカーネルをPythonに埋め込み、NPUグラフに配置し、NumPyと比較して結果を確認します。バンドルされているnpunlock/npu3720_kernel.hターゲットヘッダーは、NPU3720の呼び出しとテンソルアドレスヘルパーを提供します。テストされたMoviToolsツールチェーンは、<math.h>を含めずにほとんどの従来のlibm関数をカーネルで利用可能にします。この例ではtanhfを直接呼び出します。観測された候補のシンボルインベントリについては、mlibm.aを参照してください。import numpy as np import npunlock as npu npu.configure(movi_dll_dir=r"C:\path\to\MVC_DEPEND") gelu_c: bytes = b""" #define MLIBM_DEFINE_LINK_COMPAT 1 #include <npunlock/npu3720_kernel.h> void controlled_act(unsigned layerParams) { act_abi_invocation invocation; ACT_ABI_LOAD_INVOCATION32_OR_RETURN(layerParams, invocation); const float *in = ACT_ABI_INPUT_PTR32(const float, invocation, 0u); float *out = ACT_ABI_OUTPUT_PTR32(float, invocation, 1u); const float SQRT_2_DIV_PI = 0.7978845608028654f; for (unsigned i = 0; i < invocation.element_count; ++i) { float x = in[i]; float w = x + 0.044715f * x * x * x; w = tanhf(w * SQRT_2_DIV_PI); out[i] = 0.5f * x * (1.0f + w); } } """ N = 2048 x = npu.input("x", shape=(1, N), dtype="f32") y = npu.custom( x, source=gelu_c, carrier="Abs", _name="y", ) program = npu.compile(npu.Graph(inputs=[x], outputs=[y], name="gelu_f32_example")) input_value = np.linspace(-4, 4, N, dtype=np.float32).reshape(1, -1) output = program.run({"x": input_value})["y"] reference = 0.5 * input_value * ( 1.0 + np.tanh( np.sqrt(2.0 / np.pi) * (input_value + 0.044715 * input_value**3) ) ) print(f"maximum absolute error: {np.max(np.abs(output - reference)):g}") 同じコードが実行可能なFP32 GELUの例として利用可能です。FP16 GELUおよびマルチレイヤー2入力の例、さらにunaryとbinaryのカスタムブランチを含む混合精度グラフも参照してください。なぜnpunlockか?Intelの通常のNPUソフトウェアは、コンパイラがサポートする操作から作成されたグラフを受け入れますが、操作のC実装を提供する公開ワークフローを公開していません。NPUのACT-SHAVEプロセッサはプログラマブルであり、ソフトウェアカーネルを実行します。npunlockは、Intelのコンパイラとドライバーを周囲のグラフとハードウェア実行のために維持しながら、互換性のあるカスタムグラフ操作のためにそれらのプロセッサを使用可能にします。要件Windows x64 Meteor Lake / Intel NPU3720インストール済みのIntel NPUドライバー(デバイス用)Python 3.10以降CMake 3.24以降およびMSVCツールチェーン(ソースインストール用)抽出されたMoviTools MVC_DEPENDツールチェーン(カスタムCコンパイル用)OpenVINOは、ランタイム、Pythonパッケージ、またはコンパイラフロントエンドとして必要ありません。npunlockは、インストール済みのIntelドライバーのためにOpenVINO形式のIRを出力します。npunlockのインストール現在はソースチェックアウトからインストールされます: python -m pip install .ビルドはPythonパッケージ内にnpunlock.dllとnpunlock_worker.exeをバンドルするため、通常のPython使用では個別のネイティブパスは必要ありません。MoviToolsの取得カスタムCコンパイルはIntel/Movidius MoviToolsを使用しますが、npunlockは再配布またはダウンロードしません。検証済みのMoviToolsパッケージは、レガシーLenovoドライバーパックで見つかりました。公式ダウンロード、ハッシュ、抽出コマンド、および期待されるレイアウトについては、MoviToolsの取得を参照してください。Lenovoの古いIntel NPUドライバーパッケージ31.0.100.1688からMVC_DEPENDペイロードを抽出しますが、そのドライバーをインストールまたはダウングレードしないでください。必要なのはバンドルされたMoviToolsのみです。例の実行npunlockを抽出されたMVC_DEPENDルートに向け、GELUを実行します: $env:NPUNLOCK_MOVITOOLS_DIR = 'C:\path\to\MVC_DEPEND' python examples\example_gelu.py例はNPU上で実行され、NumPyリファレンスに対する最大誤差を報告します。現在動作するものユーザー作成のCコードをACT-SHAVEマシンコードにコンパイルするIntel NPUグラフ内でカスタムカーネルを実行する静的なFP16 unaryおよび2入力カスタムカーネル検証済みのunary FP32パス独立したFP32-unaryおよびFP16-binaryカスタムブランチを含む1つのグラフGELUやtanhfなどの非線形数学Python、CLI、およびネイティブC API現在の制限事項サポートは実験的であり、現在はWindows x64、Meteor Lake / NPU3720、静的形状、互換性のあるACTキャリア、および既知のテンソルレイアウトに限定されています。接続された混合精度変換グループはまだパッチ検出可能ではありません。検証済みの混合精度例では独立したブランチを使用しています。他のNPU世代は検証されていません。完全な互換性境界については、現在の制限事項を参照してください。Linuxおよび新しいNPUのテスト支援Linuxおよび新しいNPUをお持ちですか?貢献を歓迎します。2つのルートが特に有望に見えますが、まだテストされていません。Windowsで生成されたパッチ適用済みのNPU3720グラフは、NPUファームウェアがカスタムマシンコードを実行するため、Linuxで実行できる可能性があります。LinuxでSHAVEコードをビルドするには、Windows MoviTools DLLをロードする方法も必要になります。新しいNPUは既存の3720xx SHAVEイメージを実行する可能性があります。または、その世代の古いOEMドライバーパッケージが一致するMoviToolsコンポーネントを提供する可能性があります。どちらもハードウェア検証、ドライバー/ファームウェアバージョン記録、およびホストオラクルに対する出力比較が必要です。どちらかのパスをテストできる場合は、フィードバック、失敗レポート、およびコード貢献を歓迎します。Linuxおよび新しいNPUへの移植を参照してください。仮説、注意点、および推奨されるテストプラン。ドキュメントMoviToolsの取得 — レガシードライバーをインストールせずにコンパイラツールチェーンを取得するPython API — Pythonからグラフを構築、コンパイル、実行するカスタムカーネルの作成 — Cエントリポイント、テンソル契約、および例npunlockの仕組み — グラフコンパイルとカスタムカーネル統合リバースエンジニアリングのブレークスルー — カスタムカーネルを可能にした実験と発見モデルからマシンコードへ — ステップバイステップのローリングとコンポーネントの概要Intel NPUアーキテクチャ — DPUとACT-SHAVEの概要現在の制限事項 — 検証済みのハードウェアとABIスコープLinuxおよび新しいNPUへの移植 — 実験的なルートと貢献ガイド開発とネイティブAPI — CMake、テスト、パッケージング、CLI、およびCインターフェース完全なドキュメントインデックス警告AI使用に関する注意: このプロジェクトの構築中にAIを使用しました — スキャフォールディング、反復的な実装作業、リバースエンジニアリングの結果を整理されたドキュメントに変換する、および私の英語を修正するためです。リバースエンジニアリング、実験、デバッグ、および技術的な結論は、ハンズオン作業から得られました。それが気にならないなら、かなり深く、驚くほど満足のいくウサギの穴が待っています。ライセンスnpunlockはApache License 2.0の下でライセンスされています。MoviToolsおよびIntel/Movidiusライブラリは外部のプロプライエタリ依存関係であり、このリポジトリによってカバーまたは再配布されません。