catch-img

【LLM】Google Gemmaのファインチューニング

Gemmaは、Googleが公開した軽量かつ高性能なLLMで、商用利用可能なオープンモデルです。

この記事では、Gemmaのファインチューニングの方法について紹介しています。


目次[非表示]

  1. 1.Gemmaとは
  2. 2.Gemmaのファインチューニング
  3. 3.GemmaのファインチューニングにはGPUが必要
  4. 4.Gemmaのモデル申請
  5. 5.実行環境
  6. 6.Jupyter Labを起動
  7. 7.パッケージのインストール
  8. 8.データセットの読み込み
  9. 9.モデルの設定
  10. 10.QLoRAの設定
  11. 11.トレーニングのパラメータ設定
  12. 12.ファインチューニングの実行
  13. 13.GPUメモリの解放
  14. 14.ファインチューニング後モデルでテキスト生成
  15. 15.LLMならGPUクラウド
  16. 16.まとめ


Gemmaとは

Gemmaは、Googleが公開したGeminiと同じ技術を活用した軽量なLLMモデルで、ローカルPCの環境でも動かすことができます。

Gemmaの性能は、MetaのLlama2など同規模のモデルを上回ると言われています。学習データから特定の個人情報や機密データを除外しており、安全性の高さも誇ります。

またGemmaはオープンモデルとして公開されており、利用規約に同意をすれば商用利用が可能です。

gemma


Gemmaの性能・安全性・商用利用・推論での使い方については以下の記事で詳しく解説しています。


  【LLM】Google Gemmaとは?使い方・性能・商用利用について解説 Gemmaは、Googleが公開した軽量かつ高性能なLLMで、商用利用可能なオープンモデルです。この記事では、Gemmaの使い方から性能・安全性・商用利用まで紹介しています。 業界最安級GPUクラウド | GPUSOROBAN


Gemmaのファインチューニング

Gemmaのモデルを新しい領域やタスクに適応させるためにファインチューニング(追加学習)を行うことができます。

専門的な情報やローカルな情報など、未知のデータを使ってモデルをファインチューニングすることで、Gemmaベースの独自のモデルを作成できます。

この記事ではGemmaベースモデルに対してファインチューニングする方法を解説します。ファインチューニングをすることで、プロンプトに対して自然な応答ができるようになります。


GemmaのファインチューニングにはGPUが必要

Llama2でファインチューニングをする際には、大量の計算を行うためにGPUが必要です。

この記事では量子化を使って、精度を落とす代わりにモデルを軽量化して、1GPUで実行する方法を紹介してます。

モデル
パラメータサイズ
タイプ
ファインチューニング手法
データセット
GPUメモリ使用量
ファインチューニングの時間
使用したGPU

google/gemma-7b

70億
base model
QLoRA

philschmid/dolly-15k-oai-style

19.8GB
1時間25分

NVIDIA A100 80GB x1


Gemmaのモデル申請

Gemmaのモデルを使うためには利用申請が必要になります。

Gemmaの利用申請の方法は、以下の記事で詳しく解説しています。


  【LLM】Google Gemmaのモデル利用申請 この記事では、Gemmaのモデルを使用するための利用申請について解説しています。 業界最安級GPUクラウド | GPUSOROBAN


実行環境

この記事ではGPUクラウドサービス(GPUSOROBAN)を使用しました。

  • インスタンス名:t80-1-a-standard-ubs22-i
  • GPU:NVIDIA A100 80GB x 1
  • OS :Ubuntu 22.04
  • CUDA:11.7
  • Jupyter Labプリインストール


GPUSOROBANはメガクラウドの50%以上安いGPUクラウドサービスです。 GPUSOROBANの使い方は以下の記事で解説しています。


  会員登録~インスタンス接続手順 | GPUSOROBAN GPUSOROBANの会員登録からインスタンス作成・接続までの手順を詳しく解説する記事です。会員登録、電話番号認証、SSHキー作成、インスタンスの作成、キーの設置、ターミナルからのインスタンス接続までの流れを説明しています。 業界最安級GPUクラウド | GPUSOROBAN


Jupyter Labを起動

GPUSOROBANのインスタンスに接続したら、次のコマンドを実行し、Jupyter Labを起動します。

jupyter lab --ip='*' --port=8888 --NotebookApp.token='' --NotebookApp.password='' --no-browser


ブラウザの検索窓に"localhost:8888"を入力すると、Jupyter Labをブラウザで表示できます。

localhost:8888


Jupyter Labのホーム画面で[Python3(ipykernel)]を選択し、Notebookを開きます。

gemma


Jupyter Labの詳しい使い方は以下の記事で解説しています。


