File size: 8,464 Bytes
a91e8a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7b91b5b
6c880da
 
 
38144dc
6c880da
 
 
 
 
bbc800e
6c880da
 
 
f49cae4
 
 
6c880da
 
bbc800e
 
 
 
 
 
 
 
 
 
 
7c69b4d
bbc800e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c880da
bbc800e
 
 
 
 
153984d
 
 
bbc800e
 
 
 
 
 
 
 
 
1512ae7
bbc800e
 
 
dd61159
bbc800e
 
 
 
 
 
38144dc
 
bbc800e
 
 
 
153984d
 
 
bbc800e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd61159
bbc800e
6c880da
7b91b5b
73f1952
e1dbacb
0855753
e1dbacb
 
675c96f
e1dbacb
 
 
 
 
 
 
 
 
 
 
fb193aa
632c98d
 
 
e1dbacb
 
 
 
 
 
 
 
 
664d30a
e1dbacb
 
fc867b4
7b91b5b
73f1952
7b91b5b
 
 
 
 
 
 
4115150
7b91b5b
 
c8a4192
7b91b5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
---
base_model: llm-jp/llm-jp-3-13b
tags:
- text-generation-inference
- transformers
- unsloth
- llama
- trl
license: apache-2.0
language:
- en
---

# Uploaded  model

- **Developed by:** kazuHF
- **License:** apache-2.0
- **Finetuned from model :** llm-jp/llm-jp-3-13b

This llama model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.

[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)

# ■ kazuHF/llm-jp-3-13b-it2_loraによる推論方法

1. 環境設定
- 以下の説明はGoogle Colaboratory上での利用を想定したもの。事前にhardware acceleratorでGPUを選択しておく。

```bash
# Googleドライブに接続
from google.colab import drive
drive.mount('/content/drive')
# 接続しているGPUの種類の表示
!nvidia-smi

# 必要なライブラリのインストール
!pip uninstall unsloth -y
!pip install xformers -q
!pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" -q
!pip install -U torch -q
!pip install -U peft -q

# 必要なライブラリの読み込み
from unsloth import FastLanguageModel
from peft import PeftModel
import torch
import json
from tqdm import tqdm
import re
```
2. モデルの読み込み
- 元のモデル(llm-jp/llm-jp-3-13b)と学習させたアダプターとを統合する。
- (注) 以下のcodeの huggeinface_token の所に自身の hugging face token を入力してから実行する。

```bash
# ベースとなるモデルと学習したLoRAのアダプタ(本モデル)のIDやHugging face tokenを指定。
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "kazuHF/llm-jp-3-13b-it2_lora"
HF_TOKEN = "huggingface_token" 
# unslothのFastLanguageModelで元のモデルとトークナイザーをロード。
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_id,
    dtype=None,
    load_in_4bit=True,
    trust_remote_code=True,
)

# 元のモデルにLoRAのアダプタを統合。
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
```
3. 単一の入力文に対して推論する場合

```bash
# 単一の入力文に基づいて推論する関数の定義。
def Decoder(input):
    # 推論するためにモデルのモードを変更
    FastLanguageModel.for_inference(model)
    # 入力文による推論
    prompt = f"""### 指示\n\n{str(input)}\n\n### 回答"""        
    inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
    outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)
    prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
    print(prompt)
    print(prediction)
```
◇ 使用例
```bash
Decoder('犬と猫の見分け方は何か。')
```

4. jasonlで保存された入力文を一括して推論する場合
- Google drive の/contentにeliza-tasks-100-TV_0.jsonlをuploadしておく。

```bash
# jsonlで作製されたタスクを一括処理する場合。
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
    for line in f:
        if line.strip():  
            datasets.append(json.loads(line))
        
# モデルで入力を一括処理。
results = []
for dt in tqdm(datasets):
    # 推論するためにモデルのモードを変更
    FastLanguageModel.for_inference(model)
    # 入力文による推論
    input = dt["input"]
    prompt = f"""### 指示\n{input}\n### 回答\n"""
    inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
    outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)
    prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
    results.append({"task_id": dt["task_id"], "input": input, "output": prediction})

# 結果をjsonlで保存。
json_file_id = re.sub(".*/", "", adapter_id)
with open(f"/content/{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)
        f.write('\n')
```

