Views
No views yet
elyza-tasks-100-TV_0.jsonl に対して推論する方法を示す。elyza-tasks-100-TV_0.jsonl を事前にダウンロードする。1import json
2import re
3
4import peft
5import torch
6import transformers
7
8
9def load_jsonl(fname):
10 with open(fname, encoding="utf-8") as f:
11 data = []
12 for line in f:
13 _data = json.loads(line.strip())
14 data.append(_data)
15 return data
16
17
18# loading dataset
19dataset = load_jsonl("./elyza-tasks-100-TV_0.jsonl")
20
21
22# loading model
23bnb_config = transformers.BitsAndBytesConfig(load_in_8bit=True)
24
25model = transformers.AutoModelForCausalLM.from_pretrained(
26 pretrained_model_name_or_path="llm-jp/llm-jp-3-13b", device_map="auto", quantization_config=bnb_config
27)
28model = peft.PeftModel.from_pretrained(model, "orihihsoy/llm-jp-3-13b_qlora_8bit")
29
30tokenizer = transformers.AutoTokenizer.from_pretrained(
31 pretrained_model_name_or_path=="llm-jp/llm-jp-3-13b"
32)
33
34
35# evaluation
36PROMPT_TEMPLATE = """{instruction}
37
38### 指示:
39{input}
40
41### 回答:
42{output}"""
43
44results = []
45for data in dataset:
46 input = data["input"]
47 BOS_TOKEN = tokenizer.bos_token
48
49 prompt = BOS_TOKEN + PROMPT_TEMPLATE.format(
50 instruction="以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。", input=input, output="")
51
52 tokenized_input = tokenizer.encode(
53 prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
54 attention_mask = torch.ones_like(tokenized_input)
55 with torch.no_grad():
56 outputs = model.generate(
57 tokenized_input,
58 attention_mask=attention_mask,
59 max_new_tokens=1024,
60 do_sample=True,
61 top_p=0.95,
62 temperature=0.7,
63 repetition_penalty=1.05,
64 pad_token_id=tokenizer.eos_token_id
65 )[0]
66 output = tokenizer.decode(
67 outputs[tokenized_input.size(1):], skip_special_tokens=True)
68
69 results.append({"task_id": data["task_id"],
70 "input": input, "output": output})
71
72with open(f"gen.jsonl", 'w', encoding='utf-8') as f:
73 for result in results:
74 json.dump(result, f, ensure_ascii=False)
75 f.write('\n')