尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PowerInfer smallthinker 微调实战:基于 llama-finetune 与 GGML 的本地 LLM 全参数微调指南

发布时间:2026/9/25 3:43:01

资讯中心
01
ARTICLE

PowerInfer smallthinker 微调实战:基于 llama-finetune 与 GGML 的本地 LLM 全参数微调指南

PowerInfer smallthinker 微调实战:基于 llama-finetune 与 GGML 的本地 LLM 全参数微调指南
人工智能大模型推理引擎本地部署【免费下载链接】PowerInferHigh-speed Large Language Model Serving for Local Deployment项目地址https://gitcode.com/gh_mirrors/po/PowerInfer点击查看免费下载导读本文围绕 smallthinker/examples/training/README.md 展开系统讲解 PowerInfer 仓库中 smallthinkerllama.cpp/GGML 体系内置的llama-finetune微调示例如何在本地环境用纯 C/GGML 对开源模型如 LLaMA 3.2 1B、Stories 260K执行全参数微调如何准备 Wikitext-2 数据集、运行训练、并借助 perplexity 指标验证微调效果。读完本文你将掌握该训练示例从源码构建、数据准备、命令执行到结果验证的完整链路并能从finetune.cpp源码理解微调工具的实现原理与约束条件。一、示例概览llama.cpp/GGML 的微调训练示例smallthinker/examples/training/目录是 smallthinker 中与语言模型训练直接相关的示例目录目前只包含三个文件README.md示例说明文档本文的原始依据finetune.cpp训练主程序构建产物为llama-finetune可执行文件CMakeLists.txt构建脚本定义llama-finetune目标并链接common、llama库。原文档对该示例给出了明确的能力定位技术可行性微调finetuning在技术层面已经可用但当前仅适用于FP32 模型以及受限的硬件配置整体代码仍处于 WIPWork In Progress状态已验证的硬件门槛Stories 260K 与 LLaMA 3.2 1B 两个模型在24 GB 内存的机器上可以完成微调两条强制性的使用前提CPU 训练编译 llama.cpp 时不要启用任何额外后端如 CUDACUDA 训练运行时使用最大数量的 GPU 层数。在 smallthinker/examples/CMakeLists.txt 中可以看到training子目录默认参与整体构建add_subdirectory(training)因此只要按常规方式构建 smallthinker 项目llama-finetune就会一并产出。二、环境准备与源码构建2.1 构建 llama-finetune 与 llama-perplexity训练示例通过 CMake 构建。llama-finetune目标的定义位于 smallthinker/examples/training/CMakeLists.txtset(TARGET llama-finetune) add_executable(${TARGET} finetune.cpp) install(TARGETS ${TARGET} RUNTIME) target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) target_compile_features(${TARGET} PRIVATE cxx_std_11)从该脚本可以看出llama-finetune由 finetune.cpp 编译而来依赖common参数解析与公共工具与llama核心推理/训练库两个目标。标准构建流程在仓库根目录执行cmake -B build -DCMAKE_BUILD_TYPERelease cmake --build build --config Release -j --target llama-finetune llama-perplexity构建完成后可执行文件位于build/bin/目录下与原文档 PoC 命令中的./build/bin/llama-finetune、./build/bin/llama-perplexity路径一致。2.2 CPU 与 CUDA 训练的环境取舍原文档给出了两条非常明确的训练环境规则二者互补训练后端编译/运行要求原因结合源码推断CPU编译时不要启用 CUDA 等额外后端CPU 路径对内存管理与张量执行路径更可控且微调需要可写的权重指针见 4.3 节 mmap 强制禁用逻辑CUDA运行时使用最大 GPU 层数即-ngl 999让模型权重尽量全部驻留 GPU减少 CPU/GPU 间权重同步开销保证反向传播可执行需要说明的是这些建议来自原文档对当前 WIP 代码状态的限定若你的编译配置不同应以实际构建输出为准。三、准备训练数据获取 Wikitext-2原文档的 PoC 命令直接使用了wikitext-2-raw/wiki.test.raw作为训练文件。该数据可通过仓库自带的脚本获取见 smallthinker/scripts/get-wikitext-2.shwget https://huggingface.co/datasets/ggml-org/ci/resolve/main/wikitext-2-raw-v1.zip unzip wikitext-2-raw-v1.zip解压后会得到wikitext-2-raw/目录其中包含wiki.test.raw、wiki.train.raw、wiki.valid.raw等原始文本文件。原文档使用wiki.test.raw测试集直接作为微调语料并据此说明一个有趣的现象在测试集上训练 2 个 epoch 后模型在同一个测试集上的 perplexity 会下降——这本质上是让模型对测试语料产生了过拟合属于功能验证性质的实验设计而不是常规的训练集/测试集分离做法读者应理解其中的用意。四、运行微调PoC 命令逐参数解析原文档给出的完整 PoCProof of Concept命令如下export model_namellama_3.2-1b export quantizationf32 ./build/bin/llama-finetune --file wikitext-2-raw/wiki.test.raw -ngl 999 --model models/${model_name}-${quantization}.gguf -c 512 -b 512 -ub 512其中各参数含义如下参数含义在本示例中的取值/建议--file wikitext-2-raw/wiki.test.raw训练语料文件路径Wikitext-2 测试集原文--model models/llama_3.2-1b-f32.gguf待微调的 GGUF 模型路径LLaMA 3.2 1B 的F32版本quantizationf32-ngl 999GPU 层数999 表示尽可能把所有层放到 GPU满足CUDA 训练使用最大 GPU 层数的规则-c 512上下文长度n_ctx512 token-b 512batch size512-ub 512micro-batchubatch大小512命令执行完毕后训练脚本会把微调后的模型保存为finetuned-model.gguf保存逻辑见 finetune.cpp 中的llama_model_save_to_file(model.get(), finetuned-model.gguf)保存在当前工作目录。4.1 微调结果验证perplexity 对比原文档随后给出了验证命令./build/bin/llama-perplexity --file wikitext-2-raw/wiki.test.raw -ngl 999 --model finetuned-model.gguf该命令使用llama-perplexity工具在相同语料wiki.test.raw上计算微调后模型的困惑度perplexity。原文档明确指出微调后的模型在测试集上训练 2 个 epoch 后perplexity 值应当低于微调前的模型——这是判断微调是否生效最直观的量化证据。建议先对原始模型如models/llama_3.2-1b-f32.gguf跑一次 perplexity 作为基线再与finetuned-model.gguf的结果对比。五、源码级原理剖析finetune.cpp 是如何工作的原文档描述了能做什么而 finetune.cpp 则揭示了怎么做。整个训练主程序只有约 96 行逻辑非常清晰按顺序包含以下几个关键环节。5.1 启动前强制修正mmap 与 KV Cache 类型训练主程序在加载模型之前会强制修正三个参数finetune.cppif (params.use_mmap) { LOG_INF(%s: force disabling memory mapping because it would result in-read-only pointers to the weights\n, __func__); params.use_mmap false; } if (params.cache_type_k ! GGML_TYPE_F32) { LOG_INF(%s: force changing k cache type to f32 due to a lack of f16 support for OUT_PROD\n, __func__); params.cache_type_k GGML_TYPE_F32; } if (params.cache_type_v ! GGML_TYPE_F32) { LOG_INF(%s: force changing v cache type to f32 due to a lack of f16 support for OUT_PROD\n, __func__); params.cache_type_v GGML_TYPE_F32; }这三处强制修正对应三类硬约束禁用 mmap微调需要可写的权重指针优化器要原地更新权重而 mmap 只会产生只读指针因此必须强制use_mmap falseK/V Cache 强制 F32训练阶段用到的OUT_PROD算子缺乏 F16 支持因此 K、V cache 类型都会被强制改为GGML_TYPE_F32。这也解释了为什么原文档限定目前仅对 FP32 模型可用——当前训练代码路径对精度与算子支持有上述硬性要求低比特量化模型与 F16 cache 尚不在支持范围内。5.2 数据集构建滑窗切分与标签对齐finetune.cpp使用common_tokenize把训练文本 token 化然后调用 common_opt_dataset_init 构建训练数据集std::vectorllama_token tokens common_tokenize(ctx.get(), params.prompt, true); ggml_opt_dataset_t dataset common_opt_dataset_init(ctx.get(), tokens, llama_n_ctx(ctx.get())/2);在 common.cpp 的实现中可以看到每个数据点datapoint的长度等于当前 context 长度ne_datapoint llama_n_ctx(ctx)数据点数量按滑窗步长计算ndata (tokens.size() - ne_datapoint - 1) / stride每个数据点内部输入序列与标签序列错位一个 token输入从idata*stride开始标签从idata*stride 1开始即标准的 next-token 预测自监督目标这正是语言模型微调的本质——让模型学会预测下一个 token。common_opt_dataset_init在 common.h 中声明属于common库提供给训练示例的公共能力。5.3 优化器配置AdamW 与学习率训练使用 AdamW 优化器学习率被固定为很小的值finetune.cppstruct ggml_opt_optimizer_params optimizer_params ggml_opt_get_default_optimizer_params(nullptr); optimizer_params.adamw.alpha 1e-7f; // learning rate struct llama_opt_params lopt_params { /*n_ctx_train */ 0, /*param_filter */ llama_opt_param_filter_all, /*param_filter_ud */ nullptr, /*get_opt_pars */ ggml_opt_get_constant_optimizer_params, /*get_opt_pars_ud */ optimizer_params, }; llama_opt_init(ctx.get(), model.get(), lopt_params);这里的关键结构llama_opt_params定义在 smallthinker/include/llama.hn_ctx_train训练后假定的上下文长度传0表示使用llama_context中指定的上下文长度param_filter判断哪些张量包含可训练参数的过滤回调llama_opt_param_filter_allllama.h 中声明表示对所有张量一律返回true即全参数微调Full Fine-Tuning不冻结任何层get_opt_pars计算优化器参数的回调这里使用常量优化器参数恒定的 AdamW 配置。5.4 训练循环epoch、验证集划分与回调训练主体是两层循环finetune.cppconstexpr float val_split 0.05f; ... const int64_t idata_split ggml_opt_dataset_ndata(dataset) * (1.0f - val_split); ... for (int epoch 0; epoch 2; epoch) { llama_opt_epoch(ctx.get(), dataset, result_train, result_eval, idata_split, ggml_opt_epoch_callback_progress_bar, ggml_opt_epoch_callback_progress_bar); ... }val_split 0.05f从数据集中划出5%作为验证集其余 95% 用于训练epoch 2默认训练2 个 epoch与原文档在测试集上训练 2 个 epoch完全对应llama_opt_epochAPI 定义见 llama.h接收result_train/result_eval两个结果对象分别记录训练与验证指标并通过进度条回调实时输出训练进度。5.5 模型保存训练完成后微调得到的权重通过以下调用落盘finetune.cppllama_model_save_to_file(model.get(), finetuned-model.gguf);llama_model_save_to_file在 llama.h 中声明输出文件固定为当前目录下的finetuned-model.gguf可直接供llama-perplexity、llama-cli等下游工具加载使用。六、训练工作流总结与限制说明将原文档的实操与源码实现合并一次完整的微调工作流为构建以 Release 模式构建llama-finetune与llama-perplexityCPU 训练时不启用 CUDA 等后端取数运行 get-wikitext-2.sh 获取并解压 Wikitext-2 语料微调执行llama-finetune传入--file、--model、-ngl、-c、-b、-ub参数LLaMA 3.2 1B F32 24 GB 内存是已验证的组合验证用llama-perplexity在相同语料上对比微调前后模型的 perplexity训练 2 个 epoch 后应显著下降。同时需要明确当前实现的主要限制均来自原文档与源码代码仍处于 WIP 状态不属于生产级训练管线仅支持FP32 模型且强制 F32 的 K/V Cache因OUT_PROD缺乏 F16 支持必须禁用 mmap权重需要可写指针参数量较大的模型需要大内存文档验证的模型规模为 Stories 260K 与 LLaMA 3.2 1B内存 24 GB采用全参数微调llama_opt_param_filter_all暂不提供 LoRA 等轻量微调策略的开关。理解这些约束你就可以在当前仓库内基于 finetune.cpp 按需调整数据集、上下文长度、batch 大小与 epoch 数把该示例扩展到自己的语料与模型上。赞分享人工智能大模型推理引擎本地部署【免费下载链接】PowerInferHigh-speed Large Language Model Serving for Local Deployment项目地址https://gitcode.com/gh_mirrors/po/PowerInfer点击查看免费下载相关推荐MiniCPM-SALA 微调实战基于 Transformers Trainer / DeepSpeed / Accelerate 与 LLaMA-Factory 的全参数与 LoRA 微调指南MiniCPM SALA 微调实战基于 Transformers Trainer / DeepSpeed / Accelerate 与 LLaMA Facto大模型本地部署模型量化微调LoRA工具调用openBMBAscendllama.cpp 模型微调入门llama-finetune 与 GGML 优化器驱动的 LLM 训练实践llama.cpp 模型微调入门llama finetune 与 GGML 优化器驱动的 LLM 训练实践 在 llama.cpp 生态中 examples人工智能大模型模型推理服务推理引擎本地部署后端MiniCPM 微调实战指南基于 finetune 目录的全量微调、LoRA 与 QLoRA 完整流程MiniCPM 微调实战指南基于 finetune 目录的全量微调、LoRA 与 QLoRA 完整流程 导读 本文以 MiniCPM 仓库 finetune/人工智能大模型基础模型本地部署微调模型量化openBMB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。