GPT4All 训练体系深度解析:从 GPT4All-J 到 LLaMa 基座模型的数据蒸馏与微调实战
GPT4All 训练体系深度解析从 GPT4All-J 到 LLaMa 基座模型的数据蒸馏与微调实战【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all本文以 GPT4All 训练文档 为核心系统梳理 GPT4All 项目从 GPT-3.5-Turbo 蒸馏训练数据、LoRA 微调 LLaMa 7B 到 GPT4All-JGPT-J 基座的完整训练流水线覆盖环境搭建、DeepSpeed 分布式训练命令、YAML 配置参数、数据分词逻辑与模型生成脚本帮助读者理解该开源助手级对话模型的全部可复现细节。GPT4All 的核心理念是通过 GPT-3.5-Turbo 大规模数据蒸馏将助手风格的对话能力注入开源基座模型LLaMa、GPT-J使普通消费者设备M1 Mac、消费级 GPU、纯 CPU即可本地运行高质量对话模型。整个训练体系由两个基座模型驱动——原版基于 GPL 协议的 LLaMa 7BLoRA 微调以及后续发布的 Apache-2.0 协议的 GPT4All-J基于 GPT-J 6B后者彻底解决了 LLaMa 的协议分发限制。GPT4All-JApache-2.0 协议的开源对话模型模型发布与下载GPT4All-J 是项目为规避 LLaMa 协议限制而训练的替代方案基于 EleutherAI/gpt-j-6B 基座模型采用 Apache-2.0 许可证可自由商用分发。项目通过 Hugging Face 发布了三个迭代版本通过revision参数区分版本数据过滤策略v1.0原始训练集v1.1-breezy过滤了所有AI language model类回答v1.2-jazzy在 v1.1 基础上进一步过滤Im sorry, I cant answer...等拒答类回答加载指定版本的模型和数据集只需传入revision参数from datasets import load_dataset from transformers import AutoModelForCausalLM dataset load_dataset(nomic-ai/gpt4all-j-prompt-generations, revisionv1.2-jazzy) model AutoModelForCausalLM.from_pretrained(nomic-ai/gpt4all-j-prompt-generations, revisionv1.2-jazzy)原始 ggml 格式模型ggml-gpt4all-j.bin仅兼容项目自行 fork 的 llama.cpp C 后端gpt4all-chat 中的实现无法用于社区通用的 llama.cpp 绑定因为项目对 llama.cpp 做了大量 fork 修改。Python 绑定后来被集成进了独立的 pyllamacpp 仓库。GPT4All-J 训练数据训练数据通过 GPT-3.5-Turbo 数据蒸馏生成完整数据集已开源并附带 Atlas 索引分别基于 Prompt 和 Response 索引便于检索分析。核心数据结构为promptresponse对在data.py中可看到分词时严格遵循prompt 部分不计入 loss的原则# data.py 中的核心分词逻辑 input_tokens tokenizer(prompt \n response tokenizer.eos_token, truncationTrue, max_lengthmax_length, return_tensorspt)[input_ids].squeeze() labels input_tokens.clone() labels[:prompt_len] -100 # prompt 部分的 label 设为 -100不参与 loss 计算这意味着模型仅在 response 部分计算交叉熵损失符合标准的指令微调范式。当 prompt 长度超过max_length // 2时代码会自动截断 prompt 以保留足够的 response 空间供训练。训练 GPT4All-JDeepSpeed 分布式微调训练命令GPT4All-J 的完整训练命令使用 Hugging Face Accelerate DeepSpeedaccelerate launch --dynamo_backendinductor \ --num_processes8 --num_machines1 --machine_rank0 \ --deepspeed_multinode_launcher standard \ --mixed_precisionbf16 \ --use_deepspeed \ --deepspeed_config_fileconfigs/deepspeed/ds_config_gptj.json \ train.py --config configs/train/finetune_gptj.yaml各参数说明参数值作用--num_processes8单机 8 卡并行--mixed_precisionbf16使用 bfloat16 混合精度A100/A10G 推荐--deepspeed_config_fileds_config_gptj.jsonDeepSpeed ZeRO Stage 2 配置--dynamo_backendinductorTorchDynamo 编译后端加速DeepSpeed 配置解析ds_config_gptj.json 采用 ZeRO Stage 2优化器状态 梯度分片关键配置如下{ zero_optimization: { stage: 2, offload_param: { device: none }, offload_optimizer: { device: none } }, gradient_clipping: 1.0, optimizer: { type: AdamW, params: { lr: auto, betas: [0.9, 0.999], eps: 1e-08 } }, scheduler: { type: WarmupLR, params: { warmup_type: linear } } }对比 ds_config_gptj_lora.jsonLoRA 版本开启了 CPU offloadoffload_param.device: cpu、offload_optimizer.device: cpu以降低显存占用适合在显存较小的 GPU 上训练 LoRA 适配器。全参数训练版本ds_config_gptj.json则关闭 offload追求更高吞吐。YAML 训练配置详解finetune_gptj.yaml 是 GPT4All-J 全参数微调的配置文件# model/tokenizer model_name: EleutherAI/gpt-j-6B tokenizer_name: EleutherAI/gpt-j-6B gradient_checkpointing: true # 启用梯度检查点以时间换显存 save_name: # CHANGE # Hugging Face Hub 推送时的模型名称 # dataset streaming: false # 非流式加载 num_proc: 64 # 分词并行进程数 dataset_path: # CHANGE # 本地路径或 HF 数据集 ID max_length: 1024 # 最大序列长度 batch_size: 32 # 每 GPU 微批次大小 # train dynamics lr: 2.0e-5 # 初始学习率 min_lr: 0 # cosine 衰减终止学习率 weight_decay: 0.0 eval_every: 500 # 每 500 步评估一次验证集 save_every: 500 # 每 500 步保存 checkpoint log_grads_every: 100 # 每 100 步记录梯度 output_dir: # CHANGE # 本地输出目录 checkpoint: null # 从指定 checkpoint 恢复训练 lora: false # 全参数训练 warmup_steps: 500 # 线性 warmup 步数 num_epochs: 2 # logging wandb: true wandb_entity: # CHANGE wandb_project_name: # CHANGE seed: 42训练脚本核心逻辑train.py 是唯一的训练入口核心流程数据加载调用 data.py 的load_data()函数按train_test_split(test_size0.05)划分训练/验证集支持本地*_clean.jsonl文件或 Hugging Face 远程数据集通过revision参数指定版本。模型初始化使用AutoModelForCausalLM.from_pretrained加载基座模型若启用gradient_checkpointing则自动禁用 KV cache。LoRA 注入可选当lora: true时通过 PEFT 的LoraConfig(task_typeCAUSAL_LM, r8, lora_alpha32, lora_dropout0.1)注入低秩适配器将可训练参数压缩到基座模型的极小比例。优化器选择若 DeepSpeed 配置中声明了optimizer则使用DummyOptim由 DeepSpeed 托管否则使用标准AdamW。学习率调度采用 cosine 衰减但衰减目标不是 0 而是min_lr / lr的比例再额外叠加warmup_steps的线性升温。Checkpoint 恢复通过accelerator.load_state和skip_first_batches实现精确断点续训自动跳过已训练的 batch。每 Epoch 保存每个 epoch 结束后save_pretrained并push_to_hub私有仓库多 epoch 训练额外保存final目录。原版 GPT4All 模型基于 LLaMa 7B 的 LoRA 微调模型权重与可复现性原始 GPT4All 基于 GPL 协议的 LLaMa 7B使用 LoRA 微调。已发布的训练权重模型训练 Epoch 数说明gpt4all-lora4 个完整 epoch最终发布版gpt4all-lora-epoch-23 个完整 epoch中间版本gpt4all-j1 个完整 epochGPT-J 基座全参gpt4all-j-lora1 个完整 epochGPT-J 基座 LoRA项目明确不分发 LLaMa 7B 完整 checkpoint受 GPL 协议限制仅发布 LoRA 适配器权重。环境搭建# 克隆仓库含子模块 git clone --recurse-submodules https://github.com/nomic-ai/gpt4all.git git submodule update --init # 安装依赖 python -m pip install -r requirements.txt # 安装 PEFT当时需要从源码安装以获取最新 LoRA 支持 cd ../peft pip install -e .requirements.txt 的核心依赖包括accelerate、datasets、transformers4.28.0、peft、deepspeed、torchmetrics、wandb、einops。env.yaml 提供了等价的 Conda 环境定义Python 3.8 pytorch channel。LLaMa LoRA 训练命令accelerate launch --dynamo_backendinductor \ --num_processes8 --num_machines1 --machine_rank0 \ --deepspeed_multinode_launcher standard \ --mixed_precisionbf16 \ --use_deepspeed \ --deepspeed_config_fileconfigs/deepspeed/ds_config.json \ train.py --config configs/train/finetune-7b.yaml对应的 finetune_lora.yaml 配置中lora: trueLoRA 超参数硬编码在 train.py 中r8, lora_alpha32, lora_dropout0.1。LLaMa 版本使用ds_config.jsonZeRO Stage 2无 offload而 GPT-J LoRA 版本使用ds_config_gptj_lora.json启用 CPU offload。模型生成与推理生成命令python generate.py --config configs/generate/generate_gptj.yaml --prompt Write a script to reverse a string in Pythongenerate.py 的工作流程加载 YAML 配置含model_name、tokenizer_name、lora、max_new_tokens、temperature通过AutoModelForCausalLM.from_pretrained加载模型device_mapautotorch_dtypefloat16若lora: true使用PeftModelForCausalLM.from_pretrained挂载 LoRA 适配器特殊 token 处理若 tokenizer 缺少bos/eos/padtoken自动添加并resize_token_embeddings调用model.generate(input_ids, max_new_tokens, temperature)生成文本输出时剥离 prompt 部分decoded[len(prompt):]仅打印生成内容生成配置示例generate_gptj.yamlmodel_name: nomic-ai/gpt4all-warmup-lr-epoch_1 tokenizer_name: EleutherAI/gpt-j-6b lora: false max_new_tokens: 512 temperature: 0.001 # 接近贪心解码 prompt: | #this code prints a string reversed my_string hello how are you print(len(my_string)) My code above does not work. Can you help me?LLaMa LoRA 版本的配置 generate.yaml 则挂载nomic-ai/gpt4all-lora适配器到zpn/llama-7b基座上temperature: 0为严格贪心。评估脚本eval_figures.py 和 eval_self_instruct.py 提供批量评估能力配合 configs/eval/ 下的配置generate_gpt4all_gptj.yaml、generate_gpt4all_gptj_lora.yaml、generate_gpt4all_llama_lora.yaml对训练产物进行 perplexity 分析和生成质量检查。configs/eval/generate_gpt4all_gptj_lora.yaml 展示了 LoRA 评估的典型配置model_name: EleutherAI/gpt-j-6b tokenizer_name: EleutherAI/gpt-j-6B lora: true lora_path: nomic-ai/gpt4all-gptj-lora-epoch_1端侧部署CPU 量化模型运行原版 GPT4All 模型发布后项目同时提供了 CPU 量化版本4-bit GGML 格式的各平台预编译二进制可直接在 M1 Mac、Intel Mac、Linux x86、Windows 上运行# 下载 gpt4all-lora-quantized.bin 后放入 chat 目录执行对应平台命令 # M1 Mac cd chat; ./gpt4all-lora-quantized-OSX-m1 # Linux cd chat; ./gpt4all-lora-quantized-linux-x86 # Windows (PowerShell) cd chat; ./gpt4all-lora-quantized-win64.exe # Intel Mac cd chat; ./gpt4all-lora-quantized-OSX-intel仓库中保留了 launcher.sh 脚本自动检测操作系统包括 WSL和 Mac 架构arm64/x86_64列出当前目录下所有.bin模型文件供用户选择最终调用-m model参数启动推理。项目还提供了gpt4all-lora-unfiltered-quantized.bin变体该版本在训练时移除了所有拒答类回答可通过-m参数指定加载。对于旧硬件仅支持 AVX 不支持 AVX2GPT4All-J 发布时额外提供了avx-only版本的各平台安装包。自定义硬件编译对于非标准硬件项目建议基于其 llama.cpp fork 自行编译该 fork 包含大量针对端侧推理的优化补丁与社区版 llama.cpp 存在较大分歧。Python 客户端接口CPU 接口已弃用早期 Python 客户端基于nomic包from nomic.gpt4all import GPT4All m GPT4All() m.open() m.prompt(write me a story about a lonely computer)该接口已被新版官方 Python 绑定gpt4all-bindings/python/完全替代新版基于 llama.cpp C 层接口支持流式输出、嵌入生成等完整能力且不再依赖 notebook 环境的特殊处理。GPU 接口GPU 版本需要 Hugging Face 兼容的 LLaMa 模型文件from nomic.gpt4all import GPT4AllGPU m GPT4AllGPU(LLAMA_PATH) # LLAMA_PATH 指向 HF 格式的 LLaMa 模型 config { num_beams: 2, min_new_tokens: 10, max_length: 100, repetition_penalty: 2.0 } out m.generate(write me a story about a lonely computer, config)config支持 Hugging FaceGenerationConfig的全部参数。由于 LLaMa 7B 完整权重需 16GB 显存项目当时正在开发无此限制的替代方案——这正是后续 GPT4All-J 的动机。数据流水线从蒸馏到训练数据清理与生成项目数据流水线涉及以下脚本脚本功能clean.py对原始蒸馏数据做质量过滤去重、去 P3 内容、格式校验data.py训练时数据加载与分词load_data/load_data_for_inferenceeval_self_instruct.py基于 Self-Instruct 范式的批量生成与评估数据发布分三个层次Training Data Without P3基础蒸馏数据去除 P3 级敏感内容Full Dataset with P3含完整 P3 内容的完整数据集GPT4All-J Datasetgpt4all-j-prompt-generations专门为 GPT-J 基座训练优化的蒸馏数据原始 LLaMa 版本和 GPT4All-J 版本使用同一蒸馏方法论但基座不同训练配置对应调整。finetune_falcon.yaml 展示了后续扩展到 Falcon 7B 基座的配置使用revision: v1.3-groovy的数据版本并复用了 MPT 训练的 checkpoint 进行增量训练。分词与标签构造细节data.py 的tokenize_inputs函数处理了几个关键边界情况EOS token 兼容不同 tokenizer 的 EOS token 不同GPT-J 用/sLLaMa 用|end_of_text|代码通过检测tokenizer.eos_token ! /s做向后兼容替换超长 prompt 截断当 prompt token 数 ≥max_length // 2时将 prompt 截断到min(max_length // 2, len(prompt) // 2)个字符确保 response 部分有足够空间产生有效 label全 -100 标签检测若某样本的 label 全部为 -100即 prompt 占满了整个序列代码直接抛出异常中断训练避免无效样本进入 loss 计算项目路线图与生态短期目标已完成基于 GPT-J 训练 GPT4All-J 模型解决 LLaMa 协议分发问题创建优化的 CPU 和 GPU 推理接口集成 llama.cpp Python 绑定pyllamacpp构建对话式聊天界面gpt4all-ui / gpt4all-chat支持用户提交聊天记录参与后续训练迭代中期目标与 Atlas 检索引擎集成实现文档检索增强RAG与 LangChain 集成构建简易自定义训练脚本让用户可以微调自己的模型兼容模型生态GPT4All 推理后端llama.cpp fork兼容的 4-bit 量化模型包括gpt4all-lora-quantized.bin原版、gpt4all-lora-unfiltered-quantized.bin无过滤版、gpt4all-ggml-convertedGGML 格式转换版以及社区贡献的ggml-vicuna-7b-4bit、vicuna-13b-GPTQ-4bit-128g等。项目以 MD5 签名保证模型文件完整性。示例生成质量展示文档中记录了 GPT4All 模型的典型生成样例覆盖多种指令类型代码生成Python 反转字符串my_string Hello World reversed_str my_string[::-1] print(reversed_str)CSS 颜色查询浅红色、中等亮度的粉色The CSS code associated with the color provided is: #FF6347创意写作用扬抑格五步诗体写尤利乌斯·凯撒落入凯撒沙拉的诗模型生成了完整的 18 行诗保持了salad topping和legacy reduced to a mere garnish等意象的一致性。列表生成列举 10 种狗准确输出 Labrador Retriever、Golden Retriever、Beagle 等 10 个品种格式规范。这些样例体现了模型在指令遵循、格式控制、创意生成三个维度的能力基线。引用格式若在你的下游项目中使用了本仓库的模型或数据建议按以下 BibTeX 引用misc{gpt4all, author {Yuvanesh Anand and Zach Nussbaum and Brandon Duderstadt and Benjamin Schmidt and Andriy Mulyar}, title {GPT4All: Training an Assistant-style Chatbot with Large Scale Data Distillation from GPT-3.5-Turbo}, year {2023}, publisher {GitHub}, journal {GitHub repository}, howpublished {\url{https://github.com/nomic-ai/gpt4all}}, }适用前提与限制GPU 训练accelerate launch --num_processes8要求 8 张 GPUA100 推荐bf16 混合精度需要 Ampere 及以上架构LoRA CPU offload 配置可降级到显存较小的 GPU模型分发原始 LLaMa 7B checkpoint 因 GPL 协议未随仓库分发仅发布 LoRA 适配器GPT4All-J 全系列 Apache-2.0 可自由商用推理后端ggml 格式模型仅兼容项目 fork 的 llama.cpp即 gpt4all-chat 后端不能直接用于社区 llama.cppPython 环境transformers4.28.0、peft建议源码安装、deepspeed为训练必需nomic包仅用于旧版客户端已被 gpt4all-bindings/python/ 替代数据版本dataset_path支持本地*_clean.jsonl文件或 Hugging Face 数据集 ID通过revision参数选择 v1.0/v1.1-breezy/v1.2-jazzy 版本【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →