shuxueslpi / chatGLM-6B-QLoRA

使用peft库,对chatGLM-6B/chatGLM2-6B实现4bit的QLoRA高效微调,并做lora model和base model的merge及4bit的量化(quantize)。
356 stars 46 forks source link

用qlora做二次预训练merge后推理极慢 #23

Closed valkryhx closed 1 year ago

valkryhx commented 1 year ago

我用qlora的方式先做了一次sft 没有merge 推理速度还行。 又用qlora做了二次pretrain 看影响的层除了qkv之外dense层也影响了 结果把二次预训练的glm2 6b基座模型和qlora adapter做完merge之后,推理速度极慢,一个问题五分钟还没出答案,不知道大佬有没有遇到过这个情况

shuxueslpi commented 1 year ago

@valkryhx 我觉得不是推理慢,是陷入输出循环了,如果用stream_chat的方法应该能看出来。 你是用的merge后的int4模型吗?官方的int4方法貌似不是最优的,会导致一些性能,准确性的下降。

valkryhx commented 1 year ago

@valkryhx 我觉得不是推理慢,是陷入输出循环了,如果用stream_chat的方法应该能看出来。 你是用的merge后的int4模型吗?官方的int4方法貌似不是最优的,会导致一些性能,准确性的下降。

好的 我等会用stream方法看看。 另外为什么用您项目主页的推理方式 会报错:RuntimeError: self and mat2 must have the same dtype 我是用qlora SFT 然后加载base model时用到bitsandbytes的qconfig

config = PeftConfig.from_pretrained(peft_model_path) q_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type='nf4', bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.float32)

base_model = AutoModel.from_pretrained(config.base_model_name_or_path, quantization_config=q_config, trust_remote_code=True, device_map='auto')

add adapter

model = PeftModel.from_pretrained(base_model, peft_model_path) # 这里就报错了

shuxueslpi commented 1 year ago

@valkryhx 各个库的版本和我的一致吗?我这里这部分一直没有报过错的。

valkryhx commented 1 year ago

我看您设置的bnb_4bit_compute_dtype=torch.float32
而我在做qlora的config里面是bnb_4bit_compute_dtype=torch.float16 有可能是这个原因?

valkryhx commented 1 year ago

另外 我也看到您和bash99 讨论的帖子 https://github.com/THUDM/ChatGLM2-6B/issues/141#issuecomment-1631783021 您项目主页提供的推理方案 是否对应这个帖子中提到的方案4呢?

valkryhx commented 1 year ago

@valkryhx 各个库的版本和我的一致吗?我这里这部分一直没有报过错的。

这个问题排查出来了 我使用adapter推理那一步提前把peft版本回退到0.3.0了 所以报错 ,使用正确的peft==0.4.0dev就好了

shuxueslpi commented 1 year ago

@valkryhx 主页的对应的不是4,主页的模型没有merge,方案4的模型首先要:

python3 merge_lora_and_quantize.py \
    --lora_path saved_files/chatGLM2_6B_QLoRA_t32 \
    --output_path /tmp/qlora-model2 \
    --remote_scripts_dir remote_scripts/chatglm2-6b \
    --qbits 0

获得一个合并后的fp16模型,然后这个模型可以直接加载,那就是fp16的推理,也可以按照训练脚本里那样,用bitsandbytes的config,以nf4的方式加载进来,这个就是方案4

valkryhx commented 1 year ago

@valkryhx 主页的对应的不是4,主页的模型没有merge,方案4的模型首先要:

python3 merge_lora_and_quantize.py \
    --lora_path saved_files/chatGLM2_6B_QLoRA_t32 \
    --output_path /tmp/qlora-model2 \
    --remote_scripts_dir remote_scripts/chatglm2-6b \
    --qbits 0

获得一个合并后的fp16模型,然后这个模型可以直接加载,那就是fp16的推理,也可以按照训练脚本里那样,用bitsandbytes的config,以nf4的方式加载进来,这个就是方案4

那主页的方案相当于方案几呢?

shuxueslpi commented 1 year ago

@valkryhx 主页的对应的不是4,主页的模型没有merge,方案4的模型首先要:

python3 merge_lora_and_quantize.py \
    --lora_path saved_files/chatGLM2_6B_QLoRA_t32 \
    --output_path /tmp/qlora-model2 \
    --remote_scripts_dir remote_scripts/chatglm2-6b \
    --qbits 0

获得一个合并后的fp16模型,然后这个模型可以直接加载,那就是fp16的推理,也可以按照训练脚本里那样,用bitsandbytes的config,以nf4的方式加载进来,这个就是方案4

那主页的方案相当于方案几呢?

主页相当于方案1,也就是inference_qlora.py这个脚本的方式,没有把base model和lora model合并

valkryhx commented 1 year ago

谢谢!