Views
No views yet
1!pip uninstall unsloth -y
2!pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"1# Google Colab のデフォルトで入っているパッケージをアップグレード
2!pip install --upgrade torch
3!pip install --upgrade xformers1import torch
2if torch.cuda.get_device_capability()[0] >= 8:
3 !pip install --no-deps packaging ninja einops "flash-attn>=2.6.3"1#write権限のあるトークンを記述
2HF_TOKEN = 'your_token'
3
4# llm-jp/llm-jp-3-13bを4bit量子化のqLoRA設定でロード。
5
6from unsloth import FastLanguageModel
7import torch
8max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
9dtype = None # Noneにしておけば自動で設定
10load_in_4bit = True # 今回は13Bモデルを扱うためTrue
11
12model_id = "llm-jp/llm-jp-3-13b"
13new_model_id = "llm-jp-3-13b-it" #Fine-Tuningしたモデルにつけたい名前、it: Instruction Tuning
14# FastLanguageModel インスタンスを作成
15model, tokenizer = FastLanguageModel.from_pretrained(
16 model_name=model_id,
17 dtype=dtype,
18 load_in_4bit=load_in_4bit,
19 trust_remote_code=True,
20)
21
22# SFT用のモデルを用意
23model = FastLanguageModel.get_peft_model(
24 model,
25 r = 32,
26 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
27 "gate_proj", "up_proj", "down_proj",],
28 lora_alpha = 32,
29 lora_dropout = 0.05,
30 bias = "none",
31 use_gradient_checkpointing = "unsloth",
32 random_state = 3407,
33 use_rslora = False,
34 loftq_config = None,
35 max_seq_length = max_seq_length,
36)
37
38#データセットの読み込み
39from datasets import load_dataset
40
41dataset = load_dataset("json", data_files="./ichikara-instruction-003-001-1.json")
42
43# 学習時のプロンプトフォーマットの定義
44prompt = """### 指示
45{}
46### 回答
47{}"""
48
49
50"""
51formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる
52"""
53EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
54def formatting_prompts_func(examples):
55 input = examples["text"] # 入力データ
56 output = examples["output"] # 出力データ
57 text = prompt.format(input, output) + EOS_TOKEN # プロンプトの作成
58 return { "formatted_text" : text, } # 新しいフィールド "formatted_text" を返す
59pass
60
61# # 各データにフォーマットを適用
62dataset = dataset.map(
63 formatting_prompts_func,
64 num_proc= 4, # 並列処理数を指定
65)
66
67from trl import SFTTrainer
68from transformers import TrainingArguments
69from unsloth import is_bfloat16_supported
70
71trainer = SFTTrainer(
72 model = model,
73 tokenizer = tokenizer,
74 train_dataset=dataset["train"],
75 max_seq_length = max_seq_length,
76 dataset_text_field="formatted_text",
77 packing = False,
78 args = TrainingArguments(
79 per_device_train_batch_size = 2,
80 gradient_accumulation_steps = 4,
81 num_train_epochs = 1,
82 logging_steps = 10,
83 warmup_steps = 10,
84 save_steps=100,
85 save_total_limit=2,
86 max_steps=-1,
87 learning_rate = 2e-4,
88 fp16 = not is_bfloat16_supported(),
89 bf16 = is_bfloat16_supported(),
90 group_by_length=True,
91 seed = 3407,
92 output_dir = "outputs",
93 report_to = "none",
94 ),
95)
96
97#@title 現在のメモリ使用量を表示
98gpu_stats = torch.cuda.get_device_properties(0)
99start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
100max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
101print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.")
102print(f"{start_gpu_memory} GB of memory reserved.")
103
104#@title 学習実行
105trainer_stats = trainer.train()
106
107import json
108datasets = []
109with open("/content//elyza-tasks-100-TV_0.jsonl", "r") as f:
110 item = ""
111 for line in f:
112 line = line.strip()
113 item += line
114 if item.endswith("}"):
115 datasets.append(json.loads(item))
116 item = ""
117
118# 学習したモデルを用いてタスクを実行
119from tqdm import tqdm
120
121# 推論するためにモデルのモードを変更
122FastLanguageModel.for_inference(model)
123
124results = []
125for dt in tqdm(datasets):
126 input = dt["input"]
127
128 prompt = f"""### 指示\n{input}\n### 回答\n"""
129
130 inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
131
132 outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)
133 prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
134
135 results.append({"task_id": dt["task_id"], "input": input, "output": prediction})
136
137# jsonlで保存
138with open(f"{new_model_id}_output.jsonl", 'w', encoding='utf-8') as f:
139 for result in results:
140 json.dump(result, f, ensure_ascii=False)
141 f.write('\n')