基于LLama_factory的Qwen2.5大模型的微调笔记

Qwen2.5大模型微调记录

  • LLama-facroty
  • Qwen2.5 模型下载。
    • huggingface 下载方式
    • Modelscope 下载方式
  • 数据集准备
  • 模型微调
    • 模型训练
    • 模型验证及推理
    • 模型导出
  • 部署推理
    • vllm 推理
    • Sglang 推理

LLama-facroty

  1. 根据git上步骤安装即可,要求的软硬件都装上。
    llama-factory
  2. 运行llama-factory:
    export GRADIO_SERVER_PORT=6006    # 可以修改端口号。
    export GRADIO_SERVER_NAME=*.*.*.* # 可以修改服务地址
    或者可以通过修改interface.py文件的run_web_ui()函数
    llamafactory-cli webui  # 运行llama-factory
    运行成功可以看到一个URL,点击即可跳转到页面端
    

Qwen2.5 模型下载。

huggingface 下载方式

qwen2.5模型地址
huggingface地址
modelscope地址

  1. 安装依赖
    pip install -U huggingface_hub
  2. 模型下载
    export HF_HUB_ENABLE_HF_TRANSFER=0
    export HF_ENDPOINT=https://hf-mirror.com
    huggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2.5-7B-Instruct --local-dir /your_model_save_path

Modelscope 下载方式

  1. 安装依赖
    pip install modelscope
  2. 使用Python脚本
from modelscope import snapshot_download

cache_directory = '/your_model_save_path'
model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct', cache_dir=cache_directory)

执行脚本即可

数据集准备

  • llama-factory 支持 alpaca 格式和 sharegpt
    格式的数据集,具体要求可以看llama-factory数据集格式要求
  • 我这里采用的是sharegpt格式的数据集,比如我做一个信息抽取。
[	
	{
        "conversations": [
            {
                "from": "human",
                "value": "(这里替换成你的prompt)"
            },
            {
                "from": "gpt",
                "value": "(这里是你的标注的输出)"
            }
        ],
        "system": "你是一个信息抽取助手。你的任务是从给定的文本中提取特定的信息,并以结构化的格式呈现。提取的信息应准确、简洁且与查询相关。",
        "tools": ""
    },
    {
    	...
    }
]
  • 在你的数据集存放位置的同级目录下,一定要有一个dataset_info.json,这个里面是你自定义数据集的描述,可以包括你的多个数据集,供llama-factory识别。如果你采用的是sharegpt格式,dataset_info.json 格式如下。file_name字段填写你的数据路径。
{
  "my_dataset1": {
    "file_name": "/data/llama_factory/info_extract.json",
    "formatting": "sharegpt",
    "columns": {
      "messages": "conversations",
      "system": "system",
      "tools": "tools"
    },
    "tags": {
      "role_tag": "from",
      "content_tag": "value",
      "user_tag": "human",
      "assistant_tag": "gpt"
    }
  },
  "my_dataset2": {
    "file_name":"/data/llama_factory/info_extract2.json",
    "formatting": "sharegpt",
    "columns": {
      "messages": "conversations",
      "system": "system",
      "tools": "tools"
    },
    "tags": {
      "role_tag": "from",
      "content_tag": "value",
      "user_tag": "human",
      "assistant_tag": "gpt"
    }
  }
 }

模型微调

模型训练

  1. 我这里选择的LORA-SFT
    图中模型名称选择你微调的模型类别
    模型路径填写你下载的离线模型路径。
    微调方法选择 lora
    训练阶段 设置train 里面参数即可。
    训练方式选择SFT
    数据路径选择你数据集路径,选择之后,在数据集里面就可以选择你训练的数据集了。
    其它参数根据自己需求和资源进行调整。
    微调的时候 检查点路径不填写

在这里插入图片描述
点击开始训练,模型就开始训练,可以观察损失变化。
模型的输出目录在你的 llama-factory 项目下的saves文件夹中。
在这里插入图片描述

模型验证及推理

