🦙

【M3mac環境】llama.cppを使ったGGUF変換からOllamaで実行までの手順

2024/12/15に公開

MacでローカルLLMを実行する機会があったため、手順をまとめます。

この記事を読むと

  • MacでOllamaを使ってローカルLLMを動作させられます
  • GGUFファイルがないモデルをllama.cppによって変換してOllamaにインストールできます

なお、GGUFファイルへの変換についてすぐに読みたい人はこちらに飛んでください。

マシンスペック

macbook pro M3Max 64GBです。
例えばメモリ16GBで動作するかは未確認です。

ollamaとは

ローカルでLLMを簡単に実行できるツールです。簡単にモデルのダウンロードや推論の実行ができます。
https://ollama.com

3種類のパターン

OllamaでLLMを動かすには3種類のパターンがあります。上から順に試してみましょう。

【↑簡単】
①ollamaのModelsに公開されているモデルをダウンロードして使う
②huggingfaceに公開されているGGUFファイルを使う
③huggingfaceに公開されているSafetensorsファイルをGGUFファイルに変換して使う
【↓面倒】

①OllamaのModelsに公開されているモデルをダウンロードして使う

最も簡単な方法から試しましょう。

Ollamaのインストール

まずは以下のページからインストーラをダウンロードして実行します。
https://ollama.com/download

実行できたらmacの上部のバーにラマのアイコンが表示されます。特にウィンドウは立ち上がりません。

ターミナルを開き、以下のコマンドを打ってみましょう。

ollama --version 

インストールできていればバージョンが表示されます。

ollama version is 0.5.1

モデルのダウンロード

次にOllamaのHPのモデルの一覧から好きなモデルを探します。
メタのllama3やマイクロソフトのphi3, グーグルのgemma2など、有名どころは揃っています。
https://ollama.com/search

早く使いたくてたまらないと思いますので、今回はgemma2の2bモデルを使ってみます。1.7GBしかなく超軽量なのでダウンロードが早いです。

ollama run gemma:2b


モデルのダウンロードが終わるまで数分待つと、メッセージ入力欄が現れます。

質問する

文字を打ってエンターで送信です。
質問をしてみたところ返答が確認できました。

>>> 日本の首都はどこ?
日本の首都は東京です。

東京は日本の東部に位置し、アジアの東海岸に位置しています。

/byeまたはCntr + dで入力待機状態が終了します。

>>> /bye 
~ %

モデルの確認・変更・削除

ollama listでインストール済みのモデル一覧が表示されます。私の環境ではgemma:2b と先日インストールしたllama3.3:latest が利用可能です。

~ % ollama list
NAME                                                                       ID              SIZE      MODIFIED       
gemma:2b                                                                   b50d6c999e59    1.7 GB    5 minutes ago     
llama3.3:latest                                                            a6eb4748fd29    42 GB     2 days ago        

実行するモデルを変更する場合はモデル名を指定してrunします。

ollama run llama3.3:latest

モデルを削除する場合はモデル名を指定してrmします。

ollama rm gemma:2b

②huggingfaceに公開されているGGUFファイルを使う

OllamaのHPには存在しないモデルを使いたい場合は②の方法を使います。
Ollamaからhuggingface上のファイルを簡単にダウンロードできるようになっているため、操作自体は簡単です。

GGUF形式モデルを探す

モデル名+GGUFで検索すると、有名なモデルであれば大体ヒットします。

公式または有志の方がモデルファイルをGGUF形式に変換してアップロードしてくれています。
日本で有名な方はmmngaさんです。
https://huggingface.co/mmnga

モデルのダウンロード

Ollamaからhuggingface上のファイルを簡単にダウンロードできるようになっているため、操作自体は非常に簡単です。
https://huggingface.co/docs/hub/ollama

今回は日本語LLMのELYZAを使ってみましょう。
これは公式がGGUFファイルを合わせて公開してくれているパターンです。
https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF

実行時のコマンドのモデル名のところに、モデルの公開ページからURLをコピーして「https://」をはずしてペーストするだけです。

ollama run huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF

なお、右上の「Use this model」をクリックして、Ollamaを選び、コマンドをコピーすることもできます。

ダウンロードが実行されます。

