百川2大模型微调问题解决

    之前用https://github.com/FlagAlpha/Llama2-Chinese微调过几个模型,总体来说llama2的生态还是比较好的,过程很顺利。微调百川2就没那么顺利了,所以简单做个记录

    1. 数据准备,我的数据是单轮对话,之前微调llama2已经按照sft格式做好txt文件,翻看https://github.com/baichuan-inc/Baichuan2发现用的是json,和我所用数据格式有所出入,训练我还是用一开始用llama2的finetune脚本和参数,按照baichuan2的数据格式调整了代码。不过最后为了兼容llama2,我就把llama2的数据格式和tokenize_function给用在了百川2上,看起来也没啥问题。

    2. 模型选取,用baichuan2-13b-chat作为预训练权重,推理的时候总是头部输出我要的内容,但是输出总是无法停止,就算训完一个epoch也是这样,很怪异,研究半天,不知道所以然,干脆放弃,采用不带chat的baichuan2-13b作为预训练权重,这次很快出结果,只要iter 100次保存下来的模型,输出也是我想要的内容,所以就不换了,暂时用baichuan2-13b。主要是llama2已经跑的很好,我实验也就不求甚解,将就先用baichuan2-13b。在这个过程中"--lora_r 1 --lora_alpha 32 --lora_dropout 0.1"这几个参数,我按照baichuan2仓库里设置了。-- 更新: 其实还是baichuan2-13b-chat模型上做sft微调效果好,问题是一定要按照它的user_token, assistant_token格式来提供输入,第8点提到的废话问题按照baichuan2官方的仓库来准备Dataset之后效果就彻底对了(20231228更新,并没有解决,看第10点)

    3. 给百川模型的加载统统加上trust_remote_code,不然总是提示你y/N选择,孙悟空都会是烦死了。

    4. 训练模型遇到的错误1: 

AttributeError: 'BaichuanTokenizer' object has no attribute 'sp_model'

        这个错误通过简单回滚transfomers解决python3 -m pip install transformers==4.33.2,另外还有一个错误忘了具体是啥,通过回滚bitsandbytes解决python3 -m pip install bitsandbytes==0.41.0,幸运的是llama2在这两个模块版本下,同样工作。上面的错误,其实也有人说挪下tokenization_baichuan.py里的super的位置,我改了几处这个文件,似乎不起作用,随即放弃这个方案。

    5. ​推理过程遇到的错误2,这个错误也是折腾了我好一会,通过给AutoModelForCausalLM.from_pretrained加上pretraining_tp=1参数解决,先跑通,原理没去深究了。--纠正一下,这个并没有解决问题,不过这个问题应该是我自己搞出来的,推理AutoModelForCausalLM.from_pretrained加载模型漏了quantization_config=bnb_config选项,即 BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_use_double_quant=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.bfloat16),目前看起来是这样,pretraining_tp只是llama2才有的选项。百川2 lora 8bit可以设置quantization_config为空,之前是4bit。

RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x20 and 9x5120)

     6. 训练还遇到一个内存不足的问题3,google了两把,按照提示加了个环境变量PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:1536,果然就好了,谷歌不欺我也。内存不是真不足,而是碎片化严重,调整max_split_size_mb比降低batch size总是好的。

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 1.20 GiB (GPU 0; 23.69 GiB total capacity; 20.29 GiB already allocated; 579.94 MiB free; 22.56 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

    7. llama2微调的参数module是q_proj,k_proj,v_proj,o_proj,down_proj,gate_proj,up_proj这些,百川2很奇怪,有个自己的W_pack,把全连接打印了一下,其实还有down_proj,o_proj,up_proj,gate_proj,微调这几个部分,效果也差不多,微调哪些更好哪些更差,暂时就不去比较了,遇到问题,也许可以调整一下。 

    8. 暂时看起来,baichuan2收敛比较慢,有个max z loss不知道是否需要,看issues里讨论应该并不需要,待结果&实验。-- 更新: 这个可能也收敛不慢,其实百川2(也许百川模型都这样)就是爱吐废话,llama2没遇到这个问题,不知道是不是跟词表比较大有关系。那么如何把一个唐僧一样的废话大王变成简洁的唐僧呢?做了一些实验,最有效的是early_stopping=True,设置这个之后,七八句回答里差不多一句会多几百个字的废话,再把top_k, top_p, temperature按照BaiChuan2-13b-Chat设置,加上max_new_tokens=128表现就接近完美了。为什么llama2不需要early_stopping,或者说在某个地方其实偷偷设置了True?存疑。

    9. 另外顺口提一句经验,baichuan2官方仓库的训练代码效率低一些,Dataset每个batch其实按照batch的最长长度来padding训练性能会比较好,如果按照model max length那训练的速度慢很多,这个对效果也没啥影响。其实就是https://github.com/FlagAlpha/Llama2-Chinese的做法,虽然base在这个仓库让我走了不少弯路,不过在解决问题过程中也积攒了一些经验。

  10. 对比llama2和千问,在我自己的数据集上百川2 13b表现是差一些,而且好像有点bug,根据这个(https://github.com/hiyouga/LLaMA-Factory/issues/481)讨论以及https://github.com/hiyouga/LLaMA-Factory/commit/be21fc83f9aed0af1e5a2f83f5d5eeb36f1d283c的代码fix,推理时将gen_kwargs["eos_token_id"] = [self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids加上,输出不停止的现象基本上解决。但结果总体来说不尽如人意,也许得调调其他参数。-- 更新: 由于我base在Llama2-Chinese,百川训练的时候需要把load_in_bits设置成8,千问和llama2用的都是4(就是说其实是qlora?用了BitsandbytesConfig),结果就和LLaMA-Factory完全对上了,看起来百川2 13b的qlora在我的数据集上效果不佳。百川的实验到此为止了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值