1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unslothを使ってIBM Granite 4.0を自作の日本語データセットでファインチューニングした話

1
Posted at

背景

昨今は、企業などで生成AIが業務に欠かせないものとなっています。しかし機密情報や個人情報を生成AIに用いる場合、ChatGPTやMicrosoft Copilot、Google Geminiなどは、APIを使う場合であっても外部送信になるため使用が禁止されることケースは少なくありません。APIを使えば、学習はされないのですが、機密情報や個人情報の外部送信であることにかわりはないです。

また、自社のナレッジを活用したいというニーズもあるため、RAG(検索拡張生成)を使うにしても、特化した社内やプライベートクラウド専用の生成AIが必要になり、生成AIの中核である、LLM(大規模言語モデル)やSLM(小規模言語モデル)をつくることになります。作成したLLM/SLMを、RAGを組み合わせることもあります。

この記事について

LLMやSLMを手軽に作る方法として、既存のLLMやSLMをつかい、特定分野に特化させるファインチューニングや知識を追加する継続事前学習などがあります。
この記事では、すぐに取り組むことができる手法として、Google Colab無料プランの範囲でファインチューニングを確実に実施でき、かつ1時間程度で終わるように軽量なモデル(SLM)である、「IBM Granite 4.0 350m」と、ファインチューニングを高速化するライブラリの「Unsloth」を用いたファインチューニングに取り組んだことの記録です。
IBM Granite 4.0 は、オープンソースソフトウェアライセンスにおける Apache 2.0 License のため、商用利用ができます。
「Unsloth」が配布している、IBM Granite 4.0 向けのファインチューニング用のノートブックでは、英語の学習データセットでしたので、これを日本語データセットで学習できるようにするためにカスタマイズする必要がありましたので、カスタマイズしたノートブックも共有いたします。

ファインチューニングのために日本語データセット

ファインチューニングや継続事前学習には、学習データが必要です。
日本語で「IBM Granite 4.0 350m」を用いてファインチューニングを行うには、少なくとも100件程度の日本語データセットが必要です。
「Unsloth」で配布しているファインチューニング用ノートブックでは、英語の学習データセットとして、下記を使っています。
https://huggingface.co/datasets/unsloth/Support-Bot-Recommendation/raw/main/support_recs.csv

このデータセット、お客様サポートの会話で、snippet,recommendation という2つの列を含むCSVファイルで、sinippet という個人的に違和感があるので、作成した日本語データセットでは、次のような形式のCSVファイルとし、105行(件)ほど作成しました。ファイル名は、「finetune_support_ja_100_rich.csv」としました。

input recommendation
User: ログインしようとすると画面が真っ白になります。Agent: ご不便をおかけして申し訳ありません。発生するタイミングを教えてください。User: IDとパスワードを入力してログインを押した直後です。Agent: ご使用のブラウザ名をおしえていただけますか? ログイン後に画面が表示されない問題が発生している。ブラウザ依存やキャッシュ不整合の可能性があるため、利用環境を確認したうえで切り分けを行うことが重要である。
User: 支払いは完了したのに、サービスが使えません。Agent: 決済完了の通知は届いていますか?User: はい、メールは届いています。Agent: ありがとうございます。反映に時間がかかる場合がありますので確認します。 決済完了後にサービスが有効化されないケース。決済システムとサービス側の反映遅延を想定し、次に取るべき操作を丁寧に説明する必要がある。

Google Colab でノートブックを開く

作成した日本語データセットで、IBM Granite 4.0 350m モデルをファインチューニングするノートブックは下記になります。

日本語データセットでファインチューニングするために、カスタマイズしたノートブック

Google Colabの無料プランで使うことのできるノートブックです。
https://github.com/kolinz/notebook4AI にある「Granite4_0_ja_dataset_FT.ipynb」になります。

「Open in Colab」をクリックすることで、Google Colabで、「Granite4_0_ja_dataset_FT.ipynb」を開くことができます。
image.png

もとになった、「Granite4.0_350M.ipynb」との違いは、次のとおりです。

Google ドライブのマウントを追加

日本語データセットを、Google ドライブで版管理できるように、Google ドライブをマウントするコードを追加しています。

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

このため、データセットを読み込む部分のコードは下記のようになっています。

from datasets import load_dataset

# 1. CSVの読み込み
sheet_path = '/content/drive/MyDrive/finetune_support_ja_100_rich.csv'
dataset = load_dataset(
    "csv",
    data_files={"train": sheet_path},
    column_names=["input", "recommendation"],
    skiprows=1
)["train"]

# 2. モデルが理解できる形式に変換する関数
def formatting_prompts_func(examples):
    inputs  = examples["input"]
    outputs = examples["recommendation"]
    texts = []
    for input_text, output_text in zip(inputs, outputs):
        # Granite Baseモデルが「対話」として認識できるタグを付けます
        # input自体に "User:" が含まれているので、それを活かしつつ構成します
        text = f"<|user|>\n{input_text}\n<|assistant|>\n{output_text}\n<|endoftext|>"
        texts.append(text)
    return { "text" : texts }

# データセットに適用
dataset = dataset.map(formatting_prompts_func, batched = True)

