一、准备工作
1,克隆qwen仓库代码:
git clone https://github.com/QwenLM/Qwen.git
2,跳转至Qwen项目的目录下:
cd Qwen
3,安装依赖包:
pip install deepspeed transformers==4.32.0 peft pydantic==1.10.13 transformers_stream_generator einops tiktoken
4,训练数据准备:
样本放入列表存为json文件,命名为chat.json(可以先下载再上传)
5,下载模型文件:
git clone https://modelscope.cn/qwen/Qwen-1_8B-Chat.git
二、单机单卡微调
1,export CUDA_DEVICE_MAX_CONNECTIONS=1
export CUDA_VISIBLE_DEVICES=0
2,执行微调python文件:
python finetune.py --model_name_or_path Qwen-1_8B-Chat --data_path chat.json --fp16 True --output_dir output_qwen --num_train_epochs 5 --per_device_train_batch_size 2 --per_device_eval_batch_size 1 --gradient_accumulation_steps 8 --evaluation_strategy "no" --save_strategy "steps" --save_steps 1000 --save_total_limit 10 --learning_rate 3e-4 --weight_decay 0.1 --adam_beta2 0.95 --warmup_ratio 0.01 --lr_scheduler_type "cosine" --logging_steps 1 --report_to "none" --model_max_length 512 --lazy_preprocess True --gradient_checkpointing --use_lora
此处容易出现的问题-
(1)相关依赖包不匹配:根据错误提示更新即可
1‘No module named 'transformers.models.gemma
解决:更新transformers库pip install transformers --upgrade
2’Your currently installed version of Keras is Keras 3, but this is not yet supported in Transformers. Please install the backwards-compatible tf-keras package with `pip install tf-keras`.
解决:pip install tf-keras
(2)fp16精度问题:True改为False
三、保存微调后模型并测试
1,保存:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
model = AutoPeftModelForCausalLM.from_pretrained( "output_qwen", device_map="auto", trust_remote_code=True ).eval()
merged_model = model.merge_and_unload()
merged_model.save_pretrained("qwen-1_8b-finetune", max_shard_size="2048MB", safe_serialization=True) # 最大分片2g
tokenizer = AutoTokenizer.from_pretrained( "output_qwen", trust_remote_code=True )
tokenizer.save_pretrained("qwen-1_8b-finetune")
结果展示:
2,测试:
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
tokenizer = AutoTokenizer.from_pretrained("qwen-1_8b-finetune", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("qwen-1_8b-finetune", device_map="auto",
trust_remote_code=True).eval()
response, history = model.chat(tokenizer, "xxxx", history=None)
print(response)
结果展示: