【你的第一个大模型微调,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做法。

  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值