見出し画像

Google ColabでLLM(llm-jp-3-instruct、HF形式)をGGUF形式に変換する

※ Last update 10-03-2024
※ (10-3) rinna/gemma-2-baku-2b-it も利用できます。
※ (10-3) 3-3.に、google/gemma-2-2b-jpn-it への対応方法を追加しました。
※ 本記事はHugging Face形式のモデルの変換がメインです。GPUは使用しません。モデルの動作確認もできますが遅いので、特にllm-jp-3-instruct 13bは行わない方が良いでしょう。
※ 記述がややこしくなるため、F16やf16の記述を省いています。こちらが必要な場合はBF16やbf16の部分を読み替えてください。
※ Windows PC版については、別の記事を公開する予定です。




■ 0. はじめに

▼ 0-0. 本記事の内容

 本記事の1.では、Google Colabを用いてLLM(Hugging Face形式)をGGUF形式に変換するための手順を説明しています。

  • llm-jp-3-instructの3.7b/1.8bモデルをBF16またはQ8_0に変換。

  • BF16からQ8_0以下に変換(オプション、llama.cppのビルドが必要)。

  • モデルの応答を確かめる(オプション、llama.cppのビルドが必要)。

  • モデルのダウンロード。

 本記事の2.では、同様に下記の手順を説明しています。

  • 無料のGoogle Colab向け:llm-jp-3-instructの13bモデルをQ8_0に変換する。さらに、requantizeでQ4_K_M等に変換(オプション、llama.cppのビルドが必要)。

  • 有料のGoogle Colab Pro向け:同じく13bモデルをBF16に変換する。さらに、Q4_K_M等に変換(オプション、llama.cppのビルドが必要)。

  • モデルの応答を確かめる(オプション、llama.cppのビルドが必要、時間がかかるので非推奨)。

  • モデルのダウンロード。

 未検証ですが、他のHugging Faceモデルも変換できるかもしれません。お役に立てれば幸いです。

▼ 0-1. 本記事を読み進める前に

 あるふ氏が、既に同様のモデルを掲載しています。つまり、それ以外のタイプが必要な方や、自分でやってみたい方が本記事の対象となります。

▼ 0-2. 概要

 9-25-2024に、NII(国立情報学研究所)大規模言語モデル研究開発センター(LLMC)が完全にオープンなモデル「LLM-jp-3(1.8B, 3.7B, 13B)」を公開しました。これは、172BのLLM-jp-3を作る過程での副産物に近いものですが、既にその性能が一定の評価をされているようです。

 本記事ではGoogle Colabを利用して、公開されているLLM-jp-3をGGUF形式に変換します。ノートブックの提供は無いので、お手数ですがコピー&ペーストを行いながら順番に実行してみてください。

▼ 0-3. 備考

  • BF16やQ8_0を除く量子化タイプを作成する場合は、llama.cppのビルドが必要になります。10分程度の追加を見込んでください。

  • 大きいモデルはディスク容量が不足します。元のモデルの容量は、無料のGoogle Colabの場合で50GB程度が限界です。この大きさでは、もはやBF16への変換ができないためQ8_0に変換します。

▼ 0-4. 参考・関連



■ 1. 3.7b(1.8b)モデルを変換してダウンロード

▼ 1-1. 概要

 1.の内容は下記のとおりです。

  • Google Colabを用いてllm-jp-3-instructの3.7b/1.8bモデルをBF16またはQ8_0に変換。

  • BF16からQ8以下に変換(オプション、llama.cppのビルドが必要)。

  • モデルの応答を確かめる(オプション、llama.cppのビルドが必要)。

  • モデルのダウンロード。

 これ以降、3.7bの記述を1.8bに置き換えると1.8b向けになります。13bについては2.をご覧ください。

▼ 1-2. 変換後のモデルの大きさ

 参考まで、変換後のファイルサイズを記載しておきます。3.7bは元々の大きさが手頃なので、Q8_0でも使い勝手が良いと思います。1.8bはスマートフォン等で役に立つかもしれません。

7.04GB … llm-jp-3-3.7b-instruct-bf16.gguf
3.74GB … llm-jp-3-3.7b-instruct-q8_0.gguf
3.22GB … llm-jp-3-3.7b-instruct-q6_k.gguf
2.50GB … llm-jp-3-3.7b-instruct-q4_k_m.gguf
2.12GB … llm-jp-3-3.7b-instruct-q3_k_m.gguf
1.75GB … llm-jp-3-3.7b-instruct-q2_k.gguf