インスタンスにプリインストールされたJupyter Labを使用する場合


  プリインストールの利用方法(Docker、PyTorch、TensorFlow、JupyterLab)| GPUSOROBAN GPUSOROBAN高速コンピューティングのプリインストールの利用方法を説明しています。PyTorchやTensosrFlow、JupyterLabがプリインストールされたインスタンスを使うことで環境構築にかかる時間を削減できます。 業界最安級GPUクラウド | GPUSOROBAN


Jupyter Labを新しくインストールして使う場合


  Jupyter Labのインストール(Ubuntu)| GPUSOROBAN GPUSOROBANのUbuntuインスタンスにJupyter Labをインストールする方法を紹介しています。高性能なGPUインスタンスを利用したクラウドサービスGPUSOROBANでJupyter Labを動作させることが可能です。 業界最安級GPUクラウド | GPUSOROBAN


パッケージのインストール

JupyterLabのNotebookのコードセルで次のコマンドを実行し、PyTorchをインストールします。

pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118


次のコマンドを実行し、必要なパッケージをインストールします。

pip install transformers==4.38.2 datasets==2.16.1 accelerate==0.26.1 evaluate==0.4.1 bitsandbytes==0.42.0 trl==0.7.11 peft==0.8.2 ninja packaging tensorboard wheel


上記のパッケージのインストールが完了したら、Flash attentionをインストールします。

Flash attentionは、Transformerの処理を効率化して学習を高速化します。

pip install flash-attn --no-build-isolation


HuggingFaceにログインするためのパッケージをインストールします。

pip install -U "huggingface_hub[cli]"


HuggingFaceにログインします。

from huggingface_hub import login
token = "**************"
login(token)

token = "*************"には、HuggingFaceで発行したアクセストークンが入ります。

HuggingFaceでアクセストークンを発行する方法は以下の記事で解説しています。


  HuggingFaceでアクセストークンを作成する方法 この記事では、HuggingFaceでアクセストークンを作成する方法について解説しています。 業界最安級GPUクラウド | GPUSOROBAN


データセットの読み込み

モデルのトレーニングにはデータセット[philschmid/dolly-15k-oai-style]を使用します。
15,000以上のプロンプトと応答がペアになったデータセットです。

from datasets import load_dataset
dataset = load_dataset("philschmid/dolly-15k-oai-style", split="train")
print(dataset[3]["messages"])


モデルの設定

必要なライブラリをインポートします。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig


4bit量子化の設定をします。
量子化により精度を落とす代わりにモデルを軽量化して、GPUメモリを節約できます。

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)


モデルとトークナイザーの設定をします。

モデルはgemma-7bのベースモデルを使用します。

model_id = "google/gemma-7b"
tokenizer_id = "philschmid/gemma-tokenizer-chatml"
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    attn_implementation="flash_attention_2",
    torch_dtype=torch.bfloat16,
    quantization_config=bnb_config,
    token=token
)
tokenizer = AutoTokenizer.from_pretrained(tokenizer_id)
tokenizer.padding_side = 'right'


パイプラインの設定をします。

from transformers import pipeline
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
eos_token = tokenizer("<|im_end|>",add_special_tokens=False)["input_ids"][0]


ファインチューニング前のモデルでテキスト生成(推論)をテストしてみます。

prompts = [
    "What is the capital of Japan?",
    "Please tell me about the effects of probiotics.",
    "A rectangular garden has a length of 30 meter and a width of 20 meter. If you want to build a fence around the entire garden, how many meter of fencing will you need?",
    "What is the difference between a fruit and a vegetable? Give examples of each.",
]

def test_inference(prompt):
    prompt = pipe.tokenizer.apply_chat_template([{"role": "user", "content": prompt}], tokenize=False, add_generation_prompt=True)
    outputs = pipe(prompt, max_new_tokens=1024, do_sample=True, temperature=0.7, top_k=50, top_p=0.95, eos_token_id=eos_token)
    return outputs[0]['generated_text'][len(prompt):].strip()


for prompt in prompts:
    print(f"    prompt:\n{prompt}")
    print(f"    response:\n{test_inference(prompt)}")
    print("-"*50)


ファインチューニング前のモデルでは、プロンプトにうまく応答ができていないことが確認できます。

 prompt:
What is the capital of Japan?
    response:
We can see the _______ on the map..)-
AfterClass
I like _______. enumii
AfterClass
I like _______. enumii
--------------------------------------------------
    prompt:
Please tell me about the effects of probiotics.
    response:
The role of probiotics in the body is to help restore the balance of microorganisms in the digestive tract.<!--
user
Can probiotics be taken with antibiotics? crou
--------------------------------------------------
    prompt:
A rectangular garden has a length of 30 meter and a width of 20 meter. If you want to build a fence around the entire garden, how many meter of fencing will you need?
    response:
A rectangular garden has a length of 30 meter and a width of 20 meter. If you want to build a fence around the entire garden, how many meter of fencing will you need?
A  فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس فريبيس
--------------------------------------------------
    prompt:
What is the difference between a fruit and a vegetable? Give examples of each.
    response:
Why is there no meat
--------------------------------------------------


QLoRAの設定

QLoRAの設定をします。QLoRAとは、事前学習済みモデルに対して一部のパラメータのみを更新する計算効率の高い手法です。

さらに事前学習済みモデルを量子化してロードするため、GPUメモリを節約できます。

from peft import LoraConfig
peft_config = LoraConfig(
        lora_alpha=8,
        lora_dropout=0.05,
        r=6,
        bias="none",
        target_modules="all-linear",
        task_type="CAUSAL_LM",
)


トレーニングのパラメータ設定

トレーニングのパラメータ設定を行います。

from transformers import TrainingArguments
args = TrainingArguments(
    output_dir="gemma-7b-dolly-chatml",
    num_train_epochs=3,
    per_device_train_batch_size=2, 
    gradient_accumulation_steps=2,
    gradient_checkpointing=True,
    optim="adamw_torch_fused",
    logging_steps=10,
    save_strategy="epoch",
    bf16=True,
    tf32=True,
    learning_rate=2e-4,
    max_grad_norm=0.3,
    warmup_ratio=0.03,
    lr_scheduler_type="constant",
    push_to_hub=False,
    report_to="tensorboard",
)


ファインチューニングの実行

SFTTranerを使ってファインチューニングを実行します。
SFTTrainerは、モデルに対して教師ありファインチューニングをするTrainerです。

from trl import SFTTrainer
max_seq_length = 1512
trainer = SFTTrainer(
    model=model,
    args=args,
    train_dataset=dataset,
    peft_config=peft_config,
    max_seq_length=max_seq_length,
    tokenizer=tokenizer,
    packing=True,
    dataset_kwargs={
        "add_special_tokens": False,
        "append_concat_token": False,
    }
)

trainer.train()
trainer.save_model()

gemma


GPUメモリの解放

ファインチューニングが完了したら、モデルとTrainerの設定、キャッシュの削除によりGPUメモリを解放します。

del model
del trainer
torch.cuda.empty_cache()


ファインチューニング後モデルでテキスト生成

ファインチューニング後のモデルでテキスト生成を行うための設定をします。

import torch
from peft import AutoPeftModelForCausalLM
from transformers import  AutoTokenizer, pipeline

peft_model_id = "gemma-7b-dolly-chatml"

tokenizer = AutoTokenizer.from_pretrained(peft_model_id)
model = AutoPeftModelForCausalLM.from_pretrained(peft_model_id, device_map="auto", torch_dtype=torch.float16)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)

eos_token = tokenizer("<|im_end|>",add_special_tokens=False)["input_ids"][0]


プロンプトを実行します。

prompts = [
    "What is the capital of Japan?",
    "Please tell me about the effects of probiotics.",
    "A rectangular garden has a length of 30 meter and a width of 20 meter. If you want to build a fence around the entire garden, how many meter of fencing will you need?",
    "What is the difference between a fruit and a vegetable? Give examples of each.",
]

def test_inference(prompt):
    prompt = pipe.tokenizer.apply_chat_template([{"role": "user", "content": prompt}], tokenize=False, add_generation_prompt=True)
    outputs = pipe(prompt, max_new_tokens=1024, do_sample=True, temperature=0.7, top_k=50, top_p=0.95, eos_token_id=eos_token)
    return outputs[0]['generated_text'][len(prompt):].strip()


for prompt in prompts:
    print(f"    prompt:\n{prompt}")
    print(f"    response:\n{test_inference(prompt)}")
    print("-"*50)


ファインチューニング後のモデルでは、プロンプトに対してうまく応答ができています。

prompt:
What is the capital of Japan?

response:
The capital of Japan is Tokyo, but the new capital will be moved to Kansai, which is in Osaka.
--------------------------------------------------
prompt:
Please tell me about the effects of probiotics.

response:
Probiotics are bacteria that are beneficial to the human body, and there are many strains of probiotics. Probiotics help to balance the gut microbiome, which helps to boost immune function and reduce inflammation. Probiotics may also help to improve digestive health, reduce the risk of certain infections, and even improve mental health.
--------------------------------------------------
prompt:
A rectangular garden has a length of 30 meter and a width of 20 meter. If you want to build a fence around the entire garden, how many meter of fencing will you need?

