14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI X12 Standard Acceleron Computeで Intel AMXの効果を oneDNNと OpenVINO GenAIで確認してみてみた

14
Last updated at Posted at 2026-05-13

Oracle Cloud Infrastructure(OCI)は、Intel Xeon 6プロセッサーを搭載した X12 Standard Acceleron Compute インスタンスを提供しています。
image.png
AI、データ集約型アプリケーション、最新のマイクロサービスによってクラウドワークロードが進化し続けるにつれ、より高いパフォーマンス、改善された効率性、そして優れた価格性能比を提供するコンピューティングプラットフォームを必要としています。
Intel® Advanced Matrix Extensions(AMX)により、AIアクセラレーション機能を内蔵し、BF16 や INT8 の行列演算を高速化でき、自然言語処理、チャットボット、レコメンデーションエンジン、画像認識などのAIワークロードのパフォーマンスが大幅に向上します。
image.png
AMXは、32ビット浮動小数点演算の範囲を半分の容量で維持するBF16、精度を多少犠牲にしてもスループットを最大化するINT8、そして両者のバランスが取れたFP16など、複数のデータ形式をサポートしています。
AMX は、8 つの 1KB タイルレジスタ (行列データ専用のオンチップメモリ​​) とタイル行列乗算ユニット (TMUL - 行列計算専用ハードウェア) で構成されており、プロセッサーはサイクルあたり 2048 回の INT8 演算または 1024 回の BF16 演算を実行できます。これらのタイルレジスタは効率的な行列ストレージを提供し、メモリアクセスオーバーヘッドを削減し、ニューラルネットワークの中核となる行列演算の計算効率を向上させます。実際の顧客ワークロードにおいては、これにより、トランスフォーマーモデル、レコメンデーションシステム、自然言語処理タスクの推論時間が大幅に短縮されるとともに、リソース利用率の向上とインフラストラクチャ要件の低減により、総所有コストが削減されます。
image.png

また、Intel® oneDNN(oneAPI Deep Neural Network Library)は、AIやディープラーニング(深層学習)の処理をインテル製CPUやGPU上で劇的に高速化するためのオープンソースのクロスプラットフォーム・ライブラリです。
oneDNNやAMXは、PyTorch、TensorFlow、ONNX Runtime、OpenVINO などの CPU最適化にも関係するディープラーニング向けライブラリです。

image.png

AI ワークロードというと GPU が注目されがちですが、実際のエンタープライズ環境では、すべての処理を GPU に載せるわけではありません。
RAG の reranker、埋め込み前後の前処理、小〜中規模モデルの推論、バッチ処理、アプリケーションに近い AI 処理など、CPU 上で効率よく動かしたい処理も多くあります。
そこで重要になるのが、Intel Advanced Matrix Extensions(AMX)です。
AMX は、BF16 や INT8 といった AI 向けの行列演算を CPU 内で高速化するための機能で、PyTorch、TensorFlow、ONNX Runtime、OpenVINO、oneDNN などの CPU 最適化とも深く関係しています。

ただ、AMX が有効と言われても、

「本当に速くなるのか?」
「どれくらい差が出るのか?」
「RAG のような実AIワークロードでも効果があるのか?」

というところが気になります。

ということで今回は、OCI の VM.Standard4.Ax.Flex に Oracle Linux 10 環境を作成し、AMX を有効化した場合と、AMX を使わず AVX-512 BF16 までに制限した場合で、どれくらい性能差が出るのかを確認してみてみます。

検証は、次の2段階で行います。

  1. oneDNN の benchdnn を使用した BF16 MatMul の低レイヤー性能確認
  2. OpenVINO GenAI text_rerank を使用した RAG reranker 相当の実AIワークロード確認

単なるカタログスペックではなく、実際に OCI 上で環境を作成し、コマンドを実行して、AMX の効果を確認してみます。

目次

■ 検証環境作成

⚫︎ OCI VM.Standard4.Ax.Flex作成

次の項目で、X12 Standard Acceleron ComputeインスタンスのVM.Standard4.Ax.Flexを作成します。

項目 推奨値
Shape VM.Standard4.Ax.Flex
OCPU 最初は1
Memory 16 GB
Boot volume 100 GB目安
OS Oracle Linux 10.x x86_64
SMT 初回はデフォルト有効でOK。単一スレッド測定のノイズを減らしたい場合はVM作成時にSMT無効化も検討、今回はON

1) OCIコンソール画面
「Compute」リスト・ページで、[Instance]を選択
Standard4作成01.png

2) Instances画面
[Create Instance]をクリックして作成します。
Standard4作成02.png

3) Create compute Instance画面
[shape change]をクリックし、次の画面でshapeを選択します。
Standard4作成04.png

4) Browse all shapes画面
OCPU数は、1スレッドで計測するため、最初1で設定
oneDNNをビルドしてbenchdnnを動かすため、メモリを16 GBに設定
Standard4作成03.png

5) Create compute Instance: Security画面
Standard4作成05.png

6) Create compute Instance: Networking画面
Standard4作成06.png

7) Create compute Instance: Storage画面
ベンチマークツール用に ブート・ボリューム・サイズを100 GB以上に設定します。
Standard4作成07.png

8) VM.Standard4.Ax.Flexインスタンス作成完了画面
Standard4作成05.png

⚫︎ CPUとAMXフラグ確認

lscpuでCPUモデル、論理CPU数、スレッド構成を確認します。
続いて/proc/cpuinfoのflagsからamx_bf16amx_int8amx_tileが見えているか確認します。

1) CPU AMX確認

[opc@standard4ax ~]$ lscpu | egrep 'Model name|CPU\(s\)|Thread|Core|Socket|NUMA'
CPU(s):                                  2
On-line CPU(s) list:                     0,1
Model name:                              Intel(R) Xeon(R) 6987P-C
Thread(s) per core:                      2
Core(s) per socket:                      1
Socket(s):                               1
NUMA node(s):                            1
NUMA node0 CPU(s):                       0,1

2) AMXフラグ確認

[opc@standard4ax ~]$ grep -m1 '^flags' /proc/cpuinfo | tr ' ' '\n' | grep '^amx' | sort -u
amx_bf16
amx_int8
amx_tile

■ oneDNN benchdnn使用した AMX効果確認検証

⚫︎ benchdnnとは

benchdnnは、oneDNNに含まれるテスト兼ベンチマーク用のコマンド・ライン・ツールです。convolution、matmul、pooling、reorderなど、oneDNNが提供する各primitiveを対象に、正しく実行できるか、どの実装が選択されたか、どの程度の性能が出るかを確認できます。

今回使用するdriverは--matmulです。2次元のMatMul primitiveは、以下の行列積を計算します。

src     : M x K
weights : K x N
dst     : M x N

今回の比較では、同じVM、同じCPU、同じ行列サイズ、同じスレッド数で、ONEDNN_MAX_CPU_ISAだけを切り替えます。

指定 意味
AVX512_CORE_AMX AMXまで使用可能にします。
AVX512_CORE_BF16 AMXを使わせず、AVX-512 BF16までに制限します。

