LLaMa-Factory微调开源大模型

开源大模型微调和部署

开源大模型与传统开源代码虽然都带有"开源"二字,但本质上存在很大差异。

什么是开源大模型?

开源大模型是指公开模型权重和架构的人工智能模型,比如LLaMA、Qwen、DeepSeek等。这些模型通常有数十亿甚至上千亿参数,能够处理自然语言、图像等多模态任务。

开放内容是否通常公开
模型权重✅ 公开
模型架构✅ 公开
推理代码✅ 公开
训练代码❌ 很少公开
训练数据❌ 几乎不公开
训练过程❌ 不公开

开源大模型更像是"免费使用的黑盒",而传统开源软件是"完全透明的白盒"。开源大模型的"开源"更多是一种商业策略,让模型获得更广泛的使用和生态支持,但本质上与传统的开源精神——透明、协作、可重现——有很大差距。

下面看看怎么对开源大模型进行微调,本文主要介绍LLaMA Factory这个工具

LLaMA Factory官方文档:https://llamafactory.readthedocs.io/zh-cn/latest/

LLaMA Factory项目地址:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。致力于简化大型的定制过程。它集成了多种训练策略和监控工具,提供了命令行和 WebUI 等多种交互方式,大幅降了模型微调的技术门槛。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调,框架特性包括:

  • 模型种类:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
  • 训练算法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
  • 运算精度:16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微调。
  • 优化算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
  • 加速算子:FlashAttention-2 和 Unsloth。
  • 推理引擎:Transformers 和 vLLM。
  • 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow、SwanLab 等等。

使用LLaMa Factory目标:

  • 安装
  • 数据集准备
  • 基于Lora训练/微调
  • 模型合并与量化
  • 模型推理
  • 模型评估
  • 分布训练
  • 模型部署和调用

安装

git clone --depth1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install-e".[torch,metrics]" --no-build-isolation 
  • docker安装,镜像中已经有了环境了
docker run -it--rm--gpus=all --ipc=host hiyouga/llamafactory:latest 

数据集准备

文档:https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md

dataset_info.json 包含了所有经过预处理的 本地数据集 以及 在线数据集。如果您希望使用自定义数据集,请 务必 在 dataset_info.json 文件中添加对数据集及其内容的定义。

支持 Alpaca 格式和 ShareGPT 格式的数据集。

Alpaca

针对不同的任务有不同的格式

多模态支持 多模态图像数据集、 视频数据集 以及 音频数据集 的输入。图像data.json文件如下:(视频videos、音频audios)