3.48GB … llm-jp-3-1.8b-instruct-bf16.gguf
1.84GB … llm-jp-3-1.8b-instruct-q8_0.gguf
1.65GB … llm-jp-3-1.8b-instruct-q6_k.gguf
1.30GB … llm-jp-3-1.8b-instruct-q4_k_m.gguf
1.11GB … llm-jp-3-1.8b-instruct-q3_k_m.gguf
0.97GB … llm-jp-3-1.8b-instruct-q2_k.gguf

▼ 1-3. Google Colabの新規ノートブックを作成

 まずは https://colab.research.google.com/ へアクセスします。新規のノートブックを作成してから、以降の説明とともに掲載するコードを順番に貼って実行してください。面倒でも一ヶ所ずつ行うのが確実です。GPUは不要です。

▼ 1-4. パッケージとモデルの準備

 まず、必要なパッケージをインストールします。不足する場合は個別にインストールするか、llama.cppを入れた後でrequirements.txtも含めてみてください。

# パッケージのインストール
!pip install transformers accelerate flash-attn

 オリジナルのllm-jp-3-3.7b-instructをダウンロードします。

# LLMのダウンロード(llm-jp-3-3.7b-instruct)
!git lfs install
!git clone https://huggingface.co/llm-jp/llm-jp-3-3.7b-instruct

 変換に必要なため、LLM-jp Tokenizerのモデルを「tokenizer.model」のファイル名でダウンロードします。llm-jp-3系以外のモデルには適用しないでください。

# tokenizerモデルのダウンロード(llm-jp-3系以外では実行しないこと)
!wget https://github.com/llm-jp/llm-jp-tokenizer/raw/refs/heads/main/models/ver3.0/llm-jp-tokenizer-100k.ver3.0b1.model -O ./llm-jp-3-3.7b-instruct/tokenizer.model

▼ 1-5. llama.cppの準備

 llama.cppをクローンします。下記のいずれかを選択してください。

  • BF16またはQ8_0が必要な場合は、4行目は削除するか行頭に「#」をつけてください。変換したモデルの応答をその場で試したい場合は、こちらを選択しないでください。

  • 再変換でQ8_0以下も必要、または判断が付かない場合はそのままにします。llama.cppのビルドも行うので7~10分程度かかります。次のステップでは「bf16」を選択してください。

# llama.cppのダウンロード
!git clone https://github.com/ggerganov/llama.cpp
# llamaのビルド(7~10分かかる、BF16やQ8への変換のみであれば不要)
!cd llama.cpp && make

▼ 1-6. GGUF形式で保存

 モデルをGGUF形式に変換しながら保存します。下記のいずれかを選択してください。

  • Q8_0だけが必要な場合は、そのままにします。

  • BF16やQ8_0以下が必要な場合は、ここではBF16で保存します。「q8_0」を「bf16」に、「q8_0.gguf」を「bf16.gguf」に、それぞれ書き換えてください。

 詳細な使い方は3-1.をご覧いただくか「!python ./llama.cpp/convert_hf_to_gguf.py -h」で確認してください。outtypeは「f32, f16, bf16, q8_0, tq1_0, tq2_0」が指定できるようです。

# GGUF形式への変換(Q8_0の場合。BF16の場合はq8_0やq8をbf16にする)
# モデルが異なる場合はファイル名やパスを書き換えること
!python ./llama.cpp/convert_hf_to_gguf.py ./llm-jp-3-3.7b-instruct --outtype q8_0 --outfile ./llm-jp-3-3.7b-instruct-q8_0.gguf

 実行が終わったとき、末尾に「INFO:hf-to-gguf:Model successfully exported to llm-jp-3-3.7b-instruct-q8_0.gguf」のような表示があることを確認してください。

▼ 1-7. 量子化(オプション)

 llama.cppをビルドすると「llama-quantize」ができているので、こちらを利用して量子化を行います。下記ではBF16からQ6_Kに変換しています。この処理は若干の時間を要します。

# BF16からQ6_Kへの変換(オプション、要llama.cppのビルド、quantization typesを適宜変更すること)
!./llama.cpp/llama-quantize ./llm-jp-3-3.7b-instruct-bf16.gguf ./llm-jp-3-3.7b-instruct-q6_k.gguf q6_k

 詳細な使い方は3-2.をご覧いただくか「!./llama.cpp/llama-quantize -h」で確認してください。quantization typesの一覧があるので、参考になると思います。

