$30 off During Our Annual Pro Sale. View Details »

Ryzen NPUにおけるAI Engineプログラミング

Avatar for Jun Ando Jun Ando
December 02, 2025

Ryzen NPUにおけるAI Engineプログラミング

Avatar for Jun Ando

Jun Ando

December 02, 2025
Tweet

More Decks by Jun Ando

Other Decks in Technology

Transcript

  1. ACRiルーム ©︎ 2025 Adaptive Computing Research Initiative - ACRi 2

    Alveo Professors ACRi Founders • Digilent社 Arty A7-35T カード • 1サーバにArtyを15枚接続 • ユーザ毎にVMを割り当て ルーム FPGA Server • CPU: Core i9 (8 core /16 thread) • メモリ: DDR4 128GB (32GB x 4) • ストレージ: SSD M.2 1TB x2 • 開発環境インストール済み Arty A7-35T • 3時間単位で機材を無償で貸出し • リモートからアクセスして利用するスタイル • Forumを通じて大学教員やACRi企業が技術支援を実施 • Xilinxアクセラレータカード • Alveo U50 / U200 / U250 / U280 / VCK5000 Alveo Arty ACRi 参加企業 一般企業 学生 若手技術者 Start-up企業 技術力向上 テスト利用 技術力向上 のため 技術力向上 テスト利用 Instinct • AMD Instinct GPU • MI210 64GB Ryzen AI mini-PC • Ryzen AI 370 • 50TOPS XDNA2
  2. Ryzen NPU サーバー ds001 • Ryzen AI 370搭載ミニPC (Minisforum EliteMini

    AI370) • CPU : 12コア(24スレッド) • Zen 5 : 4コア, 最大5.1GHz • Zen 5c : 8コア, 最大3.3GHz • iGPU : RDNA 3.5, 2.9GHz, 16 CU • NPU : XDNA 2, 50TOPS ⇐ AI Engine • メモリ : 32GB • OS : Ubuntu 24.04 ©︎ 2025 Adaptive Computing Research Initiative - ACRi 3
  3. XDNA 2 • Versalファミリーに搭載されるAI Engineと同等のもの • 相互接続された数十~数百の1GHz+ VLIW/SIMDプロセッサ • 機械学習に特化した第三世代AI

    Engine (AIE-ML v2) ©︎ 2025 Adaptive Computing Research Initiative - ACRi 4 Versal® ACAP AI Engine AI Engine MEMORY MEMORY AI Engine AI Engine MEMORY MEMORY AI Engine AI Engine Memory AI Engine Memory AI Engine Memory AI Engine Memory
  4. AI Engineアーキテクチャ • データフローアーキテクチャ • プロセッサが二次元アレイ状に配置 • コア間が直接データをやり取りしながら計算 • データ移動をプログラム、決定的な動作

    ©︎ 2025 Adaptive Computing Research Initiative - ACRi 5 AI Engine Memory AI Engine Memory AI Engine Memory L2 Core L1 Block 0 Block 1 L2 L3 DRAM L1 L1 L1 L1 L1 Core Core Core Core Core CPU / GPU AI Engine (XDNA) AI Engine Memory AI Engine Memory AI Engine Memory Mem Tile Mem Tile Mem Tile Shim Tile Shim Tile Shim Tile DRAM
  5. AI Engineコア • VLIW/SIMDプロセッサ • 各コアをプログラミングする • ベクトルユニットを効率的に動かす • 512

    INT8 MAC / cycle / tile (計50TOPS@XDNA2) • 256 BF16 MAC / cycle / tile ©︎ 2025 Adaptive Computing Research Initiative - ACRi 6 固定小数点演算 ベクトルユニット (AM027) Store Unit Scalar Unit Scalar Register File Scalar ALU Non-linear Functions Instruction Fetch & Decode Unit AGU Vector Unit Vector Register File Fixed-Point Vector Unit Floating-Point Vector Unit Load Unit B AGU Load Unit A AGU Memory Interface Stream Interface AI Engine Core 加算ツリー 累積 乗算 並び替え ベクトルレジスタ アキュムレータレジスタ AI Engine MEMORY MEMORY AI Engine AI Engine MEMORY MEMORY AI Engine AI Engine Memory AI Engine Memory AI Engine Memory AI Engine Memory
  6. AI Engineプログラミングモデル • 計算をカーネルに分割しデータフローとして定義 • データ駆動:各カーネルはデータを受け取って処理して次に渡す、を繰り返す • カーネル間の接続はウィンドウ(PIPO=ピンポンバッファ)またはストリーム(FIFO) • タスク並列:各カーネルが同時に処理を実行

    • FPGA設計と同じ考え方 • 開発の流れ:アーキテクチャ設計 → カーネル実装 → グラフ実装 ©︎ 2025 Adaptive Computing Research Initiative - ACRi 7 Kernel B Kernel C Kernel D PIPO PIPO Kernel A PIPO PIPO 洗う担当 切る担当 炒める担当 味付け担当 盛り付け担当 流れ作業で食品を調理をするイメージ (食材駆動、作業並列) データフローには分岐や合流があってもよい
  7. AI Engineプログラミングモデル • AI Engineアレイ • AIEタイル間はインターコネクトで接続 • AIEコアは隣接する上下左右のメモリにアクセスできる ©︎

    2025 Adaptive Computing Research Initiative - ACRi 8 AIE core Data Memory AIE core Data Memory AIE core Data Memory AIE core Data Memory IC IC IC IC AIE Tile AIE Tile AIE Tile AIE Tile
  8. AI Engineプログラミングモデル • データフローを配置配線 • ローカルメモリを介したPIPO接続でデータを受け渡し • ひとつのコアに複数のカーネルを配置可 ©︎ 2025

    Adaptive Computing Research Initiative - ACRi 9 配置配線 Kernel B Kernel C Kernel D PIPO PIPO Kernel A PIPO PIPO AIE core Data Memory AIE core Data Memory Kernel A AIE core Data Memory AIE core Data Memory IC IC IC IC PIPO AIE Tile AIE Tile AIE Tile AIE Tile Kernel B Kernel C Kernel D PIPO PIPO PIPO PIPO
  9. AI Engineプログラミング • IRON • https://github.com/Xilinx/mlir-aie • PythonによるAIEプログラミングツールチェイン • カーネル記述

    • コア上でのカーネル実行 • カーネルや外部メモリのデータ移動 • ハードウェアを抽象化 • メタプログラミング(プログラムでプログラムを定義) • Peano • AIE向けオープンソースC++コンパイラ • XRT • ホストプログラムのためのランタイムAPI • xdna-driver • NPUドライバ ©︎ 2025 Adaptive Computing Research Initiative - ACRi 10
  10. IRONによるAIEプログラミングの流れ • アーキテクチャ設計 • カーネル分割 • メモリ割り当て • ローカルメモリ 64KB

    • メモリタイル 512KB • カーネル記述 • C++で記述する(Python記述は未成熟な印象) • AIEプログラム記述 • ワーカー • データ移動 • ホストプログラム • XRT Native API ©︎ 2025 Adaptive Computing Research Initiative - ACRi 11 AIE core Data Memory AIE core Data Memory Kernel A AIE core Data Memory AIE core Data Memory IC IC IC IC PIPO AIE Tile AIE Tile AIE Tile AIE Tile Kernel B Kernel C Kernel D PIPO PIPO PIPO PIPO
  11. カーネル記述 • AIEコアで動作する高効率なプログラムをC++で記述する (以下はベクトル演算器が動かない悪い例) • AIE APIでベクトルプログラミングする ©︎ 2025 Adaptive

    Computing Research Initiative - ACRi 12 extern "C" void vadd_kernel(float* in0, float* in1, float* out) { for (int i = 0; i < 1024; i++) { out[i] = in0[i] + in1[i]; } }
  12. AIEプログラム記述 • 明示的なデータ移動を定義 • DRAMにあるデータをAIEタイルへ移動して処理し DRAMへ戻す • ハードウェアを抽象化する概念 • ワーカー

    • AIEコア上で実行するプログラムとその入出力 • ワーカーがカーネルを実行する • Object FIFO • 外部メモリとワーカーの間のデータ移動を表現 • ランタイム • ワーカーの起動 • 外部メモリからObject FIFOへデータを充填(fill) • Object FIFOから外部メモリへデータを排出(drain) ©︎ 2025 Adaptive Computing Research Initiative - ACRi 13 DRAM Shim Tiles Compute Tiles Worker Object FIFO Data Data Runtime Kernel
  13. Object FIFO • データ移動の抽象化 • データ型、バッファ深さ • ブロードキャスト、分岐、合流 • データレイアウト変換(タイル化)

    • ハードウェアリソース:メモリ、DMA、ロック • prod/consをDRAMデータやワーカー引数、 他のObject FIFOと紐づける • 自動/手動によるメモリ配置 ©︎ 2025 Adaptive Computing Research Initiative - ACRi 14 DRAM Shim Tiles Memory Tiles Compute Tiles prod() cons() ObjectFifo(np.ndarray[(1024,), np.dtype[np.float32]], 2) Worker Object FIFO Data Data DMA DMA DMA depth = 2
  14. AIEプログラム記述 • カーネル関数定義 • C++で記述したカーネルをPythonで 扱えるように名前や型を教える • ワーカー関数定義 • ひとつのAIEコアで実行するプログラム

    を定義 • メモリリソースの取得・開放 (メモリモジュールのロック制御) • C++カーネル呼び出し ©︎ 2025 Adaptive Computing Research Initiative - ACRi 15 import numpy as np import aie.iron as iron # (1) 入出力データの型を定義 vec_type = np.ndarray[(1024,), np.dtype[np.float32]] # (2) カーネル関数定義 kernel = iron.Kernel( "vadd_kernel", # カーネル関数名 "vadd_kernel.o", # コンパイル済みオブジェクト [vec_type, vec_type, vec_type], # 引数型 ) # (3) AIEコアで実行するワーカー関数の定義 def core_fn(of_in0, of_in1, of_out, kernel): # メモリリソースを取得 elemOut = of_out.acquire(1) elemIn0 = of_in0.acquire(1) elemIn1 = of_in1.acquire(1) # カーネルを実行 kernel(elemIn0, elemIn1, elemOut) # メモリリソースを開放 of_in0.release(1) of_in1.release(1) of_out.release(1)
  15. AIEプログラム記述 • Object FIFO定義 • 型と名前を指定 • 深さはデフォルト2 • ワーカー定義

    • ワーカー関数と入出力を指定 • ランタイム定義 • カーネル起動 • 外部メモリとObject FIFOの間のデータ移動 • MLIR (LLVM中間表現)生成 • 最終的にMLIRからAIEバイナリ(xclbin)と 命令シーケンスを生成する • ホストプログラムから実行する ©︎ 2025 Adaptive Computing Research Initiative - ACRi 16 # (4) データ移動のためのObject FIFOを作成 of_in0 = iron.ObjectFifo(vec_type, name="in0") of_in1 = iron.ObjectFifo(vec_type, name="in1") of_out = iron.ObjectFifo(vec_type, name="out") # (5) ワーカー関数と入出力を指定してWorkerを作成 worker = iron.Worker( core_fn, [of_in0.cons(), of_in1.cons(), of_out.prod(), kernel], ) # (6) 実行時のAIEアレイとDRAMの間のデータ移動を定義 rt = iron.Runtime() with rt.sequence(vec_type, vec_type, vec_type) as (in0, in1, out): rt.start(worker) rt.fill(of_in0.prod(), in0) rt.fill(of_in1.prod(), in1) rt.drain(of_out.cons(), out, wait=True) # (7) リソースの配置を行いMLIRを生成 program = iron.Program(iron.device.NPU2(), rt) module = program.resolve_program(iron.placers.SequentialPlacer()) # (8) MLIRを出力 print(module)
  16. まとめ • ACRiルームにRyzen AIミニPCを導入しました • 50TOPS NPU搭載 • IRONツールチェインでAIEプログラミングできます •

    抽象化された概念がやや難解 • プログラミングガイドあり • IRONチュートリアル作りました • ACRiルームで試してみてください ©︎ 2025 Adaptive Computing Research Initiative - ACRi 19
  17. 20