【LLM入門】llama-cpp-pythonの使い方 – GGUF形式ファイルで推論編

llama-cpp-pythonの使い方入門 - GGUF形式ファイルで推論編

 

【動画で解説】「Llama.cpp」で量子化したGGUF形式のLLMの使い方入門
– Japanese LLM Fine Tuning Tutorial

 

 

【LLM入門】GGUF形式のLLMで推論
:Llama.cpp – llama-cpp-python Tutorial


視聴時間:8分5秒

文字情報だけではわかりにくい場合に、解説動画をご活用いただけますと幸いです。

 




 

 

llama-cpp-python入門:GGUF形式ファイルとは?

 

 

以下のQLoRA編のLLMのファインチューニングのチュートリアル

【QLoRA編】日本語LLMのファインチューニング & 低スペックのローカル環境のアプリで動かす
()

を使う際の利便性を考慮し「Llama.cpp」を使って量子化したGGUF形式のLLMを使うことができる

abetlen/llama-cpp-python(The MIT License)| GitHub

を活用して推論をするためのチュートリアルコードを作成しました。
GGUF形式のLLMで推論をしてみたい方などの参考になることがありましたら幸いです。
動画では「tokyotech-llm/Swallow-7b-instruct-hf」をカスタムデータセットでファインチューニング後に4bit量子化+GGUF化したLLMを活用しています。

 

【GGUFとは?何?】

ここで、

GGUFって何?

と思われている方もいるのではないかと思いますので、簡単に解説しておきます。
ここでいうGGUFとは

GGUF (GPT-Generated Unified Format)

ということで、日本語に訳すと

・GPT生成統一形式(フォーマット)

といったところでしょうか。
歴史としては、始めに

GGML (GPT-Generated Model Language)
* GPT生成モデル言語

というものがApple SiliconなどでもLLMを使えるように開発されたようです。
このGGML形式のファイルが登場したことにより、

・1つのファイルのみでLLMを共有

でき、Macなどの

・CPU上でも実行できる

ようになりました。
ただ、GGMLの難点として

・柔軟性
・互換性
・拡張性

などの問題があったようです。

その後、GGML形式のファイルの後継として、2023年8月にLlama.cppの開発チームによりGGMLの欠点を改善したGGUFがリリースされました。
既に、GGUF形式に変換したことのある方は、ご存知のことかと思いますが

・GGUF形式に変換するのに時間がかかる…

という難点があるようです。

【参考情報】

GGML officially phased out, new format called GGUF #1370 – nomic-ai/gpt4all | GitHub
GGMLは正式に段階的に廃止され、GGUFと呼ばれる新しい形式になりました

 

 

チュートリアルコードリンク・プログラムのライセンス

 

 

Google Colaboratoryのチュートリアルコード:
llama-cpp-python-for-Japanese-AI-Beginners.ipynb(The MIT License)| Google Colaboratory

 

チュートリアルコード「llama-cpp-python-for-Japanese-AI-Beginners.ipynb」のライセンス:

The MIT License

Copyright 2024 child programmer

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

【llama-cpp-python-編】
GGUF形式のLLMで推論 – 最終更新:2024年3月31日

 

 

【手順①】llama-cpp-pythonのインストール

 

 

実行コード

!pip install llama-cpp-python

# Pythonのバージョンの確認
print('(実行時点のバージョンです)')

import platform
print('python ' + platform.python_version())

 

出力例

Collecting llama-cpp-python
  Downloading llama_cpp_python-0.2.57.tar.gz (36.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 36.9/36.9 MB 16.2 MB/s eta 0:00:00
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: typing-extensions>=4.5.0 in /usr/local/lib/python3.10/dist-packages (from llama-cpp-python) (4.10.0)
Requirement already satisfied: numpy>=1.20.0 in /usr/local/lib/python3.10/dist-packages (from llama-cpp-python) (1.25.2)
Collecting diskcache>=5.6.1 (from llama-cpp-python)
  Downloading diskcache-5.6.3-py3-none-any.whl (45 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.5/45.5 kB 5.3 MB/s eta 0:00:00
Requirement already satisfied: jinja2>=2.11.3 in /usr/local/lib/python3.10/dist-packages (from llama-cpp-python) (3.1.3)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2>=2.11.3->llama-cpp-python) (2.1.5)
Building wheels for collected packages: llama-cpp-python
  Building wheel for llama-cpp-python (pyproject.toml) ... done
  Created wheel for llama-cpp-python: filename=llama_cpp_python-0.2.57-cp310-cp310-manylinux_2_35_x86_64.whl size=2867803 sha256=28f2f9f99795d83f3c14565b0a6b49dd6616601ec24dce8e2a799267cbaf6944
  Stored in directory: /root/.cache/pip/wheels/7e/c0/00/e98d6e198f941c623da37b3f674354cbdccfcfb2cb9cf1133d
Successfully built llama-cpp-python
Installing collected packages: diskcache, llama-cpp-python
Successfully installed diskcache-5.6.3 llama-cpp-python-0.2.57

(実行時点のバージョンです)
python 3.10.12

 

 

【手順②】Google Driveのマウント

 

 

Google Drive をマウントし、事前にGoogle Driveに保存しておいたGoogle Drive上の

・「GGUF形式ファイル」
(例:model-unsloth.Q4_K_M.gguf)

を使えるようにします。

実行コード

from google.colab import drive
drive.mount('/content/drive')

 

出力例

Mounted at /content/drive

 

 

【手順③】推論の実行(GGUF形式ファイルのLLM)

 

 

実行コード

from llama_cpp import Llama

# @markdown 【必須設定 ①】使用するGGUF形式ファイルのLLMのパスを入力します。
LLM_file = "/content/drive/MyDrive/Swallow-7b-instruct-hf-Q4_K_M.gguf" # @param {type:"string"}
# @markdown  【必須設定 ②】プロンプト(質問)を入力します。
input_prompt = "YouTubeのRehabC – デジタルで、遊ぶ。チャンネルについて教えてください。" # @param {type:"string"}
# @markdown ・ パラメータ設定 ①:Instructions(指示)
Instructions = "以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。\nリクエストを適切に完了するための回答を記述してください。" # @param {type:"string"}
# @markdown ・ パラメータ設定 ②:Temperature(温度)
Temperature = 0.7 # @param {type:"number"}
# @markdown ・ パラメータ設定 ③:Top P(核サンプリング)
Top_P = 0.8 # @param {type:"number"}
# @markdown ・ パラメータ設定 ④:Max Tokens(最大トークン数)
Max_Tokens = 100 # @param {type:"integer"}
# @markdown ・ パラメータ設定 ⑤:Frequency Penalty(フリークエンシー ペナルティ・繰り返しへのペナルティ)
Frequency_Penalty =  1.0 # @param {type:"number"}
# @markdown ・ パラメータ設定 ⑥:Presence Penalty(プレゼンス ペナルティ・存在の有無へのペナルティ)
Presence_Penalty =  1.0 # @param {type:"number"}
# @markdown ・ パラメータ設定 ⑦:Context Length(コンテキストの長さ・文脈の長さ)
Context_Length = 768 # @param {type:"integer"}
# @markdown ・ パラメータ設定 ⑧:Embedding(エンベディング:埋め込み表現・ベクトル表現)
# @markdown チェックを入れると「True」(有効化)になります。
Embedding = False # @param {type:"boolean"}

llm = Llama(model_path = LLM_file,  n_ctx = 768, embedding = False)

system_message = Instructions
input = input_prompt

prompt = f"""
{system_message}\n

### Instruction:\n
 {input}\n

### Response:\n
"""

output = llm(
    prompt,
    max_tokens = Max_Tokens, 
    temperature = Temperature, 
    top_p = Top_P, 
    # The penalty to apply to repeated tokens.
    # (繰り返されるトークンに対するペナルティ)
    # 指定しないと「1.1」になるようです。「frequency_penalty」に似ているようですが
    # 数値を変えると回答結果に影響するようでしたのでチュートリアルで作成したLLMを
    # Janで実行した際の回答に近かった「0.8」にしています。
    # 必要に応じて「1.1」に戻してください。
    repeat_penalty = 0.8, 
    frequency_penalty = Frequency_Penalty, 
    presence_penalty = Presence_Penalty, 
    stop = ["\n###  Instruction:", "\n### Response:", "\n"],
    echo = True,
)

print(output["choices"][0]["text"])

 

出力例

lama_model_loader: loaded meta data with 24 key-value pairs and 291 tensors from /content/drive/MyDrive/Swallow-7b-instruct-hf-Q4_K_M.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv   0:                       general.architecture str              = llama
llama_model_loader: - kv   1:                               general.name str              = LLaMA v2

・・・

以下に、あるタスクを説明する指示があり、それに付随する入力が更なる文脈を提供しています。
リクエストを適切に完了するための回答を記述してください。


### Instruction:

 YouTubeのRehabC – デジタルで、遊ぶ。チャンネルについて教えてください。


### Response:

RehabCチャンネルは、2014年に開設され、デジタルテクノロジー、デジタルデザイン、デジタル教育に関する教育コンテンツを提供しています。

 

実行結果例:【手順③】推論の実行(GGUF形式ファイルのLLM)llama-cpp-pythonの使い方入門 - GGUF形式ファイルで推論編
* 画像をクリックすると拡大します。

 

Janで設定できる範囲のパラメータの設定以外にも

・「llama-cpp-python」

参考 – 各種パラメータの設定:
API Reference | llama-cpp-python

の他のパラメータの設定の違いがあるのではないかと思われ、Janのアプリで試す際に比べて微妙に違いが出るようでした。
そのため参考程度にご活用いただけますと幸いです。
また、以下のノートブック

チュートリアルコード:
QLoRA-LLM-FineTuning-for-Japanese-AI-Beginners.ipynb(Apache-2.0 license)| Google Colaboratory

で、QLoRAのファインチューニングを実行される際には、このノートブックの

・「手順①」
・「手順③」

のコードをコピー&ペーストして、量子化後の回答の精度の検証などで使ってみてください。

 

 

【おわりに】「Llama.cpp」で量子化したGGUF形式のLLMの使い方入門

 

 

チュートリアルでは、Google ColaboratoryのCPUを活用して4-bit量子化されたLLMを使って推論してみましたが、GPUを使わずに気軽にLLMを試せるところがいいですね。

Google Colaboratoryの無料枠で使えるCPUでは、1〜2分程度で推論でしたので、ローカル環境でPythonの環境を構築できる方は「llama-cpp-python」を使えば、気軽にGGUF形式のLLMを楽しめるのではないかと思います。

 

 

by 子供プログラマー

 

 

LLM Studioでファインチューニング入門
日本語LLMのファインチューニング入門 – 自作・Hugging Face公開データセット対応

 

BitNet b1.58を学習中
【学習中…】1ビットLLMに挑戦してみたい:-1・0・1の3値でパラメータを表現 

気軽にチャットAIが始められるおすすめの拡張機能です。会員登録やログイン不要で使えるチャットAIもあります。
【使い方】ChatHub入門 – チャットAIをはじめよう