⚫︎ oneDNN用パッケージ導入

dnf updateでOSパッケージを更新し、gccgcc-c++cmakemakeなどoneDNNのビルドに必要なパッケージを導入します。
※ 本手順ではCMakeのUnix Makefiles generatorを使うため、ninja-buildは不要です。

コマンド
sudo dnf -y update
sudo dnf -y install git gcc gcc-c++ make cmake numactl util-linux procps-ng
コマンド出力結果
[opc@standard4ax ~]$ sudo dnf -y update
Last metadata expiration check: 0:21:29 ago on Tue 12 May 2026 01:29:41 PM GMT.
Dependencies resolved.
...
Upgraded:
  bind-libs-32:9.18.33-10.0.2.el10_1.3.x86_64 ... vim-minimal-2:9.1.083-6.0.1.el10_1.4.x86_64
Complete!
[opc@standard4ax ~]$ sudo dnf -y install git gcc gcc-c++ make cmake numactl util-linux procps-ng
Oracle Linux 10 Addons (x86_64)                                                                                                      153 kB/s | 3.0 kB     00:00
Package git-2.47.3-1.el10_0.x86_64 is already installed.
Package gcc-14.3.1-2.1.el10.x86_64 is already installed.
...
Installed:
  cmake-3.30.5-3.el10_0.x86_64                      cmake-data-3.30.5-3.el10_0.noarch    emacs-filesystem-1:29.4-12.el10.noarch    numactl-2.0.19-2.el10.x86_64
  vim-filesystem-2:9.1.083-6.0.1.el10_1.4.noarch

Complete!

⚫︎ oneDNNを取得してbenchdnnをビルド

oneDNNをGitHubから取得し、benchdnnターゲットをビルドします。1 OCPU環境なので、ビルド時の並列数は-j1にしておきます。
※ 本手順ではCMakeのUnix Makefiles generatorを使うため、ninja-buildは不要です。

1) git cloneでoneDNNを取得

[opc@standard4ax ~]$ git clone --depth 1 https://github.com/uxlfoundation/oneDNN.git
  Cloning into 'oneDNN'...
  remote: Enumerating objects: 5078, done.
  remote: Counting objects: 100% (5078/5078), done.
  remote: Compressing objects: 100% (3904/3904), done.
  remote: Total 5078 (delta 1823), reused 2104 (delta 1120), pack-reused 0 (from 0)
  Receiving objects: 100% (5078/5078), 14.41 MiB | 12.51 MiB/s, done.
  Resolving deltas: 100% (1823/1823), done.

2) CMakeでビルド設定を作成
cd ~/oneDNNで取得したソース・ディレクトリへ移動し、unset CMAKE_GENERATORで既存のCMake generator指定が残っていても影響しないようにしています。主処理はcmake -S . -B build ...で、buildディレクトリにビルド設定を作成します。

指定 意味
-G "Unix Makefiles" NinjaではなくMakefileでビルドします。
-DCMAKE_BUILD_TYPE=Release 性能測定向けにReleaseビルドにします。
-DONEDNN_BUILD_TESTS=ON benchdnnなどのテスト/ベンチマーク系ターゲットを有効化します。
-DONEDNN_ENABLE_MAX_CPU_ISA=ON 実行時にONEDNN_MAX_CPU_ISAでISA上限を切り替えられるようにします。
[opc@standard4ax ~]$ cd ~/oneDNN
[opc@standard4ax oneDNN]$ unset CMAKE_GENERATOR
[opc@standard4ax oneDNN]$ cmake -S . -B build \
  -G "Unix Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DONEDNN_BUILD_TESTS=ON \
  -DONEDNN_ENABLE_MAX_CPU_ISA=ON
  
-- The C compiler identification is GNU 14.3.1
-- The CXX compiler identification is GNU 14.3.1
-- Detecting C compiler ABI info
...
-- Configuring done
-- Generating done
-- Build files have been written to: /home/opc/oneDNN/build

3) benchdnnターゲットをビルド
cmake --build build --target benchdnn -j1で、benchdnn実行ファイルをビルドします。1 OCPU環境ではメモリ使用量を抑えるため-j1にしています。

[opc@standard4ax oneDNN]$ cmake --build build --target benchdnn -j1 2>&1 | tee build-benchdnn.log
  [  0%] Building CXX object src/graph/utils/CMakeFiles/dnnl_graph_utils.dir/alloc.cpp.o
  [  0%] Building CXX object src/graph/utils/CMakeFiles/dnnl_graph_utils.dir/debug.cpp.o
  [  0%] Building CXX object src/graph/utils/CMakeFiles/dnnl_graph_utils.dir/id.cpp.o
  ...
  [100%] Building CXX object tests/benchdnn/CMakeFiles/benchdnn.dir/__/test_thread.cpp.o
  [100%] Linking CXX executable benchdnn
  [100%] Built target benchdnn

4) benchdnnの起動確認
benchdnnのhelpを表示し、実行ファイルが作成されていることを確認します。この確認が通れば、以降のMatMulベンチマークに進めます。

[opc@standard4ax oneDNN]$ cd ~/oneDNN/build/tests/benchdnn
[opc@standard4ax benchdnn]$ ./benchdnn --help | head
Usage:
    benchdnn --<driver> [global_options] [driver_options] problem_description

List of supported <drivers> (lower case accepted only):
    * binary
    * bnorm
    * concat
    * conv
    * deconv
    * eltwise

⚫︎ 共通環境変数を設定

OMP_NUM_THREADS=1で1スレッド実行に固定します。ONEDNN_VERBOSE=profile_exec,dispatchは、oneDNNが選択した実装名と実行時間をログに出すための設定です。

cd ~/oneDNN/build/tests/benchdnn
export OMP_NUM_THREADS=1
export ONEDNN_VERBOSE=profile_exec,dispatch

ONEDNN_VERBOSE=profile_exec,dispatchにより、oneDNNが選択したprimitive実装と実行時間を確認できます。

⚫︎ AMX有効でbenchdnnを実行

ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMXを指定し、oneDNNがAMX実装まで選択できる状態でBF16 MatMulを実行します。taskset -c 0で論理CPU 0に固定し、1スレッドで比較します。

指定 意味
taskset -c 0 実行CPUを論理CPU 0に固定します。
ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMX AMXまで使用可能にします。
--mode=P performance modeで性能測定します。
--matmul MatMul primitiveを測定します。
--dt=bf16:bf16:f32 入力BF16、重みBF16、出力FP32で測定します。
--wtag=any weightsの内部レイアウトをoneDNNに任せます。
4096x4096:4096x4096 4096x4096同士の行列積を実行します。
コマンド
taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMX \
./benchdnn --mode=P --matmul \
  --dt=bf16:bf16:f32 \
  --stag=ab --wtag=any --dtag=ab \
  4096x4096:4096x4096
コマンド出力結果
[opc@standard4ax benchdnn]$ taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMX \
./benchdnn --mode=P --matmul \
  --dt=bf16:bf16:f32 \
  --stag=ab --wtag=any --dtag=ab \
  4096x4096:4096x4096
