一、环境
之前介绍过本地部署 LLaMaFactory 微调平台的方法,如果你还在为设备问题而烦恼,可以尝试使用云端免费 GPU 资源。
首先注册魔搭社区,绑定个人阿里云账号即可,详情见:https://www.modelscope.cn/my/mynotebook;然后就可免费获得 36 小时 GPU 环境。
配置参数如下:
- CPU:8 核,主要负责数据的调度和预处理
- 内存:32GB,数据从硬盘加载后会暂时存放这里
- 显存:24G
- 操作系统:Ubuntu 22.04
- CUDA:12.8.1,英伟达的并行计算平台,支持最新的 RTX 40 系列或 H 系列显卡
- Python:3.11
- PyTorch:2.9.1,目前最主流的深度学习框架
- ModelScope:1.35.0(预装版本)

安装 LLaMaFactory
执行 git 克隆 llama-factory 项目,运行 pip install -e .。若出现依赖冲突提示,为避免 pip 导致权限混乱,推荐使用虚拟环境(venv)。
创建虚拟环境
python -m venv llmVenv
source llmVenv/bin/activate
deprecate
在虚拟环境中执行升级:pip install --upgrade pip
后续执行 pip install -e . 和 pip install -r requirements/metrics.txt。运行 llamafactory-cli webui 可以启动,并在控制台点击 http://127.0.0.1:7860/ 完成浏览器访问。
二、模型选择
2.1. 模型分类和区别
此处选中一个模型 Qwen3-4B-Base,跳出告警提示。这是因为 Base 表示基座模型,而不是经过指令微调 Instruct 的模型。
两者区别在于:
- Base:基座模型,只完成了预训练,擅长续写文本,不擅长直接理解并回答人类的问题或指令。
- Instruct:指令模型,在基座模型的基础上,使用大量用户指令和期望回答的数据进行微调,能够正确理解并遵循人类指令。

后续选择 Qwen3.5-2B-Base,此时模型名称同样带 Base,却没有弹出告警提示。Qwen3.5 是后训练模型,已经经历了至少一轮指令微调或强化学习(RL),具备对话能力。RL 训练的模型其指令遵循能力通常优于单纯的监督微调(SFT)模型。

2.2. 加载模型对话
点击 Chat 进行加载模型对话,可以看到其中的如下参数:
2.2.1. 推理引擎
- Hugging Face:transformers 库,是 LLM 领域最通用的原生推理框架。开箱即用,配置灵活,适合调试、开发、原型验证。默认使用 PyTorch 动态图,速度相对较慢,显存占用较高。
- vLLM:高性能和服务框架,专为高吞吐、低延迟设计。支持连续批处理,自动合并请求,提高吞吐。适合生产环境部署、高并发 API 服务、需要最大化吞吐量的离线推理。
- SGLang:较新的推理框架,专注于结构化生成和复杂推理任务。吞吐量接近 vLLM,适合需要复杂生成逻辑,对推理过程有精细控制要求的场景。
2.2.2. 推理数据类型
控制模型加载和推理时使用的数值精度。
- auto:自动选择,框架会根据模型配置和硬件能力自动决定最优精度。如果支持 bfloat16,通常会优先使用,否则回退到 float16 或 32。
- float32:最精确,显存占用最大,速度最慢,通常不推荐用于推理。
- float16:显存较 fp32 减半,速度更快,精度损失小。大多数 GPU 支持。
- bfloat16:与 fp16 同显存占用,但动态范围更大,训练和推理更稳定。
2.2.3. 额外参数
{"vllm_enforce_eager": true},vLLM 专用参数,在 vLLM 中会强制使用 eager 模式(不使用 CUDA 图优化),通常用于调试或避免某些显存问题;此处当前推理引擎是 huggingface,理论上这个参数不会生效,但是我这里默认自带,还是手动删除(即仅保留 {},否则会出现 Json 格式错误);

点击加载模型后,可以看到控制台会自动下载对应的模型。

当然也可以手动下载魔搭社区的模型,默认存储路径也是一样的,访问:https://modelscope.cn/models,此处以 Qwen3.5-2B 举例:modelscope download --model Qwen/Qwen3.5-2B(详情见:https://www.modelscope.cn/models/Qwen/Qwen3.5-2B)
这里等待模型加载成功后,就可以正常聊天了。

