Oracle Cloud Infrastructure(OCI)は、Intel Xeon 6プロセッサーを搭載した X12 Standard Acceleron Compute インスタンスを提供しています。

AI、データ集約型アプリケーション、最新のマイクロサービスによってクラウドワークロードが進化し続けるにつれ、より高いパフォーマンス、改善された効率性、そして優れた価格性能比を提供するコンピューティングプラットフォームを必要としています。
Intel® Advanced Matrix Extensions(AMX)により、AIアクセラレーション機能を内蔵し、BF16 や INT8 の行列演算を高速化でき、自然言語処理、チャットボット、レコメンデーションエンジン、画像認識などのAIワークロードのパフォーマンスが大幅に向上します。

AMXは、32ビット浮動小数点演算の範囲を半分の容量で維持するBF16、精度を多少犠牲にしてもスループットを最大化するINT8、そして両者のバランスが取れたFP16など、複数のデータ形式をサポートしています。
AMX は、8 つの 1KB タイルレジスタ (行列データ専用のオンチップメモリ) とタイル行列乗算ユニット (TMUL - 行列計算専用ハードウェア) で構成されており、プロセッサーはサイクルあたり 2048 回の INT8 演算または 1024 回の BF16 演算を実行できます。これらのタイルレジスタは効率的な行列ストレージを提供し、メモリアクセスオーバーヘッドを削減し、ニューラルネットワークの中核となる行列演算の計算効率を向上させます。実際の顧客ワークロードにおいては、これにより、トランスフォーマーモデル、レコメンデーションシステム、自然言語処理タスクの推論時間が大幅に短縮されるとともに、リソース利用率の向上とインフラストラクチャ要件の低減により、総所有コストが削減されます。

また、Intel® oneDNN(oneAPI Deep Neural Network Library)は、AIやディープラーニング(深層学習)の処理をインテル製CPUやGPU上で劇的に高速化するためのオープンソースのクロスプラットフォーム・ライブラリです。
oneDNNやAMXは、PyTorch、TensorFlow、ONNX Runtime、OpenVINO などの CPU最適化にも関係するディープラーニング向けライブラリです。
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段階で行います。
- oneDNN の
benchdnnを使用した BF16 MatMul の低レイヤー性能確認 - OpenVINO GenAI
text_rerankを使用した RAG reranker 相当の実AIワークロード確認
単なるカタログスペックではなく、実際に OCI 上で環境を作成し、コマンドを実行して、AMX の効果を確認してみます。
目次
-
検証環境作成
-
oneDNN benchdnn使用した AMX効果確認検証
-
OpenVINO GenAI text_rerankを使用した実AIワークロード検証
-
今回の検証結果まとめ
-
参考
-
技術解説
-
おまけ
■ 検証環境作成
⚫︎ 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]を選択

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

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

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

5) Create compute Instance: Security画面

6) Create compute Instance: Networking画面

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

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

⚫︎ CPUとAMXフラグ確認
lscpuでCPUモデル、論理CPU数、スレッド構成を確認します。
続いて/proc/cpuinfoのflagsからamx_bf16、amx_int8、amx_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パッケージを更新し、gcc、gcc-c++、cmake、makeなど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-develとpython3-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パッケージのインストールを安定させるため、pip、setuptools、wheelを更新します。
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内でlibとlib64の両方が見えるため、optimum-cli export openvino実行時に以下のエラーが出る場合があります。
argparse.ArgumentError: argument {onnx,openvino}: conflicting subparser: onnx
そのため、変換前にoptimum-cliのサブコマンド登録パス重複を回避します。cdとsourceは以降の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 / .binとopenvino_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_VERBOSEとunset 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 / 検証環境
- Announcing OCI X12 Standard Acceleron Compute: Next-Gen Performance with Intel Xeon 6
- OCIコンピュート・シェイプ
Intel AMX / Linux
- Intel Advanced Matrix Extensions Overview
- Linux Kernel Documentation: Using XSTATE features in user space applications
oneDNN / benchdnn
- oneDNN GitHub Repository
- oneDNN benchdnn README
- oneDNN benchdnn MatMul Driver
- oneDNN Matrix Multiplication Primitive
- oneDNN CPU Dispatcher Control
- oneDNN Verbose Mode
OpenVINO / 実AIワークロード
- OpenVINO GenAI: Text Reranking
- OpenVINO GenAI llm_bench README
- CPU Dispatcher Control for OpenVINO Inference Runtime Execution
- OpenVINO CPU Device
- Hugging Face Optimum Intel
AIフレームワーク / ランタイムでのoneDNN・AMX利用例
- PyTorch: Accelerating Inference on x86-64 Machines with oneDNN Graph
- PyTorch Recipe: Leverage Intel Advanced Matrix Extensions
- TensorFlow Mixed Precision Guide
- ONNX Runtime: oneDNN Execution Provider


