KaitoAccelLab

書庫の圧縮・展開に GPU / NPU が使えるかを確かめた実験室

A lab testing whether the GPU and NPU can speed up archive codecs

対応環境
Apple Silicon の Mac / Swift(計測機は M4 Max、macOS 27、Xcode 27)
最新リリース
準備中
ライセンス
MIT
言語
Swift
更新
2026-09-29

GitHub で見る

KaitoAccelLab は、M4 Max の GPU(Metal 4)と NPU(Apple Neural Engine、Core ML)が書庫の圧縮・展開に使えるかを検証した実験室です。KaitoKit / GyoshukuKit の姉妹リポジトリで、ここで試した経路は製品には合流させていません。

結論から書くと、どの経路も CPU より速くなりませんでした。現在の macOS の圧縮・暗号ライブラリ(Apple Compression、CommonCrypto、MTLIO の展開)と KaitoKit / GyoshukuKit は CPU だけで動いており、GPU / NPU は寄与していません。

GPU では、独立 block の LZ4 復号、histogram、CRC-32 が動き、出力は byte 単位で一致しました。ただし LZ4 復号は CPU 16 lane の 0.15〜0.6 倍にとどまり、GPU 1 thread は CPU 1 core の 1/350 でした。

NPU では、GRU の byte 予測器と range coder を組み合わせた lossless codec が符号化・復号ともに動き、全 op が ANE で実行されました。学習した domain では PPMd を超える圧縮比を出しますが、速度は 0.24〜0.65 MB/s と既存 codec より 2 桁遅く、符号化と復号の compute unit を揃える必要もあります。

一方、副産物として見つけた CPU 側の伸びしろ(xz の block 並列復号、単一 stream bzip2 の block 単位並列)は KaitoKit 本流で実現し(PR #41、PR #42)、tar.xz の staging は 5〜6.7 倍、tar.bz2 の staging は 5.5〜6 倍になりました。

詳しい数字は速度レポートと解説にまとめ、生の計測は Results/ に残しています。

特徴

  • LZ4 の GPU 復号: LZ4 frame の解析、CPU 参照復号、Metal の block 並列復号 kernel(thread-per-block / SIMD-per-block)を Sources/AccelLab/LZ4 に収めています
  • 神経 codec(NBC1): range coder、頻度量子化、byte 予測器 protocol、Core ML 予測器(MLP / GRU)、神経 block codec を Sources/AccelLab/Neural に収めています
  • デモ用の pack / unpack: directory を tar(GyoshukuKit)にまとめ、神経 codec か LZ4 で圧縮して KADM container に書き出します。展開は KaitoKit で行います
  • 基準値と可動確認: CPU 基準値の計測と Metal の可動確認(Baseline.swift、MetalProbe.swift)を備えています
  • 補助スクリプト: ANE probe、GPU byte kernel、MTLIO probe、liblz4 比較器、model の学習 / 書き出し(Python、coremltools)を Scripts/ に置いています
  • コマンドライン accel-lab: probe / baseline / lz4-make-frame / lz4-gpu / demo-pack / demo-unpack のサブコマンドで、各経路を個別に試せます

対応環境と入手方法

リリースの配布はありません。ソースを clone してビルドします。計測機は Apple M4 Max(12P + 4E、GPU 40 core、ANE 16 core、128 GB)です。ライセンスは MIT です。

ソースからビルド

../KaitoKit と ../GyoshukuKit を同じ親 directory に checkout してから、次を実行します。

swift build -c release
swift test
.build/release/accel-lab probe
.build/release/accel-lab baseline --size 256 --rounds 5
.build/release/accel-lab lz4-make-frame <in> <out.lz4> --block-size 4096
.build/release/accel-lab lz4-gpu <out.lz4> --rounds 5

神経 codec を試す

Core ML model(Models/*.mlmodelc)は git 管理外で、リポジトリに入っている学習済み重み Models/*.pt から書き出します(Python、coremltools、torch)。

python3.12 -m venv .venv && source .venv/bin/activate && pip install coremltools torch numpy
python Scripts/train_gru_predictor.py <corpus> Models/gru-mixed-h1536 0 1536 256 1024
xcrun coremlcompiler compile Models/gru-mixed-h1536-b1024.mlpackage Models/
.build/release/accel-lab demo-pack <dir> out.kadm --neural --blocks 1024 --gru Models/gru-mixed-h1536-b1024.mlmodelc --units ane
.build/release/accel-lab demo-unpack out.kadm <outdir> --gru Models/gru-mixed-h1536-b1024.mlmodelc --units ane