練體系深度解析:從 GPT4All-J 到 LLaMa 基座模型的數(shù)據(jù)蒸餾與微調(diào)實戰(zhàn))
GPT4All 訓(xùn)練體系深度解析從 GPT4All-J 到 LLaMa 基座模型的數(shù)據(jù)蒸餾與微調(diào)實戰(zhàn)【免費下載鏈接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.項目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all本文以 GPT4All 訓(xùn)練文檔 為核心系統(tǒng)梳理 GPT4All 項目從 GPT-3.5-Turbo 蒸餾訓(xùn)練數(shù)據(jù)、LoRA 微調(diào) LLaMa 7B 到 GPT4All-JGPT-J 基座的完整訓(xùn)練流水線覆蓋環(huán)境搭建、DeepSpeed 分布式訓(xùn)練命令、YAML 配置參數(shù)、數(shù)據(jù)分詞邏輯與模型生成腳本幫助讀者理解該開源助手級對話模型的全部可復(fù)現(xiàn)細(xì)節(jié)。GPT4All 的核心理念是通過 GPT-3.5-Turbo 大規(guī)模數(shù)據(jù)蒸餾將助手風(fēng)格的對話能力注入開源基座模型LLaMa、GPT-J使普通消費者設(shè)備M1 Mac、消費級 GPU、純 CPU即可本地運行高質(zhì)量對話模型。整個訓(xùn)練體系由兩個基座模型驅(qū)動——原版基于 GPL 協(xié)議的 LLaMa 7BLoRA 微調(diào)以及后續(xù)發(fā)布的 Apache-2.0 協(xié)議的 GPT4All-J基于 GPT-J 6B后者徹底解決了 LLaMa 的協(xié)議分發(fā)限制。GPT4All-JApache-2.0 協(xié)議的開源對話模型模型發(fā)布與下載GPT4All-J 是項目為規(guī)避 LLaMa 協(xié)議限制而訓(xùn)練的替代方案基于 EleutherAI/gpt-j-6B 基座模型采用 Apache-2.0 許可證可自由商用分發(fā)。項目通過 Hugging Face 發(fā)布了三個迭代版本通過revision參數(shù)區(qū)分版本數(shù)據(jù)過濾策略v1.0原始訓(xùn)練集v1.1-breezy過濾了所有AI language model類回答v1.2-jazzy在 v1.1 基礎(chǔ)上進(jìn)一步過濾Im sorry, I cant answer...等拒答類回答加載指定版本的模型和數(shù)據(jù)集只需傳入revision參數(shù)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 中的實現(xiàn)無法用于社區(qū)通用的 llama.cpp 綁定因為項目對 llama.cpp 做了大量 fork 修改。Python 綁定后來被集成進(jìn)了獨立的 pyllamacpp 倉庫。GPT4All-J 訓(xùn)練數(shù)據(jù)訓(xùn)練數(shù)據(jù)通過 GPT-3.5-Turbo 數(shù)據(jù)蒸餾生成完整數(shù)據(jù)集已開源并附帶 Atlas 索引分別基于 Prompt 和 Response 索引便于檢索分析。核心數(shù)據(jù)結(jié)構(gòu)為promptresponse對在data.py中可看到分詞時嚴(yán)格遵循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 設(shè)為 -100不參與 loss 計算這意味著模型僅在 response 部分計算交叉熵?fù)p失符合標(biāo)準(zhǔn)的指令微調(diào)范式。當(dāng) prompt 長度超過max_length // 2時代碼會自動截斷 prompt 以保留足夠的 response 空間供訓(xùn)練。訓(xùn)練 GPT4All-JDeepSpeed 分布式微調(diào)訓(xùn)練命令GPT4All-J 的完整訓(xùn)練命令使用 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各參數(shù)說明參數(shù)值作用--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優(yōu)化器狀態(tài) 梯度分片關(guān)鍵配置如下{ 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 上訓(xùn)練 LoRA 適配器。全參數(shù)訓(xùn)練版本ds_config_gptj.json則關(guān)閉 offload追求更高吞吐。YAML 訓(xùn)練配置詳解finetune_gptj.yaml 是 GPT4All-J 全參數(shù)微調(diào)的配置文件# 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 # 分詞并行進(jìn)程數(shù) dataset_path: # CHANGE # 本地路徑或 HF 數(shù)據(jù)集 ID max_length: 1024 # 最大序列長度 batch_size: 32 # 每 GPU 微批次大小 # train dynamics lr: 2.0e-5 # 初始學(xué)習(xí)率 min_lr: 0 # cosine 衰減終止學(xué)習(xí)率 weight_decay: 0.0 eval_every: 500 # 每 500 步評估一次驗證集 save_every: 500 # 每 500 步保存 checkpoint log_grads_every: 100 # 每 100 步記錄梯度 output_dir: # CHANGE # 本地輸出目錄 checkpoint: null # 從指定 checkpoint 恢復(fù)訓(xùn)練 lora: false # 全參數(shù)訓(xùn)練 warmup_steps: 500 # 線性 warmup 步數(shù) num_epochs: 2 # logging wandb: true wandb_entity: # CHANGE wandb_project_name: # CHANGE seed: 42訓(xùn)練腳本核心邏輯train.py 是唯一的訓(xùn)練入口核心流程數(shù)據(jù)加載調(diào)用 data.py 的load_data()函數(shù)按train_test_split(test_size0.05)劃分訓(xùn)練/驗證集支持本地*_clean.jsonl文件或 Hugging Face 遠(yuǎn)程數(shù)據(jù)集通過revision參數(shù)指定版本。模型初始化使用AutoModelForCausalLM.from_pretrained加載基座模型若啟用gradient_checkpointing則自動禁用 KV cache。LoRA 注入可選當(dāng)lora: true時通過 PEFT 的LoraConfig(task_typeCAUSAL_LM, r8, lora_alpha32, lora_dropout0.1)注入低秩適配器將可訓(xùn)練參數(shù)壓縮到基座模型的極小比例。優(yōu)化器選擇若 DeepSpeed 配置中聲明了optimizer則使用DummyOptim由 DeepSpeed 托管否則使用標(biāo)準(zhǔn)AdamW。學(xué)習(xí)率調(diào)度采用 cosine 衰減但衰減目標(biāo)不是 0 而是min_lr / lr的比例再額外疊加warmup_steps的線性升溫。Checkpoint 恢復(fù)通過accelerator.load_state和skip_first_batches實現(xiàn)精確斷點續(xù)訓(xùn)自動跳過已訓(xùn)練的 batch。每 Epoch 保存每個 epoch 結(jié)束后save_pretrained并push_to_hub私有倉庫多 epoch 訓(xùn)練額外保存final目錄。原版 GPT4All 模型基于 LLaMa 7B 的 LoRA 微調(diào)模型權(quán)重與可復(fù)現(xiàn)性原始 GPT4All 基于 GPL 協(xié)議的 LLaMa 7B使用 LoRA 微調(diào)。已發(fā)布的訓(xùn)練權(quán)重模型訓(xùn)練 Epoch 數(shù)說明gpt4all-lora4 個完整 epoch最終發(fā)布版gpt4all-lora-epoch-23 個完整 epoch中間版本gpt4all-j1 個完整 epochGPT-J 基座全參gpt4all-j-lora1 個完整 epochGPT-J 基座 LoRA項目明確不分發(fā) LLaMa 7B 完整 checkpoint受 GPL 協(xié)議限制僅發(fā)布 LoRA 適配器權(quán)重。環(huán)境搭建# 克隆倉庫含子模塊 git clone --recurse-submodules https://github.com/nomic-ai/gpt4all.git git submodule update --init # 安裝依賴 python -m pip install -r requirements.txt # 安裝 PEFT當(dāng)時需要從源碼安裝以獲取最新 LoRA 支持 cd ../peft pip install -e .requirements.txt 的核心依賴包括accelerate、datasets、transformers4.28.0、peft、deepspeed、torchmetrics、wandb、einops。env.yaml 提供了等價的 Conda 環(huán)境定義Python 3.8 pytorch channel。LLaMa LoRA 訓(xùn)練命令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對應(yīng)的 finetune_lora.yaml 配置中l(wèi)ora: trueLoRA 超參數(shù)硬編碼在 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調(diào)用model.generate(input_ids, max_new_tokens, temperature)生成文本輸出時剝離 prompt 部分decoded[len(prompt):]僅打印生成內(nèi)容生成配置示例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為嚴(yán)格貪心。評估腳本eval_figures.py 和 eval_self_instruct.py 提供批量評估能力配合 configs/eval/ 下的配置generate_gpt4all_gptj.yaml、generate_gpt4all_gptj_lora.yaml、generate_gpt4all_llama_lora.yaml對訓(xùn)練產(chǎn)物進(jìn)行 perplexity 分析和生成質(zhì)量檢查。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端側(cè)部署CPU 量化模型運行原版 GPT4All 模型發(fā)布后項目同時提供了 CPU 量化版本4-bit GGML 格式的各平臺預(yù)編譯二進(jìn)制可直接在 M1 Mac、Intel Mac、Linux x86、Windows 上運行# 下載 gpt4all-lora-quantized.bin 后放入 chat 目錄執(zhí)行對應(yīng)平臺命令 # 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 腳本自動檢測操作系統(tǒng)包括 WSL和 Mac 架構(gòu)arm64/x86_64列出當(dāng)前目錄下所有.bin模型文件供用戶選擇最終調(diào)用-m model參數(shù)啟動推理。項目還提供了gpt4all-lora-unfiltered-quantized.bin變體該版本在訓(xùn)練時移除了所有拒答類回答可通過-m參數(shù)指定加載。對于舊硬件僅支持 AVX 不支持 AVX2GPT4All-J 發(fā)布時額外提供了avx-only版本的各平臺安裝包。自定義硬件編譯對于非標(biāo)準(zhǔn)硬件項目建議基于其 llama.cpp fork 自行編譯該 fork 包含大量針對端側(cè)推理的優(yōu)化補丁與社區(qū)版 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 環(huán)境的特殊處理。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的全部參數(shù)。由于 LLaMa 7B 完整權(quán)重需 16GB 顯存項目當(dāng)時正在開發(fā)無此限制的替代方案——這正是后續(xù) GPT4All-J 的動機。數(shù)據(jù)流水線從蒸餾到訓(xùn)練數(shù)據(jù)清理與生成項目數(shù)據(jù)流水線涉及以下腳本腳本功能clean.py對原始蒸餾數(shù)據(jù)做質(zhì)量過濾去重、去 P3 內(nèi)容、格式校驗data.py訓(xùn)練時數(shù)據(jù)加載與分詞load_data/load_data_for_inferenceeval_self_instruct.py基于 Self-Instruct 范式的批量生成與評估數(shù)據(jù)發(fā)布分三個層次Training Data Without P3基礎(chǔ)蒸餾數(shù)據(jù)去除 P3 級敏感內(nèi)容Full Dataset with P3含完整 P3 內(nèi)容的完整數(shù)據(jù)集GPT4All-J Datasetgpt4all-j-prompt-generations專門為 GPT-J 基座訓(xùn)練優(yōu)化的蒸餾數(shù)據(jù)原始 LLaMa 版本和 GPT4All-J 版本使用同一蒸餾方法論但基座不同訓(xùn)練配置對應(yīng)調(diào)整。finetune_falcon.yaml 展示了后續(xù)擴展到 Falcon 7B 基座的配置使用revision: v1.3-groovy的數(shù)據(jù)版本并復(fù)用了 MPT 訓(xùn)練的 checkpoint 進(jìn)行增量訓(xùn)練。分詞與標(biāo)簽構(gòu)造細(xì)節(jié)data.py 的tokenize_inputs函數(shù)處理了幾個關(guān)鍵邊界情況EOS token 兼容不同 tokenizer 的 EOS token 不同GPT-J 用/sLLaMa 用|end_of_text|代碼通過檢測tokenizer.eos_token ! /s做向后兼容替換超長 prompt 截斷當(dāng) prompt token 數(shù) ≥max_length // 2時將 prompt 截斷到min(max_length // 2, len(prompt) // 2)個字符確保 response 部分有足夠空間產(chǎn)生有效 label全 -100 標(biāo)簽檢測若某樣本的 label 全部為 -100即 prompt 占滿了整個序列代碼直接拋出異常中斷訓(xùn)練避免無效樣本進(jìn)入 loss 計算項目路線圖與生態(tài)短期目標(biāo)已完成基于 GPT-J 訓(xùn)練 GPT4All-J 模型解決 LLaMa 協(xié)議分發(fā)問題創(chuàng)建優(yōu)化的 CPU 和 GPU 推理接口集成 llama.cpp Python 綁定pyllamacpp構(gòu)建對話式聊天界面gpt4all-ui / gpt4all-chat支持用戶提交聊天記錄參與后續(xù)訓(xùn)練迭代中期目標(biāo)與 Atlas 檢索引擎集成實現(xiàn)文檔檢索增強RAG與 LangChain 集成構(gòu)建簡易自定義訓(xùn)練腳本讓用戶可以微調(diào)自己的模型兼容模型生態(tài)GPT4All 推理后端llama.cpp fork兼容的 4-bit 量化模型包括gpt4all-lora-quantized.bin原版、gpt4all-lora-unfiltered-quantized.bin無過濾版、gpt4all-ggml-convertedGGML 格式轉(zhuǎn)換版以及社區(qū)貢獻(xiàn)的ggml-vicuna-7b-4bit、vicuna-13b-GPTQ-4bit-128g等。項目以 MD5 簽名保證模型文件完整性。示例生成質(zhì)量展示文檔中記錄了 GPT4All 模型的典型生成樣例覆蓋多種指令類型代碼生成Python 反轉(zhuǎn)字符串my_string Hello World reversed_str my_string[::-1] print(reversed_str)CSS 顏色查詢淺紅色、中等亮度的粉色The CSS code associated with the color provided is: #FF6347創(chuàng)意寫作用揚抑格五步詩體寫尤利烏斯·凱撒落入凱撒沙拉的詩模型生成了完整的 18 行詩保持了salad topping和legacy reduced to a mere garnish等意象的一致性。列表生成列舉 10 種狗準(zhǔn)確輸出 Labrador Retriever、Golden Retriever、Beagle 等 10 個品種格式規(guī)范。這些樣例體現(xiàn)了模型在指令遵循、格式控制、創(chuàng)意生成三個維度的能力基線。引用格式若在你的下游項目中使用了本倉庫的模型或數(shù)據(jù)建議按以下 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 訓(xùn)練accelerate launch --num_processes8要求 8 張 GPUA100 推薦bf16 混合精度需要 Ampere 及以上架構(gòu)LoRA CPU offload 配置可降級到顯存較小的 GPU模型分發(fā)原始 LLaMa 7B checkpoint 因 GPL 協(xié)議未隨倉庫分發(fā)僅發(fā)布 LoRA 適配器GPT4All-J 全系列 Apache-2.0 可自由商用推理后端ggml 格式模型僅兼容項目 fork 的 llama.cpp即 gpt4all-chat 后端不能直接用于社區(qū) llama.cppPython 環(huán)境transformers4.28.0、peft建議源碼安裝、deepspeed為訓(xùn)練必需nomic包僅用于舊版客戶端已被 gpt4all-bindings/python/ 替代數(shù)據(jù)版本dataset_path支持本地*_clean.jsonl文件或 Hugging Face 數(shù)據(jù)集 ID通過revision參數(shù)選擇 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創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考