开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)

 一、前言

        预训练模型提供的是通用能力,对于某些特定领域的问题可能不够擅长,通过微调可以让模型更适应这些特定领域的需求,让它更擅长解决具体的问题。

        本篇是开源模型应用落地-qwen-7b-chat-LoRA微调(一)进阶篇,学习通义千问最新1.5系列模型的微调方式。


二、术语介绍

2.1. LoRA微调

        LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。  是一种有效的自适应策略,它不会引入额外的推理延迟,并在保持模型质量的同时显着减少下游任务的可训练参数数量。

2.2. Qwen1.5

    Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. In comparison with the previous released Qwen, the improvements include:

  • 6 model sizes, including 0.5B, 1.8B, 4B, 7B, 14B, and 72B;
  • Significant performance improvement in human preference for chat models;
  • Multilingual support of both base and chat models;
  • Stable support of 32K context length for models of all sizes
  • No need of trust_remote_code.

    For more details, please refer to our blog post and GitHub repo.


三、构建环境

3.1. 基础环境

  1.  操作系统:centos7
  2.  Tesla V100-SXM2-32GB  CUDA Version: 12.2

3.2.下载qwen1.5-7b-chat模型

方式一:通过huggingface下载

https://huggingface.co/Qwen/Qwen1.5-7B-Chat/tree/main

方式二:通过ModelScope下载

git clone https://www.modelscope.cn/qwen/Qwen1.5-7B-Chat.git

下载好的项目放置在/model目录下,并重命名为qwen1.5-7b-chat

3.3.下载qwen1.5项目

方式一:直接下载

地址:
GitHub - QwenLM/Qwen1.5: Qwen1.5 is the improved version of Qwen, the large language model series developed by Qwen team, Alibaba Cloud.

方式二:使用git克隆项目

git clone https://github.com/QwenLM/Qwen1.5.git

下载好的项目放置在/service目录下,并重命名为qwen1.5

qwen1.5内置文件结构如下:

3.4.安装依赖

方式一:首次安装

conda create --name qwen1.5 python=3.10
conda activate qwen1.5
pip install -r /service/qwen1.5/requirements.txt
pip install peft

  requirements.txt文件内容为:

transformers>=4.32.0,<4.38.0
accelerate
tiktoken
einops
transformers_stream_generator==0.0.4
scipy

方式二:基于现有虚拟环境升级

  适用于已根据开源模型应用落地-qwen-7b-chat-LoRA微调(一)完成首次虚拟环境的搭建

conda create --name qwen1.5--clone qwen
conda activate qwen1.5
pip install --upgrade transformers==4.38.1

克隆环境后:

升级成功后:

若出现安装速度较慢的情况,可以指定第三方源,例如:

3.5.准备训练数据

示例数据如下

[
    {
        "instruction": "您是谁",
        "output": "我是人见人爱,车见车载的叮当猫,我非常乐意解决您的问题。"    
     },
    {
        "instruction": "您身份是啥",
        "output": "我是人见人爱,车见车载的叮当猫。"    
    },
    {
        "instruction": "你的名字是什么",
        "output": "我是叮当猫。"    
    }
]

准备好的数据放置在/service/qwen/data目录,并根据需要重命名,这里保持文件名为:lora_dataset.json

3.6.修改微调脚本

修改配置/service/qwen1.5/examples/sft/finetune.sh

#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
DIR=`pwd`

# Guide:
# This script supports distributed training on multi-gpu workers (as well as single-worker training).
# Please set the options below according to the comments.
# For multi-gpu workers training, these options should be manually set for each worker.
# After setting the options, please run the script on each worker.

# Number of GPUs per GPU worker
GPUS_PER_NODE=$(python -c 'import torch; print(torch.cuda.device_count())')

# Number of GPU workers, for single-worker training, please set to 1
NNODES=${NNODES:-1}

# The rank of this worker, should be in {0, ..., WORKER_CNT-1}, for single-worker training, please set to 0
NODE_RANK=${NODE_RANK:-0}

# The ip address of the rank-0 worker, for single-worker training, please set to localhost
MASTER_ADDR=${MASTER_ADDR:-localhost}

# The port for communication
MASTER_PORT=${MASTER_PORT:-6001}