▼ 1-8. 応答の確認(オプション)

 llama.cppがビルド済みの場合、その場でモデルの応答を確かめることができます。下記の例ではQ8_0を指定していますが、応答が終わるまでに1分程度かかりました。小さなモデルの方が応答が早いので、変換後に試してみると良いでしょう。

# 応答の確認(ファイル名は適宜変更すること)
command = """
./llama.cpp/llama-cli -m './llm-jp-3-3.7b-instruct-q8_0.gguf' -p '
## 指示 ##
もし犬が突然しゃべれるようになったら、最初になんて言うと思う?
## 応答 ##
' -n 100
"""
!{command}

 下記の画面は実行例です。

llama-cliでモデルの応答を確かめる

▼ 1-8. ファイルのダウンロード

 画面左端にあるフォルダのアイコンをクリックすると、ファイル一覧が表示されます。「\content」の中に保存したファイルがありますので、ダウンロードを選択します。ダウンロードがすぐ始まらないように見えても、実際には始まっています。

変換したファイルをダウンロードする(画面は例)

▼ 1-9. Googleドライブへのコピー(オプション)

 Googleドライブへコピーすることもできます。前項のとおり直接ダウンロードできますので、こちらの利用は必須ではありません。

 まず、Googleドライブのマウントを実行します。本記事では従来の方法を利用します。実行後、画面に従って操作を行ってください。

# Googleドライブのマウント(旧方式)
from google.colab import drive
drive.mount("/content/drive")

 Googleドライブへコピーを行います。コピー先の空き容量に注意してください。

# Googleドライブへコピー(ファイル名は適宜変更すること)
import shutil
import os
src_file = './llm-jp-3-3.7b-instruct-q8_0.gguf'
dst_dir = '/content/drive/MyDrive'
shutil.copy(src_file, dst_dir)

 コピーが終わった後、Googleドライブ上でファイルが表示されるまで少しかかります。1~3分ほど待ってからリロードしてみてください。

▼ 1-10. 実行の終了

 使い終わって用がなくなったら、「ランタイムを接続解除して削除」の操作を忘れないようにしてください。利用していたCPU、メモリ、ディスクが解放され、残るのは現在の表示のみです。

使い終わったらランタイムを接続解除する



■ 2. 12bモデルを変換してダウンロード

▼ 2-1. 概要

 2.の内容は下記のとおりです。モデルのサイズが大きいため、無料のGoogle ColabではQ8_0に変換します(Q8未満への変換は再量子化になり、品質の低下を伴います)。

  • Google Colabを用いてllm-jp-3-instructの12bモデルをBF16またはQ8_0に変換。

  • BF16またはQ8_0からQ8_0以下に変換(オプション、llama.cppのビルドが必要)。

  • モデルの応答を確かめる手順は、想像以上に実行時間が長いため非推奨。

  • モデルのダウンロード。

▼ 2-2. 変換後のモデルの大きさ

 参考まで、変換後のファイルサイズを記載しておきます。

 有料のGoogle Colab Proの場合です。bf16とq8_0以外は、llama-quantizeを使用してbf16から変換しています。

25.53GB … llm-jp-3-13b-instruct-bf16.gguf
13.57GB … llm-jp-3-13b-instruct-q8_0.gguf
10.48GB … llm-jp-3-3.7b-instruct-q6_k.gguf
7.77GB … llm-jp-3-3.7b-instruct-q4_k_m.gguf
6.31GB … llm-jp-3-3.7b-instruct-q3_k_m.gguf
4.89GB … llm-jp-3-3.7b-instruct-q2_k.gguf

 無料のGoogle Colabの場合です。ディスク容量が足りずbf16に変換できないのでq8_0に変換します。その後で元のモデルを消し、llama-quantizeを使用してq8_0から再量子化しています。品質の低下を抑えるためOutput.weightの再量子化を行わない設定を用いて、118MBほどサイズが大きくなっています。

10.59GB … llm-jp-3-3.7b-instruct-q6_k-req.gguf
7.89GB … llm-jp-3-3.7b-instruct-q4_k_m-req.gguf
6.42GB … llm-jp-3-3.7b-instruct-q3_k_m-req.gguf
4.89GB … llm-jp-3-3.7b-instruct-q2_k-req.gguf

 応答の精度を重視する場合、モデルのサイズが近ければ3.7bよりも13bの方が期待できるのではないかと考えています。