response:
You need to take the perimeter of the garden. For a rectangle, the perimeter is given by the sum of all four sides: 2*length + 2*width. In this case, the perimeter is 2*30 + 2*20 = 100 meter of fencing.
--------------------------------------------------
prompt:
What is the difference between a fruit and a vegetable? Give examples of each.

response:
The difference between a fruit and a vegetable is that a vegetable is a plant's root, stem, leaves, or flower. A fruit is the seed-bearing mature structure of a plant. Examples of vegetables include broccoli, carrots, and potatoes. Examples of fruits include apples, oranges, and pineapples.
--------------------------------------------------

<以下は日本語訳>
プロンプト:
日本の首都はどこですか?

応答:
日本の首都は東京ですが、新首都は関西の大阪に移転します。
--------------------------------------------------
プロンプト:
プロバイオティクスの効果について教えてください。

応答:
プロバイオティクスは人体に有益な細菌であり、プロバイオティクスには多くの種類があります。 プロバイオティクスは腸内微生物叢のバランスを整えるのに役立ち、免疫機能を高め、炎症を軽減します。 プロバイオティクスは、消化器の健康を改善し、特定の感染症のリスクを軽減し、さらには精神的健康の改善にも役立つ可能性があります。
--------------------------------------------------
プロンプト:
長方形の庭園は長さ30メートル、幅20メートルです。 庭全体にフェンスを設置したい場合、何メートルのフェンスが必要ですか?

応答:
庭の周囲を取る必要があります。 長方形の場合、周囲長は 4 つの辺の合計 (2*長さ + 2*幅) で求められます。 この場合、フェンスの周囲は 2*30 + 2*20 = 100 メートルになります。
--------------------------------------------------
プロンプト:
果物と野菜の違いは何ですか? それぞれの例を挙げてください。

応答:
果物と野菜の違いは、野菜が植物の根、茎、葉、または花であることです。 果実は、種子を含む成熟した植物の構造です。 野菜の例としては、ブロッコリー、ニンジン、ジャガイモなどが挙げられます。 果物の例には、リンゴ、オレンジ、パイナップルが含まれます。
--------------------------------------------------


LLMならGPUクラウド

LLMを使用する際には、モデルサイズやタスクに応じて必要なスペックが異なります。

LLMで使用されるGPUは高価なため、買い切りのオンプレミスよりも、コストパフォーマンスが高く柔軟な使い方ができるGPUクラウドをおすすめしています。

GPUクラウドのメリットは以下の通りです。

  • 必要なときだけ利用して、コストを最小限に抑えられる
  • タスクに応じてGPUサーバーを変更できる
  • 需要に応じてGPUサーバーを増減できる
  • 簡単に環境構築ができ、すぐに開発をスタートできる
  • 新しいGPUを利用できるため、陳腐化による買い替えが不要
  • GPUサーバーの高電力・熱管理が不要


コスパをお求めなら、メガクラウドと比較して50%以上安いGPUクラウドサービス「GPUSOROBAN」がおすすめです。


  生成AIに最適なGPUクラウド「高速コンピューティング」|GPUSOROBAN GPUSOROBANの高速コンピューティングは、NVIDIAの高速GPUが業界最安級で使えるクラウドサービスです。NVIDIA A100を始めする高速GPUにより、画像生成AI、画像認識、機械学習を高速化します。 業界最安級GPUクラウド | GPUSOROBAN


大規模なLLMを計算する場合は、NVIDIA H100のクラスタが使える「GPUSOROBAN AIスパコンクラウド」がおすすめです。

  LLMに最適なH100が業界最安級「AIスパコンクラウド」| GPUSOROBAN AIスパコンクラウドはNVIDIA H100を搭載したGPUインスタンスが業界最安級で使えるクラウドサービスです。HGX H100(H100 x8枚)を複数連結したクラスタ構成により、LLMやマルチモーダルAIの計算時間を短縮します。料金はAWSのH100インスタンスと比較して75%安く設定しており、大幅なコストダウンが可能です。 業界最安級GPUクラウド | GPUSOROBAN


まとめ

この記事では、Gemmaベースモデルをファインチューニングする方法を紹介しました。

モデルをファインチューニングすることで、Gemmaベースの独自のモデルを作成できます。

Gemmaに関する詳細は以下の記事で解説していますので、あわせてご覧ください。


  【LLM】Google Gemmaとは?使い方・性能・商用利用について解説 Gemmaは、Googleが公開した軽量かつ高性能なLLMで、商用利用可能なオープンモデルです。この記事では、Gemmaの使い方から性能・安全性・商用利用まで紹介しています。 業界最安級GPUクラウド | GPUSOROBAN



MORE INFORMATION

GPUでお困りの方はGPUSOROBANで解決!
お気軽にご相談ください

10日間無料トライアル
詳しい資料はこちら
質問・相談はこちら