采用LLaMa-Factory对QWen大模型实现微调(效果很好)

前言

       LLaMA-factory是一个非常有用的开源框架。关于利用llama-factory实现大模型的微调,研究了有一个多月了,终于相对成功的微调了一个QWen的大模型。其中的曲折愿和大家分享!

一、源码的下载

在github上的网址:

GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)

不采用git,直接download,如图:

下载完毕后,解压后的效果如下:

二、在AnaConda配置完成安装

启动AnaConda的命令行:

查看现有的虚拟环境,如下图:

(可见我当前的系统安装了多个Python版本的环境,这个可以参考我的另外一篇博客:

https://quickrubber.blog.csdn.net/article/details/140995598)

激活Python311

进入LLaMa-Factory的下载目录,如下图:

安装依赖:

下载得速度还是比较快的,然后如下:

三、启动LLaMa-factory

自动打开了浏览器(这个启动过程大约需要十多秒),如下图:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

尝试直接挂接Ollama的本地大模型,发现无法成功,具体可以参看我的另一篇博客:

llama-Factory不宜直接挂接Ollama的大模型-CSDN博客

所以,考虑直接采用魔搭社区下载的大模型。

四、访问本地的千问(QWen)大模型对比微调结果

4.1、从魔搭社区下载大模型文件

采用的还是比较轻量级的QWen2.5:0.5B。

链接:魔搭社区

直接逐个下载即可(当然也可用命令行下载,在此不赘述)

下载完毕后,文件夹中的文件如下:

4.2、PyCharm工程访问大模型文件实现测试1

代码如下:

from transformers import AutoModelForCausalLM, AutoTokenizer
#模型文件采用在线的方式进行
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_before_fine_tuning"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

运行结果如下:

                                  (结果图1)

4.3、采用LLaMa-factory实现模型的微调

选定模型位置:

选择一个llama-factory自带的一个数据集:

开始训练:

控制台的训练显示1:

查看资源管理器,发现GPU已100%被占用:

训练完毕(2080显卡用时1小时):

完毕后可以得到一个训练记录:

点开文件夹:

4.4、采用llama-factory将微调后的模型导出

导出完毕:

得到的模型文件夹内容:

4.5、将用于微调的数据集中数据测试微调后的模型

代码:

from transformers import AutoModelForCausalLM, AutoTokenizer#模型文件采用在线的方式进行
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_after_fine_tuning"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

运行效果:

                                   (结果图2)

显然“结果图2”比“结果图1”(4.2)更加接近微调数据集的答案。

微调数据集中对应的内容:

换行打印的内容如下:

可见,可能人名未必对的上,但是意思比微调前接近了。

人名对不上的缘故是,微调才运行了3个epoch,持续微调,降低误差后。可能更准确。

五、自定义数据集进行微调

5.1、5条数据的数据集

alpaca_en_demo.json有1000条数据集,所以微调起来慢。

我选取了其中5条,构成了新的alpaca_en_demo_mychange.json

关于alpaca_en_demo_mychange.json的内容:

在dataset_info.json中添加数据信息

为了方便微调数据集的加载,必须修改dataset_info.json,添加自定义数据集的信息:

5.2、按照4.3方式微调

重启llama-factory:

然后,开始重新训练:

训练完毕(2080显卡用时2分钟):

得到新的训练结果:

5.3、导出新的大模型文件

具体方法参照4.4

5.4、最新大模型文件测试

代码:

from transformers import AutoModelForCausalLM, AutoTokenizer
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_after_fine_tuning_5"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

运行结果:

原微调数据集:

对比微调数据集,第二个名字(Conner McDavid)完全能对上。所以微调还是有了改进。

但是结果还是不满意。

5.5、加大epoch数量(500)进行微调

   训练完毕(大约用了半小时):

再同样进行模型文件合并导出,重新用Python程序进行测试,发现仍然还是只有一个球员名字对上,效果还是不满意。(尽管loss误差已经是零了)

5.6、重磅级别的改进

在Python问答环节中增加了一个sample=False的设置:

运行效果如下:

对比微调用的数据集中的内容:

Good!终于完全对上了!微调成功!

测试程序的对应源码,可以从此处下载:

https://download.csdn.net/download/quickrubber/90778391

                                                             

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

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

相关文章

深入理解深度Q网络DQN:基于python从零实现

DQN是什么玩意儿? 深度Q网络(DQN)是深度强化学习领域里一个超厉害的算法。它把Q学习和深度神经网络巧妙地结合在了一起,专门用来搞定那些状态空间维度特别高、特别复杂的难题。它展示了用函数近似来学习价值函数的超能力&#xf…

机械物理:水力发电站工作原理是什么?

水利发电站的工作原理是将水的势能转化为电能,主要依赖水体的重力作用与能量转换设备。以下是其核心步骤和组成部分的详细解释: 1. 蓄水与势能积累 水坝与水库:通过建造水坝拦截河流,形成水库蓄水。水位升高后,水体的…

[面试]SoC验证工程师面试常见问题(五)TLM通信篇

SoC验证工程师面试常见问题(五) 摘要:UVM (Universal Verification Methodology) 中的 TLM (Transaction Level Modeling) 通信是一种用于在验证组件之间传递事务(Transaction)的高层次抽象机制。它通过端口(Port)和导出(Export)实现组件间的解耦通信,避免了信…

CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发

CAD插件实现块属性值与excel的互动,效果如下: 加载dll插件(CAD 命令行输入netload ,运行xx即可导出Excel,运行xx1即可根据excel更新dwg块属性值。) 部分代码如下 // 4. 开启事务更新CAD数据using (Transact…

【数据挖掘】Apriori算法

Apriori算法是经典的关联规则挖掘算法,用于从事务型数据库中发现频繁项集和强关联规则,特别常用于购物篮分析等场景。 🧠 核心思想(Apriori原则) 一个项集是频繁的,前提是它的所有子集也必须是频繁的。 即&…

单链表设计与实现

01. 单链表简介 在数据结构中,单链表的实现可以分为 带头结点 和 不带头结点 两种方式,这里我们讨论第二种方式。 头结点:链表第一个节点不存实际数据,仅作为辅助节点指向首元节点(第一个数据节点)。头指…

【论文阅读】——Articulate AnyMesh: Open-Vocabulary 3D Articulated Objects Modeling

文章目录 摘要一、介绍二、相关工作2.1. 铰接对象建模2.2. 部件感知3D生成 三、方法3.1. 概述3.2. 通过VLM助手进行可移动部件分割3.3. 通过几何感知视觉提示的发音估计3.4. 通过随机关节状态进行细化 四、实验4.1. 定量实验发音估计设置: 4.2. 应用程序 五、结论六、思考 摘要…

Zookeeper单机版安装部署

目录 1.1、概述1.2、系统环境1.3、部署流程1.3.1、下载安装包1.3.2、解压文件1.3.3、创建数据目录和日志目录1.3.4、配置ZooKeeper1.3.5、启动ZooKeeper服务1.3.6、连接和验证 1.4、Zookeeper服务管理命令1.4.1、启动Zookeeper服务1.4.2、停止Zookeeper服务1.4.3、查看Zookeepe…

在 Elasticsearch 中删除文档中的某个字段

作者:来自 Elastic Kofi Bartlett 探索在 Elasticsearch 中删除文档字段的方法。 更多有关 Elasticsearch 文档的操作,请详细阅读文章 “开始使用 Elasticsearch (1)”。 想获得 Elastic 认证?查看下一期 Elasticsear…

元数据和主数据

元数据和主数据是数据管理中的两个关键概念,其核心区别如下: 1. 定义与本质 元数据(Metadata) “关于数据的数据”,用于描述数据的属性、结构、来源、用途等上下文信息。 示例:数据库表的字段名称、数据类型…

java的Stream流处理

Java Stream 流处理详解 Stream 是 Java 8 引入的一个强大的数据处理抽象,它允许你以声明式方式处理数据集合(类似于 SQL 语句),支持并行操作,提高了代码的可读性和处理效率。 一、Stream 的核心概念 1. 什么是 Str…

llama-Factory不宜直接挂接Ollama的大模型

前言 llama-Factory尝试使用Ollama本地安装的大模型。 一、在Ollama中安装QWen 安装qwen:0.5b 安装完成了: 同理安装qwen2.5:0.5b 安装完毕后,再用ollama list进行查看: 我们在chatbox中进行查看: 说明这两个大模型,…

基于WSL用MSVC编译ffmpeg7.1

在windows平台编译FFmpeg,网上的大部分资料都是推荐用msys2mingw进行编译。在win10平台,我们可以采用另一种方式,即wslmsvc 实现window平台的ffmpeg编译。 下面将以vs2022ubuntu22.04 为例,介绍此方法 0、前期准备 安装vs2022 &…

vue3+vite项目引入tailwindcss

从2025年1月tailwindcss4.0发布开始使用tailwindcss比之前简化很多 1,安装 yarn add tailwindcss tailwindcss/vite2,配置vite.config.js import tailwindcss from tailwindcss/vite;...plugins: [tailwindcss(),...] ...3,在主css文件顶部添加 注意一定是css文件,不能是sc…

蓝牙RFCOMM协议概述

RFCOMM概述 概念 RFCOMM 协议提供了对 L2CAP 协议上的串行端口的模拟。该协议基于 ETSI 标准 GSM 07.10。 RFCOMM 采用与 TS07.10 相同的字节序列方式。所有二进制数字都按照从低位到高位的顺序,从左至右读。 两个使用RFCOMM通信的蓝牙设备可以打开多个仿真串行端…

[工具]B站缓存工具箱 (By 郭逍遥)

📌 项目简介 B站缓存工具箱是一个多功能的B站缓存工具,包含视频下载、缓存重载、文件合并及系统设置四大核心功能。基于yutto开发,采用图形化界面操作,极大简化B站资源获取与管理流程。 工具可以直接将原本缓存的视频读取&#…

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度

递归 递归三部曲: 1.确定参数和返回值2.确定终止条件3.确定单层逻辑 226.翻转二叉树 题目 思路与解法 第一想法: 递归,对每个结点进行反转 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…

sunset:Solstice靶场

sunset:Solstice https://www.vulnhub.com/entry/sunset-solstice,499/ 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.244 3&#xff…

AZScreenRecorder最新版:功能强大、操作简便的手机录屏软件

AZScreenRecorder最新版是一款功能强大的手机录屏软件,专为安卓设备设计。它无需ROOT权限,支持无限录制时长,操作简单,录制过程中可以随时暂停,满足不同用户的个性化录屏需求。此外,用户还可以自定义分辨率…

模块自动导入的小工具

import { ref, reactive, onMounted } from vue import { useRoute, useRouter } from vue-router项目里很多文件都需要引入这些公共库,比较繁琐,使用一个小工具可以自动导入,就不需要在每个文件里面都写这些导入的代码了。 通过命令行下载安…