LLMファインチューニングのためのデータセット準備 Google Drive上のJSONLを読み込みフォーマットする

前回の記事では、LLMファインチューニングのためのGoogle Colab環境構築について解説しました。今回はその次のステップとして、ファインチューニングに使用するデータセットの準備を行います。

下記が前回の記事です。

機械学習、特にファインチューニングにおいて、学習データとなるデータセットを適切な形式に整えることは非常に重要です。

今回解説をする内容は次の記事の「2.データの準備」が対象に該当します。

ここでは、Google Drive上に配置したJSONL形式のデータファイルを読み込み、Hugging Faceのdatasetsライブラリを使って前処理を行う手順を説明しています。

詳しく見ていきましょう。

今回のゴール

  • Google DriveからJSONLファイルを読み込む
  • datasetsライブラリを使ってデータを扱いやすい形式に変換する
  • ファインチューニング(今回はテキスト継続学習)に適したフォーマットに関数を適用して整形する

データ準備コード全体

まずは、データセット準備のためのPythonコード全体を示します。

# Python
# --- 設定 ---
# データファイルのパス (ご自身のGoogle Drive上のパスに修正してください)
data_path = "/content/drive/MyDrive/wordpress_posts_映画_processed.jsonl"
# ----------------

# データセットのロード
try:
    # "json"フォーマットとして、指定されたパスのファイルを読み込む
    # split="train" は、データセットを 'train' スプリットとしてロードすることを示す
    dataset = load_dataset("json", data_files=data_path, split="train")
    print(f"データセットの読み込み完了。件数 {len(dataset)}")
    # print("データサンプル", dataset[0]) # 必要に応じてコメント解除してデータ確認
except Exception as e:
    print(f"データセットの読み込みに失敗しました {e}")
    print(f"ファイルパス '{data_path}' が正しいか、ファイルが存在するか確認してください。")
    # エラー発生時は以降の処理を中断
    raise

# データフォーマット関数 (テキスト継続学習用)
# この関数は、データセットの各レコードに適用される
# Llama-3 + SFTTrainer を想定し、ここでは単純なテキスト結合のみを行う
def format_data(example):
    # 入力は辞書形式 (example) で、元のJSONLの各行に対応
    # 'title' と 'text' のキーを使って値を取得し、整形
    formatted_text = f"タイトル {example['title']}\n\n本文\n{example['text']}"
    # SFTTrainerがデフォルトで入力として期待する 'text' キーを持つ辞書を返す
    return {"text": formatted_text}

# データセット全体に関数を適用し、前処理を行う
# mapメソッドはデータセットの各要素に関数を適用し、新しいデータセットを生成
# remove_columnsで、フォーマット後の 'text' 列以外は削除する
dataset = dataset.map(format_data, remove_columns=['id', 'title', 'text', 'category', 'post_date'])

# (オプション) データセットの分割は行わず、全て訓練データとして使用
# 必要に応じて訓練/検証/テストに分割することも可能
train_dataset = dataset
# print("フォーマット後のデータサンプル", train_dataset[0]) # 必要に応じてコメント解除して確認

print("データセットの前処理完了。")

コード解説

ステップごとに処理内容を見ていきましょう。

1. 設定 データファイルのパス指定

# Python
data_path = "/content/drive/MyDrive/wordpress_posts_映画_processed.jsonl"

data_path変数に、学習データとして使用するJSONLファイルのパスを指定します。これはGoogle DriveをColabにマウントした後のパスです (/content/drive/MyDrive/ 以下に、ご自身のDrive内のファイルパスが続きます)。ご自身の環境に合わせて、正しいファイルパスに修正してください。

JSONL (JSON Lines) とは 1行に1つの有効なJSONオブジェクトが記述されているテキストファイル形式です。ストリーミング処理に適しています。

2. データセットのロード load_dataset

try:
    dataset = load_dataset("json", data_files=data_path, split="train")
    # ... (省略) ...
except Exception as e:
    # ... (省略) ...
    raise

