2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

  • 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形式のモデルの実行

モデルを実行する方法はいくつかあります。

  1. llama.cppを直接利用
  2. 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をベースイメージに相当する概念として整理しているんですね。)

Modelfile
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の仕様について確認する
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?