Llama-Factory 与 vLLM:训练与推理的分工艺术

在大模型落地浪潮中,一个常见的误解正在悄悄蔓延:有人把 Llama-Factory 当成部署工具,也有人试图用 vLLM 来做微调。这种混淆看似无伤大雅,实则可能让整个项目陷入资源错配、性能瓶颈甚至返工重来的困境。

问题的核心在于——我们没有搞清楚一件事:“练模型”和“跑模型”是两件完全不同的事

就像造车和开车不能混为一谈,训练一个模型和高效运行它,背后的技术路径、系统设计和优化目标截然不同。而 Llama-Factory 和 vLLM,正是分别站在了这条流水线的两端:一个专注“怎么练”,一个专攻“怎么跑”。


当你拿到一家医院的问诊记录,想让大模型学会专业术语和诊疗逻辑时,你会怎么做?从零训练一个新模型?显然不现实。更合理的做法是,在已有基座模型上注入领域知识——这正是 Llama-Factory 的主场。

它不是一个简单的脚本集合,而是一套完整的微调操作系统。你可以把它想象成一个自动化车间:数据进来后,自动清洗、对齐格式;选择 Qwen 或 LLaMA 这类主流架构后,框架会自动加载 tokenizer、配置训练参数;接着启动 LoRA 或 QLoRA 微调,只更新少量参数即可完成定制化适配。

关键是,这一切不需要写一行训练循环代码。它的 WebUI 界面允许你点选模型、调整 batch size、设置学习率,然后一键开始训练。底层基于 Hugging Face Transformers + PEFT + Accelerate 构建,支持多卡并行(DDP/FSDP),还能用 NF4 量化把 7B 模型塞进 RTX 3090 的 24GB 显存里跑起来。

比如下面这段代码:

from llmtuner import Trainer

training_args = {
    "model_name_or_path": "meta-llama/Llama-2-7b-hf",
    "data_path": "data/alpaca.json",
    "output_dir": "output/llama2-lora",
    "per_device_train_batch_size": 4,
    "gradient_accumulation_steps": 8,
    "learning_rate": 1e-4,
    "num_train_epochs": 3,
    "lora_r": 8,
    "lora_alpha": 16,
    "target_modules": ["q_proj", "v_proj"],
    "fp16": True,
}

trainer = Trainer(training_args)
trainer.train()

短短十几行,就完成了 LoRA 微调的全流程封装。lora_r 控制低秩矩阵维度,target_modules 指定要插入适配器的注意力层,fp16 开启混合精度节省显存——这些细节都暴露给用户的同时,又不必关心梯度同步、设备映射等底层实现。

这就是 Llama-Factory 的哲学:低代码但不失控制力。它降低的是工程复杂度,而不是技术深度。

可问题是,模型练好了之后呢?总不能让用户直接 ssh 到服务器上跑 generate() 吧。你需要把它变成服务,能承受上百人同时提问,响应还得快。

这时候就得换场了。把微调好的模型权重导出,交给 vLLM。

vLLM 不参与任何训练过程,它的使命只有一个:让推理又快又省

传统 Transformer 解码有个老大难问题——KV Cache。每个生成的 token 都要缓存其 key 和 value,而且必须连续存储在显存中。一旦请求长度不一或中途退出,就会留下大量碎片,导致显存利用率暴跌。

vLLM 的突破性贡献就是 PagedAttention——灵感来自操作系统的内存分页机制。它把 KV Cache 切成固定大小的“页面”,允许非连续存放。就像硬盘上的文件可以分散存储一样,显存利用率一下子提升了好几倍。

不仅如此,vLLM 还实现了持续批处理(Continuous Batching)。传统批处理得等所有请求完成才能释放资源,而 vLLM 可以动态合并新请求和正在解码的老请求,GPU 几乎 never idle。配合 CUDA 核心优化,吞吐量轻松达到原生 Hugging Face 实现的 2–4 倍。

来看个典型部署示例:

from vllm import LLM, SamplingParams

llm = LLM(model="your-finetuned-model", tensor_parallel_size=2)
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=200)

prompts = ["请解释什么是糖尿病?", "写一段健康饮食建议"]
outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.outputs[0].text)

几行代码,就能启动一个高性能推理服务。tensor_parallel_size=2 表示使用两张 GPU 做张量并行,SamplingParams 控制生成策略,generate() 内部自动调度批处理流程。更重要的是,它提供 OpenAI 兼容 API,前端几乎无需改造就能接入现有系统。

这意味着什么?意味着你在本地用 QLoRA 微调出一个医疗助手模型后,可以用极低成本部署成对外服务,支撑数千并发也不卡顿。


如果把整个大模型应用比作一条生产线,那它们的分工非常清晰:

+---------------------+
|     用户需求         |
| (定制领域模型)       |
+----------+----------+
           |
           v
+------------------------+
|  数据收集与标注        |
| (业务语料、问答对等)    |
+----------+-------------+
           |
           v
+----------------------------+
|   Llama-Factory 微调平台    |
| - 数据预处理                |
| - LoRA/QLoRA 微调训练       |
| - 模型评估与导出            |
+----------+-----------------+
           |
           v (导出模型权重)
+----------------------------+
|   vLLM 推理服务集群         |
| - 加载微调后模型            |
| - PagedAttention 加速       |
| - 提供 REST API 接口        |
+----------+------------------+
           |
           v
+---------------------------+
|   终端应用                |
| (APP、Web、Bot 等)         |
+---------------------------+

左边是“炼丹炉”,右边是“配送站”。Llama-Factory 负责把通用模型炼成行业专家,vLLM 负责把这个专家的声音快速传出去。

实际项目中,这种分离尤为重要。训练任务通常是间歇性的,耗时数小时甚至几天;而推理服务需要 7×24 小时稳定运行。把两者混在同一环境里,轻则资源争抢,重则因训练崩溃影响线上服务。

更进一步看,这种架构还带来了灵活性。你可以用消费级显卡(如 3090/4090)在本地完成 QLoRA 微调,再将轻量化的适配器权重上传到云端,由 vLLM 在 A100 集群上部署高并发服务。训练成本低,推理效率高,整体 TCO(总拥有成本)大幅下降。

反过来说,若误用工具,后果也很明显:

  • 想用 vLLM 做微调?不行,它压根没有反向传播模块。
  • 用 Llama-Factory 直接对外提供服务?理论上可行,但默认生成速度慢、并发能力弱,面对真实流量很容易雪崩。
  • 有人尝试在 vLLM 中集成训练功能?目前没有任何计划,团队明确表示聚焦推理优化。

这也提醒我们:工具的选择本质上是对问题域的理解。如果你还在纠结“哪个更好”,说明还没想清楚自己到底要解决什么问题。


最终,这场协作的价值体现在落地效率上。过去,一支小团队要花几个月搭建训练 pipeline、调试部署服务;现在,一个人两天就能完成从数据准备到上线 API 的全过程。

Llama-Factory 让“练模型”变得像搭积木一样简单,vLLM 让“跑模型”接近即插即用。它们不做对方的事,却共同打通了大模型落地的最后一公里。

未来的 AI 工程化,未必属于那些追求全栈自研的团队,反而更可能属于那些懂得借力、善用分工的人——知道什么时候该炼,什么时候该跑。

Logo

免费领 100 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