Hugging Faceのdatasetsライブラリが提供するload_dataset関数を使って、データを読み込みます。

  • "json" 読み込むデータの形式を指定します。datasetsはCSV, Parquetなど様々な形式に対応しています。
  • data_files=data_path 読み込むファイルパスを指定します。
  • split="train" データセットを「訓練用 (train)」スプリットとして読み込みます。ファイルが1つの場合、デフォルトでtrainスプリットになります。

ファイルが存在しない、パスが間違っている、JSONL形式でないなどの理由で読み込みに失敗する可能性もあるため、try-exceptブロックでエラーハンドリングを行っています。エラー発生時には、原因究明の手がかりとなるメッセージを表示し、処理を中断します。

3. データフォーマット関数 format_data

# Python
def format_data(example):
    formatted_text = f"タイトル {example['title']}\n\n本文\n{example['text']}"
    return {"text": formatted_text}

ファインチューニングの目的(今回は元のデータに基づいたテキスト生成能力の向上、いわゆるテキスト継続学習)に合わせて、モデルが学習しやすい形式にデータを整形する関数を定義します。

この関数 format_data は、データセットの1レコード(1行分のデータ)を example という辞書として受け取ります。この辞書には、元のJSONLファイルのキー(id, title, textなど)が含まれています。

関数内では、example 辞書から titletext の値を取り出し、f-stringを使って「タイトル \n\n 本文 \n …」という形式の1つのテキスト (formatted_text) に結合しています。

最後に、{"text": formatted_text} という形式の辞書を返します。これは、後続の学習ステップで使うSFTTrainertrlライブラリの一部)が、デフォルトで入力テキストとして"text"というキーの値を参照するためです。コメントにあるように、Llama-3のようなモデルとSFTTrainerの組み合わせでは、特殊トークン(例: <s>, </s>)の付与などをSFTTrainer側で処理してくれるため、ここでは単純なテキスト結合に留めています。

4. データセットへの関数適用 dataset.map

# Python
dataset = dataset.map(format_data, remove_columns=['id', 'title', 'text', 'category', 'post_date'])

dataset.map()メソッドは非常に便利で、データセット内の全てのレコード(要素)に対して、指定した関数(ここではformat_data)を効率的に適用できます。

  • format_data 各レコードに適用する関数を指定します。
  • remove_columns=[...] 関数適用後のデータセットから、指定した列を削除します。今回は、format_dataで生成したtext列だけを残し、元のid, title, text, category, post_date列は不要なので削除しています。これにより、メモリ使用量を削減し、後の処理をシンプルにできます。

この処理により、元のデータセットは、各レコードが{"text": "整形済みテキスト"}という形式を持つ新しいデータセットに変換されます。

5. 訓練データセットの準備

# Python
train_dataset = dataset

今回はデータセットを訓練用と検証用に分割せず、読み込んだ全データをそのまま訓練用データセット (train_dataset) として使用しています。データ量が十分にある場合や、学習中のモデル性能を評価したい場合は、dataset.train_test_split()のようなメソッドを使って分割することも可能です。

6. 完了メッセージ

# Python
print("データセットの前処理完了。")

全ての処理が正常に完了したことを示すメッセージです。これで、ファインチューニングに投入できる形式のデータセット (train_dataset) が準備できました。

まとめ

この記事では、datasetsライブラリを活用して、Google Drive上のJSONLファイルから学習データを読み込み、ファインチューニングに適した形式に前処理する手順を解説しました。

  • load_dataset で様々な形式のデータを簡単に読み込める
  • map メソッドでデータセット全体に関数を効率的に適用し、整形や不要な列の削除ができる
  • try-except でファイル読み込み時のエラーに対応する

データセットの準備は、ファインチューニングの成否に大きく影響する重要な工程です。

次はいよいよAIの学習(ファインチューニング)を行うために、主役となるAIの「脳」にあたる「モデル」と、そのモデルが人間の言葉を理解するための「翻訳機」にあたる「トークナイザー」を、作業場所(Google Colab)に読み込む作業に入ります。

※この記事の作成には、一部生成AI(Google Geminiなど)を利用しています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール