使用LLaMA-Factory对大模型进行微调

之前了解过一些LLM从训练到落地的过程;
其中一个重要的步骤就是微调;

预训练:在大规模数据上学习通用语言知识。(使用海量无标注文本(TB级))
微调:在预训练基础上,使用特定任务的标注数据进一步优化模型。(使用少量任务标注数据(KB-MB级))
预训练是“培养通才”,微调是“打造专才”

全量微调, 成本太高, 个人搞不了,一般企业也搞不了, 所以现在开始学习高效参数微调PEFT(Parameter-Efficient Fine Tuning)

核心思想:冻结大部分预训练参数,只训练少量新增参数。
优势:显存占用低、训练速度快、避免遗忘

通常大模型部署在服务器上,代码在我们自己的电脑上编写
核心思路就是
本地:负责编写代码、准备数据、发起微调任务、监控训练过程。
服务器:负责实际的模型加载、计算和参数更新(利用 GPU 资源)

其实就是本地写代码,然后把代码在服务器上运行
我这边采用的方式是VS Code 远程开发
安装 VS Code 插件:Remote-SSH 参考: https://blog.csdn.net/xy3233/article/details/149528434

现在开始微调一个大模型,
参考: https://www.lixueduan.com/posts/ai/05-finetune-llamafactory/
先跟着别人一步一步做
我们先下载一个小模型 Qwen1.5-1.8B-Chat

modelscope download --model Qwen/Qwen1.5-1.8B-Chat  --local_dir /opt/vllm/models/Qwen1.5-1.8B-Chat

然后启动模型(注意python虚拟环境)

vllm serve /opt/vllm/models/Qwen1.5-1.8B-Chat \
--max-model-len 8192  \
--gpu-memory-utilization 0.70  \
--host 0.0.0.0  \
--port 8081  \
--served-model-name Qwen1.5-1.8B-Chat

gpu小的话 就调整 gpu-memory-utilization 0.70 不然显存不够
启动完毕
在这里插入图片描述
测试:
http://localhost:8081/v1/chat/completions

{"model": "Qwen1.5-1.8B-Chat","messages": [{"role": "system","conten": "You are a helpful assistant."},{"role": "user","content": [{"type": "text","text": "你是谁"}]}]
}  

回复:

{"id": "chatcmpl-1fdd8d7a1e134a0ea2938520a983d58e","object": "chat.completion","created": 1753168788,"model": "Qwen1.5-1.8B-Chat","choices": [{"index": 0,"message": {"role": "assistant","reasoning_content": null,"content": "我是来自阿里云的大规模语言模型,我叫通义千问。我是阿里巴巴集团研发的超大规模语言模型,是全球首个预训练语言模型,拥有超过1750万参数,能够理解和生成高质量的语言文本。\n\n我可以回答各种问题,无论是科技、文化、生活、娱乐还是专业知识领域的问题,都能提供准确和流畅的回答。我能处理大量数据,具有强大的语义理解、自然语言生成、问答系统、知识图谱构建等能力,能够根据上下文进行推理和思考,帮助用户获取所需的信息和知识,实现人机交互的智能化。\n\n此外,我还支持多种应用场景,例如智能客服、智能写作、智能翻译、自动摘要、推荐系统、智能问答系统等,并且可以通过接口与多个外部应用系统集成,形成更复杂的多模态对话系统。\n\n作为一款预训练语言模型,我通过不断的学习和优化,持续提升自己的性能和效果,同时也为人工智能领域的研究和发展做出了重要贡献。无论是在技术上,还是在实际场景的应用中,我都希望能够成为您高效解决问题、获取信息、交流沟通的重要工具,共同推动人工智能的进步和发展。","tool_calls": []},"logprobs": null,"finish_reason": "stop","stop_reason": null}],"usage": {"prompt_tokens": 15,"total_tokens": 251,"completion_tokens": 236,"prompt_tokens_details": null},"prompt_logprobs": null,"kv_transfer_params": null
}