~ % ollama run huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
pulling manifest 
pulling 91553c45080b... 100% ▕███████████████████████████████████████████████████████▏ 4.9 GB                         
pulling 475211637354... 100% ▕███████████████████████████████████████████████████████▏ 7.8 KB                         
pulling eef4a93c7add... 100% ▕███████████████████████████████████████████████████████▏  193 B                         
verifying sha256 digest 
writing manifest 
success

実行

①と同じようにモデル名を指定してrunします。

ollama run huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF

動作することが確認できました。

>>> アメリカでIT産業で有名な都市は?
 | IT・コンピューター|知恵袋
「IT・コンピューター」に関する知恵袋の回答です。

IT産業が有名な都市として、アメリカでは以下の都市を挙げることができます。
1. サンフランシスコ(カリフォルニア州):世界に名だたるIT企業、AppleやGoogle、Facebookなどが本社を構えている都市で
、「Silicon Valley」(シリコンバレー)と呼ばれるIT産業の集積地です。 
2. ボストン(マサチューセッツ州):ボストンには、ハーバード大学やマサチューセッツ工科大学など、世界有数の名門大学が
立地し、優秀な人材を供給しています。
3. ニューヨーク(ニューヨーク州):金融やメディアの中心として栄えてきた大都市で、IT企業も多くあります。 
4. シアトル(ワシントン州):マイクロソフトが本社を置く都市です。
5. オースティン(テキサス州):テキサス大学オースティン校のあるこの都市には、多くのIT企業やスタートアップが集積して
います。 
6. ボルチモア(メリーランド州):JHU(ジョンズ・ホプキンズ大学)をはじめとする優秀な研究機関があります。

これらの都市は、有名なIT企業やスタートアップの本社、研究所が集積しているため、世界中から人材や投資が集まっています
。

補足:Modelfileについて

後述のModelfileのテンプレートについて、huggingfaceからダウンロードした際は、GGUFファイル内のデータに基づいてテンプレートを自動で選択してくれるようです。
https://huggingface.co/docs/hub/en/ollama
https://note.com/schroneko/n/n6a7c34f0a50c

③huggingfaceに公開されているSafetensorsファイルをGGUFファイルに変換して使う

GGUFファイルが見つからない場合はどうしたら良いでしょうか。
自身の環境でSafetensorsファイルをGGUF形式に変換すれば利用できます。

なおOllamaで利用できるようにするには

  • GGUF形式のファイル
  • Ollama Modelfile
    の2つが必要です。

以下の記事を参考にさせていただきました。ありがとうございます。
https://zenn.dev/robustonian/articles/llama3_swallow_8b

手順について、上記の記事と全く同一内容になるのを避けるため、Llama-3-ELYZA-JP-8Bを手元でGGUFに変換してOllamaで動作させてみます。
https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

llama.cppのビルド

llama.cppと言うLLMのライブラリをセットアップします。

任意の作業ディレクトリの中でcloneします。
今回は「llm_pj」というフォルダ内で作業します。

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
cmake -B build
cmake --build build --config Release

なお、他の記事ではビルドの際にmakeを実行すると書いてあるのですが、以下のエラーが出て、Cmakeを使えと指示されます。

Makefile:2: *** The Makefile build is deprecated. Use the CMake build instead. For more details, see https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md.  Stop.

https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md

参照先の記述にしたがってCmakeを使っています。

cmake -B build
cmake --build build --config Release

Safetensorsファイル(transformerモデル)のダウンロード

GitLFSをインストールしていない場合は、事前にインストールしておきます。
GitLFS(Git Large File Storage)とは、大規模なファイルを扱う際に本体は別サーバーに保管しておき、参照用のファイルのみをレポジトリに保管しておく機能です。

brew install git-lfs

以下のコマンドでファイルをダウンロードします。
時間がかかる上にインジケーターが表示されないので心配になります。
お使いのネットワーク状況によりますが8Bの場合10〜20分程度は見ておいたほうが良いです。

cd ../
mkdir models
cd models
git lfs install
git clone https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

ダウンロードが完了すると以下のように表示されます。

~/development/llm_pj/models % git clone https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B
Cloning into 'Llama-3-ELYZA-JP-8B'...
remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 36 (delta 8), reused 0 (delta 0), pack-reused 3 (from 1)
Unpacking objects: 100% (36/36), 2.65 MiB | 3.94 MiB/s, done.
Filtering content: 100% (4/4), 2.95 GiB | 8.57 MiB/s, done.

