【深度学习】微调通义千问模型:LoRA 方法,微调Qwen1.8B教程,实践

官网资料:
https://github.com/QwenLM/Qwen/blob/main/README_CN.md

文章目录

    • 准备数据
    • 运行微调
      • 设置网络代理
      • 启动容器
      • 执行 LoRA 微调
        • 修改 finetune/finetune_lora_single_gpu.sh
        • 运行微调
    • 执行推理

在本篇博客中,我们将介绍如何使用 LoRA 方法微调通义千问模型,以适应特定任务或数据。首先,我们将简要介绍准备数据和运行微调所需的步骤,然后详细说明如何执行 LoRA 微调。

准备数据

首先,您需要准备您的训练数据,并将其存储为 JSON 文件。每个样本都应该是一个字典,包含 id 和对话信息。以下是一个示例:

[{"id": "identity_0","conversations": [{"from": "user","value": "你好"},{"from": "assistant","value": "我是一个语言模型,我叫通义千问。"}]}
]

运行微调

设置网络代理

在开始微调之前,请确保设置好网络代理,以确保能够顺利访问所需资源。

export http_proxy=http://10.20.31.16:10811
export https_proxy=http://10.20.31.16:10811

启动容器

您可以通过以下命令启动容器:

docker run --gpus all -e LANG=C.UTF-8 -it zhenhengdong/nlp:qwenllm_cu121_V1_finetuning bash

执行 LoRA 微调

我们将使用 LoRA 方法进行微调。首先,修改 finetune_lora_single_gpu.sh 脚本以配置微调参数。

修改 finetune/finetune_lora_single_gpu.sh
vim finetune/finetune_lora_single_gpu.sh

以下是脚本的修改说明:

  • 设置 CUDA 设备的最大连接数为 1。
  • 定义了模型路径和数据路径两个变量,用户可以通过命令行参数指定,否则将使用默认值。
  • 使用 CUDA_VISIBLE_DEVICES 指定使用的 GPU 设备编号。
  • 调用 Python 脚本 finetune.py 进行微调,设置了微调所需的各种参数,包括模型名称、数据路径、微调 epoch 数等。
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1MODEL="Qwen/Qwen-1_8B-Chat" # 如果您不想直接从 huggingface 加载模型,请设置路径
DATA="/data/shared/Qwen/data.json" # 请指定训练数据的路径function usage() {echo '
Usage: bash finetune/finetune_lora_single_gpu.sh [-m MODEL_PATH] [-d DATA_PATH]
'
}while [[ "$1" != "" ]]; docase $1 in-m | --model )shiftMODEL=$1;;-d | --data )shiftDATA=$1;;-h | --help )usageexit 0;;* )echo "Unknown argument ${1}"exit 1;;esacshift
doneexport CUDA_VISIBLE_DEVICES=2python finetune.py \--model_name_or_path $MODEL \--data_path $DATA \--bf16 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# 如果您使用的是 fp16 而不是 bf16,请使用 deepspeed
# --fp16 True --deepspeed finetune/ds_config_zero2.json
运行微调

直接执行即可:

bash finetune/finetune_lora_single_gpu.sh

通过以上步骤,您就可以成功运行 LoRA 方法对通义千问模型进行微调了。

训练结束后,adapter部分的参数就存这里:

在这里插入图片描述

执行推理

与全参数微调不同,LoRA和Q-LoRA的训练只需存储adapter部分的参数。假如你需要使用LoRA训练后的模型,你需要使用如下方法。假设你使用Qwen1.8B训练模型,你可以用如下代码读取模型:

from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-1_8B-Chat", trust_remote_code=True)from peft import AutoPeftModelForCausalLMmodel = AutoPeftModelForCausalLM.from_pretrained("/data/shared/Qwen/output_qwen", # path to the output directorydevice_map="auto",trust_remote_code=True
).eval()# 第一轮对话 1st dialogue turn
response, history = model.chat(tokenizer, "你好", history=None)
print(response)
# 你好!很高兴为你提供帮助。# 第二轮对话 2nd dialogue turn
response, history = model.chat(tokenizer, "给我讲一个年轻人奋斗创业最终取得成功的故事。", history=history)
print(response)
# 这是一个关于一个年轻人奋斗创业最终取得成功的故事。
# 故事的主人公叫李明,他来自一个普通的家庭,父母都是普通的工人。从小,李明就立下了一个目标:要成为一名成功的企业家。
# 为了实现这个目标,李明勤奋学习,考上了大学。在大学期间,他积极参加各种创业比赛,获得了不少奖项。他还利用课余时间去实习,积累了宝贵的经验。
# 毕业后,李明决定开始自己的创业之路。他开始寻找投资机会,但多次都被拒绝了。然而,他并没有放弃。他继续努力,不断改进自己的创业计划,并寻找新的投资机会。
# 最终,李明成功地获得了一笔投资,开始了自己的创业之路。他成立了一家科技公司,专注于开发新型软件。在他的领导下,公司迅速发展起来,成为了一家成功的科技企业。
# 李明的成功并不是偶然的。他勤奋、坚韧、勇于冒险,不断学习和改进自己。他的成功也证明了,只要努力奋斗,任何人都有可能取得成功。# 第三轮对话 3rd dialogue turn
response, history = model.chat(tokenizer, "给这个故事起一个标题", history=history)
print(response)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Docker Container(容器)