onednn_verbose,v1,info,oneDNN v3.13.0 (commit e8ae444d854529a0cbef6d7f6de8b7ea39718f03)
onednn_verbose,v1,info,cpu,runtime:OpenMP,nthr:1
onednn_verbose,v1,info,cpu,isa:Intel AVX10.1 and Intel AMX with bfloat16 and 8-bit integer support
onednn_verbose,v1,info,gpu,runtime:none
onednn_verbose,v1,info,graph,backend,0:dnnl_backend
onednn_verbose,v1,primitive,info,template:operation,engine,primitive,implementation,prop_kind,memory_descriptors,attributes,auxiliary,problem_desc,exec_time
onednn_verbose,v1,graph,info,template:operation,engine,partition_id,partition_kind,op_names,data_formats,logical_tensors,fpmath_mode,implementation,backend,exec_time
onednn_verbose,v1,primitive,create:dispatch,reorder,cpu,reorder,jit_direct_copy:uni,undef,src:f32::blocked:ba::f0 dst:bf16::blocked:BA16a32b2a::f0,,,4096x4096,memory formats for src and dst tensors do not match,src/cpu/x64/jit_uni_reorder_direct_copy.cpp:314
onednn_verbose,v1,primitive,exec,cpu,reorder,jit:uni,undef,src:f32::blocked:ba::f0 dst:bf16::blocked:BA16a32b2a::f0,,,4096x4096,10.646
onednn_verbose,v1,primitive,exec,cpu,reorder,jit_direct_copy:uni,undef,src:f32::blocked:ab::f0 dst:bf16::blocked:ab::f0,,,4096x4096,4.00293
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,202.429
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,198.2
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,198.001
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.833
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,198.085
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.829
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.302
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.205
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.248
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.238
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.443
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.458
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.325
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.246
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,198.302
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.489
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx10_1_512_amx,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a32b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,197.349
Template entries: perf,%engine%,%impl%,%name%,%prb%,%Gops%,%+ctime%,%-time%,%-Gflops%,%0time%,%0Gflops%
perf,engine,impl,name,prb,Gops,max_ctime,min_time,min_Gflops,avg_time,avg_Gflops
perf,cpu,brg_matmul:avx10_1_512_amx,,--mode=P --matmul --dt=bf16:bf16:f32 --stag=ab --dtag=ab 4096x4096:4096x4096,137.439,8.87939,197.24,696.811,197.633,695.425
============================================================
= Implementation statistics (--summary=no-impl to disable) =
============================================================
| brg_matmul:avx10_1_512_amx : 1 (100%)                    |
============================================================
tests:1 passed:1 skipped:0 mistrusted:0 unimplemented:0 invalid_arguments:0 failed:0 listed:0
total perf: min(ms):197.24 avg(ms):197.633
total: 4.27s; create_pd: 0.00s (0%); create_prim: 0.01s (0%); fill: 0.87s (20%); execute: 0.00s (0%);

・ 結果

avg_time = 197.633
avg_Gflops = 695.425

⚫︎ AMX無効で実行

ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16を指定し、AMXを使わせずAVX-512 BF16までに制限します。AMX有効時と同じ行列サイズ、同じスレッド数、同じCPU固定条件で比較します。

コマンド
taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16 \
./benchdnn --mode=P --matmul \
  --dt=bf16:bf16:f32 \
  --stag=ab --wtag=any --dtag=ab \
  4096x4096:4096x4096
コマンド出力結果
[opc@standard4ax benchdnn]$ taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16 \
./benchdnn --mode=P --matmul \
  --dt=bf16:bf16:f32 \
  --stag=ab --wtag=any --dtag=ab \
  4096x4096:4096x4096
onednn_verbose,v1,info,oneDNN v3.13.0 (commit e8ae444d854529a0cbef6d7f6de8b7ea39718f03)
onednn_verbose,v1,info,cpu,runtime:OpenMP,nthr:1
onednn_verbose,v1,info,cpu,isa:Intel AVX-512 with Intel DL Boost and bfloat16 support
onednn_verbose,v1,info,gpu,runtime:none
onednn_verbose,v1,info,graph,backend,0:dnnl_backend
onednn_verbose,v1,primitive,info,template:operation,engine,primitive,implementation,prop_kind,memory_descriptors,attributes,auxiliary,problem_desc,exec_time
onednn_verbose,v1,graph,info,template:operation,engine,partition_id,partition_kind,op_names,data_formats,logical_tensors,fpmath_mode,implementation,backend,exec_time
onednn_verbose,v1,primitive,create:dispatch,reorder,cpu,reorder,jit_direct_copy:uni,undef,src:f32::blocked:ba::f0 dst:bf16::blocked:BA16a64b2a::f0,,,4096x4096,memory formats for src and dst tensors do not match,src/cpu/x64/jit_uni_reorder_direct_copy.cpp:314
onednn_verbose,v1,primitive,exec,cpu,reorder,jit:uni,undef,src:f32::blocked:ba::f0 dst:bf16::blocked:BA16a64b2a::f0,,,4096x4096,11.5869
onednn_verbose,v1,primitive,exec,cpu,reorder,jit_direct_copy:uni,undef,src:f32::blocked:ab::f0 dst:bf16::blocked:ab::f0,,,4096x4096,4.04199
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1501.5
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1491.71
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1487.42
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1488.79
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1487.98
onednn_verbose,v1,primitive,exec,cpu,matmul,brg_matmul:avx512_core_bf16,undef,src:bf16::blocked:ab::f0 wei:bf16:a:blocked:BA16a64b2a::f0 dst:f32::blocked:ab::f0,,,4096x4096:4096x4096,1487.1
Template entries: perf,%engine%,%impl%,%name%,%prb%,%Gops%,%+ctime%,%-time%,%-Gflops%,%0time%,%0Gflops%
perf,engine,impl,name,prb,Gops,max_ctime,min_time,min_Gflops,avg_time,avg_Gflops
perf,cpu,brg_matmul:avx512_core_bf16,,--mode=P --matmul --dt=bf16:bf16:f32 --stag=ab --dtag=ab 4096x4096:4096x4096,137.439,0.838135,1487.13,92.4188,1488.64,92.3254
============================================================
= Implementation statistics (--summary=no-impl to disable) =
============================================================
| brg_matmul:avx512_core_bf16 : 1 (100%)                   |
============================================================
tests:1 passed:1 skipped:0 mistrusted:0 unimplemented:0 invalid_arguments:0 failed:0 listed:0
total perf: min(ms):1487.13 avg(ms):1488.64
total: 9.85s; create_pd: 0.00s (0%); create_prim: 0.00s (0%); fill: 0.87s (9%); execute: 0.00s (0%);

・ 結果

avg_time = 1488.64
avg_Gflops = 92.3254

⚫︎ benchdnn結果まとめ

OCI VM.Standard4.Ax.Flex上で、oneDNN benchdnnを使い、BF16 MatMul 4096x4096:4096x4096を1スレッドで測定しました。

