LLamaFactory:当下最容易上手的大模型微调工具

2024-04-08 04:44

本文主要是介绍LLamaFactory:当下最容易上手的大模型微调工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近日,国内的一款微调框架发布了自己的论文《LLAMAFACTORY: Unified Efficient Fine-Tuning of 100+ Language Models》,对他们的框架做了系统性的总结。该框架自推出后迅速出圈,现已斩获15.6k的star,逐步成为当下微调的首选工具。

喜欢本文记得收藏、点赞、关注。文末参与技术讨论

在这里插入图片描述

https://arxiv.org/pdf/2403.13372.pdf

大模型实战

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。


汇总合集:《大模型实战宝典》(2024版) 发布!


突出表现

模型微调相较于上下文学习来讲,存在比较高的门槛,但又是模型专业化,领域化不可或缺的技术手段。而其复杂性突出表现在这些方面:

1)理论基础,如果说基于大模型写prompt 根据一定范式来构建RAG或者Agent不需要太多机器学习理论知识,然而微调就必须要对这些有理解,比如样本,学习率,logloss等。

2)数据准备,对于普通开发者,高质量的数据是微调成功的关键保证,而如何预处理,清洗,标注这些样本本身就很复杂,更因此诞生了大模型数据工程这样的领域来解决这一问题。

3)基座模型存在分化,虽然当下很多模型都参考llama和huggingface的一些规范,但是仍然都有一些特殊之处,想要微调也需要针对性地去分析和构建相应的策略。

4)超参数优化,微调本身是一个“炼丹”过程,如何能够找到合适的超参数,达到一个最佳性能,是一个重大挑战。

5)AI工程复杂性,涉及到硬件\软件\复杂流程的协同配合以及系统优化,在有限的成本、资源和时间要求下完成模型训练过程。

正是因为这些原因,对于预训练微调,需要一个类似于工厂的工业化手段来降低门槛,提升效率。

因此,行业内出现了很多微调框架,而LLamaFactory(https://github.com/hiyouga/LLaMA-Factory)便是其中之一,从起名上就可以看出它们的目标是成为模型微调的工厂。

在这里插入图片描述

架构

它得以流行主要得益于支持当下主流的大模型百川、千问、LLaMA等,不仅集成了大模型预训练、监督微调和强化微调等阶段的主流的微调技术(支持 LoRA 和 QLoRA 等参数高效微调策略),还提供了预训练、指令微调等丰富的数据集,方便参考使用,最重要的是提供了一个无代码的图形界面,大幅降低使用门槛,非开发者也可以方便地完成模型微调。

该框架架构上由四个模块构成:模型加载器、数据工作器和训练器,以及用户界面LlamaBoard。

在这里插入图片描述

在根据官方文档安装好LLamaFactory后,可以有三种方式进行操作,WebUI、CLI或者Python。

1.webUI。

CUDA_VISIBLE_DEVICES=0 python src/train_web.py

在这里插入图片描述

2.CLI,由于有时候界面限制,可能需要命令行的方式进行微调。如果不知道具体格式,可以在界面上配置好,再复制到命令行中调整使用。

在这里插入图片描述

在example目录中有大量的示例可供参考。

examples/
├── lora_single_gpu/
│   ├── pretrain.sh: 进行预训练
│   ├── sft.sh: 进行指令监督微调
│   ├── reward.sh: 进行奖励模型训练
│   ├── ppo.sh: 进行 PPO 训练
│   ├── dpo.sh: 进行 DPO 训练
│   ├── orpo.sh: 进行 ORPO 训练
│   ├── prepare.sh: 保存预处理后的数据集
│   └── predict.sh: 进行批量预测
├── qlora_single_gpu/
│   ├── bitsandbytes.sh: 微调 4/8 比特 BNB 模型
│   ├── gptq.sh: 微调 4/8 比特 GPTQ 模型
│   ├── awq.sh: 微调 4 比特 AWQ 模型
│   └── aqlm.sh: 微调 2 比特 AQLM 模型
├── lora_multi_gpu/
│   ├── single_node.sh: 使用 Accelerate 进行单节点训练
│   └── multi_node.sh: 使用 Accelerate 进行多节点训练
├── full_multi_gpu/
│   ├── single_node.sh: 使用 DeepSpeed 进行单节点训练
│   └── multi_node.sh: 使用 DeepSpeed 进行多节点训练
├── merge_lora/
│   ├── merge.sh: 将 LoRA 权重合并到预训练模型中
│   └── quantize.sh: 使用 AutoGPTQ 量化模型
├── inference/
│   ├── cli_demo.sh: 启动命令行推理接口
│   ├── api_demo.sh: 启动 OpenAI 风格 API
│   ├── web_demo.sh: 启动浏览器推理接口
│   └── evaluate.sh: 在 MMLU 数据集上评测模型
└── extras/├── galore/│   └── sft.sh: 使用 GaLore 训练模型├── loraplus/│   └── sft.sh: 使用 LoRA+ 训练模型├── llama_pro/│   ├── expand.sh: 扩展模型中的层│   └── sft.sh: 训练扩展后的模型└── fsdp_qlora/└── sft.sh: 使用 FSDP 微调量化模型

3)编程方式。

