モデルの推論方法

以下にモデルの推論方法を記します.なお,ElYZA-tasks-100-tvの推論はunslothを使用すると,T4で24分で完了することを確認しています.

パッケージのインストール

# 必要なパッケージのインストール
%%capture
!pip install datasets
!pip install bitsandbytes triton
!pip install unsloth-zoo==2024.12.1
!pip install -q --upgrade --no-cache-dir "unsloth[2024.11.9] @ git+https://github.com/niryuu/unsloth.git@use-exact-model-name"
!pip install --upgrade torch
!pip install --upgrade xformers

huggingfaceトークンのアクセス

Google gemma2のアクセスが可能になっていないとエラーが出る.(google/gemma-2-9bのモデルカードにいき,承諾すれば使える)

# Huggingfaceのログイン
#colabでsecret keyに登録している場合は不要
from huggingface_hub import notebook_login
notebook_login()

パッケージのimport

from transformers import AutoTokenizer, AutoModelForCausalLM,BitsAndBytesConfig
import bitsandbytes as bnb
from unsloth import FastLanguageModel
import torch
from peft import peft_model
from peft import 
import pandas as pd
import json
from datasets import Dataset
import time

パラメータおよび量子化の設定

max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
model_id="google/gemma-2-9b" #ベースモデル
dtype = None # Noneにしておけば自動で設定
adapter_id="Enumaelish1004/gemma2-9b-sft-lora-v3.3"
# 量子化のConfigを設定
quantization_config = BitsAndBytesConfig(
    load_in_4bit=True, # 4ビット量子化を使用
    bnb_4bit_quant_type="nf4", # 4ビット量子化の種類にnf4(NormalFloat4)を使用
    bnb_4bit_use_double_quant=True, # 二重量子化を使用
    bnb_4bit_compute_dtype=torch.bfloat16 # 量子化のデータ型をfloat16に設定
)

ベースモデルおよびトークナイザーのロード

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_id,
    dtype=dtype,
    quantization_config=quantization_config,
    attn_implementation="eager",#gemma2では"eager"が推奨されている
    trust_remote_code=True,
    use_exact_model_name=True#unsoth独自のgemmaモデルをダウンロードしないためのオプション
)

アダプターをベースモデルに接続

model = peft_model.PeftModel.from_pretrained(model, adapter_id)
FastLanguageModel.for_inference(model)#推論モード

データセットのロード

df = pd.read_json('./elyza-tasks-100-TV_0.jsonl', orient='records', lines=True)#データセットのjsolファイルのパスを入力
compe_data=Dataset.from_pandas(df)
compe_data=compe_data.map(lambda example:{"output":""})

チャットテンプレート

gemma2は特殊なテンプレートを使うらしいので,alpacaテンプレートをgemma2用に変更している.

template_chat=""" <start_of_turn>user
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

{}<end_of_turn>
<start_of_turn>model
"""

推論

results_list={"task_id":[],"input":[],"output":[]}
start = time.perf_counter() #計測開始
for i,data in enumerate(compe_data):
    print("==========={}/{}===========".format(i,len(compe_data)))
    input_text=data["input"]
    output_text=data["output"]
    print(f"Q. {input_text}")
    model_inputs=template_chat.format(input_text)
    model_inputs = tokenizer(model_inputs, return_tensors="pt").to(model.device)
    pred = model.generate(**model_inputs, max_new_tokens=max_seq_length, use_cache=True,repetition_penalty=1.2,do_sample=False,temperature=1.0)
    pred=tokenizer.decode(pred[0][model_inputs.input_ids.size(1):], skip_special_tokens=True)
    pred=pred.replace("<end_of_turn>","")
    print(f"A. {pred}")
    results_list["task_id"].append(data["task_id"])
    results_list["input"].append(input_text)
    results_list["output"].append(pred)
end = time.perf_counter() #計測終了
print("推論時間:{:.2f}".format((end-start)/60))
results=pd.DataFrame(results_list)#結果をpandasに変更
# 結果の保存
results.to_json("./gemma2-9b-sft-v3_3_elyzaTV.jsonl", orient='records', force_ascii=False, lines=True)#任意の保存先のパスを入力

使用したデータセット

ライセンス問題のため,学習に使用したデータセットを記述します.もし問題があればお知らせください.

GENIAC-Team-Ozaki/Hachi-Alpaca_newans license: cc-by-4.0

HachiML/alpaca_jp_math license: apache-2.0

weblab-GENIAC/aya-ja-nemotron-dpo-masked license: apache-2.0

kanhatakeyama/multiturn-conv-from-aozora-bunko license: apache-2.0

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Enumaelish1004/gemma2-9b-sft-lora-v3.3

Finetuned
(330)
this model