▼ 2-3. Google Colabの新規ノートブックを作成

 まずは https://colab.research.google.com/ へアクセスします。新規のノートブックを作成してから、以降の説明とともに掲載するコードを順番に貼って実行してください。面倒でも一ヶ所ずつ行うのが確実です。GPUは不要です。

▼ 2-4. パッケージとモデルの準備

 まず、必要なパッケージをインストールします。不足する場合は個別にインストールするか、llama.cppを入れた後でrequirements.txtも含めてみてください。

# パッケージのインストール
!pip install transformers accelerate flash-attn

 オリジナルのllm-jp-3-13b-instructをダウンロードします。サイズが大きいので10分程度かかります。

# LLMのダウンロード(llm-jp-3-3.7b-instruct)
!git lfs install
!git clone https://huggingface.co/llm-jp/llm-jp-3-13b-instruct

 参考まで、ダウンロードによって生じたディスク使用量を確認します。無料のGoogle Colabでは、この時点で残りが20GBしかありません。

# ダウンロードしたディレクトリのディスク使用量を確認する
!du -hcs ./llm-jp-3-13b-instruct

(下記は実行結果)
52G	./llm-jp-3-13b-instruct
52G	total

 変換に必要なため、LLM-jp Tokenizerのモデルを「tokenizer.model」のファイル名でダウンロードします。llm-jp-3系以外のモデルには適用しないでください。

# tokenizerモデルのダウンロード(他のモデルでは実行しないこと)
!wget https://github.com/llm-jp/llm-jp-tokenizer/raw/refs/heads/main/models/ver3.0/llm-jp-tokenizer-100k.ver3.0b1.model -O ./llm-jp-3-13b-instruct/tokenizer.model

▼ 2-5. llama.cppの準備

 llama.cppをクローンします。下記のいずれかを選択してください。無料のGoogle ColabではBF16の選択が不可です。

  • BF16またはQ8_0が必要な場合は、4行目は削除するか行頭に「#」をつけてください。変換したモデルの応答をその場で試したい場合(ただし時間がかかるので非推奨)は、こちらを選択しないでください。

  • 再変換でQ8_0以下も必要、または判断が付かない場合はそのままにします。llama.cppのビルドも行うので7~10分程度かかります。

# llama.cppのダウンロード
!git clone https://github.com/ggerganov/llama.cpp
# llamaのビルド(7~10分かかる、BF16やQ8_0への変換のみであれば不要)
!cd llama.cpp && make

▼ 2-6. GGUF形式で保存

 モデルをGGUF形式に変換しながら保存します。下記のいずれかを選択してください。無料のGoogle ColabではQ8_0のみが選択できます。

  • Q8_0が必要な場合は、そのままにします。

  • BF16やQ8_0以下が必要な場合は、ここではBF16で保存します。「q8_0」を「bf16」に、「…q8_0.gguf」を「…bf16.gguf」に、それぞれ書き換えてください。

 詳細な使い方は3-1.をご覧いただくか「!python ./llama.cpp/convert_hf_to_gguf.py -h」で確認してください。outtypeは「f32, f16, bf16, q8_0, tq1_0, tq2_0」が指定できるようです。

# GGUF形式への変換(Q8の場合。BF16の場合はq8_0やq8をbf16にする)
# モデルが異なる場合はファイル名やパスを書き換えること
!python ./llama.cpp/convert_hf_to_gguf.py ./llm-jp-3-13b-instruct --outtype q8_0 --outfile ./llm-jp-3-13b-instruct-q8_0.gguf

 実行が終わったとき、末尾に「INFO:hf-to-gguf:Model successfully exported to llm-jp-3-13b-instruct-q8_0.gguf」のような表示があることを確認してください。

▼ 2-7. 量子化について

 llama.cppをビルドすると「llama-quantize」ができているので、こちらを利用して量子化を行います。

 詳細な使い方は3-2.をご覧いただくか「!./llama.cpp/llama-quantize -h」で確認してください。quantization typesの一覧があるので、参考になると思います。

▼ 2-8. 量子化の実行(オプション、有料版の場合)

 有料版のGoogle Colab ProではBF16から変換します。下記ではBF16からQ4_K_Mに変換しています。この処理は若干の時間を要します。