MODEL="/model/qwen1.5-7b-chat" # Set the path if you do not want to load from huggingface directly
# ATTENTION: specify the path to your training data, which should be a json file consisting of a list of conversations.
# See the section for finetuning in README for more information.
DATA="/service/qwen1.5/data/lora_dataset.json"
DS_CONFIG_PATH="finetune/ds_config_zero3.json"
USE_LORA=False
Q_LORA=False

function usage() {
    echo '
Usage: bash finetune/finetune_lora_ds.sh [-m MODEL_PATH] [-d DATA_PATH] [--deepspeed DS_CONFIG_PATH] [--use_lora USE_LORA] [--q_lora Q_LORA]
'
}

while [[ "$1" != "" ]]; do
    case $1 in
        -m | --model )
            shift
            MODEL=$1
            ;;
        -d | --data )
            shift
            DATA=$1
            ;;
        --deepspeed )
            shift
            DS_CONFIG_PATH=$1
            ;;
        --use_lora  )
            shift
            USE_LORA=$1
            ;;
        --q_lora    )
            shift
            Q_LORA=$1
            ;;
        -h | --help )
            usage
            exit 0
            ;;
        * )
            echo "Unknown argument ${1}"
            exit 1
            ;;
    esac
    shift
done

DISTRIBUTED_ARGS="
    --nproc_per_node $GPUS_PER_NODE \
    --nnodes $NNODES \
    --node_rank $NODE_RANK \
    --master_addr $MASTER_ADDR \
    --master_port $MASTER_PORT
"

torchrun $DISTRIBUTED_ARGS /service/qwen1.5/examples/sft/finetune.py \
    --model_name_or_path $MODEL \
    --data_path $DATA \
    --output_dir /model/fine-tuning/lora-qwen1.5-7b-chat \
    --num_train_epochs 2 \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 8 \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps 10 \
    --save_total_limit 10 \
    --learning_rate 3e-4 \
    --weight_decay 0.01 \
    --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 \
    --use_lora ${USE_LORA} \
    --gradient_checkpointing

主要关注以下参数:

num_train_epochs:用于指定训练的总轮数或迭代次数。一个轮数代表将整个训练数据集传递给模型进行一次训练的过程。增加num_train_epochs的值可以增加模型的训练时间和迭代次数,使模型有更多的机会学习训练数据集中的模式和特征。然而,如果num_train_epochs设置得过高,可能会导致过拟合,即模型在训练数据上表现良好,但在未见过的数据上表现较差。

per_device_train_batch_size:用于指定每个训练设备(如GPU)上的训练批量大小。它决定了在每次参数更新时,模型在每个设备上同时处理的训练样本数量。

gradient_accumulation_steps:用于控制梯度累积的步骤数,定义了在执行一次参数更新之前要累积的小批量样本数。例如,如果设置为2,则每处理两个小批量样本,就会计算梯度的累积并更新模型参数。这相当于使用两倍的批量大小进行训练,但梯度更新仍然是在每个小批量样本上执行的。

model_max_length参数用于限制模型输入的最大长度。它指定了模型可以接受的最大输入文本长度,超过该长度的部分将被截断或忽略。设置model_max_length的目的是为了控制模型的计算成本和内存消耗。通过限制输入文本的长度,可以确保模型在资源受限的环境下能够高效地进行推断或训练。需要注意的是,设置model_max_length也会影响模型的生成能力。如果将文本截断到较短的长度,可能会丢失一些上下文信息,导致模型生成的结果不完整或不准确。


四、部署服务

通过微调改变模型的自我认知

4.1.启动训练

source /opt/anaconda3/bin/activate qwen1.5
nohup sh /service/qwen1.5/finetune/finetune.sh > output.txt 2>&1 &

执行后:

GPU使用情况:


五、附带说明

5.1.GPU资源不足

尽量减少gradient_accumulation_steps、gradient_accumulation_steps、model_max_length这三个值。

5.2.问题:raise JSONDecodeError("Expecting value", s, err.value) from None

原因:下面红框注释的代码有缺陷,不支持qwen1系列的数据格式,需要改成json.load的方式进行整个文件加载

5.3.TypeError: Accelerator.__init__() got an unexpected keyword argument 'use_seedable_sampler'

原因:accelerate版本太低,当前版本是0.23.0

需要升级

pip install --upgrade accelerate==0.27.2

5.4.问题:AttributeError: 'Qwen2Tokenizer' object has no attribute 'eod_id'

