實踐:從訓練數(shù)據(jù)版本管理到 DeepSpeed 單機多卡訓練全流程解析)
GPT4All-J 微調(diào)實踐從訓練數(shù)據(jù)版本管理到 DeepSpeed 單機多卡訓練全流程解析【免費下載鏈接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.項目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all本篇圍繞 GPT4All 倉庫的gpt4all-training/README.md展開系統(tǒng)講解 GPT4All-J 系列模型的訓練復刻方法包括三個版本訓練數(shù)據(jù)集v1.0 / v1.1-breezy / v1.2-jazzy的區(qū)別與revision加載方式、accelerate launch結(jié)合 DeepSpeed 的完整啟動命令參數(shù)、以及支撐該流程的 train.py、data.py、clean.py 和 YAML 配置文件的源碼級實現(xiàn)細節(jié)。讀完后你將能夠獨立配置并復現(xiàn) GPT4All-J 的完整微調(diào)流水線。一、GPT4All 訓練模塊的定位gpt4all-training/是 GPT4All 項目中負責模型訓練與復現(xiàn)的獨立子項目。README 開頭列出了 Nomic 為該項目發(fā)布的三份技術(shù)報告按時間順序分別是Technical Report 1GPT4All項目整體介紹Technical Report 2GPT4All-JGPT-J-6B 基座上的微調(diào)方法與數(shù)據(jù)構(gòu)造過程Technical Report 3GPT4All Snoozy and Groovy后續(xù)模型版本。README 的核心目標是讓任何人可以復刻replicateGPT4All-J為此官方同時開放了經(jīng)過篩選curated的完整訓練數(shù)據(jù)并提供了從數(shù)據(jù)清洗、分詞到多卡訓練的完整代碼。下文按數(shù)據(jù) → 啟動命令 → 訓練代碼 → 配置文件的順序展開。二、GPT4All-J 訓練數(shù)據(jù)三個版本的篩選策略README 明確說明訓練數(shù)據(jù)有三個版本每一版都在前一版基礎(chǔ)上做了進一步的語言篩選filtering版本數(shù)據(jù)篩選策略v1.0原始數(shù)據(jù)集訓練的初始模型v1.1-breezy在過濾數(shù)據(jù)集中移除了所有AI language model我是人工智能語言模型類表述v1.2-jazzy在 v1.1 基礎(chǔ)上進一步移除了 Im sorry, I cant answer... 一類的拒答/道歉話術(shù)模型與數(shù)據(jù)集的版本都可以通過revision參數(shù)指定。以加載v1.2-jazzy的模型和數(shù)據(jù)為例README 原文示例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, revisionv1.2-jazzy)訓練側(cè)的代碼同樣支持這一機制。從 data.py 中l(wèi)oad_data函數(shù)的實現(xiàn)可以看到當dataset_path不是本地路徑時會走 HuggingFace Hub 下載分支并把配置文件里的revision字段原樣透傳給load_datasetdataset load_dataset(dataset_path, splittrain, revisionconfig[revision] if revision in config else None)這意味著只需在 YAML 配置中追加revision: v1.2-jazzy一行即可切換訓練所用的數(shù)據(jù)版本代碼層面對三個版本完全兼容。此外load_data支持本地數(shù)據(jù)若dataset_path指向本地目錄則自動 glob 目錄下所有*_clean.jsonl文件合并加載data.py這與clean.py的輸出命名約定xxx_clean.jsonl嚴格對應(yīng)。三、數(shù)據(jù)預處理管線clean.py 與 tokenize 邏輯3.1 行級清洗clean.pyclean.py 負責把raw_data_sanity_cleaned_without_p3/目錄下的原始 JSONL 清洗為訓練格式其規(guī)則在源碼中一目了然只保留source、prompt、response三個字段其余如model_settings一律剔除source缺失時補為unspecified若prompt/response是 dict依次嘗試value、description鍵展開為字符串否則丟棄該條使用 pandas 刪除空值、空串以及l(fā)en(prompt) 1的臟數(shù)據(jù)每個輸入文件輸出同名xxx_clean.jsonlclean.py。3.2 分詞與標簽構(gòu)造data.pydata.py 中的tokenize_inputs實現(xiàn)了典型的 prompt-completion 損失掩碼策略核心步驟截斷保護若 prompt 分詞后長度達到max_length // 2則將 prompt 截斷到max_length // 2以內(nèi)并assert保證不會侵占 response 的空間data.py拼接與掩碼將prompt \n response eos整體分詞到max_length然后克隆一份作為labels把labels[:prompt_len]置為-100——即 loss 只在 response 部分計算prompt 不參與訓練目標填充不足max_length的標簽用-100補齊并對全 -100的異常樣本直接raisedata.py數(shù)據(jù)集劃分load_data按seed做 95/5 的訓練/驗證切分train_test_split(test_size.05)非流式模式下用num_proc默認 64并行 map 分詞最后保留input_ids / labels / attention_mask三列并返回兩個DataLoaderdata.py。四、一鍵復刻accelerate launch 啟動命令全解README 給出的 GPT4All-J 訓練指令如下8 卡單機配置accelerate 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ù)含義結(jié)合 train.py 實際消費方式說明參數(shù)作用--num_processes8單機 8 卡數(shù)據(jù)并行對應(yīng)train.py中accelerator.num_processes打印的 GPU 數(shù)--num_machines1/--machine_rank0單機多卡擴展多機時按機器數(shù)與編號修改--mixed_precisionbf16以 bf16 混合精度訓練與 DeepSpeed 配置中bf16.enabled: auto呼應(yīng)--use_deepspeed/--deepspeed_config_file啟用 DeepSpeed 引擎使用 ds_config_gptj.json--dynamo_backendinductor指定 torch.compile 的 dynamo 后端為 inductor 做算子級優(yōu)化train.py --config ...訓練入口YAML 配置經(jīng) read.py 的read_configyaml.safe_load解析訓練入口train.py在 DeepSpeed 場景下有兩個關(guān)鍵適配值得注意優(yōu)化器/調(diào)度器讓渡若 DeepSpeed 配置中聲明了optimizer/scheduler則用DummyOptim/DummyScheduler占位把真正的參數(shù)初始化交給 DeepSpeedtrain.py、train.pyds_config_gptj.json 正是聲明了 AdamWbetas 0.9/0.999、eps 1e-8與 WarmupLR 線性預熱學習率、warmup 步數(shù)均取auto從 YAML 的lr/warmup_steps注入梯度累積步數(shù)讀取gradient_accumulation_steps直接從 DeepSpeed 配置讀取在ds_config_gptj.json中為auto即由 accelerate 依據(jù)全局 batch 計算loss先除以累積步數(shù)再accelerator.backward并在累積步邊界統(tǒng)一optimizer.step()train.py、train.py。五、訓練主循環(huán)與工程細節(jié)train.pytrain.py 除了上面的分布式適配外還實現(xiàn)了完整的訓練/評估/保存閉環(huán)模型加載AutoModelForCausalLM.from_pretrained加載 GPT-J-6B配置gradient_checkpointing: true時關(guān)閉 KV cacheuse_cacheFalse并啟用梯度檢查點以顯存換吞吐train.pyLoRA 開關(guān)配置lora: true時注入 PEFTLoraConfig(task_typeCAUSAL_LM, r8, lora_alpha32, lora_dropout0.1)r、alpha在源碼中是硬編碼常量train.py余弦退火至 min_lr與常見的衰減到 0 不同這里的總步數(shù)計算為steps int(steps * min_lr/lr) warmup使學習率余弦退火到min_lr而非 0train.py斷點續(xù)訓配置checkpoint后調(diào)用accelerator.load_state恢復并按 checkpoint 名稱中的step_N跳過已消費的批次train.py周期性保存與評估每save_every步保存可恢復狀態(tài)到{output_dir}/step_{n}每eval_every步計算全卡聚合的驗證 loss 并打印/上報每個 epoch 結(jié)束后把模型save_pretrained到{output_dir}/epoch_{n}并嘗試push_to_hub私有倉庫失敗僅打印不中斷訓練train.py日志默認開啟 wandbwandb: true記錄 loss、lr并可用wandb.watch記錄梯度。六、YAML 配置參數(shù)詳解訓練行為完全由 YAML 驅(qū)動。以 GPT-J 全參微調(diào)配置 configs/train/finetune_gptj.yaml 為例逐項說明# CHANGE為必須替換的字段# model/tokenizer model_name: EleutherAI/gpt-j-6B # 基座模型即 GPT-J 6B tokenizer_name: EleutherAI/gpt-j-6B gradient_checkpointing: true # 6B 全參微調(diào)默認開啟梯度檢查點 save_name: # CHANGE # push_to_hub 的倉庫名 # dataset streaming: false # 關(guān)閉流式啟用本地緩存 map num_proc: 64 # 分詞并行進程數(shù) dataset_path: # CHANGE # 數(shù)據(jù)倉庫名或本地 *_clean.jsonl 目錄 max_length: 1024 # promptresponse 截斷長度 batch_size: 32 # 每卡 micro batch # train dynamics lr: 2.0e-5 # 全參微調(diào)學習率 min_lr: 0 # 余弦退火終止學習率 weight_decay: 0.0 eval_every: 500 / save_every: 500 # 評估與斷點保存間隔 output_dir: # CHANGE # 權(quán)重與 checkpoint 落盤目錄 checkpoint: null # 續(xù)訓時填 step_N 目錄 lora: false # 全參 vs LoRA warmup_steps: 500 num_epochs: 2 # logging wandb: true / wandb_entity / wandb_project_name: # CHANGE seed: 42倉庫中還提供了同構(gòu)的變體配置可對比選擇configs/train/finetune_gptj_lora.yamlGPT-J 的 LoRA 版關(guān)鍵差異為lora: true、gradient_checkpointing: false、batch_size: 1configs/train/finetune_lora.yaml通用 LoRA 模板lr: 5.0e-5LoRA 常用更高學習率、eval_every/save_every: 2000configs/train/finetune.yaml 與 configs/train/finetune_openllama.yaml面向 OpenLLaMA 等其他基座的全參/LoRA 模板。DeepSpeed 側(cè)configs/deepspeed/ds_config_gptj.json 與通用 ds_config.json 采用ZeRO Stage 2無參數(shù)/優(yōu)化器 offload、allgather_partitions: true、contiguous_gradients: true、gradient_clipping: 1.0批大小相關(guān)字段全部auto由 accelerate 依據(jù)batch_size與 8 進程自動推導全局 batch。七、運行環(huán)境與輔助工具環(huán)境依賴見 requirements.txtaccelerate、datasets、transformers4.28.0、peftLoRA、deepspeed、torchmetrics、wandb、jsonlinesclean.py 依賴等另附 conda 環(huán)境描述 env.yaml。訓練完成后的驗證鏈路在 GPT-J_MAP.md 中給出用 8 卡torchrun跑 inference.py配置 configs/inference/gptj.yaml在訓練數(shù)據(jù)上做推理再用 build_map.py 生成 embedding 聚類地圖可直觀對比微調(diào)前后模型對數(shù)據(jù)的表征變化配套的 eval_self_instruct.py 則基于 Self-Instruct 提示評估模型輸出質(zhì)量。適用前提與限制上述流程按 README 設(shè)計面向 8× 高端 GPU 的單機訓練6B 全參 bf16 ZeRO-2LoRA 配置batch_size: 1、關(guān)閉梯度檢查點適合顯存更受限的環(huán)境但仍需多卡數(shù)據(jù)并行。模型與數(shù)據(jù)集均通過revision鎖定版本復現(xiàn)時務(wù)必確認使用v1.2-jazzy等目標版本以匹配相應(yīng)權(quán)重的訓練數(shù)據(jù)?!久赓M下載鏈接】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),僅供參考