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

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 1. Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 2. Visual Studio 安装和管理 GitHub Copilot 3. Visual Studio 使用 GitHub Copilot 扩展 4. Visual Studio 使用 GitHub Copilot 聊天 5. Visual Studio 使用 GitHub Copilot 协助调试 6. Visual Studio 使用 IntelliCode AI 辅助代码开发 7. Visual Studio 玩转 IntelliCode AI辅助开发

AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!

AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!

个人主页-爱因斯晨 文章专栏-AIGC   长大好多烦恼,好愁! 目录   前言 初步了解 Mcp到底是个啥? 发展 理论基础 核心组件 使用逻辑 于传统API不同之处 模型推荐   前言 上年这个时候,刚拿到录取通知书。哥哥教我用ai智能体,其实就是向我炫技。当时我问他,为什么不能直接给我生成图表,直接给我生成多好,省得我再去复制了。他说,其实很简单,只要做个接口协议什么的就行,只是目前国内没人做。当时说的很高深,我也听不懂。没想到年底,这个功能就实现内测了。在某种程度上,我也算是预言了哈哈。 初步了解 Mcp到底是个啥? Mcp,全称 Model Context Protocol,翻译过来是模型上下文协议。你不用管这高大上的名字,简单说,它就是和大 AI 模型聊天时,一种把相关信息整理好、按规矩传给 AI 的方式。

OpenAI Codex vs GitHub Copilot:哪个更适合你的开发需求?2025年深度对比

OpenAI Codex 与 GitHub Copilot:2025年开发者如何做出关键选择? 在2025年的技术栈里,一个高效的AI编程伙伴不再是锦上添花,而是决定项目节奏与质量的核心生产力。面对市场上功能各异的选择,许多开发者,尤其是那些管理着复杂项目或带领团队的技术决策者,常常陷入一个两难的境地:是选择功能全面、能独立处理任务的“AI工程师”,还是选择无缝集成、提供实时灵感的“智能副驾驶”?这不仅仅是工具的选择,更是关于工作流重塑、团队协作模式乃至项目架构未来的战略决策。对于个人开发者、初创团队乃至大型企业的技术负责人而言,理解这两款主流工具——OpenAI Codex与GitHub Copilot——在本质定位、适用场景与成本效益上的深层差异,是避免资源错配、最大化技术投资回报的第一步。本文将深入它们的核心,帮助你根据真实的开发需求,找到那个最契合的“数字搭档”。 1. 核心理念与定位:从“辅助”到“执行”的范式差异 理解Codex和Copilot,首先要跳出“它们都是写代码的AI”这个笼统印象。它们的底层设计哲学决定了完全不同的应用边界。 OpenAI Codex

FLUX.2[klein]开源!小香蕉平替,本地部署AI绘画的极简方案

FLUX.2[klein]开源!小香蕉平替,本地部署AI绘画的极简方案

文章目录 * 前言 * 一、FLUX.2[klein]到底香在哪? * 二、部署前准备:硬件+环境一键搞定 * 1. 硬件要求(最低配置) * 2. 环境安装(3行命令搞定) * 三、极简部署方案:2种方式任选(新手首选方式1) * 方式1:Python脚本一键运行(纯代码,无界面,最快上手) * 步骤1:创建运行脚本 * 步骤2:运行脚本 * 方式2:ComfyUI可视化部署(适合喜欢拖拽操作的用户) * 步骤1:安装ComfyUI * 步骤2:下载FLUX.2[klein]模型 * 步骤3:启动ComfyUI并加载工作流 * 四、常见问题&优化技巧 * 1. 显存不足怎么办? * 2. 模型下载慢/