from llmtuner import run_exp
run_exp(dict(stage="sft",do_train=True,model_name_or_path="Qwen/Qwen1.5-0.5B-Chat",dataset="identity,alpaca_gpt4_en,alpaca_gpt4_zh",template="qwen",finetuning_type="lora",lora_target="all",output_dir="test_identity",per_device_train_batch_size=4,gradient_accumulation_steps=4,lr_scheduler_type="cosine",logging_steps=10,save_steps=100,learning_rate=1e-4,num_train_epochs=5.0,max_samples=500,max_grad_norm=1.0,fp16=True,
))

对于用户来讲,准备正确高质量的数据是用好该工具的关键。在使用自定义数据集时需要在 dataset_info.json 文件中按照以下格式提供数据集定义,数据集格式支持两种:alpaca 和 sharegpt,具体可参考其官方文档。

"数据集名称": {"hf_hub_url": "Hugging Face 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)","ms_hub_url": "ModelScope 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)","script_url": "包含数据加载脚本的本地文件夹名称(若指定,则忽略 file_name)","file_name": "该目录下数据集文件的名称(若上述参数未指定,则此项必需)","file_sha1": "数据集文件的 SHA-1 哈希值(可选,留空不影响训练)","subset": "数据集子集的名称(可选,默认:None)","folder": "Hugging Face 仓库的文件夹名称(可选,默认:None)","ranking": "是否为偏好数据集(可选,默认:False)","formatting": "数据集格式(可选,默认:alpaca,可以为 alpaca 或 sharegpt)","columns(可选)": {"prompt": "数据集代表提示词的表头名称(默认:instruction)","query": "数据集代表请求的表头名称(默认:input)","response": "数据集代表回答的表头名称(默认:output)","history": "数据集代表历史对话的表头名称(默认:None)","messages": "数据集代表消息列表的表头名称(默认:conversations)","system": "数据集代表系统提示的表头名称(默认:None)","tools": "数据集代表工具描述的表头名称(默认:None)"},"tags(可选,用于 sharegpt 格式)": {"role_tag": "消息中代表发送者身份的键名(默认:from)","content_tag": "消息中代表文本内容的键名(默认:value)","user_tag": "消息中代表用户的 role_tag(默认:human)","assistant_tag": "消息中代表助手的 role_tag(默认:gpt)","observation_tag": "消息中代表工具返回结果的 role_tag(默认:observation)","function_tag": "消息中代表工具调用的 role_tag(默认:function_call)","system_tag": "消息中代表系统提示的 role_tag(默认:system,会覆盖 system 列)"}
}

经过以上的步骤,剩下的就是需要耐心的调参和评估了。下面是一个利用webui进行微调操作示例。

小结

相较于其他方法,目前,LlamaFactory可以说是当下最简单快捷又功能强大的一种微调工具,值得大家学习使用。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了NLP&大模型算法岗技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流

用通俗易懂方式讲解系列

  • 《大模型面试宝典》(2024版) 正式发布!

  • 《大模型实战宝典》(2024版)正式发布!

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)

  • 用通俗易懂的方式讲解:1.6万字全面掌握 BERT

  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线

  • 用通俗易懂的方式讲解:28张图全解深度学习知识!

  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库

  • 用通俗易懂的方式讲解:实体关系抽取入门教程

  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer

  • 用通俗易懂的方式讲解:图解 Transformer 架构

  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)

  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期

  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览

  • 用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

  • 用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

  • 用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。

  • 用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。

  • 用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。

  • 用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统

  • 用通俗易懂的方式讲解:面试字节大模型算法岗(实习)

  • 用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结

  • 用通俗易懂的方式讲解:大模型微调方法汇总

这篇关于LLamaFactory:当下最容易上手的大模型微调工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

Python使用Turtle实现精确计时工具

《Python使用Turtle实现精确计时工具》这篇文章主要为大家详细介绍了Python如何使用Turtle实现精确计时工具,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录功能特点使用方法程序架构设计代码详解窗口和画笔创建时间和状态显示更新计时器控制逻辑计时器重置功能事件

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将