File size: 3,009 Bytes
1ffa3a9 1a0dab1 1ffa3a9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
---
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')
```
|