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')
```