【深度学习】微调通义千问模型: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://www.mzph.cn/news/699917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm设置淘宝镜像

将npm的下载源恢复为默认的官方源,命令如下: npm config set registry https://registry.npmjs.org淘宝官方提供的最新的配置淘宝镜像的方法,命令如下: npm config set registry https://registry.npmmirror.com也可以查看是否修改…

第 1 章 作业题

10 该题还算比较复杂,但是考虑清楚之后也还好 电路交换 建立连接的时间 发送时延 传播时延 传播时延是链路长度 每段链路的传播时延 分组交换 发送时延 传播时延 发送时延指的是报文长度除以数据率,经过一个节点也有发送时延,也是…

【小白友好】python leetcode 27 remove element

Problem: 27. 移除元素 工程思想 用一些python已有的工具: while val in nums:nums.remove(val)但是我们显然不要这么做对不对! 从零开始 看题目是要in place,则考虑交换咯。 要把不等于val的移到前面,则考虑把数组分成2部分&…

MySQL sql注意点

为何写这篇博客,源于工作时虽然写了大量sql语句包括复杂sql。可是一但脱离sql执行环境和运行结果。发现很多东西只是在尝试中解决了问题,但这还远远不够。 本文列取了常用但是容易遗漏的一些知识点。另外关键词一般大写,为了便于阅读所以很多…

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理,这样会即将不用的命名空间去除,不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…

XGB-11:随机森林

XGBoost通常用于训练梯度提升决策树和其他梯度提升模型。随机森林使用与梯度提升决策树相同的模型表示和推断,但使用不同的训练算法。可以使用XGBoost来训练独立的随机森林,或者将随机森林作为梯度提升的基模型。这里我们专注于训练独立的随机森林。 XG…

解决Mysql的Access denied for user权限不足问题

当用客户端工具连接数据库 以root 用户登录后 无法给相关用户授权数据库等操作: 原因: root%表示 root用户 通过任意其他端访问操作 被拒绝! 授权即可: 登录server端: mysql -uroot -pxxxxx(使用账号密码登录linux mysql服务内部) 然后输入如下sql命令…

Sora:开启视频生成新时代的强大人工智能模型

目录 一、Sora模型的诞生与意义 二、Sora模型的技术特点与创新 三、Sora模型的应用前景与影响 四、面临的挑战与未来发展 1、技术挑战 2、道德和伦理问题 3、计算资源需求 4、未来发展方向 随着信息技术的飞速发展,人工智能(AI)已成为…

vue3中使用vuedraggable实现拖拽el-tree数据进分组

看效果: 可以实现单个拖拽、双击添加、按住ctrl键实现多个添加,或者按住shift键实现范围添加,添加到框中的数据,还能拖拽排序 先安装 vuedraggable 这是他的官网 vue.draggable中文文档 - itxst.com npm i vuedraggable -S 直接…

tomcat通过JAVA_OPTS注入自定义变量 —— 筑梦之路

背景说明 tomcat部署的java应用在k8s集群或容器中,想要给tomcat传自定义变量,应该如何实现? 解决方法 1. 在k8s集群或容器环境中通过env或者configmap方式添加自定义的环境变量 比如: my_key: aaaa 2. tomcat下新增脚本&am…

拓扑空间简介

目录 介绍集合论与映射映射相关定义映射(map)映射的一种分类:一一的和到上的 拓扑空间背景介绍开子集开子集的选择 拓扑拓扑空间常见拓扑拓扑子空间同胚其他重要定义 开覆盖紧致性有限开覆盖紧致性 R R R的紧致性 习题 介绍 这是对梁灿彬的《…

shim error: docker-runc not installed on system

问题描述:shim error: docker-runc not installed on system 解决办法: 方式一: cd /usr/libexec/docker/sudo ln -s docker-runc-current docker-runc 方式二: vi /etc/docker/daemon.json # 添加内容如下: {"…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP(统一过程开发)4 1 视图 1)逻辑视图: 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构,包括类、接口、包、模块等,并用于表示系统的组织结构…

全栈笔记_工具篇(nvm免安装版自动配置,无需手动设置环境变量)

将免安装压缩包nvm-noinstall.zip解压到指定目录,如:C:\nvm 修改install.cmd: @echo off set /P NVM_PATH="Enter the absolute path where the nvm-windows zip file is extracted/copied to: " set NVM_HOME=%NVM_PATH% setx NVM_HOME "%NVM_HOME%"fo…

C++入门学习(三十六)函数的声明

程序是自上而下运行的&#xff0c;比如我下面的代码&#xff1a; #include <iostream> #include<string> using namespace std;int main() { int a1; int b2;int sumaddNumbers(a,b); cout<<sum;return 0; }int addNumbers(int a, int b) { int sum …

MFC 配置Halcon

1.新建一个MFC 工程&#xff0c;Halcon 为64位&#xff0c;所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…

简单讲解并梳理微信小程序默认几个文件和文件夹结构及其作用

那么 我们来说一下 小程序整个项目结构 它各个文件 和 整体结构 这是我们新创建的一个小程序项目 我们从上到下 分别来看一下 这些文件和目录结构的作用 首先是 pages 它的作用在于存储整个项目所有的 page页面文件 我们小程序官方 是推荐我们将所有page 界面都放在pages目录…

稀疏计算、彩票假说、MoE、SparseGPT

稀疏计算可能是未来10年内最有潜力的深度学习方向之一&#xff0c;稀疏计算模拟了对人脑的观察&#xff0c;人脑在处理信息的时候只有少数神经元在活动&#xff0c;多数神经元是不工作的。而稀疏计算的基本思想是&#xff1a;在计算过程中&#xff0c;将一些不重要的参数设置为…

一招解决 vue数据格式校验时候 async-validator: [‘XXXX is not a number‘]

在vue中 amt数字需要进行纯数字校验&#xff1a; 格式都没问题&#xff0c;但是输入纯数字也会报错&#xff0c;报错如下&#xff1a; async-validator:[‘amt is not a number’] 网上找了一些&#xff0c;但是均为能奏效&#xff0c;尝试如下&#xff1a; 尝试1&#x…

软件保护技术

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 软件保护 软件保护技术其实是一个很大的概念&#xff0c;技术上分为很多不同的分支&#xff0c;主要包括加密、防篡改、软件水印、软件多样化、反逆向技术、虚拟机、基于网络的保护和基于硬件的保护等。 加密是指对…