著者:澤井 理紀、藤田 充矩
大規模言語モデル(LLM)に基づく生成AIが注目を集めています。そうした生成AIを活用するには、LLMを特定のタスクやデータセットに最適化する「ファインチューニング」が欠かせません。本特集では、生成AIを支える技術を解説した上で、NVIDIAが提供する生成AI向けのフレームワーク「NVIDIA NeMo」を使って独自の生成AIをローカル環境に構築し、LLMをファインチューニングする方法を紹介します。
シェルスクリプトマガジン Vol.90は以下のリンク先でご購入できます。
図2 LLMダウンロード用のPythonスクリプト
1 2 3 4 5 6 7 8 9 10 |
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スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
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() |