Open8

ONNX Runtime GenAIをUnityで動かす実験

Koki IbukuroKoki Ibukuro

OnnxRuntime を動かす実験のログは以下のScrapに↓
https://zenn.dev/asus4/scraps/2c17b71ffd5552

最近気付いた Onnx Runtime Generative AI package。
https://github.com/microsoft/onnxruntime-genai

良さそうなonnxモデルを見かけてpythonコードを見ても、メインの実装はOnnxRuntimeでやっていても、結局 pre-processingをHuggingFace/Transformersに依存していて、モバイル移植できない〜。みたいな経験が多く。

ONNX Runtime GenAIは tokenizer などの実装を C++で実装して、C# 用FFIインターフェースが出ている。
NuGetにビルド済ライブラリが公開されている。など今の私のニーズに合っている気がしたので、Unity C#から動くか実験して見ますというログ

Koki IbukuroKoki Ibukuro

macOS用ライブラリをつかって、ライブラリを起動してみると、UnityEditorごとクラッシュ。

  • libonnxruntime.dylib
  • libonnxruntime-genai.dylib
    を同じフォルダに置くと起動するので、 .dylibを探すのに失敗しているらしい。

ソースコードを読み込むと、ORT_LIB_PATH という環境変数を設定すれば良さそう。

https://github.com/microsoft/onnxruntime-genai/blob/a763c441713ef0623a35240ec90f4311f1da35e8/src/models/onnxruntime_api.h#L230-L270

Koki IbukuroKoki Ibukuro

macOS は動いた!

iOSはstatic linkされてるはずなのに、dylibを呼ぼうとしてクラッシュするな。わからん

Library not loaded: @rpath/onnxruntime-genai.framework/onnxruntime-genai
Koki IbukuroKoki Ibukuro

C#からアクセスされるUnityFramework.frameworkへembedしてみると以下のエラーが出る。コードサイン周りのエラーである。実装的にはC#からアクセスするためにはUnityFramework.framework へリンクされていなくてはいけないが何か回避策は無いだろうか…。

'/...../onnxruntime-unity-examples.app/Frameworks/UnityFramework.framework/Frameworks/onnxruntime-genai.framework/onnxruntime-genai' (code signature in <.....> '/private/var/containers/Bundle/Application/...../onnxruntime-unity-examples.app/Frameworks/UnityFramework.framework/Frameworks/onnxruntime-genai.framework/onnxruntime-genai' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.),

と探っていて、UnityFramework.frameworkへはembedなしでリンク。Unity-iPhone本体ターゲット側にembed + signで埋め込み。で起動までは確認した。


該当コードは以下。

https://github.com/asus4/onnxruntime-unity/blob/1512078d6f226c61b396a41da3226387a9ae63ae/com.github.asus4.onnxruntime/Editor/OrtPostProcessBuild.cs#L55-L65

この処理が正しいかは自信ないが、起動するようになったので先に進める。

Koki IbukuroKoki Ibukuro

モデルの最適化 (for CPU)

CUDA, DirectML対応のonnxモデルは提供されているが、モバイルでの可能性も調べたいので、CPU版も試しておきたい。

動画でつかったモデルは、int4 quantized CPU optimized モデル
https://huggingface.co/microsoft/Phi-4-mini-instruct-onnx

https://huggingface.co/microsoft/Phi-4-mini-instruct-onnx/tree/main/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4

マルチモーダルも試してみようと、こちらを試してみたのだが、GPU用のモデルしか提供されてないため残念な速度。
https://huggingface.co/microsoft/Phi-4-multimodal-instruct-onnx

自分でCPU版を生成するのはoliveを使ってできるのかな?試してみよう。

https://onnxruntime.ai/docs/genai/tutorials/deepseek-python.html