目标: 修改模型自我认知, 当询问: 它是谁 要回复它是: 它是贾维斯,由钢铁侠制造;

下面使用 LLaMAFactory 演示如何进行 LoRA 微调。
LLaMAFactory简介:

LLaMA Factory 是一个大模型微调与部署工具包
兼容主流开源模型,如 LLaMA 系列、Qwen 系列、Mistral、Baichuan、ChatGLM、Yi 等,支持多种微调方法
全参数微调:更新模型所有参数,适合资源充足的场景。
参数高效微调:包括 LoRA、QLoRA、IA³、Prefix-Tuning 等,仅更新少量参数,大幅降低显存需求。
指令微调:针对对话、问答等任务优化模型响应,支持多轮对话格式。评估与部署一体化
提供自动评估工具,支持困惑度(Perplexity)、人工评分等指标。
集成部署功能,可直接导出为 Hugging Face 格式、ONNX 格式,
或通过 vllm、FastAPI 快速部署为 API 服务。

环境隔离

创建一个虚拟环境python3 -m venv LLaMA-env
激活  source /opt/vllm/env/LLaMA-env/bin/activate
退出 deactivate

前置条件
安装 torch,torchvision,transformers 这几个的版本;
直接到 https://github.com/hiyouga/LLaMA-Factory.git 看一下推荐版本;
然后根据cuda的版本 来确定 torch的版本
我这里使用的是 torch 2.6.0+cu118, torchvision 0.21.0+cu118;
然后安装 transformers==4.50.0

①安装 LLaMAFactory 和所需依赖

git clone  https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -r  requirements.txt
pip install -e .

LLaMA-Factory 校验
使用 llamafactory-cli version 快速校验安装是否成功
在这里插入图片描述
在这里插入图片描述

  1. 准备数据集
    准备数据集可以分为两个步骤:
    1)准备数据集文件,json 格式,存放到 data 目录下
    2)注册数据集,将 json 文件注册到 data 目录下的 dataset_info.json 文件
    LLaMA-Factory 内置了一些数据集,本次就使用内置的 identity 数据集(在data文件夹下),用于修改模型的自我意识。

将identity.json 复制一份, 命名 identity2.json,
对{{name}} 和{{author}} 进行全局替换。 这样数据就准备好了

注册数据集: 在data文件夹中找dataset_info.json,把内容改成 (只放这一个)

{"identity": {"file_name": "identity2.json"}
}

key 为数据集名称,比如这里的 identity
value 为数据集配置,只有文件名 file_name 为必填的,比如这里的 identity2.json

modelPath=/opt/vllm/models/Qwen1.5-1.8B-Chatllamafactory-cli train \--model_name_or_path $modelPath \--stage sft \--do_train \--finetuning_type lora \--template qwen \--dataset identity \--output_dir ./saves/lora/sft \--learning_rate 0.0005 \--num_train_epochs 8 \--cutoff_len 4096 \--logging_steps 1 \--warmup_ratio 0.1 \--weight_decay 0.1 \--gradient_accumulation_steps 8 \--save_total_limit 1 \--save_steps 256 \--seed 42 \--data_seed 42 \--lr_scheduler_type cosine \--overwrite_cache \--preprocessing_num_workers 16 \--plot_loss \--overwrite_output_dir \--per_device_train_batch_size 1 \--fp16

执行完之后是这样的
在这里插入图片描述
根据前面的指令 微调后的模型保存到了我们指定的 ./saves/lora/sft 目录
只是权重文件比较小,只有 29M。(这个执行不起来,我试了 也许是错了)
在这里插入图片描述
权重合并
使用的 LoRA 微调,会生成单独的 LoRA 权重,当微调完成后需要将原始模型和 LoRA 权重进行合并,得到一个新的模型。

# 原始模型
modelPath=/opt/vllm/models/Qwen1.5-1.8B-Chat
# 上一步微调得到的 LoRA 权重
adapterModelPath=./saves/lora/sft/llamafactory-cli export \--model_name_or_path $modelPath \--adapter_name_or_path $adapterModelPath \--template qwen \--finetuning_type lora \--export_dir /opt/vllm/models/Qwen1.5-1.8B-Chat-2 \--export_size 2 \--export_device cpu \--export_legacy_format False

结果是这样的
在这里插入图片描述

合并完之后
重新启动测试

vllm serve /opt/vllm/models/Qwen1.5-1.8B-Chat-2 \
--max-model-len 8192  \
--gpu-memory-utilization 0.70  \
--host 0.0.0.0  \
--port 8081  \
--served-model-name Qwen1.5-1.8B-Chat

测试结果
在这里插入图片描述

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

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

相关文章

WxPython——一些最常见的错误现象及解决方法

一些最常见的错误现象及解决方法 有一些错误它们可能会发生在你的wxPython应用程序对象或初始的顶级窗口在创建时,这些错误可能是很难诊断的。下面我们列出一些最常见的错误现象及解决方法: 错误现象:程序启动时提示“unable to import modul…

SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理

SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理 官网:https://spark.apache.org/docs/4.0.0/sql-ref-functions.html https://spark.apache.org/docs/4.0.0/sql-ref-null-semantics.html#innot-in-subquery Unlike the EXISTS expression, IN expression can return…

【安卓笔记】lifecycle与viewModel

0. 环境: 电脑:Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 本篇文章涉及到的内容 lifecycle livedata databinding viewModel 2. …

84、逆向工程开发方法

逆向工程开发方法是一种通过分析现有产品、系统或代码来理解其设计原理、功能实现及潜在缺陷,并在此基础上进行改进、复制或创新的技术过程。它广泛应用于软件、硬件、机械、电子等多个领域,尤其在缺乏原始设计文档或需要快速掌握复杂系统时具有显著优势…

ospf单区域实验