# BF16からQ6_Kへの変換(オプション、要llama.cppのビルド)
!./llama.cpp/llama-quantize ./llm-jp-3-13b-instruct-bf16.gguf ./llm-jp-3-13b-instruct-q4_k_m.gguf q4_k_m

▼ 2-9. 量子化(オプション、無料版の場合)

 無料版のGoogle ColabではQ8_0から変換します。その前にディスク容量が足りないので、ダウンロードしたモデルを削除します。

# ダウンロードしたモデルを削除(無料版でさらに変換する場合は必須)
!rm -rf ./llm-jp-3-13b-instruct

 続けてQ8_0からQ4_K_Mに変換します(※Q4_K_Mは配布されているので、それ以外でも良いと思います)。

 オプション「--allow-requantize」を使用すると、既に量子化したモデルを再量子化(requantize)できます。ここでは「--leave-output-tensor」も加えます。ファイルサイズがわずかに増えますが、Output.weightを量子化しなくなるため品質の低下が抑えられます。

 所要時間は、Q8_0からQ4_K_Mへの変換では30分程度、Q6への変換では12分程度を要しました。

# Q8_0からQ4_K_Mへの変換(オプション、Output.weightを除くrequantize、要llama.cppのビルド、quantization typesを適宜変更すること)
!./llama.cpp/llama-quantize --allow-requantize --leave-output-tensor ./llm-jp-3-13b-instruct-q8_0.gguf ./llm-jp-3-13b-instruct-q4_k_m_req_lot.gguf q4_k_m

 参考まで、「--leave-output-tensor」を付けないバージョンです。こちらは非推奨とします。

# Q8_0からQ4_K_Mへの変換(オプション、Output.weightを含むrequantize、要llama.cppのビルド、quantization typesを適宜変更すること)
!./llama.cpp/llama-quantize --allow-requantize ./llm-jp-3-13b-instruct-q8_0.gguf ./llm-jp-3-13b-instruct-q4_k_m_req.gguf q4_k_m

▼ 2-10. 応答の確認(オプション)

 llama.cppがビルド済みの場合、その場でモデルの応答を確かめることができます。ただし、CPUでの13bモデルの応答は非常に遅いので注意してください。

 下記の例ではQ4_K_Mを指定していますが、CPUではこれだけの応答を行うために5分程度かかりました。

# 応答の確認(ファイル名は適宜変更すること)
command = """
./llama.cpp/llama-cli -m './llm-jp-3-13b-instruct-q4_k_m_req.gguf' -p '
## 指示 ##
15文字以内で自己紹介を行ってください。それ以外の出力は必要ありません。
## 応答 ##
' -n 100
"""
!{command}
実行例

▼ 2-11. ファイルのダウンロード

 画面左端にあるフォルダのアイコンをクリックすると、ファイル一覧が表示されます。「\content」の中に保存したファイルがありますので、ダウンロードを選択します。ダウンロードがすぐ始まらないように見えても、実際には始まっています。

変換したファイルをダウンロードする(画面は例)

▼ 2-12. Googleドライブへのコピー(オプション)

 空き容量が十分であれば、Googleドライブへコピーすることもできます。前項のとおり直接ダウンロードできますので、こちらの利用は必須ではありません。

 まず、Googleドライブのマウントを実行します。本記事では従来の方法を利用します。実行後、画面に従って操作を行ってください。

# Googleドライブのマウント(旧方式)
from google.colab import drive
drive.mount("/content/drive")

 Googleドライブへコピーを行います。コピー先の空き容量に注意してください。

# Googleドライブへコピー(ファイル名は適宜変更すること)
import shutil
import os
src_file = './llm-jp-3-13b-instruct-q8_0.gguf'
dst_dir = '/content/drive/MyDrive'
shutil.copy(src_file, dst_dir)

 コピーが終わった後、Googleドライブ上でファイルが表示されるまで少しかかります。数分ほど待ってからリロードしてみてください。

▼ 2-13. 実行の終了

 使い終わって用がなくなったら、「ランタイムを接続解除して削除」の操作を忘れないようにしてください。利用していたCPU、メモリ、ディスクが解放され、残るのは現在の表示のみです。

使い終わったらランタイムを接続解除する



■ 3. おまけ

▼ 3-1. convert_hf_to_gguf.pyのヘルプ

 執筆時点での内容です。

