File size: 5,697 Bytes
2de67ea
15eba44
 
 
 
 
56b90ca
15eba44
 
 
2de67ea
 
15eba44
2de67ea
15eba44
2de67ea
488d646
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
 
15eba44
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
 
 
 
 
 
 
 
2de67ea
15eba44
2de67ea
15eba44
2de67ea
15eba44
 
 
 
 
 
 
 
 
 
 
 
56b90ca
15eba44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74eb6c4
 
15eba44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
---
language: 
  - "ja"
tags:
  - "text-generation"
  - "Japanese"
license: "cc-by-nc-4.0"
datasets: []
metrics: []
base_model: []
---

# 推論用コード README

## 概要

以下では、Hugging Faceにアップロードしたモデルを用いて、ELYZA-tasks-100-TVの出力を得るための方法を説明します。

---

## 使用したデータセット

本プロジェクトで使用したデータは、以下の論文で紹介されたデータセットです。

- **関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎**. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)

このデータセットは、LLM(大規模言語モデル)に対する日本語インストラクションデータを構築するために利用されました。`ichikara-instruction`というデータセットは、様々なタスクに対して日本語での指示を提供するもので、モデルの日本語処理能力向上に役立ちます。

### データセットのリンク

データセットに関する詳細情報やダウンロードリンクは、以下の公式ウェブページから確認できます:

- [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/)


---

## 必要なライブラリ

推論を実行するためには、以下のPythonライブラリが必要です。

```bash
pip install -U ipywidgets
pip install transformers==4.46.3
pip install -U bitsandbytes
pip install -U accelerate
pip install -U datasets
pip install -U peft==0.13.2
```

これらのライブラリは、モデルの推論やデータセットの処理を行うために使用されます。

---

## 推論の実行

### 1. Hugging Face トークンの設定

まず、Hugging Faceのトークンを取得し、以下のコードで設定します。

```bash
HF_TOKEN = "Hugging Face Token"  # ご自身のHugging Faceトークンを貼り付けてください
```

### 2. モデルとアダプタの設定

次に、使用するベースモデルを指定します。以下のコードでモデルの設定を行います。

```bash
# 使用するベースモデル(Hugging Face上のモデルIDを指定)
model_id = "nyanta2530/llm-jp-3-13b-finetune"
```

### 3. モデルのロード

以下のコードで、ベースモデルおよびLoRAアダプタを統合したモデルをロードします。

```bash
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel
import torch

# LoRAの設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)

# モデルとトークナイザーのロード
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    token=HF_TOKEN
)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token=HF_TOKEN)
```

### 4. 入力データの読み込み

次に、入力データ(ELYZA-tasks-100-TV)をJSONL形式で読み込みます。以下のコードで、ファイルを読み込み、タスクデータを処理します。

```bash
import json

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 = ""
```

### 5. 推論の実行

次に、ロードしたモデルを使用して、各タスクの入力に対して推論を実行します。以下のコードで推論を行い、結果をresultsリストに保存します。

```bash
from tqdm import tqdm

results = []
for data in tqdm(datasets):
    input = data["input"]
    prompt = f"""### 指示
    {input}
    ### 回答
    """
    
    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=100,
            do_sample=False,
            repetition_penalty=1.2,
            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})
```

### 6. 出力ファイルの保存

最後に、生成された結果をjsonl形式で保存します。以下のコードで、推論結果をファイルに書き出します。

```bash
import re

# jsonlファイルの保存
jsonl_id = re.sub(".*/", "", adapter_dpo_id)
with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)  # ensure_ascii=False for handling non-ASCII characters
        f.write('\n')

```

このコードを実行すると、{jsonl_id}-outputs.jsonlという名前で出力ファイルが保存されます。このファイルは、タスクIDと出力が含まれたjsonl形式のファイルです。