Views
No views yet
1# 必要なパッケージのインストール
2%%capture
3!pip install datasets
4!pip install bitsandbytes triton
5!pip install unsloth-zoo==2024.12.1
6!pip install -q --upgrade --no-cache-dir "unsloth[2024.11.9] @ git+https://github.com/niryuu/unsloth.git@use-exact-model-name"
7!pip install --upgrade torch
8!pip install --upgrade xformers1# Huggingfaceのログイン
2#colabでsecret keyに登録している場合は不要
3from huggingface_hub import notebook_login
4notebook_login()1from transformers import AutoTokenizer, AutoModelForCausalLM,BitsAndBytesConfig
2import bitsandbytes as bnb
3from unsloth import FastLanguageModel
4import torch
5from peft import peft_model
6from peft import
7import pandas as pd
8import json
9from datasets import Dataset
10import time1max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
2model_id="google/gemma-2-9b" #ベースモデル
3dtype = None # Noneにしておけば自動で設定
4adapter_id="Enumaelish1004/gemma2-9b-sft-lora-v3.3"
5# 量子化のConfigを設定
6quantization_config = BitsAndBytesConfig(
7 load_in_4bit=True, # 4ビット量子化を使用
8 bnb_4bit_quant_type="nf4", # 4ビット量子化の種類にnf4(NormalFloat4)を使用
9 bnb_4bit_use_double_quant=True, # 二重量子化を使用
10 bnb_4bit_compute_dtype=torch.bfloat16 # 量子化のデータ型をfloat16に設定
11)
121model, tokenizer = FastLanguageModel.from_pretrained(
2 model_name=model_id,
3 dtype=dtype,
4 quantization_config=quantization_config,
5 attn_implementation="eager",#gemma2では"eager"が推奨されている
6 trust_remote_code=True,
7 use_exact_model_name=True#unsoth独自のgemmaモデルをダウンロードしないためのオプション
8)1model = peft_model.PeftModel.from_pretrained(model, adapter_id)
2FastLanguageModel.for_inference(model)#推論モード1df = pd.read_json('./elyza-tasks-100-TV_0.jsonl', orient='records', lines=True)#データセットのjsolファイルのパスを入力
2compe_data=Dataset.from_pandas(df)
3compe_data=compe_data.map(lambda example:{"output":""})template_chat=""" <start_of_turn>user
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。
{}<end_of_turn>
<start_of_turn>model
"""1results_list={"task_id":[],"input":[],"output":[]}
2start = time.perf_counter() #計測開始
3for i,data in enumerate(compe_data):
4 print("==========={}/{}===========".format(i,len(compe_data)))
5 input_text=data["input"]
6 output_text=data["output"]
7 print(f"Q. {input_text}")
8 model_inputs=template_chat.format(input_text)
9 model_inputs = tokenizer(model_inputs, return_tensors="pt").to(model.device)
10 pred = model.generate(**model_inputs, max_new_tokens=max_seq_length, use_cache=True,repetition_penalty=1.2,do_sample=False,temperature=1.0)
11 pred=tokenizer.decode(pred[0][model_inputs.input_ids.size(1):], skip_special_tokens=True)
12 pred=pred.replace("<end_of_turn>","")
13 print(f"A. {pred}")
14 results_list["task_id"].append(data["task_id"])
15 results_list["input"].append(input_text)
16 results_list["output"].append(pred)
17end = time.perf_counter() #計測終了
18print("推論時間:{:.2f}".format((end-start)/60))
19results=pd.DataFrame(results_list)#結果をpandasに変更
20# 結果の保存
21results.to_json("./gemma2-9b-sft-v3_3_elyzaTV.jsonl", orient='records', force_ascii=False, lines=True)#任意の保存先のパスを入力