不能沿用qwen1系列的代码,

GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud.

需要使用qwen1.5系列的代码:GitHub - QwenLM/Qwen1.5: Qwen1.5 is the improved version of Qwen, the large language model series developed by Qwen team, Alibaba Cloud.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知名策略师上调微软目标价,微软后期走势将怎样?

KlipC报道&#xff1a;美国投行知名策略师Dan Ives将微软目标价从475美元上调至500美元&#xff0c;该新目标意味着较周一收盘价有18%的上涨空间。 值得一提的是Copilot是微软在Windows 11中加入的AI助手&#xff0c;该AI助手可以帮助用户完成各种任务。随着微软人工智能助理工…

QT中的 容器(container)简介

Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并且更易于使…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准&#xff0c;黑龙江日报报业集团主管主办&#xff0c;面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者&#xff0c;开展学术交流与研讨&#xff0c;汲取当今业界新鲜的…

无线开关量收发模块如何在远距离情况下监测工厂设备运行?

PLC无线通讯一般有以下几个应用场景&#xff1a; 【应用一】开关量信号1点对多点远距离无线通讯 支持点对点及1点对多点&#xff0c;多路开关量/数字量信号远距离无线传输通讯 【应用二】开关量信号多点对1点之间远距离无线通讯 PLC、泵阀、二次仪表、继电器等I/O开关量信号…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

Ribbon简介

目录 一 、概念介绍 1、Ribbon是什么 2、认识负载均衡 2.1 服务器端的负载均衡 2.2 客户端的负载均衡 3、Ribbon工作原理 4、Ribbon的主要组件 IClientConfig ServerList ServerListFilter IRule Iping ILoadBalancer ServerListUpdater 5、Ribbon支持…

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例&#xff0c;演示了如何使用CONCAT函数&#xff1a; -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…

拥抱绿色革命!揭秘CAE仿真技术在风电能源领域的应用

众所周知&#xff0c;风能是清洁能源的代表&#xff0c;而风电更是其核心。伴随着全球电力需求的日益增长以及环保节能意识的逐渐加强&#xff0c;加强生态文明建设&#xff0c;推进绿色低碳发展&#xff0c;已成为当今社会的共识。政府工作报告提到&#xff0c;过去一年可再生…

MySQL高级SQL2

一、表连接 二、视图 三、null值和空值区别 四、存储过程 五、函数 六、字符串函数 七、日期时间函数

Java Swing游戏开发学习19

内容来自RyiSnow视频讲解 这一节讲的是**Entity ArrayList(Render Order Revised)**实体数组列表&#xff08;渲染顺序修改&#xff09;。 前言 由于NPC和player的实体碰撞区域比他们本身的大小要小&#xff0c;所以会造成一个bug&#xff0c;当前的绘制顺序是&#xff0c;NP…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

Web框架开发-Django中间件

一、中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。 Django的中间件的定义: Middleware is a framework of hooks into Dj…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

git reset版本回退后悔药(图文例子)

目录 版本回退前期测试样例准备git reset --soft 不撤销add,撤销commit,保留修改git reset --mixed 或 git reset () 撤销add,撤销commit,保存修改git reset --hard 撤销add,撤销commit,不保存修改git reset --merge 取消合并git reset --keep 不撤销add,撤销commit,根据情况判…

单链表的插入和删除

一、插入操作 按位序插入&#xff08;带头结点&#xff09;&#xff1a; ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;//在第i 个位置插插入元素e (带头结点) bool Li…

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

win11 查看 wifi 密码

** win11 查看 wifi 密码 ** 第一种方法&#xff1a; 1.点击桌面左下角的开始菜单&#xff0c;选择“设置”。 2.在网络和internet中选择“高级网络设置”。 3.在相关设置下方点击“更多网络适配器选项”。 4.右击“WLAN”&#xff0c;在WLAN信息窗口点击“状态”。 5.…

月入10.5k;36岁生物专业转行网优,选择真的比努力更重要!

张雪峰说&#xff1a;普通家庭的孩子选择专业首要要考虑的是能不能就业&#xff1f;能不能拿到高薪&#xff1f;因为除了你的父母&#xff0c;没人会对你的未来负责。 学历和专业哪个更重要&#xff1f;不同的人往往会有不同的解答&#xff0c;今天故事的主人公H先生毕业于武汉…