Views
No views yet
1!pip install -U pip --quiet
2
3######### to avoid using unsloth model
4!pip uninstall unsloth -y --quiet
5!pip install -q --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/niryuu/unsloth.git@use-exact-model-name"
6######### /to avoid using unsloth model
7
8!pip install --upgrade torch --quiet
9!pip install --upgrade xformers --quiet
10!pip install -U peft --quiet
11!pip install -U openai --quiet
12!pip install -U transformers --quiet
13!pip install -U bitsandbytes --quiet
14!pip install -U accelerate --quiet
15!pip install -U datasets --quiet
16!pip install -U peft --quiet
17!pip install -U trl --quiet
18
19# Install Flash Attention 2 for softcapping support
20import torch
21if torch.cuda.get_device_capability()[0] >= 8:
22 !pip install --no-deps packaging ninja einops "flash-attn>=2.6.3" --quiet
23
24# Hugging Face Token
25from google.colab import userdata
26
27HF_TOKEN = userdata.get('HF_TOKEN')
28
29import torch
30from unsloth import FastLanguageModel
31
32dtype = None # Noneにしておけば自動で設定
33load_in_4bit = True # 今回は13Bモデルを扱うためTrue
34
35# model_size = '27b'
36# USE_OZAKI_DATA = True
37# DATA_SAMPLING_RATE = 0.05
38
39
40lr = 2e-4
41per_device_train_batch_size = 8
42lora_r = 16
43lora_alpha = 32
44max_seq_length = 768 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
45max_seq_length_output = 512
46
47####################################### Gemma2
48USE_OZAKI_DATA = True
49DATA_SAMPLING_RATE = 0.2
50model_size = '9b'
51model_id = f"google/gemma-2-{model_size}"
52new_model_id = f"gemma-2-{model_size}-r{lora_r}-{max_seq_length}-{max_seq_length_output}-it"
53lora_model_id = new_model_id+"_lora"
54adapter_id = f"Naotaka/{lora_model_id}"
55
56# FastLanguageModel インスタンスを作成
57model, tokenizer = FastLanguageModel.from_pretrained(
58 model_name=model_id,
59 dtype=dtype,
60 load_in_4bit=load_in_4bit,
61 trust_remote_code=True,
62)
63
64# LoRAアダプタを適用
65# lora_model_idからLoRAアダプタを読み込みモデルにマージ
66from peft import PeftModel
67
68model = PeftModel.from_pretrained(
69 model,
70 adapter_id,
71 token=HF_TOKEN
72)
73
74# ELYZA-tasks-100-TVの読み込み。事前にファイルをアップロードしてください
75# データセットの読み込み。
76# omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
77import json
78datasets = []
79with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
80 item = ""
81 for line in f:
82 line = line.strip()
83 item += line
84 if item.endswith("}"):
85 datasets.append(json.loads(item))
86 item = ""
87
88# 学習したモデルを用いてタスクを実行
89from tqdm import tqdm
90
91# 推論するためにモデルのモードを変更
92FastLanguageModel.for_inference(model)
93
94results = []
95for dt in tqdm(datasets):
96 input = dt["input"]
97
98 prompt = f"""### 指示\n{input}\n### 回答\n"""
99
100 inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
101
102 outputs = model.generate(**inputs, max_new_tokens = 368, use_cache = True, do_sample=False, repetition_penalty=1.2)
103 prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
104
105 results.append({"task_id": dt["task_id"], "input": input, "output": prediction})
106
107# jsonlで保存
108file_name = f"./output.jsonl"
109with open(file_name, 'w', encoding='utf-8') as f:
110 for result in results:
111 json.dump(result, f, ensure_ascii=False)
112 f.write('\n')