Ollamaで広がるローカルLLMの世界 - GGUF形式モデルのインポート方法

これまでOllamaを使用して比較的容易にローカルLLMモデルを使用することをやってきました。ここまで来ると未対応のLLMモデルを使用したくなってきます(よね😊)。

そこで、OllamaのREADMEファイルを読んでいったところ

github.com

Import GGUFという項目がありました。

GGUFとは LLMモデルllamma.cppから使用できるようにしたバイナリ形式のファイルになります。現在はこのファイル形式で使用できる処理系も増えてきています。HuggingfaceでもGGUF形式のファイルが公開されていて、それをOllamaからロードしてすることができるようになります。デフォルトで対応したLLMモデルは少ないのですが、GGUF形式まで含めると数多くのモデルが使用できます。

参考

huggingface.co

自分も話題になっていたrinna楽天サイバーエージェントのモデルを使ってみたいと思っていたので、今回はこの使い方を含めてまとめてみたいと思います。

GGUF形式LLMモデルの準備

まずは今回使用していくGGUF形式LLMモデルを探していくことになります。Huggingfaceから探すのが良いです。注意点としてはすべてのLLMモデルGGUF形式で公開されているわけではないので、そのあたりは気をつけましょう。公式でなくても形式変換を行っている方もいらっしゃるので、そちらを使用するのもいいでしょう。今回は多くのLLMモデルGGUF形式に変換して公開されているmomongaさんのGGUF形式のファイルを称させていただこうと思います。ありがとうございます🙏

huggingface.co

今回はChat機能を持つ以下の3つのLLMモデルをを使ってみたいと思います。

huggingface.co

huggingface.co

huggingface.co

準備と言ってもGGUF形式のファイルのダウンロードして、Dockerのコンテナから参照できるフォルダへのコピーとなります。

上記のリンクを開き、モデルのページの【Files and Versions】をクリックし、該当するモデルのリストにある【↓】ボタンをクリックしてモデルのダウンロードを行います。モデルファイルのファイルはサイズが大きいので注意してください。

これでGGUF形式LLMモデルをダウンロードできました。これで準備はOKです。ダウンロードしたファイルはDocker起動コマンドでマウント指定するフォルダに移動しておきましょう。

例えば、以下のようにDockerコンテナを起動した場合には-vで指定したフォルダに格納します。

Ubuntu等の場合は以下のように起動している場合には~/ollamaディレクトリに格納します。

$ docker run -d --gpus=all -v ~/ollama:/ollama -p 11434:11434 --name ollama ollama/ollama

Windowsでは以下のように起動するとC:\ollamaフォルダに格納します。

PS> docker run -d -v /c/ollama:/ollama -p 11434:11434 --name ollama ollama/ollama

以降はUbuntuで使用した例を記述していきますが、Windows側の作業フォルダが違うだけなので適宜読み替えてもらえればと思います。

DockerコンテナからダウンロードしたGGUF形式のLLMモデルの確認

ではDockerOllamaコンテナを起動して事前の状態を確認をします。

# コンテナの起動
$ docker start ollama

# ダウンロードしたモデルの確認()
$ docker exec -it ollama ls /ollama

# 現在のモデルの状態(元の状態)
$ docker exec -it ollama ollama list
NAME                ID              SIZE    MODIFIED    
granite-code:8b     998bce918de0    4.6 GB    2 weeks ago    
codegemma:latest    0c96700aaada    5.0 GB    2 weeks ago    
codellama:latest    8fdf8f752f6e    3.8 GB    2 weeks ago    
gemma2:latest       ff02c3702f32    5.4 GB    2 weeks ago    
llama3.1:latest     91ab477bec9d    4.7 GB    2 weeks ago

ちゃんとダウンロードしたファイルが確認できています。

設定ファイル(Modelfile)の作成

