ゲーム開発でローカルLLMを使う方法まとめ

はじめに

いままで、幾つかの方法でゲーム開発(Godot)にてローカルLLMを使う方法を記事にしてきました。

記事を書くにあたって調べたことや、記事にしたことを共有したいと思うので、今回のまとめ記事を作りました。

今からLLMを使ったゲーム開発をする方は、どの方法が良いかを考えてみてください。

また、記事作成時点での話なのでご了承ください

対象となるゲームエンジン

この記事では次のゲームエンジンを対象として話していきます。基本的にC系統の言語(C# or C++)が使えれば、ライブラリ化して呼び出せるので、ほとんどのゲームエンジンで利用できると思います。

  • Unity : C#
  • Unreal Engine : C++
  • Godot : C# / C++ / GDScript

また、方法の1つ目であるllamafileを使う方法は、コマンドライン実行に依存するので、ほとんどの言語で使えると思います。

ローカルLLMを使う方法まとめ

本記事で紹介する方法は次の3つです。

  • ローカルLLMの実行ファイルを利用する
  • llama.cppを直接プログラムに組み込む
  • ONNX Runtimeを利用する

各方法についての詳細を書いていきます。

ローカルLLMの実行ファイルを利用する

実装難易度 :

まず1つ目はローカルLLMの実行ファイルを用意し、それをサブプロセスとして実行する方法です。

実行ファイルはllama.cppをビルドすると生成できます。実行ファイルとGUFF形式のモデルデータを用意することで、ほとんどの言語でローカルLLMを利用できます。

GitHub - ggerganov/llama.cpp: LLM inference in C/C++
LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.

また、llama.cppのビルドが面倒であれば、llamafileというダウンロードするだけで利用できる実行ファイルもあります。

GitHub - Mozilla-Ocho/llamafile: Distribute and run LLMs with a single file.
Distribute and run LLMs with a single file. Contribute to Mozilla-Ocho/llamafile development by creating an account on G...

これらの実行ファイルを用意し、各言語のコマンドライン実行関数を呼び出せば、LLMの実行が可能です。

また、llama.cpp(llamafile)の実行ファイルにはサーバーモードがあります。サーバーをサブプロセスとして実行し、http通信をすることで、LLMの結果を順次受け取るなどの操作がしやすくなります。

以下の過去記事を参考にしてください。Godotで動かした話ですが、ほとんどのゲームエンジンで転用できると思います。

llama.cppを直接プログラムに組み込む

実装難易度 :

2つ目の方法はllama.cppを外部ライブラリとして、プログラムに組み込むことです。

llama.cppは名前の通りC++で書かれているため、C++のライブラリとして組み込むことが可能です。

また、他の言語のラッパーも多数存在しています(公式ページにラッパー一覧が書いてあります)。

これだけあれば、ほとんどのゲームエンジン言語で組み込むことが可能です。

この方法は、1つ目の実行ファイルとして呼び出す方法と比べると、ソフトの安定性が確保されます。なぜなら、「外部プログラムが何らかの要因で止まる」などの外的要因が無いからです。

ただし、ライブラリとして組み込むということは、ライブラリの登録、ドキュメントの理解などの知識が必要になります。また、記事も殆ど無いので、エラーに対処する方法も自分で考えなければなりません。

過去にGodotでllama.cppのC#ラッパーであるLLamaSharpを組み込んだ話を記事にしています。C#はC++より外部ライブラリの登録が簡単なので、おすすめです。

また、この記事の内容はLLMの実行のみをC#で書いているため、容易にUnityへの移植が可能です。

ONNX Runtimeを利用する

実装難易度 :

3つ目の方法としてONNX Runtimeを利用するというものがあります。

ONNX Runtime | Home
Cross-platform accelerated machine learning. Built-in optimizations speed up training and inferencing with your existing...

これを利用すればONNX形式のモデルが実行できるようになります。

C++やC#、Java, Python, Objective-Cなどにも対応しているので、様々なゲームエンジンに組み込むことが可能になります。

また、C#であればMicrosoftのMicrosoft.ML.OnnxRuntimeGenAIを利用することで更に簡単に実装ができます。簡単なガイドも公開されているので、それに沿うだけで利用可能です。

ONNX Runtime Generative AI を使用する Windows アプリで Phi3 やその他の言語モデルの使用を開始する
Phi3 モデルと ONNX Runtime Generative AI ライブラリを使用する WinUI 3 アプリを作成する方法について説明します。

これらの話をGodotのC#で書いた記事がこちらになります。

もちろんUnityにも移植ができるように書いてあるので、参考にしてください。

この方法のメリットは、ONNX形式のモデルが利用できることであり、GUFF形式に対応していないモデルも利用できることにあります。

また、WindowsであればDirectMLが利用できるため、CUDAを入れなくてもGPU利用ができるようになります。LLamaSharpでGPUを利用しようとするとひと手間かかります。

一方で、ONNX Runtimeは煩雑なドキュメントとなっており、エラーが出た場合に原因を救命するのは、かなり大変です。

逆に利便性だけで言ったら、2つ目のLLamaSharpのほうが簡単にできるので、そちらを利用するのが簡単だと思います。

それと、ONNX RuntimeはLLM以外の機械学習モデルも動かせるため、ONNX Runtimeを実装すれば、LLM以外のモデルも利用できます。

Inference with C#
ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator

まとめ

今回はゲーム開発でローカルLLMを使う3つ方法をまとめました。

おすすめとしてはとりあえず、1つ目の実行ファイルでLLMを利用する方法を試した後に、2つ目もしくは3つ目を試すのが良いと思います。1つ目の方法はほぼ失敗しないですし、かなり簡単に実装できます。

この記事を参考にした誰かが、LLMを利用したゲームが作り、ゲーム増えていくことを願っています。

タイトルとURLをコピーしました