条件 ONEDNN_MAX_CPU_ISA oneDNN実装 平均時間 平均性能
AMX有効 AVX512_CORE_AMX brg_matmul:avx10_1_512_amx 197.633 ms 695.425 GFLOPS
AMX無効 AVX512_CORE_BF16 brg_matmul:avx512_core_bf16 1488.64 ms 92.325 GFLOPS

速度比は以下です。

695.425 / 92.325 = 約 7.53倍

今回の条件では、BF16 MatMulにおいてAMX有効時に約7.5倍の性能向上を確認できました。

■ OpenVINO GenAI text_rerankを使用した実AIワークロード検証

benchdnnはAMXの低レベルな行列演算性能を見るには分かりやすいですが、実際のAIアプリケーション全体のワークロードではありません。
そこで追加検証として、OpenVINO GenAIのtext_rerankを使い、RAGでよく使われるrerankerに近いワークロードでもAMX有効/無効の差を確認します。

⚫︎ Python仮想環境を作成

OpenVINO GenAIとllm_benchを入れるため、Python仮想環境を作成します。python3-develpython3-pipはPythonパッケージのインストールや一部依存関係のビルドで使います。

1) 必要パッケージをdnfで導入

コマンド
sudo dnf -y install git python3 python3-pip python3-devel gcc gcc-c++ make wget
コマンド出力結果
[opc@standard4ax ~]$ sudo dnf -y install git python3 python3-pip python3-devel gcc gcc-c++ make wget
  Last metadata expiration check: 0:15:37 ago on Tue 12 May 2026 01:29:41 PM GMT.
  Package git-2.47.3-1.el10_0.x86_64 is already installed.
  Package python3-3.12.12-3.0.1.el10_1.3.x86_64 is already installed.
  ...
  Installed:
    python3-devel-3.12.12-3.0.1.el10_1.3.x86_64                                            python3-pip-23.3.2-7.el10.noarch
  
  Complete

2) 仮想環境を作成して有効化
python3 -m venvで検証用の独立したPython環境を作成し、sourceで有効化します。プロンプトに((ov-genai-rerank) )が付けば仮想環境が有効になっています。

[opc@standard4ax ~]$ python3 -m venv ~/ov-genai-rerank
[opc@standard4ax ~]$ source ~/ov-genai-rerank/bin/activate

3) pip / setuptools / wheelを更新

Pythonパッケージのインストールを安定させるため、pipsetuptoolswheelを更新します。

コマンド
python -m pip install --upgrade pip setuptools wheel
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax ~]$ python -m pip install --upgrade pip setuptools wheel
Requirement already satisfied: pip in ./ov-genai-rerank/lib64/python3.12/site-packages (23.3.2)
Collecting pip
Collecting setuptools
...
Successfully installed packaging-26.2 pip-26.1.1 setuptools-82.0.1 wheel-0.47.0

⚫︎ OpenVINO GenAIをインストール

openvino-genaiをPyPIからインストールします。これにより、OpenVINO Runtime、OpenVINO Tokenizers、OpenVINO GenAI Pythonパッケージが入ります。

コマンド
python -m pip install openvino-genai
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax ~]$ python -m pip install openvino-genai
  Collecting openvino-genai
    Downloading openvino_genai-2026.1.0.0-2187-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (26 kB)
  Collecting openvino_tokenizers~=2026.1.0.0.dev (from openvino-genai)
  ...
  Successfully installed numpy-2.4.4 openvino-2026.1.0 openvino-genai-2026.1.0.0 openvino-telemetry-2025.2.0 openvino_tokenizers-2026.1.0.0

⚫︎ OpenVINO GenAIのllm_benchを取得

llm_benchはOpenVINO GenAIに含まれる性能評価用ツールです。GitHubからopenvino.genaiリポジトリをcloneし、tools/llm_bench配下で必要なPython依存関係を入れます。

1) openvino.genaiをclone

コマンド
cd ~
git clone --depth 1 https://github.com/openvinotoolkit/openvino.genai.git
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax ~]$ cd ~
((ov-genai-rerank) ) [opc@standard4ax ~]$ git clone --depth 1 https://github.com/openvinotoolkit/openvino.genai.git
  Cloning into 'openvino.genai'...
  remote: Enumerating objects: 1414, done.
  remote: Counting objects: 100% (1414/1414), done.
  remote: Compressing objects: 100% (1229/1229), done.
  remote: Total 1414 (delta 259), reused 592 (delta 140), pack-reused 0 (from 0)
  Receiving objects: 100% (1414/1414), 2.44 MiB | 16.64 MiB/s, done.
  Resolving deltas: 100% (259/259), done.

2) llm_benchの依存関係をインストール

コマンド
cd ~/openvino.genai/tools/llm_bench
python -m pip install -U --upgrade-strategy eager -r requirements.txt
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax ~]$ cd ~/openvino.genai/tools/llm_bench
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python -m pip install -U --upgrade-strategy eager -r requirements.txt
  Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cpu, https://storage.openvinotoolkit.org/simple/wheels/nightly
  Requirement already satisfied: numpy<=2.4.4,>=1.23.5 in /home/opc/ov-genai-rerank/lib64/python3.12/site-packages (from -r requirements.txt (line 2)) (2.4.4)
  Requirement already satisfied: openvino in /home/opc/ov-genai-rerank/lib64/python3.12/site-packages (from -r requirements.txt (line 4)) (2026.1.0)
  ...
  Successfully installed MarkupSafe-3.0.3 anyio-4.13.0 argparse-1.4.0 ... transformers-4.57.6 transformers_stream_generator-0.0.5 typing_extensions-4.15.0 urllib3-2.7.0 vector-quantize-pytorch-1.28.2 vocos-0.1.0 zipp-3.23.1

⚫︎ OpenCVをheadless版に差し替え

llm_benchは内部でcv2をimportします。Oracle Linux 10の最小構成VMではImportError: libGL.so.1が発生する場合があります。今回のtext_rerankではOpenCVのGUI機能は使わないため、opencv-pythonを削除し、opencv-python-headlessに差し替えます。

1) OpenCV通常版を削除してheadless版をインストール

コマンド
python -m pip uninstall -y opencv-python opencv-contrib-python opencv-python-headless opencv-contrib-python-headless
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python -m pip uninstall -y opencv-python opencv-contrib-python opencv-python-headless opencv-contrib-python-headless
  Found existing installation: opencv-python 4.13.0.92
  Uninstalling opencv-python-4.13.0.92:
    Successfully uninstalled opencv-python-4.13.0.92
  WARNING: Skipping opencv-contrib-python as it is not installed.
  WARNING: Skipping opencv-python-headless as it is not installed.
  WARNING: Skipping opencv-contrib-python-headless as it is not installed.
  ((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python -m pip install opencv-python-headless
  Collecting opencv-python-headless
    Downloading opencv_python_headless-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl.metadata (19 kB)
  ...
  Successfully installed opencv-python-headless-4.13.0.92

2) cv2 importを確認
cv2 import OKが出れば、libGL.so.1問題は回避できています。

コマンド
python - <<'PY'
import cv2
print("cv2 import OK:", cv2.__version__)
PY
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python - <<'PY'
import cv2
print("cv2 import OK:", cv2.__version__)
PY

  cv2 import OK: 4.13.0

⚫︎ optimum-cliの重複登録を回避

Oracle Linux 10環境では、Python venv内でliblib64の両方が見えるため、optimum-cli export openvino実行時に以下のエラーが出る場合があります。

argparse.ArgumentError: argument {onnx,openvino}: conflicting subparser: onnx

そのため、変換前にoptimum-cliのサブコマンド登録パス重複を回避します。cdsourceは以降のoptimum-cliを対象の仮想環境で実行するための補足です。

1) optimum-cliの登録パス重複をpatch

