CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

GGUFファイルで保存されたLLMをOllamaで読み込んで使う方法を調べてみました。

こんにちは、CCCMKホールディングスTECH LAB三浦です。

7月中旬に入り、この頃は夏らしい日が増えてきました。特にセミの鳴き声が聞こえると、「夏だなぁ」と感じます。毎年夏になると、何か一つでも思い出に残ることをしたいなぁという気持ちになり、今年は何をしようかな、と考えています。

以前Jetson AGX Orinというエッジデバイス上でOllamaというツールを使ってLLMを動かしてみた話をご紹介しました。

techblog.cccmkhd.co.jp

その際はOllamaのModel Registryに登録されているLLMを選択し、ダウンロードして動かしてみたのですが、それ以外のLLMでも"GGUF"という形式でモデルファイルを出力すればOllamaで動かせることを知りました。今回はその具体的な方法について調べたことをご紹介したいと思います。

GGUFって?

そもそも"GGUF"ってなんだろう、と疑問に思ったので、まずそこから調べてみました。GGUFはC言語の機械学習ライブラリ"GGML"で使用される機械学習モデルを読み込むためのバイナリ形式のファイルで、高速に読み書きが可能です。さらに1つのファイルの中にモデルの重みだけでなくモデルそのもののメタ情報も格納できるようになっていて、1ファイルだけで読み書きが完結する点が大きな特徴です。GGMLライブラリはollamaの推論処理を実行するllama.cppというフレームワークの中で使用されており、ollamaもまたGGUF形式のファイルからモデルを使用することが可能です。

参考にさせて頂いたのはこちらのページです。このページの中にはGGUFファイルの構造や命名規則なども掲載されています。

github.com

GGUFファイルを取得する

GGUFファイルはたとえばHugging Faceでいくつか公開されていて、そのファイルをダウンロードすることで入手出来ます。またPyTorchのモデルをGGUFに変換する方法もありそうなのですが、こちらの方法はまだ試せておらず、今後詳しく調べていきたいと思っています。

さて、今回はELYZA株式会社がHugging Faceで公開している"Llama-3-ELYZA-JP-8B-GGUF"というLLMのGGUFファイルを使わせて頂きました。

huggingface.co

このページの中にある"Files and versions"タブをクリックすると関連するファイル一覧が表示されます。一覧から"Llama-3-ELYZA-JP-8B-q4_k_m.gguf"を見つけ、その横に表示されている"Download file"をクリックすると、ファイルをダウンロードすることが出来ます。

Ollamaで使えるようにする

Modelfileの作成

OllamaではModelfileを記述することで新しいモデルを追加することが出来ます。私は先ほどダウンロードしたGGUFファイルと同じディレクトリ階層に"Modelfile"というファイル名で以下の内容を記述しました。

FROM ./Llama-3-ELYZA-JP-8B-q4_k_m.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|>"

FROMでベースとなるGGUFファイルのパスを指定します。TEMPLATEはユーザーの入力をそれぞれのモデルの入力に適した形式に整形してプロンプト化するために必要です。どんなTEMPLATEを使ったらいいのかを確認する方法ですが、まずHugging FaceでGGUFファイルをダウンロードするページの以下の図の部分をクリックすると表示される、モデルのメタ情報に含まれているtokenizer.chat_templateの値を参考にしました。

赤丸で囲った箇所をクリックするとモデルのメタ情報が表示されます。

ただこの値はOllamaのTEMPLATEとは互換性がなくそのままでは使えなかったため、OllamaのModelfileについての説明ページに掲載されているTEMPLATEの作成例を見て確認しながらModelfileに記載しました。

github.com

PARAMETER stopはその単語が出現したら文章の生成を停止させるための設定です。

モデルの作成

Modelfileの作成が完了したら、Ollamaが稼働している状態で次のコマンドをWindowsならPowershellなどで実行します。このコマンドはModelfileと同じ階層で実行します。また、createに続くパラメータでモデルに付ける名前を設定しています。

ollama create llama-3-elyza-8b -f Modelfile

モデルを呼び出す

モデルを作成したら、Ollamaが起動していればWeb APIで使用することが可能になります。たとえば次のように使用することが出来ます。

curl http://localhost:11434/api/chat -d '{
  "model": "llama-3-elyza-8b",
  "messages": [
    {
      "role": "system",
      "content": "あなたはとても厳格な口調のアシスタントです。"
    },
    {
      "role": "user",
      "content": "おにぎりの美味しい作り方を教えてください。"
    }
  ],
  "stream": false,
}'

次のような結果が返ってきました。とても厳格におにぎりの作り方を教えてくれました。

{
  "model": "llama-3-elyza-8b",
  "created_at": "2024-07-18T07:15:16.5827795Z",
  "message": {
    "role": "assistant",
    "content": "おにぎりを作るということは、基本的な料理のスキルが問われる行為だ。手抜きや適当さは許されない。...(中略)\n\n以上が私の教えだ。お前はこれを守る義務があると心得よ。"
  },
  "done_reason": "stop",
  "done": true,
  "total_duration": 28484152800,
  "load_duration": 25478700,
  "prompt_eval_count": 48,
  "prompt_eval_duration": 1222592000,
  "eval_count": 287,
  "eval_duration": 27231968000
}

まとめ

ということで、今回はGGUF形式のモデルをOllamaで使う方法について調べてまとめてみました。GGUFは1つのファイルで必要な情報が完結しているので、とても扱いやすいな、と感じました。今度はPyTorchなどで保存したモデルファイルからGGUFにどのように変換をするのかなど、調べてみたいと思います!