著者:澤井 理紀、藤田 充矩
大規模言語モデル(LLM)に基づく生成AIが注目を集めています。そうした生成AIを活用するには、LLMを特定のタスクやデータセットに最適化する「ファインチューニング」が欠かせません。本特集では、生成AIを支える技術を解説した上で、NVIDIAが提供する生成AI向けのフレームワーク「NVIDIA NeMo」を使って独自の生成AIをローカル環境に構築し、LLMをファインチューニングする方法を紹介します。
シェルスクリプトマガジン Vol.90は以下のリンク先でご購入できます。![]()
![]()
図2 LLMダウンロード用のPythonスクリプト
import os
from huggingface_hub import snapshot_download
MODEL_DIR = "./models"
os.makedirs(MODEL_DIR, exist_ok=True)
snapshot_download(
repo_id="elyza/ELYZA-japanese-Llama-2-7b",
local_dir=f"{MODEL_DIR}/ELYZA-japanese-Llama-2-7b",
local_dir_use_symlinks=False
)
図4 PEFTに使用するデータセットの形式を変換するPythonスクリプト
import json
import os
import random
INPUT_TRAIN = "./JGLUE/datasets/jcommonsenseqa-v1.1/train-v1.1.json"
INPUT_VALID = "./JGLUE/datasets/jcommonsenseqa-v1.1/valid-v1.1.json"
OUTPUT_DIR = "./data/jcommonsenseqa-v1.1"
random.seed(42)
os.makedirs(OUTPUT_DIR, exist_ok=True)
def write_jsonl(fname, json_objs):
with open(fname, 'wt') as f:
for o in json_objs:
f.write(json.dumps(o, ensure_ascii=False)+"\n")
def form_question(obj):
st = ""
st += "### 指示:\n"
st += "与えられた選択肢の中から、最適な答えを選んでください。"
st += "出力は以下から選択してください:\n"
st += f"- {obj['choice0']}\n"
st += f"- {obj['choice1']}\n"
st += f"- {obj['choice2']}\n"
st += f"- {obj['choice3']}\n"
st += f"- {obj['choice4']}\n"
st += "### 入力:\n"
st += f"{obj['question']}\n"
st += "### 応答:"
return st
def prosess(input_path, train=False):
with open(input_path) as f:
dataset = [json.loads(line) for line in f.readlines()]
processed = []
for data in dataset:
prompt = form_question(data)
answer = data[f"choice{data['label']}"]
processed.append({"input": prompt, "output": f"{answer}"})
if train:
random.shuffle(processed)
train_ds = processed[:-1000]
valid_ds = processed[-1000:]
write_jsonl(f"{OUTPUT_DIR}/train-v1.1.jsonl", train_ds)
write_jsonl(f"{OUTPUT_DIR}/valid-v1.1.jsonl", valid_ds)
else:
write_jsonl(f"{OUTPUT_DIR}/test-v1.1.jsonl", processed)
return
def main():
prosess(INPUT_TRAIN, train=True)
prosess(INPUT_VALID)
if __name__ == "__main__":
main()