Unslothなど関連ソフトウェアのバージョン固定

こうしてノートブックを公開しているわけなので、確実に動作するように、Unsloth配布のノートブックとは異なり、Unsloth関連のバージョンを固定しています。次のようになっています。

%%capture
import os, importlib.util
!pip install --upgrade -qqq uv
if importlib.util.find_spec("torch") is None or "COLAB_" in "".join(os.environ.keys()):
    try: import numpy, PIL; get_numpy = f"numpy=={numpy.__version__}"; get_pil = f"pillow=={PIL.__version__}"
    except: get_numpy = "numpy"; get_pil = "pillow"
    !uv pip install -qqq \
        "torch==2.7.1" "triton>=3.3.0" {get_numpy} {get_pil} torchvision bitsandbytes "transformers==4.56.2" \
        "unsloth-zoo==2025.12.7" \
        "unsloth==2025.12.9"
elif importlib.util.find_spec("unsloth") is None:
    !uv pip install -qqq unsloth
!uv pip install --upgrade --no-deps transformers==4.56.2 tokenizers trl==0.22.2 unsloth unsloth_zoo

# These are mamba kernels and we must have these for faster training
# Mamba kernels are for now supported only on torch==2.7.1. If you have newer torch versions, please wait 30 minutes for it to compile
!uv pip install --no-build-isolation mamba_ssm==2.2.5
!uv pip install --no-build-isolation causal_conv1d==1.5.2

インストールするソフトウェアのバージョンを固定することで、確実に動作するようになります。

学習済みモデルダウンロード

ファインチューニングしたモデルをダウンロードし、パソコンのローカル環境やサーバー等でセルフホストできるように、GGUF形式で保存し、ダウンロードする機能を、ノートブックの最後の方に追加しています。

モデルの保存

学習済みモデルを保存する処理です。

model.save_pretrained("granite4_ft_model")  # Local saving , デフォルトモデル名 lora_model
tokenizer.save_pretrained("granite4_ft_model")
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
# tokenizer.push_to_hub("your_name/lora_model", token = "...") # Online saving

下記のコードも加えます。

if False:
    from unsloth import FastLanguageModel
    model, tokenizer = FastLanguageModel.from_pretrained(
        model_name = "granite4_ft_model", # YOUR MODEL YOU USED FOR TRAINING
        max_seq_length = 2048,
        load_in_4bit = True,
    )

messages = [
    {"role": "user", "content": scenario_3},
]
inputs = tokenizer.apply_chat_template(
    messages,
    tokenize = True,
    add_generation_prompt = True, # Must add for generation
    padding = True,
    return_tensors = "pt",
    return_dict=True,
).to("cuda")

from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer, skip_prompt = False)

_ = model.generate(**inputs,
                   streamer = text_streamer,
                   max_new_tokens = 512, # Increase if tokens are getting cut off
                   use_cache = True,
                   # Adjust the sampling params to your preference
                   do_sample=False,
                   temperature = 0.7, top_p = 0.8, top_k = 20,

モデルのエクスポート(ダウンロード)

保存した学習済みモデルをダウンロード向けに軽量化するために量子化する処理を追加します。

# 8ビット量子化を指定
if True:
    model.save_pretrained_gguf("export_model", tokenizer, quantization_method = "q8_0")

この処理で、8ビット量子化となり、GGUF形式で保存されます。
しかし、もとのモデル名と区別がつかないので、モデル名を変更する処理を追加します。

import os

src = "/content/granite-4.0-350m.Q8_0.gguf"
dst = "/content/granite-4.0-350m-FT-ja.Q8_0.gguf"

os.rename(src, dst)

これで、モデル名が変更できたので、エクスポート(ダウンロード)する処理を追加します。

from google.colab import files
files.download('/content/granite-4.0-350m-FT-ja.Q8_0.gguf')

ダウンロードしたモデルをPC上で動かす

ダウンロードしたモデルをPC上で使ってみるには、この記事では「LM Studio」を使って動作確認しています。
LM Studioを使っていない方は、LM Stduioをインストールしてみてください。LM Studioは2025年7月に企業利用ができるようになりました。インストールは英語ですが、日本語画面に変更することができます。
https://lmstudio.ai/

Windowsのターミナル(もしくはコマンドプロンプト)を起動しまして、次のコマンドを実行します。

lms import gguf形式のモデルのパス 

今回は、モデルをダウンロードしたフォルダで下記を実行しました。

lms import granite-4.0-350m-FT-ja.Q8_0.gguf

これで、LM Studio で、ダウンロードしたモデルを使うことができます。実際に会話してみると、ファインチューニングに使用した日本語データセットが影響していると思われる反応をします。

image.png

終わりに

IBM Granite 4.0 がリリースされ、Unslothが対応したことで、IBM Cloudなどで親和性の高い、IBM Graniteのファインチューニングがより一層手軽になり、今回は日本語データセットを用いて、大学の授業や社会人向けのオンライン勉強会で、1時間以内にファインチューニングハンズオンができるように仕立てることができました。

今後は、LangflowなどIBMと関わりのあるAIエージェント作成ツールとの連携などに発展させたいと思います。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?