模型:
inu-ai/alpaca-guanaco-japanese-gpt-1b
这是一个使用1.3B参数的日本语GPT模型的对话人工智能。需要7GB的VRAM或7GB的RAM,应该能够正常运行。
我们使用了rinna公司的" japanese-gpt-1b ",以及从日语数据集" alpaca_ja "和" GuanacoDataset "中提取的日语数据进行训练。
我们由衷地感谢提供训练数据和模型的人们。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = AutoTokenizer.from_pretrained("inu-ai/alpaca-guanaco-japanese-gpt-1b", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("inu-ai/alpaca-guanaco-japanese-gpt-1b").to(device)
MAX_ASSISTANT_LENGTH = 100
MAX_INPUT_LENGTH = 1024
INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n'
NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n'
def prepare_input(role_instruction, conversation_history, new_conversation):
instruction = "".join([f"{text}\\n" for text in role_instruction])
instruction += "\\n".join(conversation_history)
input_text = f"User:{new_conversation}"
return INPUT_PROMPT.format(instruction=instruction, input=input_text)
def format_output(output):
output = output.lstrip("<s>").rstrip("</s>").replace("[SEP]", "").replace("\\n", "\n")
return output
def generate_response(role_instruction, conversation_history, new_conversation):
# 入力トークン数1024におさまるようにする
for _ in range(8):
input_text = prepare_input(role_instruction, conversation_history, new_conversation)
token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt")
n = len(token_ids[0])
if n + MAX_ASSISTANT_LENGTH <= MAX_INPUT_LENGTH:
break
else:
conversation_history.pop(0)
conversation_history.pop(0)
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
min_length=n,
max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH),
temperature=0.7,
do_sample=True,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
bad_words_ids=[[tokenizer.unk_token_id]]
)
output = tokenizer.decode(output_ids.tolist()[0])
formatted_output_all = format_output(output)
response = f"Assistant:{formatted_output_all.split('応答:')[-1].strip()}"
conversation_history.append(f"User:{new_conversation}".replace("\n", "\\n"))
conversation_history.append(response.replace("\n", "\\n"))
return formatted_output_all, response
role_instruction = [
"User:あなたは「ずんだもん」なのだ。東北ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだ」を付けてしゃべるのだ。",
"Assistant:了解したのだ!",
]
conversation_history = [
"User:こんにちは!",
"Assistant:ボクは何でも答えられるAIなのだ!",
]
questions = [
"日本で一番高い山は?",
"日本で一番広い湖は?",
"世界で一番高い山は?",
"世界で一番広い湖は?",
"最初の質問は何ですか?",
"今何問目?",
]
# 各質問に対して応答を生成して表示
for question in questions:
formatted_output_all, response = generate_response(role_instruction, conversation_history, question)
print(response)
Assistant:はい、日本で一番高い山は日本の富士山です。 Assistant:日本で最も広い湖は琵琶湖です。 Assistant:世界で一番高い山といえば、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。 Assistant:世界で一番広い湖は、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。 Assistant:最初の質問は、ずんだアローに変身するかどうかの質問である。 Assistant:今、あなたの質問は10問目です。
该代码具有根据给定的角色指示和对话历史生成回答的功能,用于回答新的问题。以下是对代码的简要说明。
最后,对于questions列表中的每个问题,生成并显示AI的回答。运行此代码时,AI将根据指定的角色指示对列表中的问题做出回应。
我们询问了100个问题类似于"输入",通过检查其对应的"回答"中是否包含正确的字符串来进行评估。我们选择了正确回答率最高的第4个epoch的模型。需要注意的是,当"输入"像示例代码一样变得很长时,正确回答率下降到大约50%。
| 入力 | 応答 | 正答率[%] |
|---|---|---|
| 日本で一番広い湖は? | 琵琶湖 | 96 |
| 世界で一番高い山は? | エベレスト | 86 |
与 alpaca 相同,我们采用了以下格式:
<s> 以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。 [SEP] 指示: User:あなたは「ずんだもん」なのだ。東北ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだ」を付けてしゃべるのだ。 Assistant:了解したのだ! [SEP] 入力: User:日本で一番高い山は? [SEP] 応答: 日本で一番高い山は富士山で、標高3776メートルです。 </s>
由于换行符被替换为空格,因此实际的训练数据中,我们将换行符替换为“\n”。在transformers的代码中,如果要对txt文件进行训练,需要每行一个数据,所以我们将换行符替换为“\n”。训练数据文件是guanaco_alpaca_ja.txt。
我们在训练过程中使用以下超参数:*如果VRAM不足,将optim更改为adafactor可以减少VRAM使用量。
python.exe transformers/examples/pytorch/language-modeling/run_clm.py ^
--model_name_or_path rinna/japanese-gpt-1b ^
--train_file train_data/guanaco_alpaca_ja.txt ^
--output_dir output ^
--do_train ^
--bf16 True ^
--tf32 True ^
--optim adamw_bnb_8bit ^
--num_train_epochs 4 ^
--save_steps 2207 ^
--logging_steps 220 ^
--learning_rate 1e-07 ^
--lr_scheduler_type constant ^
--gradient_checkpointing ^
--per_device_train_batch_size 8 ^
--save_safetensors True ^
--logging_dir logs
由于不清楚,我们将列出原始模型和训练数据的许可证。