なお、git lfs installはGitLFSを有効化するコマンドで、有効化後にgit cloneすると参照用ファイルの情報を元に本体ファイルがダウンロードされます。

GGUFモデルに変換

仮想環境を作成します。

cd ../
python3 -m venv venv
source venv/bin/activate
python -m pip install -r ./llama.cpp/requirements.txt 

f16-GGUFモデルに変換します。

python ./llama.cpp/convert_hf_to_gguf.py ./models/Llama-3-ELYZA-JP-8B/ --outtype f16 --outfile ./models/Llama-3-ELYZA-JP-8B-f16.gguf

完了するとGGUFファイルが生成されます。

Ollama Modelfileを作成します

cd models
nano Modelfile_Llama-3-ELYZA-JP-8B-f16.txt

今回は以下の記事を参考にこのように記述します。

FROM ./Llama-3-ELYZA-JP-8B-f16.gguf
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token"

https://qiita.com/s3kzk/items/3cebb8d306fb46cabe9f

Ctrl + Xでnanoエディタを終了すると、ファイル名の確認が入るので、enterで確定すると保存されます。

Modelfileについての補足

モデルごとに適切なフォーマットで記述する必要があります。

Llama-3-ELYZA-JP-8BはLlama3がベースになっているため、ollama showで既存のモデルファイルを確認して、それを書き換えるようにすると動作するようです。
https://qiita.com/s3kzk/items/3cebb8d306fb46cabe9f
https://note.com/npaka/n/ndadbae6c6be5

もし参考になる記述が存在しない場合は、こちらのドキュメントを参照しながら記述する必要があります。
https://github.com/ollama/ollama/blob/main/docs/modelfile.md

Ollamaのモデルを作成

以下のコマンドを実行します。
仮想環境の中で実行するようにしてください。

ollama create Llama-3-ELYZA-JP-8B-f16.gguf -f Modelfile_Llama-3-ELYZA-JP-8B-f16.txt

実行すると以下のようになります。

(venv) ~/development/llm_pj/models % ollama create Llama-3-ELYZA-JP-8B-f16.gguf -f Modelfile_Llama-3-ELYZA-JP-8B-f16.txt
transferring model data 100% 
using existing layer sha256:0645a807993252df622a701d85ac3e42d82ce1c58fe6949ac3f635b24332bd74 
using existing layer sha256:8ab4849b038cf0abc5b1c9b8ee1443dca6b93a045c2272180d985126eb40bf6f 
creating new layer sha256:c0aac7c7f00d8a81a8ef397cd78664957fbe0e09f87b08bc7afa8d627a8da87f 
creating new layer sha256:ba4749188695777c79170aa784d2ff2f13ea121d82b97bfc48cb9aa4add172f0 
writing manifest

以下のようにモデルが新たに追加されていることわかります。

(venv) ~/development/llm_pj/models % ollama list
NAME                                                                       ID              SIZE      MODIFIED       
Llama-3-ELYZA-JP-8B-f16.gguf:latest                                        b936590e0fef    16 GB     17 seconds ago
(以下省略)

Ollamaにインストールできたら、これら3つのファイルは削除しても問題ありません。

実行

実際に実行してみましょう。

(venv) ~/development/llm_pj/models % ollama run Llama-3-ELYZA-JP-8B-f16.gguf:latest
>>> イギリスで有名なお茶は何ですか?
イギリスと言えば紅茶の国です。数多くの種類がありますが、特に有名なのは以下のものです。

1. アールグレイ: bergamotの香りが特徴的なフレーバーティー。
2. イングリッシュブレックファスト: ストレートティーの代表格で、ミルクと砂糖を入れて飲むことが多い。
3. リプトン オレンジペコー: 織物商のサックヴィル・テレスフォーヌスがインドで発見したオレンジフラワーの香りが特徴的。

他にも、フォートナム&メイソンやハンスンなどの有名ブランドから、多くの種類のお茶が販売されています。

最後に

Ollamaを使ってローカルLLMを動かす方法を解説しました。
既存の記事で私が詰まった点を踏まえて記載しているため、参考になれば幸いです。

Discussion