usage: convert_hf_to_gguf.py [-h] [--vocab-only] [--outfile OUTFILE]
                             [--outtype {f32,f16,bf16,q8_0,tq1_0,tq2_0,auto}] [--bigendian]
                             [--use-temp-file] [--no-lazy] [--model-name MODEL_NAME] [--verbose]
                             [--split-max-tensors SPLIT_MAX_TENSORS]
                             [--split-max-size SPLIT_MAX_SIZE] [--dry-run]
                             [--no-tensor-first-split] [--metadata METADATA]
                             model

Convert a huggingface model to a GGML compatible file

positional arguments:
  model                 directory containing model file

options:
  -h, --help            show this help message and exit
  --vocab-only          extract only the vocab
  --outfile OUTFILE     path to write to; default: based on input. {ftype} will be replaced by the
                        outtype.
  --outtype {f32,f16,bf16,q8_0,tq1_0,tq2_0,auto}
                        output format - use f32 for float32, f16 for float16, bf16 for bfloat16,
                        q8_0 for Q8_0, tq1_0 or tq2_0 for ternary, and auto for the highest-
                        fidelity 16-bit float type depending on the first loaded tensor type
  --bigendian           model is executed on big endian machine
  --use-temp-file       use the tempfile library while processing (helpful when running out of
                        memory, process killed)
  --no-lazy             use more RAM by computing all outputs before writing (use in case lazy
                        evaluation is broken)
  --model-name MODEL_NAME
                        name of the model
  --verbose             increase output verbosity
  --split-max-tensors SPLIT_MAX_TENSORS
                        max tensors in each split
  --split-max-size SPLIT_MAX_SIZE
                        max size per split N(M|G)
  --dry-run             only print out a split plan and exit, without writing any new files
  --no-tensor-first-split
                        do not add tensors to the first split (disabled by default)
  --metadata METADATA   Specify the path for an authorship metadata override file

▼ 3-2. llama-quantizeのヘルプ

 執筆時点での内容です。

usage: llama.cpp\build\bin\Debug\llama-quantize.exe [--help] [--allow-requantize] [--leave-output-tensor] [--pure] [--imatrix] [--include-weights] [--exclude-weights] [--output-tensor-type] [--token-embedding-type] [--override-kv] model-f32.gguf [model-quant.gguf] type [nthreads]

  --allow-requantize: Allows requantizing tensors that have already been quantized. Warning: This can severely reduce quality compared to quantizing from 16bit or 32bit
  --leave-output-tensor: Will leave output.weight un(re)quantized. Increases model size but may also increase quality, especially when requantizing
  --pure: Disable k-quant mixtures and quantize all tensors to the same type
  --imatrix file_name: use data in file_name as importance matrix for quant optimizations
  --include-weights tensor_name: use importance matrix for this/these tensor(s)
  --exclude-weights tensor_name: use importance matrix for this/these tensor(s)
  --output-tensor-type ggml_type: use this ggml_type for the output.weight tensor
  --token-embedding-type ggml_type: use this ggml_type for the token embeddings tensor
  --keep-split: will generate quatized model in the same shards as input  --override-kv KEY=TYPE:VALUE
      Advanced option to override model metadata by key in the quantized model. May be specified multiple times.
Note: --include-weights and --exclude-weights cannot be used together