GGUFファイルollama createコマンドを使用し、設定ファイルを使うことで導入ができます。この設定ファイルをModelfileといいます。-fオプションでファイル名(パスも含めて)の指定を行うことが可能です。

このファイルはカスタマイズできる様になっていますが、今回はオリジナルのモデルとするためにfromのエントリを作成するだけにしたいと思います。ファイルに以下の様な1行を書き込みます。

最も簡単なモデルファイルの例

form 【パス付きのモデルファイル名】

今回はModelfileをモデルと同じパスに作成します。(/ollma/ディレクトリに作成)

Modelfile_rinna

from /ollama/rinna-youri-7b-chat-gguf

Modelfile_Rakuten

from /ollama/RakutenAI-7B-chat-gguf

Modelfile_CA

from /ollama/cyberagent-calm2-7b-chat-gguf

モデルファイルのダウンロードと、modelfileの作成ができれは準備完了です。

GGUFファイルからモデルの取り込み

GGUFファイルからのモデルの取り込みはollama createコマンドで行います。起動は以下のように行います。 使用時のモデルはわかりやすい名前をつけておくとよいでしょう。

$ docker exec -it ollama ollama create 【使用時のモデル名】 -f 【パス付きのModelfile名】
# rinna-youri-7b-chat-gguf
$ docker exec -it ollama ollama create rinna-youri-7b-chat -f /ollama/Modelfile_rinna

# RakutenAI-7B-chat-gguf
$ docker exec -it ollama ollama create RakutenAI-7B-chat -f /ollama/Modelfile_Rakuten

# cyberagent-calm2-7b-chat-gguf
$ docker exec -it ollama ollama create cyberagent-7b-chat -f /ollama/Modelfile_CA

実行の様子

モデルの状況

モデルを実行する

GGUF形式LLMモデルの取り込みも終わったので実行させてみたいと思います。チャット形式なので、プロンプトは

  1. 「おはようございます」
  2. 「今日は曇っています。なにをするといいでしょうか?」

と入力してみます。

rinna-youri-7b-chat-gguf

# rinna-youri-7b-chat-gguf
$ docker exec -it ollama ollama run rinna-youri-7b-chat

2つともはうまく答えてくれませんでした😢プロンプトの書き方などが悪いのでしょうか?

RakutenAI-7B-chat-gguf

# RakutenAI-7B-chat-gguf
$ docker exec -it ollama ollama run RakutenAI-7B-chat

こちらは「おはようございます渥美長兵衛です」という番組を紹介してくれました。(そんな番組は存在しない)これだけ長く返答してくれるのは嬉しいのですが、あまりにも大々的なハルシネーションをしてくれているので、評価が難しいです。文体がWikipediaっぽい感じがしますね。

cyberagent-calm2-7b-chat-gguf

# cyberagent-calm2-7b-chat-gguf
$ docker exec -it ollama ollama run cyberagent-7b-chat

1つ目には、世間話という体で答えてくれましたが、2つ目はうまく答えてくれませんでした。

おわりに

今回使用したLLMの評価はちょっと微妙なところもありましたが、本来やりたかったOllamaに対応していないLLMモデルGGUF形式モデルからインポートするという目的は達成できました。この仕組みを使うことでOllmaで使用できるLLMモデル数も増え、いろいろな実験ができるようになります。また、このModelfileの使用はGGUF形式の変換だけではなく、プロンプトなどのカスタマイズをすることができるなどの、既存モデルのカスタマイズにも使用する事ができるようです。例えば、キャラ付けをするといったパラメータも用意されています。

新しいLLMを使うことで見えてくることや、得意不得意が見えるのも楽しい実験かなと思います。(良い結果ばかりではないのでそこも味わうというのがいいと思います)

過去記事参照

uepon.hatenadiary.com

uepon.hatenadiary.com

uepon.hatenadiary.com

uepon.hatenadiary.com

参考

github.com

bhrtaym-blog.com

日本語LLMまとめ

github.com

/* -----codeの行番号----- */