mymusise/ChatGLM-Tuning

训练能跑通了,但是我这边训练的人设好像没啥效果,是训练参数问题还是训练数据问题

jianxun168 opened this issue · 16 comments

我这边数据集格式是
{
"instruction": "你做为一个佛学人事,请回答下面问题",
"input": "宇宙人生的真相是什么?",
"output": " 空."
},
{
"instruction": "你做为一个佛学人事,请回答下面问题",
"input": "什么是空?",
"output": " 空为物,为极微之物."
},
调用方式是
input_text = "### Instruction:你做为一个佛学人事,请回答下面问题\n ### Input:有人说你是傻瓜?\n### Response:"
#input_text = "### Input:昨天与今天,我们该如何把握?\n### Response:"
batch = tokenizer(input_text, return_tensors="pt")
out = model.generate(
#input_ids=batch["input_ids"],
input_ids=batch["input_ids"],
eos_token_id=tokenizer.eos_token_id*2,
attention_mask=torch.ones_like(batch["input_ids"]).bool(),
max_length=512,
temperature=0.9
)
out_text = tokenizer.decode(out[0])
print(out_text)
回答的问题是

Instruction:你做为一个佛学人事,请回答下面问题

Input:什么是空??

Response: 空即是色,色即是空。佛教认为一切存在都是虚幻不实的,包括物质世界和心灵世界。因此,佛教不提倡追求物质财富和享受,而是提倡追求内心的平静和解脱。佛教中的“空”并不是指完全不存在,而是强调一切存在都是虚幻不实的,包括物质和精神层面。佛教中的“色”也并不是指物质世界,而是指的是一切存在都有产生和灭亡的过程,包括物质和精神层面。因此,佛教中的“空”和“色”并不是对立的概念,而是一种相对的概念。

这个回答和我训练集的相对应的数据好像一点也不一样,我不清楚是训练的参数不对还是训练集不对,能指教一下吗
训练的参数是
python finetune.py
--dataset_path /root/autodl-fs/data/alpaca
--lora_rank 8
--per_device_train_batch_size 1
--gradient_accumulation_steps 1
--max_steps 600
--save_steps 300
--save_total_limit 2
--learning_rate 2e-5
--fp16
--remove_unused_columns false
--logging_steps 50
--output_dir /root/autodl-fs/output,

我个人体感只 finetune attention 效果是不太行的,我把 r 增加到 32 了,然后 finetune 所有 dense layer, 包括 attention 后的 dense 和 FFN. Loss 降低到差不多 2.5 左右,有一些效果。也可以确认一下是否 load 了正确的数据集。另一方面,我觉得 ChatGLM 原模型训练的太过了,只训练很少的 lora 可能很难把原本的模型扳过来。所以可能要非常贴切还是得 finetune 整个模型。

谢谢,r指的是训练参数中的--lora_rank 8 吗?我刚学习,参数还不太搞的明白用处了

谢谢,r指的是训练参数中的--lora_rank 8 吗?我刚学习,参数还不太搞的明白用处了

是的,我的 LoRa config 如下

peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=32,
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],
)

需要同步的改 Inference 代码里面的 LoRA Config

好的,谢谢,我再试一下

谢谢,r指的是训练参数中的--lora_rank 8 吗?我刚学习,参数还不太搞的明白用处了

是的,我的 LoRa config 如下

peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=32,
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],
)

需要同步的改 Inference 代码里面的 LoRA Config

你好,我加上这个target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],训练后,调用infer.ipynb会报错,这个参数的作用是啥?可以不加的吧

lora是为了调linear层,这个参数的意思调哪些linear层

这个是调更多的 linear,如果说你训练的时候也 inject 了这些 lora,那么你推理的时候也需要这些

这个是调更多的 linear,如果说你训练的时候也 inject 了这些 lora,那么你推理的时候也需要这些
谢谢回复,我还有问题就是
如果我训练用了target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],推理的时候怎么使用的?有相关的文档吗?

这个是调更多的 linear,如果说你训练的时候也 inject 了这些 lora,那么你推理的时候也需要这些
谢谢回复,我还有问题就是
如果我训练用了target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],推理的时候怎么使用的?有相关的文档吗?

只需要推理的时候也增加这些就可以了,我这边是能正确 inference 的

这个是调更多的 linear,如果说你训练的时候也 inject 了这些 lora,那么你推理的时候也需要这些
谢谢回复,我还有问题就是
如果我训练用了target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],推理的时候怎么使用的?有相关的文档吗?

只需要推理的时候也增加这些就可以了,我这边是能正确 inference 的

谢谢回复,我这边也能推理了,但是和.json文件的答复还是不一样,感觉训练后的人设没立起来,估计训练量不够或文本量不够

谢谢,r指的是训练参数中的--lora_rank 8 吗?我刚学习,参数还不太搞的明白用处了

是的,我的 LoRa config 如下

peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=32,
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],
)

需要同步的改 Inference 代码里面的 LoRA Config

我尝试了 target_modules=["query_key_value"]和 target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"]两种方式各在我的训练集上训练了一个epoch,其中前者正确训练出了人设,后者好像没有任何影响,可以详细说说这几个参数的意义吗(或者相关文档),谢谢了

这个是调更多的 linear,如果说你训练的时候也 inject 了这些 lora,那么你推理的时候也需要这些
谢谢回复,我还有问题就是
如果我训练用了target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],推理的时候怎么使用的?有相关的文档吗?

只需要推理的时候也增加这些就可以了,我这边是能正确 inference 的

谢谢回复,我这边也能推理了,但是和.json文件的答复还是不一样,感觉训练后的人设没立起来,估计训练量不够或文本量不够

请教一下,你现在是用了多少的数据量

谢谢,r指的是训练参数中的--lora_rank 8 吗?我刚学习,参数还不太搞的明白用处了

是的,我的 LoRa config 如下

peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=32,
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"],
)

需要同步的改 Inference 代码里面的 LoRA Config

我尝试了 target_modules=["query_key_value"]和 target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"]两种方式各在我的训练集上训练了一个epoch,其中前者正确训练出了人设,后者好像没有任何影响,可以详细说说这几个参数的意义吗(或者相关文档),谢谢了

可以分享一下所用的训练数据中有关某一人设的数据用了多少条吗?

epoch设置多一点、我使用五条对话训练了100epoch才让模型记住了

200条数据的样子

请问target_modules=["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"]中后三个参数的意思是什么