"在哪里走散,你都会找到我~" Docker 容器 什么是容器? 通俗来讲,容器是镜像运行的实体。我们对于镜像的认知是,“存储在磁盘上的只读文件”。当我们启动一个容器的本质,就是启动一个进程,即容器…

SpringBoot实现缓存预热的几种常用方案

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN(也包括LSTM GRU)解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

从零开始 TensorRT(5)C++ 篇:g++、CMake、VS Code 环境入门

前言 学习资料: B站视频:基于 VSCode 和 CMake 实现 C/C 开发 B站视频:Cherno C 教程 从本文开始,正式进入 C 部分。由于个人 C 零基础,仅了解一些 Python,所以学习时的痛点更偏向于 C 的基础,…

nios ii开发随笔

错误一: d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: test.elf section .text will not fit in region ram_oc_xzs d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_6…

01_第一章 WEB开发概述(技术栈,交互模式,CS和BS模式,前后端分离)

文章目录 第一章 WEB概述1.1 JAVAWEB简介1.2 JAVAWEB技术栈1.3 JAVAWEB交互模式1.4 JAVAWEB的CS和BS模式1.5 JAVAWEB实现前后端分离 第一章 WEB概述 1.1 JAVAWEB简介 用Java技术来解决相关web互联网领域的技术栈.使用JAVAEE技术体系开发企业级互联网项目. 项目规模和架构模式与…

Linux:ACL权限,特殊位和隐藏属性

目录 一.什么是ACL 二.操作步骤 ① 添加测试目录、用户、组,并将用户添加到组 ② 修改目录的所有者和所属组 ③ 设定权限 ④ 为临时用户分配权限 ⑤ 验证acl权限 ⑥ 控制组的acl权限 三. 删除ACL权限 一.什么是ACL 访问控制列表 (Access Control List):ACL 通…

如何在 Tomcat 中为 Web 应用程序启用和配置缓存?

在Tomcat中为Web应用程序启用和配置缓存通常涉及到对Tomcat的连接器(Connector)进行配置,以及可能的话,配置Web应用程序本身以支持缓存。 1. 配置Tomcat连接器以启用缓存 Tomcat的连接器可以通过其配置来启用各种…

FFmpeg解析之avformat_find_stream_info函数

avformat_find_stream_info 的主要作用就是:解析媒体文件并获取相关的流信息 整体的逻辑如下图所示: /*** Read packets of a media file to get stream information. This* is useful for file formats with no headers such as MPEG. This* function…

LeetCode206: 反转链表.

题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 解题方法 假设链表为 1→2→3→∅,我们想要把它改成∅←1←2←3。在遍历链表时,将当前节点的 next指针改为指向前一个节点。由于节点没有引用其前一…

挑战杯 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

电表(2)stm32学习笔记-STLINK使用

stm32学习笔记-STLINK使用 使用ST-LINK调试程序进度表格 使用ST-LINK调试程序 说明 组成 总结 记录使用STLINK进行项目的烧写和调试,旨在高效的进行代码调试学习工具包括笔记本、keil5MDK、stm32f030c8t6电表主机、STLINK V2、导线、电表代码总的来说&#xff0…

yolov8-seg dnn调用

接上篇一直更换torch、opencv版本都无法解决这个问题(seg调用dnn报错)。那问题会不会出在yolov8源码本身呢。yolov8的讨论区基本都看过了,我决定尝试在其前身yolov5的讨论区上找找我不信没人遇到这个问题。很快找到下面的讨论第一个帖子&…

Project_Euler-03 题解

Project_Euler-03 题解 题目 思路 首先排除掉暴力求解,虽然也可以得出答案,但是我在我仅仅只有二颗核心的服务器上跑了很久很久… 尝试另一种方法: 首先要知道一个知识,所有的数都可以拆解成为素数因子平方连乘的形式&#xff…

Spring Boot与HikariCP:性能卓越的数据库连接池

点击下载《Spring Boot与HikariCP:性能卓越的数据库连接池》 1. 前言 本文将详细介绍Spring Boot中如何使用HikariCP作为数据库连接池,包括其工作原理、优势分析、配置步骤以及代码示例。通过本文,读者将能够轻松集成HikariCP到Spring Boot…

PCIe P2P DMA全景解读

温馨提醒:本文主要分为5个部分,总计4842字,需要时间较长,建议先收藏! P2P DMA简介 P2P DMA软硬件支持 CXL P2P DMA原理差异 P2P DMA应用场景 P2P DMA技术挑战 一、P2P DMA简介 P2P DMA(Peer-to-Peer…

解决ubuntu系统cannot find -lc++abi: No such file or directory

随着CentOS的没落,使用ubuntu的越来越多,而且国外貌似也比较流行使用ubuntu,像LLVM/Clang就有专门针对ubuntu编译二进制发布文件: ubuntu本身也可以直接通过apt install命令来安装编译好的clang编译器。不过目前22.04版本下最高…

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…

java——File类和字符集

目录 File类File类的常用操作:案例:文件搜索的实现案例:递归文件夹删除 字符集几种常见的字符集总结字符集的编码和解码 File类 File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文…

成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘

🔥 成功解决TypeError: can’t multiply sequence by non-int of type ‘float’ 📅 日期:2024年2月23日 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化…