三、数据集
魔搭社区中提供大量数据集,我们学习过程中可以下载使用,详情见:https://www.modelscope.cn/datasets
3.1. 获取源数据
此处随便举个例子,随手拿了个蚂蚁金融语义相似度数据集,详情见:https://www.modelscope.cn/datasets/modelscope/afqmc

在数据集文件中下载 train.csv,下载完成后,我可能可以得到如下数据,可以看出此数据集是用于评估问题间的语义相似性。
sentence1 = 句子 1, sentence2 = 句子 2, label = 0 表示两者语义不同、1 表示语义相同

3.2. 编写转换脚本
我们通过脚本将 csv 转换成 LLaMaFactory 需要的 json 格式,脚本如下,不熟练的小伙伴可借助 AI 工具。

3.3. 生成数据集
在 py 脚本目录下执行 python csv2Json.py 可以得到目标文件 json 如下:

将生成的 ant_finance_same.json 移动至 LLaMA-Factory 项目中的 data 文件夹中,再修改 dataset_info.json 加入刚才生成的 json,其余保持不动;
dataset_info.json 是 LLaMaFactory 中用于注册和管理数据集的配置文件。主要作用是配置数据集文件路径。

四、训练
4.1. 加载并预览数据集
现在,我们就可以在数据集中选中刚才配置的数据,点击预览数据集后可以看到示例;

4.2. 执行微调
点击开始微调模型,大约一两分钟后可以看到下方控制台输出日志,然后就是耐心的等待(GPU 环境超过 1 小时无操作将触发自动关闭功能,要记得点下控制台);

上图可知,此次训练需要大约 10.5 小时,但是单次实例连接时间最长是 8 小时,尽管可以中途中断,后续再继续,但是我执行 1 个小时后,环境直接卡死,什么都动不了。

本次演示我还是希望能够走完一遍流程,于是将数据集做了份删减版。mini 版数据集仅 1000 条数据,训练需要不到 20 分钟;



上图中右边的趋势图表示训练过程中损失值 Loss 随训练步数 Step 变化的曲线,用于监控模型的学习情况。
original 原始曲线:每个记录点实际计算出的损失值,由于单批次数据存在随机性,曲线往往会有很多噪声毛刺;
smoothed 平滑曲线:对原始损失进行移动平均或指数平滑后的曲线,能更加清晰地反映损失的整体变化趋势,滤除短期波动;
4.3. 导出微调结果
等到训练完毕,我们可以在检查点路径找到刚才微调后的模型;

导出完成后,我们可以看到路径下对应的文件;

我们尝试加载微调后的模型,进行对话。

五、转换 GGUF
为了能够让 ollama 或 llama.cpp 直接使用,需要将 Hugging Face 格式模型转换成 GGUF 格式的文件。
5.1. 创建环境
为避免冲突,建议创建一个独立的 Python 环境:
python -m venv cppVenv
source cppVenv/bin/activate
克隆 llama.cpp,该工具可转换 GGUF:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
pip install -r requirements.txt
5.2. 执行转换
python convert_hf_to_gguf.py /mnt/workspace/models/Qwen3.5-2B-output --outfile /mnt/workspace/gguf/Qwen3.5-2B-output.gguf --outtype q8_0
Qwen3.5-2B-output 为 model.safetensors 文件所在路径;
--outtype q8_0 表示量化类型,默认输出 f16 格式;
执行过程中会出现异常:
File "/mnt/workspace/git_src/llama.cpp/cppVenv/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py", line 1153, in from_pretrained raise ValueError( ValueError: Tokenizer class TokenizersBackend does not exist or is not currently imported.
原因是在合并模型时,无法正确加载模型的 tokenizer 导致的,通常是因为模型文件夹中的 tokenizer_config.json 配置缺少必要的 tokenizer 文件。
- 检查当前 tokenizer_config.json 内容:
cat /mnt/workspace/models/Qwen3.5-2B-output/tokenizer_config.json | grep tokenizer_class

- Qwen3.5-2B 模型对应的 tokenizer 类是 Qwen2Tokenizer,使用 sed 直接替换:
sed -i 's/"tokenizer_class": "TokenizersBackend"/"tokenizer_class": "Qwen2Tokenizer"/g' /mnt/workspace/models/Qwen3.5-2B-output/tokenizer_config.json
替换后再执行转换命令即可,最后可以得到 GGUF 文件。


