前回の記事では、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
辞書から title
と text
の値を取り出し、f-stringを使って「タイトル \n\n 本文 \n …」という形式の1つのテキスト (formatted_text
) に結合しています。
最後に、{"text": formatted_text}
という形式の辞書を返します。これは、後続の学習ステップで使うSFTTrainer
(trl
ライブラリの一部)が、デフォルトで入力テキストとして"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など)を利用しています。