你的第一个大模型微调,Qwen1_8B-Chat-Int8,8G显卡
部署第一个小模型后进行finetuning微调。先学习一下调用API,再用web启动服务,最后微调训练完以后用web服务验证。
一、调用API
有openapi,还有dashscopeapi,都是类似的,学会一个就会另一个。主要试的第二个,链接如下。
使用环境变量保存,linux下用
export DASHSCOPE_API_KEY="YOUR_DASHSCOPE_API_KEY"
windows下可以
setx DASHSCOPE_API_KEY="YOUR_DASHSCOPE_API_KEY"
也可以直接设置环境变量。
按照实例调用就行,代码里面不用单独写api_key,程序会自动去环境变量里面找。
ps:设置完后要重启一下vscode,我说半天怎么不行呢,这家伙一直没重新读取环境变量。
二、启动web服务
1.下载Qwen官方代码
git clone https://hub.yzuu.cf/QwenLM/Qwen.git#github国内镜像网站,不用魔法
2.环境依赖及运行
cd Qwen
pip install -r requirements_web_demo.txt
命令行启动,或者程序运行都行
python web_demo.py#具体在Qwen文件夹里
然后就行了。
三、微调
1、windows下详看这篇文章(我有所改动),linux照github QWEN官方做。
python finetune.py --model_name_or_path C:/Users/A/.cache/modelscope/hub/qwen/Qwen-1_8B-Chat-Int8 --data_path C:/lkp/LLM/qwen1.8B/qwen_data_process/q_answer/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
ps:
1.去下载他的chat.json文件,照着那篇文章做就行,这里我用的绝对路径。此为lora微调,还有全参数微调,显卡要求高,还有Q-lora微调,要求比lora低。
2.如果出现json读取错误问题,改一下finetune.py代码
try:
train_json = json.load(open(data_args.data_path, "r"))
except:
train_json = json.load(open(data_args.data_path, "r",encoding='utf8'))
2、训练结束后怎么调用新的模型
1.直接调用
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("C:/Users/A/.cache/modelscope/hub/qwen/Qwen-1_8B-Chat-Int8", revision='master', trust_remote_code=True)
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained(
f'C:\lkp\LLM\qwen1.8B\Qwen\output_qwen', # path to the output directory
device_map="auto",
trust_remote_code=True
).eval()
response, history = model.chat(tokenizer, "你来自哪里", history=None)
print(response)
response, _ = model.chat(tokenizer, "你是谁", history=None)
print(response)
web_demo.py 照此改动才能使用。改动完毕后重新启动web会发现你是谁的问题已经改过来了。
ps:没合并的话,基本模型地址不变,tokenizer和config仍然是之前的,仅model变化
DEFAULT_CKPT_PATH = 'C:/Users/A/.cache/modelscope/hub/qwen/Qwen-1_8B-Chat-Int8'
#没合并的话,基本模型地址不变,tokenizer和config仍然是之前的,仅model变化
def _load_model_tokenizer(args):
tokenizer = AutoTokenizer.from_pretrained(
args.checkpoint_path, trust_remote_code=True, resume_download=True,
)
if args.cpu_only:
device_map = "cpu"
else:
device_map = "auto"
'''model = AutoModelForCausalLM.from_pretrained(
args.checkpoint_path,
device_map=device_map,
trust_remote_code=True,
resume_download=True,
).eval()'''
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained(
f'C:\lkp\LLM\qwen1.8B\Qwen\output_qwen', # path to the output directory
device_map="auto",
trust_remote_code=True
).eval()
config = GenerationConfig.from_pretrained(
args.checkpoint_path, trust_remote_code=True, resume_download=True,
)
return model, tokenizer, config
2.合并源模型,注意:非量化后的lora微调,能合并。量化后的lora微调,不能合并,本文的模型不能合并;使用Q-lora,不能合并。
参照之前微调的文章。
3、复杂微调需要更改更多参数
以上只是最简单的微调,5轮几十条数据,只能把chat.json中的你是谁的问题改过来,后面的答案还会和原数据不完全一致,只是初步尝试。
复杂微调以后再介绍,可以学习firefly做法。