コマンド
cd ~/openvino.genai/tools/llm_bench
source ~/ov-genai-rerank/bin/activate

python - <<'PY'
from pathlib import Path
import site

targets = set()

for base in site.getsitepackages():
    p = Path(base) / "optimum" / "commands" / "optimum_cli.py"
    if p.exists():
        targets.add(p.resolve())

old = "for register_path in set(commands_register_spec.submodule_search_locations):"
new = "for register_path in {__import__('pathlib').Path(p).resolve() for p in commands_register_spec.submodule_search_locations}:"

if not targets:
    raise SystemExit("optimum_cli.py not found")

for path in sorted(targets):
    text = path.read_text()
    if old in text:
        path.write_text(text.replace(old, new))
        print(f"patched: {path}")
    elif new in text:
        print(f"already patched: {path}")
    else:
        print(f"pattern not found: {path}")
PY
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ cd ~/openvino.genai/tools/llm_bench
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ source ~/ov-genai-rerank/bin/activate
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python - <<'PY'
from pathlib import Path
import site

targets = set()

for base in site.getsitepackages():
    p = Path(base) / "optimum" / "commands" / "optimum_cli.py"
    if p.exists():
        targets.add(p.resolve())

old = "for register_path in set(commands_register_spec.submodule_search_locations):"
new = "for register_path in {__import__('pathlib').Path(p).resolve() for p in commands_register_spec.submodule_search_locations}:"

if not targets:
    raise SystemExit("optimum_cli.py not found")

for path in sorted(targets):
    text = path.read_text()
    if old in text:
        path.write_text(text.replace(old, new))
        print(f"patched: {path}")
    elif new in text:
        print(f"already patched: {path}")
    else:
        print(f"pattern not found: {path}")
PY

  patched: /home/opc/ov-genai-rerank/lib/python3.12/site-packages/optimum/commands/optimum_cli.py

2) optimum-cliが動くことを確認

which optimum-cliで仮想環境内のCLIを使っていることを確認し、--helpが表示されればOKです。

コマンド
which optimum-cli
optimum-cli export openvino --help | head -n 20
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ which optimum-cli
~/ov-genai-rerank/bin/optimum-cli
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ optimum-cli export openvino --help | head -n 20
usage: optimum-cli export openvino [-h] -m MODEL [--task TASK]
                                   [--framework {pt}] [--trust-remote-code]
                                   [--weight-format {fp32,fp16,int8,int4,mxfp4,nf4,cb4}]
                                   [--quant-mode {int8,f8e4m3,f8e5m2,cb4_f8e4m3,int4_f8e4m3,int4_f8e5m2}]
                                   [--library {transformers,diffusers,timm,sentence_transformers,open_clip}]
                                   [--cache_dir CACHE_DIR]
                                   [--pad-token-id PAD_TOKEN_ID]
                                   [--variant VARIANT] [--ratio RATIO] [--sym]
                                   [--group-size GROUP_SIZE]
                                   [--group-size-fallback {error,ignore,adjust}]
                                   [--backup-precision {none,int8_sym,int8_asym}]
                                   [--dataset DATASET] [--all-layers] [--awq]
                                   [--scale-estimation] [--gptq]
                                   [--lora-correction]
                                   [--sensitivity-metric SENSITIVITY_METRIC]
                                   [--quantization-statistics-path QUANTIZATION_STATISTICS_PATH]
                                   [--num-samples NUM_SAMPLES]
                                   [--disable-stateful]
                                   [--disable-convert-tokenizer]
                                   [--smooth-quant-alpha SMOOTH_QUANT_ALPHA]

⚫︎ OpenVINO形式にrerankerモデルを変換

公式例と同じcross-encoder/ms-marco-MiniLM-L6-v2を使います。OpenVINO GenAI text_rerankでは、モデル本体だけでなくopenvino_tokenizer.xml / .binも必要になるため、optimum-cli export openvinoでモデルとtokenizerをまとめて変換します。

1) optimum-cliでOpenVINO IRへ変換
--task text-classificationを指定し、cross-encoderのrerankerモデルをOpenVINO形式へ変換します。

コマンド
cd ~/openvino.genai/tools/llm_bench
mkdir -p models
rm -rf models/ms-marco-MiniLM-L6-v2
optimum-cli export openvino \
  --model cross-encoder/ms-marco-MiniLM-L6-v2 \
  --task text-classification \
  models/ms-marco-MiniLM-L6-v2
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ mkdir -p models
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ rm -rf models/ms-marco-MiniLM-L6-v2
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ optimum-cli export openvino \
  --model cross-encoder/ms-marco-MiniLM-L6-v2 \
  --task text-classification \
  models/ms-marco-MiniLM-L6-v2
Multiple distributions found for package optimum. Picked distribution: optimum
Failed to load CPU gemm_4bit_forward from kernels-community: No module named 'kernels'. Please make sure you already `pip install kernels` and the kernels >= 0.11.1
`loss_type=None` was set in the config but it is unrecognized. Using the default loss: `ForCausalLMLoss`.
/home/opc/ov-genai-rerank/lib64/python3.12/site-packages/transformers/modeling_attn_mask_utils.py:196: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect.
  inverted_mask = torch.tensor(1.0, dtype=dtype) - expanded_mask

2) 変換ファイルを確認
openvino_model.xml / .binopenvino_tokenizer.xml / .binが生成されていることを確認します。特にopenvino_tokenizer.xmlがないと、Tokenizer::encode is not availableで実行時に失敗します。

コマンド
find models/ms-marco-MiniLM-L6-v2 -maxdepth 1 -type f | sort
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ find models/ms-marco-MiniLM-L6-v2 -maxdepth 1 -type f | sort
  models/ms-marco-MiniLM-L6-v2/config.json
  models/ms-marco-MiniLM-L6-v2/openvino_detokenizer.bin
  models/ms-marco-MiniLM-L6-v2/openvino_detokenizer.xml
  models/ms-marco-MiniLM-L6-v2/openvino_model.bin
  models/ms-marco-MiniLM-L6-v2/openvino_model.xml
  models/ms-marco-MiniLM-L6-v2/openvino_tokenizer.bin
  models/ms-marco-MiniLM-L6-v2/openvino_tokenizer.xml
  models/ms-marco-MiniLM-L6-v2/special_tokens_map.json
  models/ms-marco-MiniLM-L6-v2/tokenizer_config.json
  models/ms-marco-MiniLM-L6-v2/tokenizer.json
  models/ms-marco-MiniLM-L6-v2/vocab.txt

⚫︎ OpenVINO CPU設定ファイルを作成

AMX有効側とAMX無効側でOpenVINOのキャッシュを分けます。同じCACHE_DIRを使うと、どちらの条件でcompileされたキャッシュか分かりにくくなるためです。unset ONEDNN_VERBOSEunset DNNL_VERBOSEは、OpenVINO GenAI実行時に詳細ログが出すぎないようにするためです。

コマンド
cd ~/openvino.genai/tools/llm_bench
source ~/ov-genai-rerank/bin/activate
unset ONEDNN_VERBOSE
unset DNNL_VERBOSE

cat > ov_cpu_1t_bf16_amx.json <<'JSON'
{
  "INFERENCE_NUM_THREADS": 1,
  "PERFORMANCE_HINT": "LATENCY",
  "INFERENCE_PRECISION_HINT": "bf16",
  "CACHE_DIR": "ov_cache_amx"
}
JSON

cat > ov_cpu_1t_bf16_noamx.json <<'JSON'
{
  "INFERENCE_NUM_THREADS": 1,
  "PERFORMANCE_HINT": "LATENCY",
  "INFERENCE_PRECISION_HINT": "bf16",
  "CACHE_DIR": "ov_cache_noamx"
}
JSON
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ unset ONEDNN_VERBOSE
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ unset DNNL_VERBOSE
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ cat > ov_cpu_1t_bf16_amx.json <<'JSON'
{
  "INFERENCE_NUM_THREADS": 1,
  "PERFORMANCE_HINT": "LATENCY",
  "INFERENCE_PRECISION_HINT": "bf16",
  "CACHE_DIR": "ov_cache_amx"
}
JSON
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ cat > ov_cpu_1t_bf16_noamx.json <<'JSON'
{
  "INFERENCE_NUM_THREADS": 1,
  "PERFORMANCE_HINT": "LATENCY",
  "INFERENCE_PRECISION_HINT": "bf16",
  "CACHE_DIR": "ov_cache_noamx"
}
JSON

⚫︎ rerank対象文書を作成

text_rerankでは、queryに対して複数の候補文書をrerankします。今回は64件の候補文書をJSONL形式で用意します。

コマンド
cat > make_rerank_docs.py <<'PY'
import json

docs = [
    "OpenVINO is an inference optimization toolkit for running AI models efficiently on Intel CPUs, GPUs, and NPUs.",
    "Intel AMX accelerates matrix operations such as BF16 and INT8 computations for AI workloads.",
    "oneDNN provides optimized deep learning primitives including convolution, matrix multiplication, and reorder operations.",
    "RAG systems often use embedding models for retrieval and cross-encoder rerankers to sort candidate documents.",
    "A reranker scores query and document pairs and returns documents ordered by semantic relevance.",
    "OCI VM.Standard4.Ax.Flex uses Intel Xeon 6 processors and can expose AMX capabilities to Linux guests.",
    "BF16 can improve throughput for deep learning inference while keeping a wider dynamic range than FP16.",
    "The CPU plugin in OpenVINO can use optimized kernels through oneDNN for Intel x86-64 processors.",
    "Text generation decode is often sequential, while reranking can process many query-document pairs.",
    "Prompt processing in LLMs includes large matrix multiplications and may benefit from CPU acceleration.",
    "Database indexing, backup scheduling, and storage tiering are common enterprise infrastructure tasks.",
    "Weather forecasts, travel guides, and restaurant reviews are examples of general consumer information.",
    "Container orchestration platforms schedule workloads across clusters and provide service discovery.",
    "Network security groups and route tables control traffic flow in cloud virtual networks.",
    "Object storage is commonly used for durable storage of logs, backups, and unstructured data.",
    "A compiler transforms source code into executable machine code for a target architecture."
]

with open("rerank_docs.jsonl", "w", encoding="utf-8") as f:
    for i in range(64):
        text = docs[i % len(docs)]
        text = f"Document {i:03d}. {text} This passage is used for OpenVINO GenAI text reranking benchmark."
        f.write(json.dumps({"text": text}, ensure_ascii=False) + "\n")
PY

python make_rerank_docs.py
wc -l rerank_docs.jsonl
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ cat > make_rerank_docs.py <<'PY'
import json

docs = [
    "OpenVINO is an inference optimization toolkit for running AI models efficiently on Intel CPUs, GPUs, and NPUs.",
    "Intel AMX accelerates matrix operations such as BF16 and INT8 computations for AI workloads.",
    "oneDNN provides optimized deep learning primitives including convolution, matrix multiplication, and reorder operations.",
    "RAG systems often use embedding models for retrieval and cross-encoder rerankers to sort candidate documents.",
    "A reranker scores query and document pairs and returns documents ordered by semantic relevance.",
    "OCI VM.Standard4.Ax.Flex uses Intel Xeon 6 processors and can expose AMX capabilities to Linux guests.",
    "BF16 can improve throughput for deep learning inference while keeping a wider dynamic range than FP16.",
    "The CPU plugin in OpenVINO can use optimized kernels through oneDNN for Intel x86-64 processors.",
    "Text generation decode is often sequential, while reranking can process many query-document pairs.",
    "Prompt processing in LLMs includes large matrix multiplications and may benefit from CPU acceleration.",
    "Database indexing, backup scheduling, and storage tiering are common enterprise infrastructure tasks.",
    "Weather forecasts, travel guides, and restaurant reviews are examples of general consumer information.",
    "Container orchestration platforms schedule workloads across clusters and provide service discovery.",
    "Network security groups and route tables control traffic flow in cloud virtual networks.",
    "Object storage is commonly used for durable storage of logs, backups, and unstructured data.",
    "A compiler transforms source code into executable machine code for a target architecture."
]

with open("rerank_docs.jsonl", "w", encoding="utf-8") as f:
    for i in range(64):
        text = docs[i % len(docs)]
        text = f"Document {i:03d}. {text} This passage is used for OpenVINO GenAI text reranking benchmark."
        f.write(json.dumps({"text": text}, ensure_ascii=False) + "\n")
PY

