inu-ai commited on
Commit
5e67680
1 Parent(s): 4f03072

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +179 -0
README.md ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: ja
3
+ tags:
4
+ - ja
5
+ - japanese
6
+ - gpt
7
+ - text-generation
8
+ - lm
9
+ - nlp
10
+ license: mit
11
+ datasets:
12
+ - kunishou/databricks-dolly-15k-ja
13
+ widget:
14
+ - text: >-
15
+ <s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n日本で一番広い湖は?\n[SEP]\n応答:\n
16
+ ---
17
+
18
+ # alpaca-guanaco-japanese-gpt-1b
19
+
20
+ 1.3Bパラメータの日本語GPTモデルを使用した指示に応答するAIです。VRAM 7GB または RAM 7GB が必要で、問題なく動作すると思われます。
21
+
22
+ rinna社の「[japanese-gpt-1b](https://huggingface.co/rinna/japanese-gpt-1b)」を、日本語データセット「[alpaca_ja](https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja)」を使用して学習させました。
23
+
24
+ 学習データやモデルを作成および配布してくださった方々に心から感謝申し上げます。
25
+
26
+ # モデルの使用方法
27
+
28
+ ## モデルの読み込み
29
+
30
+ ```python
31
+ import torch
32
+ from transformers import AutoTokenizer, AutoModelForCausalLM
33
+
34
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
35
+ tokenizer = AutoTokenizer.from_pretrained("inu-ai/dolly-japanese-gpt-1b", use_fast=False)
36
+ model = AutoModelForCausalLM.from_pretrained("inu-ai/dolly-japanese-gpt-1b").to(device)
37
+ ```
38
+
39
+ ## ChatGPT4によるサンプルコード
40
+
41
+ ```python
42
+ MAX_ASSISTANT_LENGTH = 100
43
+ MAX_INPUT_LENGTH = 1024
44
+ INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n'
45
+ NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n'
46
+
47
+ def prepare_input(instruction, input_text):
48
+ if input_text != "":
49
+ prompt = INPUT_PROMPT.format(instruction=instruction, input=input_text)
50
+ else:
51
+ prompt = NO_INPUT_PROMPT.format(instruction=instruction)
52
+ return prompt
53
+
54
+ def format_output(output):
55
+ output = output.lstrip("<s>").rstrip("</s>").replace("[SEP]", "").replace("\\n", "\n")
56
+ return output
57
+
58
+ def generate_response(instruction, input_text):
59
+ prompt = prepare_input(instruction, input_text)
60
+ token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
61
+ n = len(token_ids[0])
62
+
63
+ with torch.no_grad():
64
+ output_ids = model.generate(
65
+ token_ids.to(model.device),
66
+ min_length=n,
67
+ max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH),
68
+ temperature=0.7,
69
+ do_sample=True,
70
+ pad_token_id=tokenizer.pad_token_id,
71
+ bos_token_id=tokenizer.bos_token_id,
72
+ eos_token_id=tokenizer.eos_token_id,
73
+ bad_words_ids=[[tokenizer.unk_token_id]]
74
+ )
75
+
76
+ output = tokenizer.decode(output_ids.tolist()[0])
77
+ formatted_output_all = format_output(output)
78
+ response = f"Assistant:{formatted_output_all.split('応答:')[-1].strip()}"
79
+
80
+ return formatted_output_all, response
81
+
82
+ instruction = "あなたは何でも正確に答えられるAIです。"
83
+ questions = [
84
+ "日本で一番高い山は?",
85
+ "日本で一番広い湖は?",
86
+ "世界で一番高い山は?",
87
+ "世界で一番広い湖は?",
88
+ "冗談を言ってください。",
89
+ ]
90
+
91
+ # 各質問に対して応答を生成して表示
92
+ for question in questions:
93
+ formatted_output_all, response = generate_response(instruction, question)
94
+ print(response)
95
+ ```
96
+
97
+ ## 出力
98
+
99
+ ```
100
+ Assistant:富士山
101
+ Assistant:琵琶湖
102
+ Assistant:エベレストです。
103
+ Assistant:それは、面積で最大であると同時に、深さでも最も深い湖でもあります。
104
+ Assistant:A.I.は、自分の意思で、そして、自分の考えで行動することができます。
105
+ ```
106
+
107
+ ## ChatGPT4による説明
108
+
109
+ このコードは、GPT-2モデルを使って、指定された指示と入力に対して適切な応答を生成するAIアシスタントです。
110
+ まず、`prepare_input`関数でプロンプトを作成し、`generate_response`関数でモデルから応答を生成します。
111
+ 生成された応答を整形し、質問ごとに結果を表示します。
112
+
113
+ # 評価
114
+ 100回の「入力」のような質問を行い、それらに対する「応答」に正解の文字列が含まれるかで評価しています。
115
+ 一番正答率が高い18エポック目のモデルを選択しました。(やり過ぎたかもしれないです。)
116
+
117
+ | 入力 | 応答 | 正答率[%] |
118
+ |-----------------------|-------------|-------|
119
+ | 日本で一番広い湖は? | 琵琶湖 | 91 |
120
+ | 世界で一番高い山は? | エベレスト | 84 |
121
+
122
+ # 学習データのフォーマット
123
+
124
+ [alpaca](https://github.com/tatsu-lab/stanford_alpaca)と同じように、以下のようなフォーマットにしてい��す。
125
+
126
+ ```
127
+ <s>
128
+ 以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。
129
+ [SEP]
130
+ 指示:
131
+ あなたは何でも正確に答えられるAIです。
132
+ [SEP]
133
+ 入力:
134
+ User:日本で一番高い山は?
135
+ [SEP]
136
+ 応答:
137
+ 富士山
138
+ </s>
139
+ ```
140
+
141
+ transformersのコードでtxtファイルを学習する場合、1データ1行のようなので改行コードを一旦`\n`に置き換えています。
142
+ 学習データは[databricks-dolly-15k-ja.txt](train_data/databricks-dolly-15k-ja.txt)です。
143
+
144
+ # 学習のハイパーパラメータ
145
+
146
+ 学習時には以下のハイパーパラメータを使用:
147
+ ※VRAMが足りない場合、optimをadafactorにするとVRAM使用量が減りました。
148
+ ```
149
+ python.exe transformers/examples/pytorch/language-modeling/run_clm.py ^
150
+ --model_name_or_path rinna/japanese-gpt-1b ^
151
+ --train_file train_data/guanaco_alpaca_ja.txt ^
152
+ --output_dir output ^
153
+ --do_train ^
154
+ --bf16 True ^
155
+ --tf32 True ^
156
+ --optim adamw_bnb_8bit ^
157
+ --num_train_epochs 18 ^
158
+ --save_steps 384 ^
159
+ --logging_steps 38 ^
160
+ --learning_rate 1e-07 ^
161
+ --lr_scheduler_type constant ^
162
+ --gradient_checkpointing ^
163
+ --per_device_train_batch_size 8 ^
164
+ --save_safetensors True ^
165
+ --logging_dir logs
166
+ ```
167
+
168
+ # ライブラリのバージョン
169
+
170
+ - Transformers 4.28.0.dev0
171
+ - Pytorch 2.0.0+cu117
172
+ - Tokenizers 0.13.3
173
+ - bitsandbytes 0.37.2
174
+
175
+ # ライセンス
176
+ mit
177
+
178
+ - japanese-gpt-1b - mit
179
+ - databricks-dolly-15k-ja - CC BY NC 4.0