--- base_model: llm-jp/llm-jp-3-13b library_name: peft --- # 概要 [llm-jp/llm-jp-3-13b](https://huggingface.co/llm-jp/llm-jp-3-13b) を [ichikara-instruction](https://liat-aip.sakura.ne.jp/wp/llm%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf%e4%bd%9c%e6%88%90/llm%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf-%e5%85%ac%e9%96%8b) でSFTしたモデル。SFTの際は、モデルパラメータに対し8bit量子化を行ったQLoRAを用いている。 # 推論方法 本モデルを用いて `elyza-tasks-100-TV_0.jsonl` に対して推論する方法を示す。 ## データ `elyza-tasks-100-TV_0.jsonl` を事前にダウンロードする。 ## サンプルコード ```python import json import re import peft import torch import transformers def load_jsonl(fname): with open(fname, encoding="utf-8") as f: data = [] for line in f: _data = json.loads(line.strip()) data.append(_data) return data # loading dataset dataset = load_jsonl("./elyza-tasks-100-TV_0.jsonl") # loading model bnb_config = transformers.BitsAndBytesConfig(load_in_8bit=True) model = transformers.AutoModelForCausalLM.from_pretrained( pretrained_model_name_or_path="llm-jp/llm-jp-3-13b", device_map="auto", quantization_config=bnb_config ) model = peft.PeftModel.from_pretrained(model, "orihihsoy/llm-jp-3-13b_qlora_8bit") tokenizer = transformers.AutoTokenizer.from_pretrained( pretrained_model_name_or_path=="llm-jp/llm-jp-3-13b" ) # evaluation PROMPT_TEMPLATE = """{instruction} ### 指示: {input} ### 回答: {output}""" results = [] for data in dataset: input = data["input"] BOS_TOKEN = tokenizer.bos_token prompt = BOS_TOKEN + PROMPT_TEMPLATE.format( instruction="以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。", input=input, output="") tokenized_input = tokenizer.encode( prompt, add_special_tokens=False, return_tensors="pt").to(model.device) attention_mask = torch.ones_like(tokenized_input) with torch.no_grad(): outputs = model.generate( tokenized_input, attention_mask=attention_mask, max_new_tokens=1024, do_sample=True, top_p=0.95, temperature=0.7, repetition_penalty=1.05, pad_token_id=tokenizer.eos_token_id )[0] output = tokenizer.decode( outputs[tokenized_input.size(1):], skip_special_tokens=True) results.append({"task_id": data["task_id"], "input": input, "output": output}) with open(f"gen.jsonl", 'w', encoding='utf-8') as f: for result in results: json.dump(result, f, ensure_ascii=False) f.write('\n') ```