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