模型验证 - 点击evaluate&predict。
首先在 检查点路径选择你保存的某个checkpoint
然后添加你的验证集路径,选择验证集,点击开始。
到输出目录即可查看结果。
在这里插入图片描述
模型推理 - 点击chat。
首先在 检查点路径选择你保存的某个checkpoint。
然后选择推理引擎、数据类型,点击加载模型即可对话。
在这里插入图片描述

模型导出

模型导出-点击export
选择你验证过的最好的checkpoint.
设置相应的参数,
导出量化模型,需要填写一个量化数据集路径(验证集)。
导出设备如果是GPU 选择auto
导出的模型是已经merge后的模型。直接加载使用即可。

部署推理

vllm 推理

from transformers import AutoTokenizer
from vllm import LLM, SamplingParams


class VLLMInfer:
    def __init__(self, model_path):
        self.model_path = model_path
        self.llm, self.tokenizer = self.vllm_load_model()

    def vllm_load_model(self):
        tokenizer = AutoTokenizer.from_pretrained(self.model_path)
        llm = LLM(model=model_path,
                  gpu_memory_utilization=0.9,
                  trust_remote_code=True,
                  tensor_parallel_size=2  # GPU数量
                  )
        return llm, tokenizer
   
    # 批次
    def inference(self, prompts, system):
        texts = []
        for prompt in prompts:
            messages = [
                {"role": "system", "content": system},
                {"role": "user", "content": prompt}
            ]
            text = self.tokenizer.apply_chat_template(
                messages,
                tokenize=False,
                add_generation_prompt=True
            )
            texts.append(text)
        sampling_params = SamplingParams(temperature=0.1,
                                         top_p=0.7,
                                         repetition_penalty=1.0,
                                         max_tokens=200,
                                         )
        outputs = self.llm.generate(texts, sampling_params)

        result_list = []
        for output in outputs:
            generated_text = output.outputs[0].text
            result_list.append(generated_text.replace("\n", "").replace("<|im_end|>", '').replace("json", ""))
        return result_list


if __name__ == '__main__':
    model_path = "your_model_path"
    qwen_chat = VLLMInfer(model_path)
    system = "你是一个智能的助手."
    test_texts = ['', '']
    result = qwen_chat.inference(test_texts, system)
    print(result)

Sglang 推理

from transformers import AutoTokenizer
import sglang as sgl
import time


class SgLangInfer:
    def __init__(self, model_path):
        self.model_path = model_path
        self.llm, self.tokenizer = self.load_model()

    def load_model(self):
        tokenizer = AutoTokenizer.from_pretrained(
            self.model_path,
            trust_remote_code=True,
            clean_up_tokenization_spaces=False
        )

        llm = sgl.Engine(
            model_path=self.model_path,
            mem_fraction_static=0.85,
            tp_size=2,
            max_total_tokens=9000,
            enable_p2p_check=True  # 解决4090 p2p之间通信传输问题
        )

        return llm, tokenizer

    def inference(self, prompts, system):
        texts = []
        for prompt in prompts:
            messages = [
                {"role": "system", "content": system},
                {"role": "user", "content": prompt}
            ]
            text = self.tokenizer.apply_chat_template(
                messages,
                tokenize=False,
                add_generation_prompt=True
            )
            texts.append(text)
        sampling_params = {"temperature": 0,
                           "top_p": 1,
                           "repetition_penalty": 1.0, 
                           "max_new_tokens": 200}
        result_list = []
        response = self.llm.generate(texts, sampling_params)
        # print(f"response:{response}")

        for res in response:
            result_list.append(res['text'])

        return result_list

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

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

相关文章

提取图片高频信息

提取图片高频信息 示例-输入&#xff1a; 示例-输出&#xff1a; 代码实现&#xff1a; import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…

移动充储机器人“小奥”的多场景应用(上)

一、高速公路服务区应用 在高速公路服务区&#xff0c;新能源汽车的充电需求得到“小奥”机器人的及时响应。该机器人配备有储能电池和自动驾驶技术&#xff0c;能够迅速定位至指定充电点&#xff0c;为待充电的新能源汽车提供服务。得益于“小奥”的机动性&#xff0c;其服务…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

Windows环境GeoServer打包Docker极速入门

目录 1.前言2.安装Docker3.准备Dockerfile4.拉取linux环境5.打包镜像6.数据挂载6.测试数据挂载7.总结 1.前言 在 Windows 环境下将 GeoServer 打包为 Docker&#xff0c;可以实现跨平台一致性、简化环境配置、快速部署与恢复&#xff0c;同时便于扩展集成和版本管理&#xff0c…

《Vue零基础入门教程》第四课: 应用实例

往期内容 《Vue零基础入门教程》第一课&#xff1a;Vue简介 《Vue零基础入门教程》第二课&#xff1a;搭建开发环境 《Vue零基础入门教程》第三课&#xff1a;起步案例 参考官方文档 https://cn.vuejs.org/api/application#create-app 示例 const {createApp} Vue// 通…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…

02微服务系统与设计(D1_走出微服务误区:避免从单体到分布式单体)

目录 学习前言 一、回顾&#xff1a;从单体到微服务到 Function 二、分布式单体 分布式单体起因之一&#xff1a;通过共享库和网络客户端访问分布式能力 分布式单体起因之二&#xff1a;简单用远程调用替代进程内方法调用 分布式单体起因小结 三、引入非侵入式方案&#…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

鸿蒙学习高效开发与测试-集成开发环境(4)

文章目录 1、工程管理2、代码编辑3、界面预览4、编译构建5、代码调试6、性能调优7、设备模拟8、命令行工具9、端云一体化开发 HUAWEI DevEco Studio 是面向鸿蒙生态的集成开发环境&#xff0c;提供了一站式的鸿蒙生态应用、元服务开发能力&#xff0c;详细能力如图所示。 1、工…

基于yolov8、yolov5的茶叶等级检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;茶叶等级检测在茶叶生产、质量控制和市场销售中起着至关重要的作用&#xff0c;不仅能帮助相关部门实时监测茶叶质量&#xff0c;还为智能化检测系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的茶叶等级检测模型&#xff0c;该模…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;一&#xff09;——CSS 初体验与网页样式新征程 前言一、为什么需要 CSS&#xff1f;二、CSS的引用&#xff08;一&#xff09;行内样式&#xff08;二&#xff09;内部样式&#xff08;三&#xff09;外部样式&#xf…

Android音频采集

在 Android 开发领域&#xff0c;音频采集是一项非常重要且有趣的功能。它为各种应用程序&#xff0c;如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型&#xff1a;Mic 音频采集和系统音频采集。 1. Mic音频采集…

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

数据结构之一:复杂度

相关代码&#xff1a;SData/test_22/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 数据结构&#xff1a;在内存当中存储、组织数据的方式。&#xff08;顺序表、链表、栈、队列、树等&#xff09;。 算法&#xff1a;与数据结构配合使用&#xff0c;是对数据的处理。&#…

【鸿蒙技术分享:探索 HarmonyOS 开发之旅】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Houdini和Blender如何使用CPU云渲染

近期&#xff0c;渲染101云渲染农场在产品和服务方面进行了重要更新&#xff0c;进一步提升了我们平台的渲染能力和兼容性&#xff0c;助力各位用户高效完成创作。云渲码6666 渲染101云渲码6666 1. Houdini和Blender支持CPU云渲染 我们不断拓展云渲染的工具和平台支持&#x…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js &#xff08;放在项目根目录下&#xff09; module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

网络编程 作业1

1.c #include <myhead.h> #define IP "192.168.60.45" #define PORT 6666 #define BACKLOG 100 void fun(int sss) {if(sssSIGCHLD){while(waitpid(-1,NULL,0)>0);}} int main(int argc, const char *argv[]) {//1.捕获子进程退出时的信号if(signal(SIGCHL…