前提
過去記事
この Phi-3.5-mini-instruct を ONNX 化する記事の Phi-4 版です。
従って手順は簡易的に書いておりますので、、詳細は上記記事をご覧ください。
やりたかったこと
Hugging Face に置いてある Phi-4 のモデルを ONNX に変換して C# のコードから呼び出すこと。
今までの状況
比較的シンプルに変換可能なツールである onnxruntime-genai が、Phi-4 に対応していなかった。(詳細は下記の Issue を参照)
最新のツールの対応状況
onnxruntime-genai の開発が進み、v0.6.0rc1 で Phi-4 にも対応しました。
この記事では、上記の RC 版を使って Phi-4 を ONNX に変換する方法を紹介します。
手順
モデル変換用マシンの準備
Phi-4 のモデルは Phi-3.5 に比べて大きいため、変換時に要求するメモリの空き領域も大きいです。メモリ不足の環境で変換を実施した場合、モデルをロードするためのプロセスの途中("Loding checkpoint shards"
) の処理の途中で変換ツールが強制終了されてしまいます。当方が動作検証した環境としては、128GB 程度のメモリを搭載したマシンが必要なようでした。
Azure の契約をお持ちの方でしたら、Standard D32ads v5 (32 vcpu 数、128 GiB メモリ)
あたりのサイズを選ぶとメモリの搭載量としては充分かと思います。
また、現状 Pypi 経由でセットアップ可能なパッケージには Linux 版と MacOS 版しかないため、OS としてはそれらの OS を選ぶ必要があります。
以下、当方が検証に利用した VM のスペックをまとめます。
- VM Size : Standard D32ads v5 (32 vcpu 数、128 GiB メモリ)
- VM OS : Ubuntu 24.04
環境セットアップ用のコマンド一式
Ubuntu 24.04 では、Python 3.12 がプリインストールされていますので、HuggingFace CLI のセットアップ以降のツールセットアップ手順を実施する必要があります。実行すべきコマンドは以下の通りです。
python3 -m venv .venv
source .venv\bin\Activate
pip install --upgrade huggingface_hub
pip install torch transformers onnx onnxruntime
pip install onnxruntime-genai==0.6.0rc1
Hugging Face CLI へのログイン
Hugging Face CLI にログインしましょう。Hugging Face のポータルで生成できるトークンを入力せよ、と言われるので、指示通りにすすめます。
huggingface-cli login
Login successful
の出力がでたら、Hugging Face CLI の準備は完了です。
Model Builder の動作確認
以下のコマンドを入力し、きちんと Model Builder が動くことを確認します。
python -m onnxruntime_genai.models.builder --help
usage: builder.py [-h] [-m MODEL_NAME] [-i INPUT] -o OUTPUT -p {int4,fp16,fp32} -e {cpu,cuda,dml,web} [-c CACHE_DIR]
[--extra_options KEY=VALUE [KEY=VALUE ...]]
options:
-h, --help show this help message and exit
<以下略>
モデル変換
以下のコマンドで、Phi-4 のモデルを CPU で動作する ONNX のモデルに変換可能です。
python3 -m onnxruntime_genai.models.builder -m "microsoft/phi-4" -o Phi-4-onnx-cpu-int4 -p int4 -e cpu -c cachedir
コマンドラインオプションを変えることで、量子化についての設定や、CUDA や DirectML への対応も可能です。
このコマンドを実行すると、-o
オプションで指定したディレクトリの下に ONNX に変換されたモデル一式のファイルが保存されているはずです。
動作確認
ONNX 形式の Phi-3 モデルをロードして Completion を試す簡単なサンプルは、同僚の物江さんが作ったものに日本語解説までついているので、こちらをご参照ください!サンプルの解説では Phi-3 の話をしていますが、Phi-4 でも同様の手順でモデルだけ差し替えれば CPU 版モデルの動作確認はできました。
まとめ
今回の手順で、Phi-4 を INT4 で量子化したうえで ONNX に変換することが可能なことが分かりました。
余談
本当は、Olive を使った方が量子化の設定を細かく出来たりするので、こっちでそのうち試してみたいところ。。。