- 推論結果は Google drive の/contentに、llm-jp-3-13b-it2_lora_output.jsonlとして保存される。



# ■ kazuHF/llm-jp-3-13b-it2_loraの概要

1. モデルの概要
- ベースモデル: llm-jp/llm-jp-3-13b (https://huggingface.co/llm-jp/llm-jp-3-13b)
- 用途: 日本語によるQ&A形式の文章生成
- アーキテクチャ: FrameworkやLibraryとしてはPyTorch、Transformers、Unsloth、trl、LoRA、xformers、Flash Attentionなどを利用。UnslothによりFine TuningやInferenceを高速化し、メモリも削減した。llm-jp/llm-jp-3-13bを4bitで量子化するLoRAでロードし、SFTで事後学習を行った。

2. 事後学習の詳細
- 事後学習用データにichikara-instruction-003-001-1.jsonを必要な申請を行って利用した。
- Epoch数 1, バッチサイズ 2, 学習率 2e-4
- Google Colaboratory Pro上のL4/A100で学習

3. モデルの入出力
- 学習における入力のkeyは “text”、出力のkeyは “output”
- 推論による出力のkeyは “task_id”, “input”, “output”

4. 推論方法
- Hugging FaceのIDは model_id = "llm-jp/llm-jp-3-13b”, adapter_id = "kazuHF/llm-jp-3-13b-it2_lora" と指定し、FastLanguageModel.from_pretrained( … model_id … )
で元のモデルをロードする。
- そして model = PeftModel.from_pretrained( … adaptor_id … )によって元のモデルとLoRAのアダプターを結合し、そのモデルのモードを FastLanguageModel.for_inference(model) によって推論モードに変更する。
- 入力を”””###\n 指示 入力 \n### 回答\n”””の形式にしてトークン化し、model.generate( “input_ids”: …, “attention_mask”: …, …) によってpredictionを行い、それをdecodeして出力とする。

5. ライセンス
- ベースモデル: 国立情報学研究所 大規模言語モデル研究開発センターが公開しているllm-jp/llm-jp-3-13b。Apache 2.0 のライセンスを継承する。
- 事後学習に用いたデータ: 理化学研究所 革新知能統合研究センター 言語情報アクセス技術チームが公開している ichikara-instruction-003-001-1.json 。CC-BY-NC-SAのライセンスを継承する。

6. 問題点や改善点
- promptに対して適切に答える場合もあるが、回答が短かったり、答えられない場合も散見されるため、更なる学習データの蓄積と事後学習を要する。

7. 謝辞
- 東京大学 松尾・岩澤研究室主催の大規模言語モデルDeep Learning応用講座 2024|Fall を受講することで本モデルが作製できた。同講座に関係する方々並びに同講座を受講された方々に心より深謝する。


# ■ 推論方法の解説

◆ Google Colaboratory上のGPUで推論する場合

1. Google Colaboratory上で、サンプルコードの
	Model_Inference_Template_20241127.jpynb
   を開く。

◇ 環境設定

1. Runtimeで、Hardware acceleratorを GPU にする。
2. ノートブックをGoogle driveに保存するため、Google driveにマウントする。
3. CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
4. 「接続しているGPUの表示」とGeminiに聞いて、GPU に接続していることを確認する。
5. /contentに、次のファイルをupload.
	elyza-tasks-100-TV_0.json
6. 提供されたコードでunsloth, torch, peftをインストール。(37sec)

◇ 推論

7. FastLanguageModel, PeftModelなどのインポート。(22sec)
8. ベースモデルと作製したモデルのIDの貼り付け。
9. 事後学習の際に使用したHugging FaceのTokenの指定。
10. FastLanguageModelのインスタンス化。下のモデルとTokenizerを読み込む。
 途中で、Grant accessをクックする。(3min)
11. 元のモデルにQLoRAのadaptorを統合。tokenにHugging FaceのTokenを指定する。(8sec)
12. elyza-tasks-100-TV_0.jsonlを読み込む。
13. adaptorをつけたモデルでタスクの推論を行う。(6min)
14. 推論結果をjsonlで保存。