开源大模型与传统开源代码虽然都带有"开源"二字,但本质上存在很大差异。
开源大模型是指公开模型权重和架构的人工智能模型,比如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训练/微调
- 模型合并与量化
- 模型推理
- 模型评估
- 分布训练
- 模型部署和调用
二、安装
- 从源码安装,可能需要先安装CUDA(略)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip 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
针对不同的任务有不同的格式
- 指令监督微调
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" }}
- 预训练
大语言模型通过学习未被标记的文本进行预训练,从而学习语言的表征。通常,预训练数据集从互联网上获得,因为互联网上提供了大量的不同领域的文本信息,有助于提升模型的泛化能力。
data.json文件如下
[ {"text": "document"}, {"text": "document"}]
dataset_info.json 中的 数据集描述 应为:
"dataset_name": { "file_name": "data.json", "columns": { "prompt": "text" }}
-
偏好训练
偏好数据集用于奖励模型训练、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" }} -
KTO
KTO数据集与偏好数据集类似,但不同于给出一个更优的回答和一个更差的回答,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" }}
- 多模态
支持 多模态图像数据集、 视频数据集 以及 音频数据集 的输入。
图像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" }}
ShareGPT
针对不同任务,数据集格式要求如下:
- 指令监督微调
相比 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" }}
- 偏好训练
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" }}
- 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" }}
四、训练/微调
通过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_train | true用于训练, 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 |
五、合并与量化
1.合并
当我们基于预训练模型训练好 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/sfttemplate: llama3finetuning_type: lora### 导出配置-位置export_dir: models/llama3_lora_sft### 导出模型的大小export_size: 2export_device: cpuexport_legacy_format: false
2.量化
在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。
量化(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/sfttemplate: llama3finetuning_type: lora### 导出配置-位置export_dir: models/llama3_lora_sft### 导出模型的大小export_size: 2export_device: cpuexport_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 推理引擎以获得更快的推理速度。
1.完整模型推理
### examples/inference/llama3.yamlmodel_name_or_path: meta-llama/Meta-Llama-3-8B-Instructtemplate: llama3infer_backend: huggingface #choices: [huggingface, vllm]
2.微调模型推理
### examples/inference/llama3_lora_sft.yamlmodel_name_or_path: meta-llama/Meta-Llama-3-8B-Instructadapter_name_or_path: saves/llama3-8b/lora/sfttemplate: llama3finetuning_type: lorainfer_backend: huggingface #choices: [huggingface, vllm]
3.多模态模型推理
model_name_or_path: llava-hf/llava-1.5-7b-hftemplate: vicunainfer_backend: huggingface #choices: [huggingface, vllm]
4.批量推理
命令:
## 通过指定一个数据集,批量进行推理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
1.转化成GGUF
上面微调合成大模型格式是Huggingface提出的Safetensors格式,GGUF格式是llama.cpp定义发布的一种大模型文件格式,GGUF是一种二进制文件格式的规范,GGUF格式可以更快的被载入使用,消耗更低的资源。但是只能做推理,不能训练,生态相对封闭,胜在部署简单。
安装llama.cpp工具
git clone https://github.com/ggerganov/llama.cpp.gitpip 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
2.安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
3.启动Ollama
nohup ollama serve &
4.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.7PARAMETER top_p 0.8PARAMETER repeat_penalty 1.05TEMPLATE """{{ 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 messageSYSTEM """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
5.使用Open WebUI
# 安装pip install open-webui# 启动,访问http://localhost:8080open-webui serve
还可以暴露API接口,其他启动和使用方式看文档
那么,如何系统的去学习大模型LLM?
作为一名深耕行业的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~

👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。


👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。

👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。

👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。

👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

被折叠的 条评论
为什么被折叠?



