今回は、Llama.cppというツールを使用して、量子化したOSSのLLMモデルを自宅環境で動作させる事が出来る環境構築の手順を紹介したいと思います。
Llama.cppとは?
Llama.cppプロジェクトは、元々は大規模言語モデル「Llama」をC++で効率的に実行するために開始されたオープンソースプロジェクトです。最初のLlamaから始まっているので、大分年季が入っているプロジェクトですが、最新の更新日付が常に更新され続ける程、未だに活発に開発が続けられている人気プロジェクトです。
https://github.com/ggerganov/llama.cpp/tree/master
また、Llama.cppは、Llamaモデルを最大限に活用するために設計されたライブラリであり、特にリソース制約のある環境(低スペックのマシンやGPU非搭載のマシン)でも動作するよう最適化されています。その最適化の手段の一つとして、モデルの量子化にも対応しており、推論時の計算コストを大幅に削減することが可能です。このような特性により、Llama.cppは幅広い用途で利用されています。
Llama.cppの特徴と利点
以下に、Llama.cppの特徴と利点をリスト化しました。
- 軽量な設計
Llama.cppはC++で記述されており、他の高レベル言語で書かれたライブラリに比べて軽量です。これは、低スペックなマシンやメモリリソースが限られている環境で特に有用です。たとえば、従来のLLMが動作しにくい低スペックなGPU搭載機や、GPUがそもそも無い環境でも、Llama.cppは少ないリソースで高効率に動作します。
- 量子化対応
Llama.cppでは、モデルを量子化することで、モデルサイズを大幅に縮小することができます。量子化は特に、推論時のメモリ使用量を削減する効果があり、これによりCPU上でも高速に動作します。例えば、従来の32ビット浮動小数点(FP32)や16ビット(FP16)から、8ビット(Q8)や4ビット(Q4)といったサイズに圧縮することが可能です。量子化されたモデルは、メモリ消費量が少なくなるだけでなく、推論速度も向上します。
どの程度の量子化が良いのか?などはLlama.cppのReadMeにも記載があるので、参考にしつつ、自分の動かしたい環境のスペックに見合うものを選択する事が重要です。 - クロスプラットフォーム対応
Llama.cppは、Windows、macOS、Linuxといった複数のプラットフォームに対応しています。特にmacOSでは、Apple Silicon(M1/M2/M3)チップのMetal APIを活用することで、非常に高いパフォーマンスを発揮します。また、NVIDIAのGPUを搭載したマシンでは、CUDAを使用して高速な推論を行うことができますし、AMDのGPU向けの最適化など、多岐にわたる環境へ対応する事が可能です。 - 簡単なビルドと導入
Llama.cppの導入は非常に簡単であり、MakeやCMakeを使った柔軟なビルドシステムにより、異なるプラットフォームやバックエンドの違いにも対応できます。複雑な依存関係を持たないため、必要なライブラリを簡単にインストールし、短時間でセットアップを完了させることが可能です。
Llama.cppのビルド方法
まず、前提としてC/C++のコンパイラーやmake(かcmake)を事前にインストールする必要があります。
makeに必要なものがインストール済みであれば、あとはGithubから最新のリポジトリをcloneしてmakeするだけでビルドが完了します。とても簡単です。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make
Windows環境や、その他特殊な環境の方はCmakeの方が環境依存部分を柔軟に吸収してくれるので良いでしょう。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release
makeとcmakeには、それぞれビルドオプションがあります。
上記の場合だと、CPUでの実行のみとなりGPUで処理してくれません。
・CUDAの場合
# makeの場合
make GGML_CUDA=1
# cmakeの場合
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
・METAL(mac環境)の場合
# makeの場合
make GGML_METAL=1
# cmakeの場合
cmake -B build -GGML_METAL=ON
cmake --build build --config Release
上記以外にも様々なオプションがありますので、AMDのGPU環境やAndroidOSなど特殊環境向けは下記のオフィシャルドキュメントを参考にしてみて下さい。
https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md
量子化されたモデルを実行する
makeした場合は、makeを実行したディレクトリ直下にコンパイルされた実行ファイルなど各種のファイルが配置されます。
cmakeの場合は、llama.cppをクローンしたディレクトリにbuild/というディレクトリが作成され、bin/ディレクトリ内部にコンパイルされた実行ファイルなどが配置されます。
まず、モデルをダウンロードします。
今回はgemma2の2b-jpn-itという、日本語ファインチューニングがされているモデルの4ビット量子化されたモデルをダウンロードします。
# モデルを置いておく好きなディレクトリを作成して下さい。
mkdir models
wget -O models/gemma-2-2b-jpn-it-Q4_K_M.gguf https://huggingface.co/alfredplpl/gemma-2-2b-jpn-it-gguf/resolve/main/gemma-2-2b-jpn-it-Q4_K_M.gguf?download=true
下記コマンドでモデルを実行します。
./llama-cli -m models/gemma-2-2b-jpn-it-Q4_K_M.gguf -p "pythonを使って、スネークゲームを作成して下さい。"
これで、Pythonプログラムが出力されるはずです。
-cnvを追加すると、チャットライクな対話式のインターフェースで会話を続けていく事が出来ます。
公式のドキュメントでオプション一覧がありますので、色々と試してみて下さい。
まとめ
今回は、Llama.cppを用いたローカルLLMの実行環境構築をご紹介しました。
実は、様々なセットアップが面倒な場合は「llama-cpp-python」という、llama.cppをpythonでラップしているpipでインストール出来るライブラリをインストールするだけで、内部ではllama.cppも自動でビルドされて楽だったりします。
ただ、llama.cppは冒頭で紹介した通り、とても更新が早いプロジェクトであるので、なるべく最新版を試したい私のような人の為に、敢えてビルドインストールする方法をご紹介しました。
llama.cppは様々な有名なプロジェクトの内部エンジンとしても採用されています(例えばOllamaなど)。
rust版やnodeJS版など、様々な言語ラッパーも存在しますので、興味のある方は是非調べてみて下さい。