Views
No views yet
datasets モジュールを用いて、ELYZA-tasks-100からタスクを取得します。DPOTrainerを用いて行います。1from trl import DPOTrainer
2trainer = DPOTrainer(model, args, train_dataset=dpo_datasets)
3trainer.train()1pip install -U ipywidgets
2pip install transformers==4.46.3
3pip install -U bitsandbytes
4pip install -U accelerate
5pip install -U datasets
6pip install -U peft==0.13.2
7pip install -U trl==0.12.11from transformers import (
2 AutoModelForCausalLM,
3 AutoTokenizer,
4 BitsAndBytesConfig
5)
6from peft import PeftModel
7
8# モデル設定
9base_model_id = "llm-jp/llm-jp-3-13b" # モデルのIDまたはパスを指定
10adapter_id = "usui2024/20241211_w_llm-jp-3-13b-it_lora" # LoRAアダプターID
11
12# QLoRAの設定
13bnb_config = BitsAndBytesConfig(
14 load_in_4bit=True,
15 bnb_4bit_quant_type="nf4",
16 bnb_4bit_compute_dtype=torch.bfloat16,
17)
18
19# モデルとトークナイザーのロード
20model = AutoModelForCausalLM.from_pretrained(
21 base_model_id,
22 quantization_config=bnb_config,
23 device_map="auto",
24 token=HF_TOKEN # HF_TOKENはHugging Faceのアクセストークン
25)
26tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True, token=HF_TOKEN)
27
28# LoRAアダプターを統合
29model = PeftModel.from_pretrained(model, adapter_id, token=HF_TOKEN)
301from datasets import load_dataset
2from tqdm import tqdm
3
4# データセットの読み込み
5datasets = load_dataset("elyza/ELYZA-tasks-100")
6
7task_results = []
8
9# タスクの生成
10for ref_input in tqdm(datasets['test']['input']):
11 prompt = f"""以下に示す参考タスクに従って、類似したタスクを生成しなさい。
12 ## 参考タスク
13 仕事の熱意を取り戻すためのアイデアを5つ挙げてください。
14 ## 類似タスク
15 試合に挑む心構えを3つほど挙げてください。
16 ## 参考タスク
17 {ref_input}
18 ## 類似タスク
19 """
20
21 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
22 attention_mask = torch.ones_like(tokenized_input)
23
24 with torch.no_grad():
25 outputs = model.generate(
26 tokenized_input,
27 attention_mask=attention_mask,
28 max_new_tokens=100,
29 num_return_sequences=3, # 同じタスクから3つの新タスクを生成
30 do_sample=True,
31 temperature=0.6,
32 top_p=0.9,
33 repetition_penalty=1.2,
34 pad_token_id=tokenizer.eos_token_id
35 )
36
37 output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
38
39 new_task = {"reference_task": ref_input}
40 new_task.update({f"similar_task_{i}": output_text for i, output_text in enumerate(output_texts)})
41 task_results.append(new_task)
42
43df = pd.DataFrame(task_results)
44df.head()1from trl import DPOConfig, DPOTrainer
2from datasets import Dataset
3import torch
4
5# DPO用のデータセットを準備
6dpo_datasets = Dataset.from_list(dpo_datasets)
7
8# DPOの設定
9training_args = DPOConfig(
10 output_dir=new_model_id,
11 per_device_train_batch_size=1,
12 gradient_accumulation_steps=4,
13 num_train_epochs=2,
14 logging_steps=10,
15 save_steps=100,
16 save_total_limit=1,
17 learning_rate=1.5e-4,
18 fp16=True,
19)
20
21# DPOトレーナーの設定
22dpo_trainer = DPOTrainer(
23 model,
24 args=training_args,
25 train_dataset=dpo_datasets,
26 tokenizer=tokenizer,
27 peft_config=peft_config,
28)
29
30# 学習の実行
31dpo_trainer.train()1
2
3# データセットの読み込み。
4datasets = []
5with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
6 item = ""
7 for line in f:
8 line = line.strip()
9 item += line
10 if item.endswith("}"):
11 datasets.append(json.loads(item))
12 item = ""
13
14task_results = []
15outputs_results = []
16
17for task in tqdm(dataset):
18 prompt = f"### 指示:\n{task}\n### 回答:\n"
19 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
20 attention_mask = torch.ones_like(tokenized_input)
21
22 with torch.no_grad():
23 outputs = model.generate(
24 tokenized_input,
25 attention_mask=attention_mask,
26 max_new_tokens=512,
27 num_return_sequences=3, # 最低でも2個の出力を生成
28 do_sample=True,
29 temperature=0.6,
30 top_p=0.9,
31 repetition_penalty=1.2,
32 pad_token_id=tokenizer.eos_token_id
33 )
34
35 output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
36 outputs_results.append(output_texts)
37
38# 結果の表示
39for result in outputs_results:
40 print(result)
41