File size: 3,578 Bytes
46ec075
 
 
43e4bea
1af6c3a
 
 
46ec075
1af6c3a
 
76cb0d8
 
46ec075
 
 
76cb0d8
 
 
 
 
46ec075
 
 
 
 
 
 
 
76cb0d8
 
 
 
 
 
 
 
 
 
46ec075
76cb0d8
 
 
 
 
 
 
 
46ec075
 
76cb0d8
46ec075
76cb0d8
 
 
 
 
 
 
 
46ec075
76cb0d8
46ec075
 
 
 
76cb0d8
46ec075
76cb0d8
 
 
 
 
 
 
46ec075
76cb0d8
46ec075
 
 
 
76cb0d8
 
 
 
46ec075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76cb0d8
46ec075
 
76cb0d8
46ec075
 
76cb0d8
46ec075
 
 
 
 
 
 
 
 
 
 
 
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
### 実行手順
以下の手順に従うことで、Hugging Face上のモデル(llm-jp/llm-jp-3-13b + midorikawa/llm-jp-3-13b-it_lora)を用いて
入力データ(elyza-tasks-100-TV_0.jsonl)を推論し、その結果を{model_name}-outputs.jsonlというファイルに出力できます。


### 前提条件
- Python環境があること(例: Google Colab)
- GPUを使用すること
- Hugging Faceのアクセストークン (HF_TOKEN) が取得済みであること

Usage

### セットアップ
- 必要なライブラリのインストールを行います。

```python
!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
```

### モデル・トークナイザの読み込み

```python
# Hugging Faceのトークンを取得
from google.colab import userdata
HF_TOKEN=userdata.get('HF_TOKEN')

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json

# QLoRA用の設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=False,
)


# モデル読み込み
model_name = "midorikawa/llm-jp-3-13b-it_lora"

# モデル読み込み
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    token = HF_TOKEN
)

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
```

### 入力データの準備
- ./elyza-tasks-100-TV_0.jsonlというファイルからデータセットをロードします。

```python
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
    item = ""
    for line in f:
      line = line.strip()
      item += line
      if item.endswith("}"):
        datasets.append(json.loads(item))
        item = ""
```

### 推論実行


```python

results = []
for data in tqdm(datasets):

    input_text = data["input"]

    prompt = f"""### 指示
{input_text}
### 回答:
"""

    # トークナイザーを使用して input_ids と attention_mask を取得
    tokenized_input = tokenizer(
        prompt,
        add_special_tokens=True,
        padding='longest',
        truncation=True,
        return_tensors="pt"
    ).to(model.device)

    with torch.no_grad():
        outputs = model.generate(
            input_ids=tokenized_input["input_ids"],
            attention_mask=tokenized_input["attention_mask"],
            max_new_tokens=512,
            do_sample=False,
            repetition_penalty=1.2,
            pad_token_id=tokenizer.eos_token_id
        )[0]

    # 出力をデコード
    output = tokenizer.decode(outputs[tokenized_input["input_ids"].size(1):], skip_special_tokens=True)

    results.append({"task_id": data["task_id"], "input": input_text, "output": output})

# モデル名の処理
model_name_cleaned = re.sub(".*/", "", model_name)

# 結果をファイルに保存
with open(f"./{model_name_cleaned}-outputs.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)  # ensure_ascii=False は非ASCII文字の処理に有効
        f.write('\n')

```
以上の手順で、{model_name}-outputs.jsonlというファイルに推論結果が書き出されます。

### 出力結果
- llm-jp-3-13b-it_lora-outputs.jsonl

---
base_model: llm-jp/llm-jp-3-13b
tags:
- text-generation-inference
- transformers
- unsloth
- llama
- trl
license: apache-2.0
language:
- en
---