拓扑图:AR1:[Huawei]ospf 1 router-id 1.1.1.1 [Huawei-ospf-1]area 0[Huawei-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255(1.当前网段会被ospf的进程1学习到然后通告出去;2.如果接口的IP地址处于这个网段中&#xff0c…

Linux命令基础完结篇

用户权限修改 chmod修改文件权限 文字设定法 u:所有者g:所属组o:其他人a:所有:添加权限-:删除权限:赋予权限数字设定法 r:4w:2x:1每一组权限:0~7举…

高效互联,ModbusTCP转EtherCAT网关赋能新能源电缆智能制造

在新能源汽车快速发展的背景下,新能源电缆作为关键组件,需满足耐高低温、阻燃、耐老化等严苛要求,这对生产线的工艺与设备提出了更高标准。为提升制造效率,某领先设备制造商创新采用**ModbusTCP转EtherCAT网关**技术,实…

Java_多线程_生产者消费者模型_互斥锁,阻塞队列

生产者消费者模型(Producer-Consumer Model)是计算机科学中一个经典的并发编程模型,用于解决多线程/多进程环境下的协作问题。 基本概念 生产者:负责生成数据或任务的实体 消费者:负责处理数据或执行任务的实体 缓冲区:生产者与消…

Vue3实现视频播放弹窗组件,支持全屏播放,音量控制,进度条自定义样式,适配浏览器小窗播放,视频大小自适配,缓冲loading,代码复制即用

效果图组件所需VUE3代码<template><div class"video-dialog" :class"fullScreen && video-dialog-full-screen"><el-dialogv-model"props.visible"draggable:show-close"false"title""centeralign-c…

LLM层归一化:γβ与均值方差的协同奥秘

LLM层归一化参数均值和方差;缩放和平移参数是什么 层归一化(Layer Normalization,LN)是深度学习中用于稳定神经网络训练的一种归一化技术 均值和方差参数用于对输入数据进行标准化处理,即将输入数据转换为均值为0、方差为1的标准正态分布 缩放因子γ\gammaγ:标准化后…

智慧场景:定制开发开源AI智能名片S2B2C商城小程序赋能零售新体验

摘要&#xff1a;智慧场景作为零售行业创新发展的关键载体&#xff0c;正深刻改变着消费者的生活方式。本文聚焦智慧零售模式下智慧场景的构建&#xff0c;以定制开发开源AI智能名片S2B2C商城小程序为切入点&#xff0c;深入探讨其在零售企业选址布局、商业模式创新、经营理念转…

QML WorkerScript

WorkerScript是QML中实现多线程编程的关键组件&#xff0c;它允许开发者将耗时操作移至后台线程执行&#xff0c;避免阻塞主UI线程&#xff0c;从而提升应用响应速度和用户体验。本文将全面介绍WorkerScript的核心机制、使用方法和最佳实践。WorkerScript核心机制WorkerScript通…

锐浪报表 Grid++Report 表头表尾的隐藏

设计锐浪表格的模板时&#xff0c;可以通过设计多个表头、表尾&#xff0c;表头、表尾中放入打印控件&#xff0c;可以打印相关的数据。在真实打印时&#xff0c;可以通过打印时让表头、表尾隐藏或显示&#xff0c;实现用户的表格样式。一、表头的指定1、 表头可以多个&#xf…

低速信号设计之 QSPI 篇

一、引言​ 在服务器技术不断演进的当下,对高效、稳定的数据存储和传输需求日益增长。QSPI(Quad Serial Peripheral Interface)总线作为一种高速、串行的外围设备接口,在服务器领域中发挥着关键作用。它为服务器中的各类存储设备及部分外围芯片与主处理器之间提供了快速可…

别只知道暴力循环!我从用户名校验功能中领悟到的高效字符集判断法(1684. 统计一致字符串的数目)

别只知道暴力循环&#xff01;我从用户名校验功能中领悟到的高效字符集判断法 &#x1f60e; 大家好&#xff0c;日常开发中&#xff0c;我们经常会遇到一些看似不起眼&#xff0c;却能成为性能瓶颈的小模块。今天&#xff0c;我想和大家分享一个我亲身经历的故事&#xff0c;…

力扣面试150题--在排序数组中查找元素的第一个和最后一个位置

Day 85 题目描述思路 当 nums[mid] < target 时&#xff0c;说明目标值在右侧&#xff0c;移动左指针 left mid 1 当 nums[mid] > target 时&#xff0c;说明目标值可能在当前位置或左侧&#xff0c;移动右指针 right mid - 1 循环结束后&#xff0c;left 指针会指向第…

C++实战:人脸识别7大核心实例

计算机视觉实例应用 基于C++的人脸识别实例 以下是一些基于C++的人脸识别实例的示例和实现方法,涵盖了多种技术和库的应用。这些例子可以帮助开发者快速上手并实现人脸识别功能。 OpenCV 基础人脸检测 使用OpenCV的预训练模型进行人脸检测是入门级示例。OpenCV自带Haar级联…

Uniapp中使用vue3语法

在setup语法糖中调用uniapp的页面生命周期 <script setup>import { onShow } from "dcloudio/uni-app"onShow(() > {//hanlder...}) </script>vue2混入在vue3中建议使用组合式API 新建baseHook.js import { ref } from "vue"; export fu…

C++vector(2)

2.vector深度剖析及模拟实现 2.1std::vector的核心框架接口的模拟实现bit::vector vector的模拟实现 2.2 使用memcpy拷贝问题 假设模拟实现的vector中的reserve接口中&#xff0c;使用memcpy进行的拷贝&#xff0c;以下代码会发生什么问题&#xff1f; int main() {gxl::ve…

IPSec VPN -- 野蛮模式

一、野蛮模式简介野蛮模式VPN是指IPsec VPN中IKE协商采用野蛮模式&#xff08;Aggressive Mode&#xff09;的虚拟专用网络。它是IKE第一阶段协商的一种方式&#xff0c;与主模式相对&#xff0c;具有协商速度快但安全性稍低的特点。以下是具体介绍&#xff1a;1、工作原理&…