Allowed quantization types:
   2  or  Q4_0    :  4.34G, +0.4685 ppl @ Llama-3-8B
   3  or  Q4_1    :  4.78G, +0.4511 ppl @ Llama-3-8B
   8  or  Q5_0    :  5.21G, +0.1316 ppl @ Llama-3-8B
   9  or  Q5_1    :  5.65G, +0.1062 ppl @ Llama-3-8B
  19  or  IQ2_XXS :  2.06 bpw quantization
  20  or  IQ2_XS  :  2.31 bpw quantization
  28  or  IQ2_S   :  2.5  bpw quantization
  29  or  IQ2_M   :  2.7  bpw quantization
  24  or  IQ1_S   :  1.56 bpw quantization
  31  or  IQ1_M   :  1.75 bpw quantization
  10  or  Q2_K    :  2.96G, +3.5199 ppl @ Llama-3-8B
  21  or  Q2_K_S  :  2.96G, +3.1836 ppl @ Llama-3-8B
  23  or  IQ3_XXS :  3.06 bpw quantization
  26  or  IQ3_S   :  3.44 bpw quantization
  27  or  IQ3_M   :  3.66 bpw quantization mix
  12  or  Q3_K    : alias for Q3_K_M
  22  or  IQ3_XS  :  3.3 bpw quantization
  11  or  Q3_K_S  :  3.41G, +1.6321 ppl @ Llama-3-8B
  12  or  Q3_K_M  :  3.74G, +0.6569 ppl @ Llama-3-8B
  13  or  Q3_K_L  :  4.03G, +0.5562 ppl @ Llama-3-8B
  25  or  IQ4_NL  :  4.50 bpw non-linear quantization
  30  or  IQ4_XS  :  4.25 bpw non-linear quantization
  15  or  Q4_K    : alias for Q4_K_M
  14  or  Q4_K_S  :  4.37G, +0.2689 ppl @ Llama-3-8B
  15  or  Q4_K_M  :  4.58G, +0.1754 ppl @ Llama-3-8B
  17  or  Q5_K    : alias for Q5_K_M
  16  or  Q5_K_S  :  5.21G, +0.1049 ppl @ Llama-3-8B
  17  or  Q5_K_M  :  5.33G, +0.0569 ppl @ Llama-3-8B
  18  or  Q6_K    :  6.14G, +0.0217 ppl @ Llama-3-8B
   7  or  Q8_0    :  7.96G, +0.0026 ppl @ Llama-3-8B
  33  or  Q4_0_4_4 :  4.34G, +0.4685 ppl @ Llama-3-8B
  34  or  Q4_0_4_8 :  4.34G, +0.4685 ppl @ Llama-3-8B
  35  or  Q4_0_8_8 :  4.34G, +0.4685 ppl @ Llama-3-8B
   1  or  F16     : 14.00G, +0.0020 ppl @ Mistral-7B
  32  or  BF16    : 14.00G, -0.0050 ppl @ Mistral-7B
   0  or  F32     : 26.00G              @ 7B
          COPY    : only copy tensors, no quantizing

▼ 3-3. Gemma 2 JPN model card(google/gemma-2-2b-jpn-it)への対応

 簡潔に掲載しますので、新規のノートブックでお試しください。

 事前に https://huggingface.co/google/gemma-2-2b-jpn-it へアクセスして、モデルへアクセスができるよう許可を得てください。

 必要なパッケージをインストールします。

!pip install transformers accelerate flash-attn

 下記を実行して、許可を得たアカウントの有効なトークンを入力し、次にyを入力してください。これでダウンロードができるようになります。

!pip install huggingface_hub
!huggingface-cli login

 モデルをダウンロードします。

!git lfs install
!git clone https://huggingface.co/google/gemma-2-2b-jpn-it

 llama.cppを導入します。全体で7~10分程度かかります。F16、BF16、Q8_0のいずれかのみでよければ、llama.cppのビルド(2行目)は必要ありません。

!git clone https://github.com/ggerganov/llama.cpp
!cd llama.cpp && make

 モデルをBF16に変換します。F16やQ8_0に書き換えることができます。

!python ./llama.cpp/convert_hf_to_gguf.py ./gemma-2-2b-jpn-it --outtype bf16 --outfile ./gemma-2-2b-jpn-it-bf16.gguf

 BF16からQ6_Kに変換します(llama.cppのビルドが必要)

!./llama.cpp/llama-quantize ./gemma-2-2b-jpn-it-bf16.gguf ./gemma-2-2b-jpn-it-q6_k.gguf q6_k

 Q6_Kのモデルで応答を確認します。

command = """
./llama.cpp/llama-cli -m './gemma-2-2b-jpn-it-q6_k.gguf' -p '
## 指示 ##
200文字以内で自己紹介を行ってください。それ以外の出力は必要ありません。
## 応答 ##
' -n 200
"""
!{command}

 実際の応答です…。

## 指示 ##
200文字以内で自己紹介を行ってください。それ以外の出力は必要ありません。
## 応答 ##
こんにちは!私は、オープンソースのAIアシスタント、Bardです。Googleによって開発された大規模言語モデルです。テキストを理解し、生成する能力を持っています。あなたと会話したり、情報を提供したり、さまざまなタスクを実行することができます。



■ 4. その他

 私が書いた他の記事は、メニューよりたどってください。

 noteのアカウントはメインの@Mayu_Hiraizumiに紐付けていますが、記事に関することはサブアカウントの@riddi0908までお願いします。

この記事が気に入ったらサポートをしてみませんか?