これまでOllamaを使用して比較的容易にローカルLLMモデルを使用することをやってきました。ここまで来ると未対応のLLMモデルを使用したくなってきます(よね😊)。
そこで、OllamaのREADMEファイルを読んでいったところ
Import GGUFという項目がありました。

GGUFとは LLMモデルをllamma.cppから使用できるようにしたバイナリ形式のファイルになります。現在はこのファイル形式で使用できる処理系も増えてきています。HuggingfaceでもGGUF形式のファイルが公開されていて、それをOllamaからロードしてすることができるようになります。デフォルトで対応したLLMモデルは少ないのですが、GGUF形式まで含めると数多くのモデルが使用できます。
参考
自分も話題になっていたrinna、楽天、サイバーエージェントのモデルを使ってみたいと思っていたので、今回はこの使い方を含めてまとめてみたいと思います。

GGUF形式のLLMモデルの準備
まずは今回使用していくGGUF形式のLLMモデルを探していくことになります。Huggingfaceから探すのが良いです。注意点としてはすべてのLLMモデルがGGUF形式で公開されているわけではないので、そのあたりは気をつけましょう。公式でなくても形式変換を行っている方もいらっしゃるので、そちらを使用するのもいいでしょう。今回は多くのLLMモデルをGGUF形式に変換して公開されているmomongaさんのGGUF形式のファイルを称させていただこうと思います。ありがとうございます🙏
今回はChat機能を持つ以下の3つのLLMモデルをを使ってみたいと思います。
- mmnga/rinna-youri-7b-chat-gguf(https://huggingface.co/mmnga/rinna-youri-7b-chat-gguf)
- mmnga/RakutenAI-7B-chat-gguf(https://huggingface.co/mmnga/RakutenAI-7B-chat-gguf)
- mmnga/cyberagent-calm2-7b-chat-gguf(https://huggingface.co/mmnga/cyberagent-calm2-7b-chat-gguf)
準備と言っても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モデルの確認
ではDockerのOllamaコンテナを起動して事前の状態を確認をします。
# コンテナの起動 $ 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モデルの取り込みも終わったので実行させてみたいと思います。チャット形式なので、プロンプトは
- 「おはようございます」
- 「今日は曇っています。なにをするといいでしょうか?」
と入力してみます。
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を使うことで見えてくることや、得意不得意が見えるのも楽しい実験かなと思います。(良い結果ばかりではないのでそこも味わうというのがいいと思います)