Views
No views yet
1# Google Colab の場合は上記の環境構築手順を行なわず、単にこのセルから実行していってください。
2!pip uninstall unsloth -y
3!pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
4
5
6# Google Colab のデフォルトで入っているパッケージをアップグレード(Moriyasu さんありがとうございます)
7!pip install --upgrade torch
8!pip install --upgrade xformers
9
10
11# notebookでインタラクティブな表示を可能とする(ただし、うまく動かない場合あり)
12# Google Colabでは実行不要
13!pip install ipywidgets --upgrade
14
15
16# Install Flash Attention 2 for softcapping support
17import torch
18if torch.cuda.get_device_capability()[0] >= 8:
19 !pip install --no-deps packaging ninja einops "flash-attn>=2.6.3"
20
21
22# Hugging Face Token を指定
23# 下記の URL から Hugging Face Token を取得できますので下記の HF_TOKEN に入れてください。
24# Write権限を付与してください。
25# https://huggingface.co/settings/tokens
26HF_TOKEN = "your-token" #@param {type:"string"}
27
28# あるいは Google Colab シークレットを使う場合、左のサイドバーより🔑マークをクリック
29# HF_TOKEN という名前で Value に Hugging Face Token を入れてください。
30# ノートブックからのアクセスのトグルをオンにし、下記の二行のコードのコメントアウトを外してください。
31
32# from google.colab import userdata
33# HF_TOKEN=userdata.get('HF_TOKEN')
34
35
36# llm-jp/llm-jp-3-13bを4bit量子化のqLoRA設定でロード。
37
38from unsloth import FastLanguageModel
39import torch
40max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
41dtype = None # Noneにしておけば自動で設定
42load_in_4bit = True # 今回は13Bモデルを扱うためTrue
43
44model_id = "llm-jp/llm-jp-3-13b"
45new_model_id = "llm-jp-3-13b-it" #Fine-Tuningしたモデルにつけたい名前、it: Instruction Tuning
46# FastLanguageModel インスタンスを作成
47model, tokenizer = FastLanguageModel.from_pretrained(
48 model_name=model_id,
49 dtype=dtype,
50 load_in_4bit=load_in_4bit,
51 trust_remote_code=True,
52)
53
54# SFT用のモデルを用意
55model = FastLanguageModel.get_peft_model(
56 model,
57 r = 32,
58 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
59 "gate_proj", "up_proj", "down_proj",],
60 lora_alpha = 32,
61 lora_dropout = 0.05,
62 bias = "none",
63 use_gradient_checkpointing = "unsloth",
64 random_state = 3407,
65 use_rslora = False,
66 loftq_config = None,
67 max_seq_length = max_seq_length,
68)
69
70
71from datasets import load_dataset
72
73dataset = load_dataset("json", data_files="/content/news_summaries.jsonl")
74# パスの指定にご注意ください。アップロードしたファイルを右クリックし、「パスをコピー」をクリック、上記の data_files と合致していることをご確認ください。Omnicampus のディレクトリ構造とは異なるかもしれません。
75
76
77# データセットのカラム名を確認
78print("Dataset columns:", dataset.column_names)
79
80# 安全なフォーマット関数を定義
81def formatting_prompts_func(examples):
82 try:
83 # 動的にキーを判定
84 key = "text" if "text" in examples else next(iter(examples.keys()))
85 input_text = examples[key]
86 # カスタム処理
87 return {"formatted_text": f"Processed: {input_text}"}
88 except KeyError:
89 print(f"Key error for examples: {examples}")
90 return {}
91
92# フィルタリング(必要に応じて)
93if "text" not in dataset.column_names:
94 print("Warning: 'text' column not found. Filtering dataset...")
95 dataset = dataset.filter(lambda example: "text" in example)
96
97# map を適用
98dataset = dataset.map(
99 formatting_prompts_func,
100 num_proc=4 # 並列処理
101)
102
103# 処理結果を確認
104print(dataset)
105
106
107# データセットのカラムを確認
108print(dataset.column_names) # 現在のカラム名を表示
109
110# `formatting_prompts_func`の修正
111def formatting_prompts_func(examples):
112 # ここでは 'summary' カラムを使用
113 input_data = examples["summary"] # 入力データを 'summary' から取得
114 # ここでinput_dataを使った処理を続ける
115 return {"formatted_summary": input_data} # フォーマットした結果を返す
116
117# 各データにフォーマットを適用
118dataset = dataset.map(
119 formatting_prompts_func,
120 num_proc=4, # 並列処理数を指定
121)
122
123# 結果を確認
124print(dataset)
125
126
127from datasets import load_dataset
128from transformers import AutoTokenizer, AutoModelForCausalLM
129from trl import SFTTrainer
130import logging
131
132# ロギングの設定 - デバッグに非常に有効
133logging.basicConfig(level=logging.INFO)
134logger = logging.getLogger(__name__)
135
136def prepare_dataset(dataset_name, split='train'):
137 try:
138 # データセットの読み込み
139 dataset = load_dataset(dataset_name, split=split)
140
141 # データセットの存在と内容の確認
142 if len(dataset) == 0:
143 logger.error(f"データセット {dataset_name} が空です。")
144 raise ValueError("データセットにデータがありません。")
145
146 logger.info(f"データセットのサイズ: {len(dataset)}")
147 logger.info(f"データセットの最初のサンプル: {dataset[0]}")
148
149 return dataset
150
151 except Exception as e:
152 logger.error(f"データセット読み込み中にエラーが発生: {e}")
153 raise
154
155def prepare_model_and_tokenizer(model_name):
156 try:
157 tokenizer = AutoTokenizer.from_pretrained(model_name)
158 model = AutoModelForCausalLM.from_pretrained(model_name)
159
160 return model, tokenizer
161
162 except Exception as e:
163 logger.error(f"モデルとトークナイザーの読み込み中にエラーが発生: {e}")
164 raise
165
166def main():
167 try:
168 # データセットとモデルの設定
169 dataset_name = "your_dataset_name" # 実際のデータセット名に置き換えてください
170 model_name = "your_base_model" # 使用するモデル名に置き換えてください
171
172 # データセットの準備
173 train_dataset = prepare_dataset(dataset_name)
174
175 # モデルとトークナイザーの準備
176 model, tokenizer = prepare_model_and_tokenizer(model_name)
177
178 # トレーナーの設定
179 trainer = SFTTrainer(
180 model=model,
181 tokenizer=tokenizer,
182 train_dataset=train_dataset,
183 dataset_text_field="text", # データセットの適切なテキストフィールドに置き換えてください
184 max_seq_length=512
185 )
186
187 # トレーニングの開始
188 trainer.train()
189
190 except Exception as e:
191 logger.error(f"トレーニング中に致命的なエラーが発生: {e}")
192
193if __name__ == "__main__":
194 main()
195
196
197#@title 現在のメモリ使用量を表示
198gpu_stats = torch.cuda.get_device_properties(0)
199start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
200max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
201print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.")
202print(f"{start_gpu_memory} GB of memory reserved.")
203
204
205from transformers import AutoTokenizer, GPT2LMHeadModel
206
207# ドキュメントをトークナイザーで準備
208tokenizer = AutoTokenizer.from_pretrained("gpt2") # 適切なモデル名を使用
209tokenizer.add_special_tokens({'pad_token': '[PAD]'}) # パディングトークンを設定
210
211model = GPT2LMHeadModel.from_pretrained("gpt2") # 同じモデルをロード
212model.resize_token_embeddings(len(tokenizer)) # トークン数をモデルに反映
213
214def preprocess_data(examples):
215 return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)
216
217# データセットをトークナイズ
218tokenized_dataset = dataset.map(preprocess_data, batched=True)
219
220
221# ELYZA-tasks-100-TVの読み込み。事前にファイルをアップロードしてください
222# データセットの読み込み。
223# omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
224import json
225datasets = []
226with open("/content//elyza-tasks-100-TV_0.jsonl", "r") as f:
227 item = ""
228 for line in f:
229 line = line.strip()
230 item += line
231 if item.endswith("}"):
232 datasets.append(json.loads(item))
233 item = ""
234
235
236from transformers import AutoModelForCausalLM, AutoTokenizer
237
238# モデルとトークナイザーの準備
239tokenizer = AutoTokenizer.from_pretrained("gpt2") # 適切なモデル名を使用
240model = AutoModelForCausalLM.from_pretrained("gpt2")
241
242# 入力データの準備
243inputs = tokenizer("ここに入力文を入れます", return_tensors="pt")
244
245# generateメソッドの呼び出し(無効な引数を削除)
246outputs = model.generate(
247 **inputs,
248 max_new_tokens=512, # 新しく生成するトークンの最大数
249 use_cache=True, # キャッシュを使用するか
250 do_sample=False, # サンプリングを行うかどうか
251 repetition_penalty=1.2 # 繰り返しペナルティ
252)
253
254# 出力のデコード
255prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
256print(prediction)
257
258
259# jsonlで保存
260with open(f"{new_model_id}_output.jsonl", 'w', encoding='utf-8') as f:
261 for result in results:
262 json.dump(result, f, ensure_ascii=False)
263 f.write('\n')
264
265
266from transformers import AutoModelForCausalLM, AutoTokenizer
267from huggingface_hub import login, HfApi
268
269# Hugging Face Hubにアクセスするための認証トークンを設定
270token = "your-token" # あなたのトークンをここに入力
271login(token=token)
272
273# モデルとトークナイザーの準備
274model_name = "gpt2"
275tokenizer = AutoTokenizer.from_pretrained(model_name)
276model = AutoModelForCausalLM.from_pretrained(model_name)
277
278# LoRAアダプタの設定(必要に応じて)
279# ここにLoRAの設定を追加
280
281# プライベートリポジトリにモデルを保存
282new_model_id = "LoRA_template_unsloth_1" # 保存するモデル名を指定
283api = HfApi()
284
285# リポジトリをプライベートとして作成
286api.create_repo(new_model_id + "_lora", private=True)
287
288# モデルとトークナイザーをHugging Face Hubにアップロード
289model.push_to_hub(new_model_id + "_lora", private=True)
290tokenizer.push_to_hub(new_model_id + "_lora", private=True)
291
292print(f"Model and tokenizer uploaded to the private repository: {new_model_id + '_lora'}")