File size: 5,007 Bytes
000fec4
 
 
 
 
 
 
 
 
 
17ecdb6
 
 
000fec4
 
 
 
 
 
 
 
8844bbf
17ecdb6
000fec4
8844bbf
000fec4
8844bbf
 
 
 
 
 
 
 
17ecdb6
8844bbf
 
 
 
17ecdb6
8844bbf
17ecdb6
 
 
 
 
8844bbf
 
 
17ecdb6
 
8844bbf
 
17ecdb6
8844bbf
 
 
 
 
 
 
17ecdb6
8844bbf
17ecdb6
 
8844bbf
 
 
17ecdb6
 
 
 
 
 
 
 
 
8844bbf
 
 
17ecdb6
8844bbf
17ecdb6
8844bbf
 
 
 
 
 
 
 
 
 
 
 
17ecdb6
 
 
 
 
8844bbf
 
17ecdb6
 
 
 
 
 
 
 
 
 
 
8844bbf
 
17ecdb6
8844bbf
17ecdb6
 
8844bbf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17ecdb6
9110b79
 
17ecdb6
 
 
 
8844bbf
 
 
 
 
 
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
---
base_model: llm-jp/llm-jp-3-13b
tags:
- text-generation-inference
- transformers
- unsloth
- llama
- trl
license: apache-2.0
language:
- ja
datasets:
- elyza/ELYZA-tasks-100
---

# Uploaded  model

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

このモデルは日本語タスクに特化し、指示に基づく応答を行うためにファインチューニングされたLLM用アダプタです。  
`llm-jp/llm-jp-3-13b`をベースモデルとして、ichikara-instructionデータとELYZA-tasks-100を用いて微調整を行っています。

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)

# Instruction Tuning

以下の日本語データセットで微調整を行いました:

| Language | Dataset | Description |
|:---|:---|:---|
| Japanese | [ichikara-instruction-003-001-1.json](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-%E5%85%AC%E9%96%8B/) | 手動構築の日本語指示データセット |
| Japanese | ichikara-instruction-003-003-1.fixed.json | ichikara-instruction-003-003-1.jsonの無効なエスケープシーケンスを手動修正したデータセット |
| Japanese | [elyza/ELYZA-tasks-100](https://huggingface.co/datasets/elyza/ELYZA-tasks-100) | 日本語多目的タスク用データセット |

## Usage

下記コマンドで環境整備(本コードはGoogle Colabでの動作を想定しています):

```python
!pip install -U unsloth
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install -U torch
!pip install -U peft
```

```python
from unsloth import FastLanguageModel
from peft import PeftModel
import torch
import json
from tqdm import tqdm
import re
```

```python
HF_TOKEN = "YOUR-HF-TOKEN"
```

ベースのモデルと学習済みLoRAのアダプタ(Hugging FaceのIDを指定)。
```python
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "KKFurudate/llm-jp-3-13b-v6_lora"
```

```python
# unslothのFastLanguageModelで元のモデルをロード。
dtype = None
load_in_4bit = True

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_id,
    dtype=dtype,
    load_in_4bit=load_in_4bit,
    trust_remote_code=True,
)
```

ベースのモデルに学習済みLoRAのアダプタを統合。
```python
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
```

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

モデルを用いてタスクの推論。
```python
FastLanguageModel.for_inference(model)

results = []
for dt in tqdm(datasets):
  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で保存。
```python
json_file_id = re.sub(".*/", "", adapter_id)
with open(f"{outdir}/{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')
```

## License

[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)


## Base Model

base_model:- llm-jp/llm-jp-3-13b

## Citations

@software{unsloth,
  author = {Daniel Han, Michael Han and Unsloth team},
  title = {Unsloth},
  url = {http://github.com/unslothai/unsloth},
  year = {2023}
}

@misc{ichikara-instruction,
      title={ichikara-instruction:LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)},
      url={https://liat-aip.sakura.ne.jp/wp/llmのための日本語インストラクションデータ作成/llmのための日本語インストラクションデータ-公開/},
      author={関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎},
      year={2024},
}

@misc{elyzatasks100,
      title={ELYZA-tasks-100: 日本語instructionモデル評価データセット},
      url={https://huggingface.co/elyza/ELYZA-tasks-100},
      author={Akira Sasaki and Masato Hirakawa and Shintaro Horie and Tomoaki Nakamura},
      year={2023},
}