((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ python make_rerank_docs.py
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ wc -l rerank_docs.jsonl
  64 rerank_docs.jsonl

⚫︎ AMX有効でOpenVINO GenAI text_rerankを実行

ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMXでAMXまで使用可能にし、OpenVINO GenAIのtext_rerankを実行します。-f ovはOpenVINO形式のモデルを使う指定です。-lc ov_cpu_1t_bf16_amx.jsonにより、1スレッド、BF16 hint、AMX用キャッシュ・ディレクトリを使います。

指定 意味
-m models/ms-marco-MiniLM-L6-v2 OpenVINO形式に変換したrerankerモデルのパスです。
-d CPU CPUデバイスで実行します。
-f ov OpenVINO形式のモデルとして実行します。
--task text_rerank text rerankingタスクを実行します。
--texts_file rerank_docs.jsonl rerank対象の64文書を指定します。
--reranking_max_length 256 query-document pairの最大長を指定します。
--reranking_top_n 5 上位5件を出力します。
-n 10 warm-up後に10回測定します。
-r / -rj CSV / JSON形式で結果を保存します。
コマンド
cd ~/openvino.genai/tools/llm_bench
source ~/ov-genai-rerank/bin/activate

export OMP_NUM_THREADS=1
export OMP_WAIT_POLICY=PASSIVE

rm -rf ov_cache_amx

taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMX \
python benchmark.py \
  -m models/ms-marco-MiniLM-L6-v2 \
  -d CPU \
  -f ov \
  -n 10 \
  --task text_rerank \
  -p "How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?" \
  --texts_file rerank_docs.jsonl \
  --reranking_max_length 256 \
  --reranking_top_n 5 \
  -lc ov_cpu_1t_bf16_amx.json \
  -r rerank_amx.csv \
  -rj rerank_amx.json \
  2>&1 | tee rerank_amx.log
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax ~]$ cd ~/openvino.genai/tools/llm_bench
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ export OMP_NUM_THREADS=1
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ export OMP_WAIT_POLICY=PASSIVE
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ rm -rf ov_cache_amx
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_AMX \
python benchmark.py \
  -m models/ms-marco-MiniLM-L6-v2 \
  -d CPU \
  -f ov \
  -n 10 \
  --task text_rerank \
  -p "How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?" \
  --texts_file rerank_docs.jsonl \
  --reranking_max_length 256 \
  --reranking_top_n 5 \
  -lc ov_cpu_1t_bf16_amx.json \
  -r rerank_amx.csv \
  -rj rerank_amx.json \
  2>&1 | tee rerank_amx.log
  
Multiple distributions found for package optimum. Picked distribution: optimum
Failed to load CPU gemm_4bit_forward from kernels-community: No module named 'kernels'. Please make sure you already `pip install kernels` and the kernels >= 0.11.1
[ INFO ] ==SUCCESS FOUND==: use_case: text_rerank, model_type: bert, model_Name: ms-marco-MiniLM-L6-v2
[ INFO ] OV Config={'INFERENCE_NUM_THREADS': 1, 'PERFORMANCE_HINT': 'LATENCY', 'INFERENCE_PRECISION_HINT': 'bf16', 'CACHE_DIR': 'ov_cache_amx'}
[ INFO ] The num_beams is 1, update Torch thread num from 1 to 1, avoid to use the CPU cores for OpenVINO inference.
[ INFO ] Model path=models/ms-marco-MiniLM-L6-v2, openvino runtime version: 2026.1.0-21367-63e31528c62-releases/2026/1, genai version: 2026.1.0.0-2957-1dabb8c2255
[ INFO ] Selected OpenVINO GenAI for benchmarking
[ INFO ] Pipeline initialization time: 0.20s
[ INFO ] Read texts from rerank_docs.jsonl
[ INFO ] [warm-up][P0] Input query: How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?
[ INFO ] [warm-up][P0] Document 33, score: 0.9947
[ INFO ] [warm-up][P0] Document 49, score: 0.9947
[ INFO ] [warm-up][P0] Document 17, score: 0.9945
[ INFO ] [warm-up][P0] Document 1, score: 0.9936
[ INFO ] [warm-up][P0] Document 48, score: 0.9781
[ INFO ] [warm-up][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.25s, Latency: 249.8391 ms/prompt
[ INFO ] [warm-up][P0] First iteration latency: 249.84 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [warm-up][P0] First infer latency: 249.84 ms, other infers latency: NA, inference count: 1
[ INFO ] [1][P0] Document 33, score: 0.9947
[ INFO ] [1][P0] Document 49, score: 0.9947
[ INFO ] [1][P0] Document 17, score: 0.9945
[ INFO ] [1][P0] Document 1, score: 0.9936
[ INFO ] [1][P0] Document 48, score: 0.9781
[ INFO ] [1][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 202.1128 ms/prompt
[ INFO ] [1][P0] First iteration latency: 202.11 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [1][P0] First infer latency: 202.11 ms, other infers latency: NA, inference count: 1
[ INFO ] [2][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.21s, Latency: 205.9339 ms/prompt
[ INFO ] [2][P0] First iteration latency: 205.93 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [3][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 204.0368 ms/prompt
[ INFO ] [3][P0] First iteration latency: 204.04 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [4][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 203.6559 ms/prompt
[ INFO ] [5][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 202.6225 ms/prompt
[ INFO ] [6][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 201.9785 ms/prompt
[ INFO ] [7][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 201.3318 ms/prompt
[ INFO ] [8][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 200.6271 ms/prompt
[ INFO ] [9][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 201.5129 ms/prompt
[ INFO ] [10][P0] Input token size: 1280, Infer count: 1, Generation Time: 0.20s, Latency: 201.3244 ms/prompt
[ INFO ] [10][P0] First iteration latency: 201.32 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [10][P0] First infer latency: 201.32 ms, other infers latency: NA, inference count: 1
[ INFO ] <<< Warm-up iteration is excluded. >>>
[ INFO ] [Total] Iterations: 10
[ INFO ] [Average] P[0] Input token size: 1280, 1st iteration latency: 202.51 ms, 2nd iteration latency: NA, 2nd iteration throughput: NA

実行時に以下のwarningが表示される場合がありますが、==SUCCESS FOUND==が出て、最後に[Average] ... latencyが出力されれば測定は完了しています。

Multiple distributions found for package optimum. Picked distribution: optimum
Failed to load CPU gemm_4bit_forward from kernels-community: No module named 'kernels'

AMX有効側の結果です。

[ INFO ] [Average] P[0] Input token size: 1280, 1st iteration latency: 202.51 ms

⚫︎ AMX無効でOpenVINO GenAI text_rerankを実行

ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16でAMXを使わせず、AVX-512 BF16までに制限して実行します。AMX有効時と同じモデル、同じ文書数、同じCPU固定、同じ1スレッド条件で比較します。

コマンド
rm -rf ov_cache_noamx

taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16 \
python benchmark.py \
  -m models/ms-marco-MiniLM-L6-v2 \
  -d CPU \
  -f ov \
  -n 10 \
  --task text_rerank \
  -p "How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?" \
  --texts_file rerank_docs.jsonl \
  --reranking_max_length 256 \
  --reranking_top_n 5 \
  -lc ov_cpu_1t_bf16_noamx.json \
  -r rerank_noamx.csv \
  -rj rerank_noamx.json \
  2>&1 | tee rerank_noamx.log
コマンド出力結果
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ rm -rf ov_cache_noamx
((ov-genai-rerank) ) [opc@standard4ax llm_bench]$ taskset -c 0 env ONEDNN_MAX_CPU_ISA=AVX512_CORE_BF16 \
python benchmark.py \
  -m models/ms-marco-MiniLM-L6-v2 \
  -d CPU \
  -f ov \
  -n 10 \
  --task text_rerank \
  -p "How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?" \
  --texts_file rerank_docs.jsonl \
  --reranking_max_length 256 \
  --reranking_top_n 5 \
  -lc ov_cpu_1t_bf16_noamx.json \
  -r rerank_noamx.csv \
  -rj rerank_noamx.json \
  2>&1 | tee rerank_noamx.log
Multiple distributions found for package optimum. Picked distribution: optimum
Failed to load CPU gemm_4bit_forward from kernels-community: No module named 'kernels'. Please make sure you already `pip install kernels` and the kernels >= 0.11.1
[ INFO ] ==SUCCESS FOUND==: use_case: text_rerank, model_type: bert, model_Name: ms-marco-MiniLM-L6-v2
[ INFO ] OV Config={'INFERENCE_NUM_THREADS': 1, 'PERFORMANCE_HINT': 'LATENCY', 'INFERENCE_PRECISION_HINT': 'bf16', 'CACHE_DIR': 'ov_cache_noamx'}
[ INFO ] The num_beams is 1, update Torch thread num from 1 to 1, avoid to use the CPU cores for OpenVINO inference.
[ INFO ] Model path=models/ms-marco-MiniLM-L6-v2, openvino runtime version: 2026.1.0-21367-63e31528c62-releases/2026/1, genai version: 2026.1.0.0-2957-1dabb8c2255
[ INFO ] Selected OpenVINO GenAI for benchmarking
[ INFO ] Pipeline initialization time: 0.29s
[ INFO ] Read texts from rerank_docs.jsonl
[ INFO ] [warm-up][P0] Input query: How does Intel AMX accelerate OpenVINO and oneDNN AI inference on OCI?
[ INFO ] [warm-up][P0] Document 33, score: 0.9947
[ INFO ] [warm-up][P0] Document 49, score: 0.9946
[ INFO ] [warm-up][P0] Document 17, score: 0.9946
[ INFO ] [warm-up][P0] Document 1, score: 0.9937
[ INFO ] [warm-up][P0] Document 48, score: 0.9779
[ INFO ] [warm-up][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.16s, Latency: 1159.3773 ms/prompt
[ INFO ] [warm-up][P0] First iteration latency: 1159.38 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [warm-up][P0] First infer latency: 1159.38 ms, other infers latency: NA, inference count: 1
[ INFO ] [1][P0] Document 33, score: 0.9947
[ INFO ] [1][P0] Document 49, score: 0.9946
[ INFO ] [1][P0] Document 17, score: 0.9946
[ INFO ] [1][P0] Document 1, score: 0.9937
[ INFO ] [1][P0] Document 48, score: 0.9779
[ INFO ] [1][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1112.6461 ms/prompt
[ INFO ] [1][P0] First iteration latency: 1112.65 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [2][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.12s, Latency: 1120.0807 ms/prompt
[ INFO ] [3][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.12s, Latency: 1115.2887 ms/prompt
[ INFO ] [4][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.14s, Latency: 1143.2917 ms/prompt
[ INFO ] [5][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1114.3912 ms/prompt
[ INFO ] [6][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1112.7115 ms/prompt
[ INFO ] [7][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1112.2495 ms/prompt
[ INFO ] [8][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1111.4351 ms/prompt
[ INFO ] [9][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.13s, Latency: 1129.2787 ms/prompt
[ INFO ] [10][P0] Input token size: 1280, Infer count: 1, Generation Time: 1.11s, Latency: 1112.3823 ms/prompt
[ INFO ] [10][P0] First iteration latency: 1112.38 ms, other iteration latency: NA, len of input tokens: 1280, texts number: 64
[ INFO ] [10][P0] First infer latency: 1112.38 ms, other infers latency: NA, inference count: 1
[ INFO ] <<< Warm-up iteration is excluded. >>>
[ INFO ] [Total] Iterations: 10
[ INFO ] [Average] P[0] Input token size: 1280, 1st iteration latency: 1118.38 ms, 2nd iteration latency: NA, 2nd iteration throughput: NA

⚫︎ OpenVINO GenAI text_rerank結果まとめ

OpenVINO GenAI text_rerankを使い、RAGのrerankerに近いワークロードでAMX有効/無効を比較しました。

条件 ONEDNN_MAX_CPU_ISA モデル 候補文書数 Input token size 平均レイテンシ
AMX有効 AVX512_CORE_AMX cross-encoder/ms-marco-MiniLM-L6-v2 64 1280 202.51 ms/prompt
AMX無効 AVX512_CORE_BF16 cross-encoder/ms-marco-MiniLM-L6-v2 64 1280 1118.38 ms/prompt

速度比は以下です。

1118.38 / 202.51 = 約 5.52倍

今回の条件では、OpenVINO GenAI text_rerankにおいて、AMX有効時に約5.5倍の高速化を確認できました。

■ 今回の検証結果まとめ

今回の検証では、OCI VM.Standard4.Ax.Flex上で、AMX有効/無効による性能差を2種類の方法で確認しました。

検証 ワークロード AMX有効 AMX無効 速度比
oneDNN benchdnn BF16 MatMul 4096x4096:4096x4096 695.425 GFLOPS 92.325 GFLOPS 7.5倍
OpenVINO GenAI text_rerank RAG reranker相当、64文書 202.51 ms/prompt 1118.38 ms/prompt 5.5倍

benchdnnではAMXの低レベルなBF16 MatMul性能を確認でき、OpenVINO GenAI text_rerankではRAGのrerankerに近い実AIワークロードでもAMXの効果を確認できました。

今回、OCI VM.Standard4.Ax.Flex 上で Intel AMX の効果を確認したところ、oneDNN benchdnn の BF16 MatMul では約 7.5倍、OpenVINO GenAI text_rerank では約 5.5倍の高速化を確認できました。

特に面白かったのは、AMX の効果が単なる低レイヤーの行列演算ベンチマークだけでなく、RAG の reranker に近い実AIワークロードでもはっきり見えた点です。

AI インフラというと GPU が中心に語られがちですが、実際のシステムでは、CPU 上で動く推論、rerank、前処理、後処理、検索処理、アプリケーション処理も多く存在します。
そのため、CPU 側に AI 向けのアクセラレーション機能があることは、エンタープライズ AI 基盤を考えるうえで非常に重要だと感じました。

OCI X12 Standard Acceleron Compute は、通常の汎用 Compute として利用しながら、Intel AMX による AI ワークロード高速化も期待できるため、GPU を使うほどではないが CPU 推論を高速化したいケースや、RAG アプリケーションの reranker 処理を効率化したいケースに向いていると思います。

今回の検証で、AMX は「CPU に内蔵された地味な機能」ではなく、AI 時代のクラウド・コンピュート性能を支える重要なアクセラレーション機能であることを実感できました。

次は、より大きなモデル、複数 OCPU、実際の RAG パイプライン、Oracle Database との組み合わせなどでも試してみたいと思います。

■ 参考

OCI / 検証環境

Intel AMX / Linux

oneDNN / benchdnn

OpenVINO / 実AIワークロード

AIフレームワーク / ランタイムでのoneDNN・AMX利用例

■ 技術解説

■ おまけ

ChatGPT Image 2026年5月13日 09_34_45.png
おまけ4.png

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?