[{"instruction":"人类指令(必填)","input":"人类输入(选填)","output":"模型回答(必填)","images":["图像路径(必填)"]}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","columns":{"prompt":"instruction","query":"input","response":"output","images":"images"}}

KTOKTO数据集与偏好数据集类似,但不同于给出一个更优的回答和一个更差的回答,KTO数据集对每一轮问答只给出一个 true/false 的 label。除了 instruction 以及 input 组成的人类最终输入和模型回答 output ,KTO 数据集还需要额外添加一个 kto_tag 列(true/false)来表示人类的反馈。data.json文件如下:

[{"instruction":"人类指令(必填)","input":"人类输入(选填)","output":"模型回答(必填)","kto_tag":"人类反馈 [true/false](必填)"}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","columns":{"prompt":"instruction","query":"input","response":"output","kto_tag":"kto_tag"}}

偏好训练偏好数据集用于奖励模型训练、DPO 训练和 ORPO 训练。对于系统指令和人类输入,偏好数据集给出了一个更优的回答和一个更差的回答。一些研究 表明通过让模型学习“什么更好”可以使得模型更加迎合人类的需求。甚至可以使得参数相对较少的模型的表现优于参数更多的模型。data.json文件如下:

[{"instruction":"人类指令(必填)","input":"人类输入(选填)","chosen":"优质回答(必填)","rejected":"劣质回答(必填)"}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","ranking":true,"columns":{"prompt":"instruction","query":"input","chosen":"chosen","rejected":"rejected"}}

预训练大语言模型通过学习未被标记的文本进行预训练,从而学习语言的表征。通常,预训练数据集从互联网上获得,因为互联网上提供了大量的不同领域的文本信息,有助于提升模型的泛化能力。data.json文件如下

[{"text":"document"},{"text":"document"}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","columns":{"prompt":"text"}}

指令监督微调instruction 列对应的内容为人类指令, input 列对应的内容为人类输入, output 列对应的内容为模型回答。下面是一个例子, instruction + input是人类最终输入,output是模型回答data.json文件如下

{"instruction":"计算这些物品的总费用。 ","input":"输入:汽车 - $3000,衣服 - $100,书 - $20。","output":"汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"},

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","columns":{"prompt":"instruction","query":"input","response":"output","system":"system","history":"history"}}

ShareGPT

针对不同任务,数据集格式要求如下:

OpenAI格式OpenAI 格式仅仅是 sharegpt 格式的一种特殊情况,其中第一条消息可能是系统提示词。data.json:

[{"messages":[{"role":"system","content":"系统提示词(选填)"},{"role":"user","content":"人类指令"},{"role":"assistant","content":"模型回答"}]}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","formatting":"sharegpt","columns":{"messages":"messages"},"tags":{"role_tag":"role","content_tag":"content","user_tag":"user","assistant_tag":"assistant","system_tag":"system"}}

偏好训练Sharegpt 格式的偏好数据集同样需要在 chosen 列中提供更优的消息,并在 rejected 列中提供更差的消息。下面是一个例子:data.json:

[{"conversations":[{"from":"human","value":"人类指令"},{"from":"gpt","value":"模型回答"},{"from":"human","value":"人类指令"}],"chosen":{"from":"gpt","value":"优质回答"},"rejected":{"from":"gpt","value":"劣质回答"}}]

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","formatting":"sharegpt","ranking":true,"columns":{"messages":"conversations","chosen":"chosen","rejected":"rejected"}}

指令监督微调相比 alpaca 格式的数据集, sharegpt 格式支持 更多 的角色种类,例如 human、gpt、observation、function 等等。它们构成一个对象列表呈现在 conversations 列中。下面是 sharegpt 格式的一个例子:注意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。data.json:

{"conversations":[{"from":"human","value":"你好,我出生于1990年5月15日。你能告诉我我今天几岁了吗?"},{"from":"function_call","value":"{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}"},{"from":"observation","value":"{\"age\": 31}"},{"from":"gpt","value":"根据我的计算,你今天31岁了。"}],"tools":"[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\", \"description\": \"出生日期以YYYY-MM-DD格式表示\"}}, \"required\": [\"birthdate\"]}}]"}

dataset_info.json 中的 数据集描述 应为:

"dataset_name":{"file_name":"data.json","formatting":"sharegpt","columns":{"messages":"conversations","system":"system","tools":"tools"}}

训练/微调

通过WebUI(llamafactory-cli webui)或者 命令行(llamafactory-cli train xx.yaml

参数:

名称描述
model_name_or_path模型名称或路径
stage训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO
do_traintrue用于训练, false用于评估
finetuning_type微调方式。可选: freeze, lora, full
lora_target采取LoRA方法的目标模块,默认值为 all
dataset使用的数据集,使用”,”分隔多个数据集
template数据集模板,请保证数据集模板与模型相对应。
output_dir输出路径
logging_steps日志输出步数间隔
save_steps模型断点保存间隔
overwrite_output_dir是否允许覆盖输出目录
per_device_train_batch_size每个设备上训练的批次大小
gradient_accumulation_steps梯度积累步数
max_grad_norm梯度裁剪阈值
learning_rate学习率
lr_scheduler_type学习率曲线,可选 linear, cosine, polynomial, constant 等。
num_train_epochs训练周期数
bf16是否使用 bf16 格式
warmup_ratio学习率预热比例
warmup_steps学习率预热步数
push_to_hub是否推送模型到 Huggingface

合并与量化

合并

当我们基于预训练模型训练好 LoRA 适配器后,我们不希望在每次推理的时候分别加载预训练模型和 LoRA 适配器,因此我们需要将预训练模型和 LoRA 适配器合并导出成一个模型,并根据需要选择是否量化。根据是否量化以及量化算法的不同,导出的配置文件也有所区别。

通过命令llamafactory-cli export merge_config.yaml

配置文件示例

# 基座模型路径model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct # 训练后的LoRA适配器adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora ### 导出配置-位置export_dir: models/llama3_lora_sft ### 导出模型的大小export_size:2export_device: cpu export_legacy_format:false

量化

在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。

量化(Quantization)通过数据精度压缩有效地减少了显存使用并加速推理。LLaMA-Factory 支持多种量化方法,包括:AQLM、AWQ、GPTQ、QLoRA …

QLoRA 是一种在 4-bit 量化模型基础上使用 LoRA 方法进行训练的技术。它在极大地保持了模型性能的同时大幅减少了显存占用和推理时间。

# 基座模型路径model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct # 训练后的LoRA适配器adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora ### 导出配置-位置export_dir: models/llama3_lora_sft ### 导出模型的大小export_size:2export_device: cpu export_legacy_format:false

推理

可以使用 llamafactory-cli chat inference_config.yaml 或 llamafactory-cli webchat inference_config.yaml 进行推理与模型对话。对话时配置文件只需指定原始模型 model_name_or_path 和 template ,并根据是否是微调模型指定 adapter_name_or_path 和 finetuning_type。

如果您希望向模型输入大量数据集并保存推理结果,您可以启动 vllm 推理引擎对大量数据集进行快速的批量推理。您也可以通过 部署 api 服务的形式通过 api 调用来进行批量推理。

默认情况下,模型推理将使用 Huggingface 引擎。 您也可以指定 infer_backend: vllm 以使用 vllm 推理引擎以获得更快的推理速度。

完整模型推理

### examples/inference/llama3.yamlmodel_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3 infer_backend: huggingface #choices: [huggingface, vllm]

微调模型推理

### examples/inference/llama3_lora_sft.yamlmodel_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora infer_backend: huggingface #choices: [huggingface, vllm]

多模态模型推理

model_name_or_path: llava-hf/llava-1.5-7b-hf template: vicuna infer_backend: huggingface #choices: [huggingface, vllm]

批量推理

命令:

## 通过指定一个数据集,批量进行推理 python scripts/vllm_infer.py --model_name_or_path path_to_merged_model --dataset alpaca_en_demo 

评估

https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/eval.html

分布训练

https://llamafactory.readthedocs.io/zh-cn/latest/advanced/distributed.html

部署和调用

市面上很多开源工具,比较简单的可以使用ollama + open WebUI

https://github.com/ollama/ollama

https://github.com/open-webui/open-webui

转化成GGUF

安装llama.cpp工具

git clone https://github.com/ggerganov/llama.cpp.git pip install-r llama.cpp/requirements.txt 

执行转换

# 如果不量化,保留模型的效果 python llama.cpp/convert_hf_to_gguf.py /mnt/workspace/.cache/modelscope/models/LLM-Research/Meta-Llama-3-8B-Instruct --outtype f16 --verbose--outfile Meta-Llama-3-8B-Instruct_f16.gguf # 如果需要量化(加速并有损效果),直接执行下面脚本就可以 python llama.cpp/convert_hf_to_gguf.py /mnt/workspace/.cache/modelscope/models/LLM-Research/Meta-Llama-3-8B-Instruct --outtype q8_0 --verbose--outfile Meta-Llama-3-8B-Instruct_q8_0.gguf 

安装ollama

curl -fsSL https://ollama.com/install.sh | sh

启动ollama

nohup ollama serve &

ollama中创建模型并运行

创建ModelFile

FROM ./Meta-Llama-3-8B-Instruct_q8_0.gguf # set the temperature to 0.7 [higher is more creative, lower is more coherent] PARAMETER temperature 0.7 PARAMETER top_p 0.8 PARAMETER repeat_penalty 1.05 TEMPLATE """{{if .System }}<|im_start|>system {{ .System }}<|im_end|>{{ end }}{{if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|>{{ end }}<|im_start|>assistant {{ .Response }}<|im_end|>""" # set the system message SYSTEM """ You are a helpful assistant. """ 

运行命令创建模型ollama create Meta-Llama-3-8B-Instruct_q8_0 --file ./ModelFile

运行模型ollama run Meta-Llama-3-8B-Instruct_q8_0

使用Open WebUI

# 安装 pip install open-webui # 启动 open-webui serve 

Read more

OpenClaw 完整安装与配置文档(包含Minimax/deepseek模型接入、飞书机器人接入)

OpenClaw 完整安装与配置文档 文档说明:本文档适用于 Linux 系统(Debian/Ubuntu 系列),详细梳理 OpenClaw 从基础环境准备、核心程序安装,到模型配置(Minimax/DeepSeek)、飞书渠道对接的全流程,所有交互式配置选项完整呈现,步骤可直接复制执行,适配新手操作。 适用场景:OpenClaw 新手部署、企业内部飞书机器人对接、Minimax/DeepSeek 模型配置 前置说明: 1. 服务器需联网,确保能访问 GitHub、npm、飞书官网; 2. 操作全程使用终端命令行,建议使用远程工具(如 Xshell、Putty)连接服务器; 3. 复制命令时需完整复制,避免遗漏特殊符号; 4. 所有交互式配置选项均完整列出,按文档指引选择即可。 5. 拥有root用户/sudo权限。

Trae x 图片素描MCP一键将普通图片转换为多风格素描效果

Trae x 图片素描MCP一键将普通图片转换为多风格素描效果

目录 * 前言 * 一、核心工具与优势解析 * 二、操作步骤:从安装到生成素描效果 * 第一步:获取MCP配置代码 * 第二步:下载 * 第三步:在 Trae 中导入 MCP 配置并建立连接 * 第四步:核心功能调用 * 三、三大素描风格差异化应用 * 四.总结 前言 在设计创作、社交媒体分享、教育演示等场景中,素描风格的图片往往能以简洁的线条突出主体特征,带来独特的艺术质感。然而,传统素描效果制作需借助专业设计软件(如Photoshop、Procreate),不仅操作复杂,还需掌握一定的绘画技巧,难以满足普通用户快速生成素描的需求。 为解决这一痛点,本文将介绍蓝耘MCP广场提供的图片素描MCP工具(工具ID:3423)。该工具基于MCP(Model Context Protocol)协议开发,支持单张/批量图片转换、3种素描风格切换及自定义参数调节,兼容多种图片格式与中文路径,无需专业设计能力,

介绍终身机器人学习的数据集LIBERO

介绍终身机器人学习的数据集LIBERO

1 LIBERO的作用 LIBERO是一个用于研究多任务和终身机器人学习中知识迁移的综合基准测试平台,LIBERO是基于robosuite框架构建的。它专注于机器人操作任务,这些任务需要两类知识: 1. 陈述性知识:关于物体和空间关系的知识 2. 程序性知识:关于运动和行为的知识 2 核心原理 任务生成与基准设计 LIBERO提供了一个程序化生成管道,原则上可以生成无限数量的操作任务。系统包含130个任务,分为四个任务套件,每个套件都有受控的分布偏移: * LIBERO-Spatial/Object/Goal:专注于特定类型知识的迁移 * LIBERO-100:包含需要迁移纠缠知识的100个操作任务 学习框架 系统采用模仿学习作为主要学习方法,因为任务使用稀疏奖励函数(任务完成时获得+1奖励)。LIBERO提供高质量的人类遥操作演示数据集用于训练。 算法与策略架构 LIBERO实现了三种视觉运动策略网络: * bc_rnn_policy:基于RNN的行为克隆策略 * bc_transformer_policy:基于Transformer的行为克隆策略

OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,