はじめに
- LLMについて勉強するために、タイトルの通りLLMをHuggingFace形式からGGUF形式へ変換してみたいと思います。
- さらにModelfileを記述して、ollamaで動作させてみます。
この記事の流れを図示(By Claude)
用語の確認
HuggingFace形式
transformersライブラリで扱う標準のモデル&トークナイザー保存フォーマット。
GGUF形式
モデルの高速読み込みと保存に最適化されたバイナリ形式で、推論用途に非常に効率的。
https://huggingface.co/docs/hub/gguf
HuggingFace形式からGGUF形式へ変換
transformers
からモデルをダウンロードします。サンプルプログラムなので軽量なモデルなら何でも良いのですがQwen2.5-0.5Bを利用します。
huggingfaceにはモデルによってはGGUF形式に変換されたモデルがアップロードされていたりもしますが、この記事では自分で変換する過程をたどりたいので、利用しません。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-0.5B",
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B")
モデルを保存します。これが、いわゆるHuggingFace形式のモデルです。
model.save_pretrained("./qwen2.5-0.5b")
tokenizer.save_pretrained("./qwen2.5-0.5b")
モデルを変換するためにllama.cpp
というツールを使います。ツール名が*.cpp
なのはちょっとややこしいですね笑。
llama.cppをcloneします。
git clone https://github.com/ggerganov/llama.cpp.git
llama.cpp直下に用意されているconvert_hf_to_gguf.py
というスクリプト(名前のままですね)で変換を行います。
cd llama.cpp
python convert_hf_to_gguf.py ./qwen2.5-0.5b --outfile ./qwen2.5-0.5b.gguf --outtype f16
ここまででGGUF形式への変換が完了しました。
GGUF形式のモデルの実行
モデルを実行する方法はいくつかあります。
- llama.cppを直接利用
- ollamaなどのラッパーを利用
一旦はllama.cppを直接利用
してみましょう。
先ほどソースコードをcloneしたのでbuildしても良いですが、省略してbrewコマンドでinstallしてみます。はじめからbrewでinstallしてもよさそうですが、先程利用したconverterが結局必要になるために、このような手順となりました。
brew install llama.cpp
これでllama-cliコマンドが実行できるようになります。
llama-cli -m qwen2.5-0.5b.gguf -p "こんにちは"
こんにちは。本日は、「明日の新卒採用、応募の対策」と題して、今後の社会課題から、就職活動の相談から、大学の入学を受ける際の相談まで、学部・大学、そして、人気の派遣社員を紹介していきます。 [end of text]
内容はアレですが、動作は問題なさそうです。
ollamaからの呼び出し
ollamaはllama.cppのラッパーで、モデルの一元管理などいくつかの利点があります。
Modelfileという名前で以下のようなファイルを作成します。(Dockerfile likeですね。GGUFをベースイメージに相当する概念として整理しているんですね。)
FROM ./qwen2.5-0.5b.gguf
Modelfileはollamaの固有の機能で、プロンプトやテンプレートなどのメタ情報でモデルをカスタマイズできる仕組みです。
さて、Modelfileの作成が終わったら、ollama craete
コマンドでモデルを作成します。
ollama create qwen -f Modelfile
こんな感じのlogが出力されます。
gathering model components
copying file sha256:32ab4932bbd95e09e5cf4d54722fb33a503740db6d5540d0841d651112d359fd 100%
parsing GGUF
using existing layer sha256:32ab4932bbd95e09e5cf4d54722fb33a503740db6d5540d0841d651112d359fd
writing manifest
success
モデルが作成されていることを確認します。
ollama list
NAME ID SIZE MODIFIED
qwen:latest 1563d9c13a0c 994 MB 2 minutes ago
ollama run
で実行します。
ollama run qwen
>>> こんにちは
!今回は、2018年の冬です。 本日は、寒いのに寒さがないとは思わなかったのですが、あたたかいお風呂ができたので、暖かくなるまで暖
房をするようにしました。 オーバーホール 今日は、とても冷たい天気でした。 西からも吹き込み雨が降り始めました。 そんな中、
2018年冬の始まりは、2月5日だったようです。 それから…
まとめ
以下の流れを理解できました。
- HuggingFace形式からGGUF形式へ変換する
- llama.cppでGGUF形式のモデルを実行する
- Modelfileを作成して、ollamaでモデルを実行する
次は
以下のようなテーマで考えています。
- llama.cppのollamaの使い勝手を比較する
- Modelfileの詳細などを記述する
- スクラッチ/ファインチューンしたモデルを実行する
- GGUFの仕様について確認する