重以浮點存儲,在雙 24GB 顯卡上訓練 70B 大模型)
人工智能大模型模型量化模型優(yōu)化【免費下載鏈接】bitsandbytesAccessible large language models via k-bit quantization for PyTorch.項目地址https://gitcode.com/gh_mirrors/bi/bitsandbytes點擊查看免費下載本篇指南圍繞倉庫文檔 docs/source/fsdp_qlora.md 展開講解 FSDP-QLoRA 的核心機制與實操流程FSDP 要求分片的參數(shù)必須是浮點類型而 4-bit 量化權(quán)重默認以torch.uint8整數(shù)存儲這正是二者沖突的根源。讀完后你將掌握通過quant_storage/bnb_4bit_quant_storage參數(shù)將量化權(quán)重轉(zhuǎn)為浮點存儲的完整配置方法能夠使用 Accelerate Transformers PEFT TRL 搭建一套可運行的 FSDP-QLoRA 訓練流程并理解 bitsandbytes 源碼中為此所做的量化狀態(tài)重建、state_dict 保存等配套支持。FSDP-QLoRA 是什么FSDP-QLoRA 將三種技術(shù)組合在一起數(shù)據(jù)并行FSDPFully Sharded Data Parallel 把模型參數(shù)、優(yōu)化器狀態(tài)和梯度分片sharding到多張 GPU 上每張卡只保存完整模型的一個切片從而把顯存占用攤薄4-bit 量化基座模型權(quán)重以 4-bitNF4/FP4存儲進一步壓縮參數(shù)體積LoRA只訓練低秩適配器梯度與優(yōu)化器狀態(tài)集中在少量可訓練參數(shù)上。按 docs/source/fsdp_qlora.md 的說法該技術(shù)由 Answer.AI 聯(lián)合 bitsandbytes 發(fā)布目標是讓最高 70B 參數(shù)的 LLM 微調(diào)可以運行在雙 24GB GPU 的消費級硬件上。其原理性細節(jié)可參考 Answer.AI 的相關(guān)技術(shù)文章《You can now train a 70b language model at home》與《Enabling 70B Finetuning on Consumer GPUs》本文則聚焦 bitsandbytes 倉庫內(nèi)部對 FSDP-QLoRA 的支撐實現(xiàn)。量化數(shù)據(jù)的存儲quant_storage參數(shù)FSDP 只分片浮點類型的問題FSDP 只支持對浮點數(shù)據(jù)類型的參數(shù)進行分片而量化權(quán)重通常以整數(shù)類型uint8存儲。對 bitsandbytes 來說這個問題并不存在——從源碼結(jié)構(gòu)看它內(nèi)部通過StoreChar之類的機制讀寫量化權(quán)重與存儲 dtype 解耦4-bit 值先被打包進uint8字節(jié)而這些字節(jié)本身可以重新view成任意等寬浮點類型而不改變比特內(nèi)容。這一點在各后端實現(xiàn)中可以直接看到。以 default純 PyTorch后端為例bitsandbytes/backends/default/ops.py 中的quantize_4bit內(nèi)核在打包完成后packed ((q8[::2] 4) | q8[1::2]).unsqueeze(1) if quant_storage ! torch.uint8: packed packed.squeeze().view(quant_storage).unsqueeze(1)即當quant_storage不是torch.uint8時直接對同一個比特緩沖做view(quant_storage)把打包字節(jié)“解釋”為 bf16/fp16 等浮點類型。CUDA、Triton、MPS 后端如 bitsandbytes/backends/triton/ops.py、bitsandbytes/backends/mps/ops.py均有同樣的處理因此這一機制在所有后端一致可用。參數(shù)在模塊與函數(shù) API 中的位置quant_storage參數(shù)出現(xiàn)在多個層次默認值統(tǒng)一為torch.uint8保持向后兼容nn.Params4bit4-bit 參數(shù)類quant_storage作為構(gòu)造參數(shù)保存為實例屬性并參與__getstate__/__setstate__序列化bitsandbytes/nn/modules.py保證 checkpoint 往返后存儲類型不丟失nn.Linear4bit、LinearNF4、LinearFP4等模塊均透傳該參數(shù)bitsandbytes/nn/modules.py函數(shù)式 APIbnb.functional.quantize_4bit同樣接受quant_storage參數(shù)bitsandbytes/functional.py其文檔字符串明確說明“The dtype of the tensor used to store the result. Defaults totorch.uint8”。在Params4bit上存儲類型還隨設備遷移保持to()/cuda()重建新參數(shù)時會原樣傳遞quant_storagebitsandbytes/nn/modules.py從預量化狀態(tài)恢復時則以數(shù)據(jù)本身的 dtype 推斷from_prequantized中self.quant_storage data.dtypebitsandbytes/nn/modules.py。通過BitsAndBytesConfig配置實際使用時你通常從transformers.BitsAndBytesConfig設置bnb_4bit_quant_storage參數(shù)。注意quant_storage的數(shù)據(jù)類型必須與模型其余部分使用的數(shù)據(jù)類型一致因為 FSDP 只能包裝具有相同浮點類型的層和模塊類型對齊才能保證模型被正確地分片。另外需要區(qū)分compute_dtype與quant_storagecompute_dtype是 CUDA 內(nèi)核中實際計算使用的數(shù)據(jù)類型4-bit 權(quán)重會從quant_storage中解包并反量化到compute_dtype。文檔建議在硬件支持時優(yōu)先使用torch.bfloat16以獲得更好的數(shù)值穩(wěn)定性。from transformers import BitsAndBytesConfig, AutoModelForCausalLM import torch bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_quant_storagetorch.bfloat16, ) model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-70b, quantization_configbnb_config, torch_dtypetorch.bfloat16, )訓練 FSDP-QLoRAFSDP 是分布式訓練框架必須通過 Accelerate 或torchrun之類的工具以分布式訓練任務的方式啟動。bitsandbytes 與 Hugging Face 生態(tài)深度集成可以便捷地配合 Transformers、PEFT、TRL 使用PEFT 官方提供了 FSDP-QLoRA 的配置示例fsdp_config_qlora.yaml、啟動腳本run_peft_qlora_fsdp.sh與訓練腳本train.py并附有“Use PEFT QLoRA and FSDP for finetuning large models on multiple GPUs”的專項文檔可作為完整可運行配置的參照。1. 安裝依賴開始之前確保安裝了最新的庫pip install -U bitsandbytes accelerate transformers peft trl2. 配置量化參數(shù)使 FSDP-QLoRA 訓練成為可能的關(guān)鍵改動就是BitsAndBytesConfig中的bnb_4bit_quant_storage參數(shù)——它允許把量化權(quán)重的存儲類型設置為浮點類型from transformers import BitsAndBytesConfig import torch bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_storagetorch.bfloat16, )參數(shù)說明參數(shù)示例值作用load_in_4bitTrue以 4-bit 方式加載基座模型bnb_4bit_quant_typenf4量化數(shù)據(jù)類型bitsandbytes 支持nf4與fp4見 quantize_4bit 的類型校驗bnb_4bit_compute_dtypetorch.bfloat16內(nèi)核計算與反量化目標類型建議 bf16bnb_4bit_use_double_quantTrue對 absmax 統(tǒng)計量再做一層量化嵌套量化進一步節(jié)省顯存bnb_4bit_quant_storagetorch.bfloat16FSDP-QLoRA 的關(guān)鍵量化權(quán)重的存儲類型必須為 FSDP 支持的浮點類型且與模型 dtype 一致3. 加載模型并對齊 dtype把BitsAndBytesConfig傳給模型即可為其啟用 FSDP-QLoRA。應將torch_dtype設置為與bnb_4bit_quant_storage一致這樣每個Linear4bit層會與Linear層以相同方式被 FSDP 包裝如果存儲類型不匹配每個Linear4bit層會被單獨包裝破壞分片效率。from transformers import AutoModelForCausalLM import torch model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-70b, quantization_configbnb_config, torch_dtypetorch.bfloat16, )4. 配置 LoRA為 QLoRA 訓練配置LoraConfig通過target_modulesall-linear覆蓋所有線性層from peft import LoraConfig peft_config LoraConfig( lora_alpha16, lora_dropout0.1, r64, biasnone, task_typeCAUSAL_LM, target_modulesall-linear, )5. 交給SFTTrainer訓練最后把模型、LoRA 配置與數(shù)據(jù)一起傳給 TRL 的SFTTrainerfrom trl import SFTTrainer trainer SFTTrainer( modelmodel, train_datasetdataset, peft_configpeft_config, processing_classtokenizer, argstraining_arguments, ) trainer.train()訓練腳本需以分布式方式啟動例如使用 Accelerate 的accelerate launch命令配合 FSDP 配置文件執(zhí)行訓練腳本PEFT 倉庫中的run_peft_qlora_fsdp.sh展示了典型啟動方式。源碼縱深bitsandbytes 為 FSDP 做的三項配套支持除了quant_storage本身bitsandbytes 還為 FSDP 場景做了若干針對性處理理解它們有助于排查分布式訓練中的狀態(tài)丟失與 checkpoint 問題FSDP 遍歷量化狀態(tài)的屬性代理。FSDP 的_get_fqns()通過getattr逐點解析參數(shù)屬性例如把weight.absmax解析為getattr(weight, absmax)來識別需要分片的量化統(tǒng)計量。為此Params4bit定義了absmax、code、offset、nested_absmax等property代理到內(nèi)部QuantStatebitsandbytes/nn/modules.py。源碼注釋說明使用 property 而非__getattr__是有意為之Dynamo 可以追蹤描述符協(xié)議訪問但無法追蹤 Tensor 子類的__getattr__后者會導致torch.compile圖斷裂關(guān)聯(lián) issue #1904。量化狀態(tài)丟失后的重建。參數(shù)在 FSDP 包裝過程中轉(zhuǎn)換時可能丟失quant_statefix_4bit_weight_quant_state_from_module會在Linear4bit.forward入口處從模塊上恢復權(quán)重屬性bitsandbytes/nn/modules.pyLinear4bit.forward第一行即調(diào)用它bitsandbytes/nn/modules.py。state_dict 保存量化元數(shù)據(jù)。Linear4bit._save_to_state_dict在保存 weight 之外還會把quant_state.as_dict(packedTrue)的各分量以weight.key的形式寫入 state_dictbitsandbytes/nn/modules.py使得 4-bit 權(quán)重能從量化元數(shù)據(jù)完整重建。倉庫中的集成測試 tests/fsdp_state_dict_save.py 驗證了這一點它用一個“凍結(jié) 4-bit 基座 可訓練 adapter”的 QLoRA 風格模型包裝 FSDP調(diào)用get_model_state_dict(cpu_offloadTrue)覆蓋了過去會因Params4bit缺少absmax屬性而崩潰的_get_fqns()遍歷路徑issue #1405。該腳本需通過torchrun --nproc_per_node1 tests/fsdp_state_dict_save.py啟動可直接用于回歸驗證。此外Params4bit.cuda()/xpu()在從 CPU 遷移到加速器前會檢測packing_format_for_cpu標記并先做布局還原bitsandbytes/nn/modules.py防止已量化的權(quán)重在 CPU→GPU 遷移時被重復量化——這正是文檔 TIP 中提到的“防止把已量化的權(quán)重再次量化”的實現(xiàn)位置。關(guān)鍵要點與常見坑類型必須對齊bnb_4bit_quant_storage、torch_dtype、模型中非量化層的 dtype 三者保持一致推薦 bf16否則Linear4bit會被逐層單獨包裝FSDP 分片失效。compute_dtype與quant_storage職責不同前者決定內(nèi)核內(nèi)反量化后的計算精度后者決定權(quán)重在顯存/分片中的存儲類型二者獨立配置。默認值保持兼容quant_storage在各處默認torch.uint8即不顯式設置時行為與舊版本完全一致只有顯式傳入浮點類型才啟用 FSDP 友好的存儲方式。分布式啟動是前提FSDP 不是普通單機訓練模式務必通過 Accelerate 或torchrun啟動。驗證手段單卡場景下可運行 tests/fsdp_state_dict_save.py 檢查 FSDP 對 4-bit 模塊的 state_dict 收集是否正常。延伸閱讀Answer.AI 發(fā)布的 FSDP-QLoRA 參考倉庫AnswerDotAI/fsdp_qlora與兩篇技術(shù)博客介紹方法動機與 70B 消費級微調(diào)細節(jié)PyTorch 官方博客《Introducing PyTorch Fully Sharded Data Parallel (FSDP) API》了解 FSDP 分片機制Hugging Face 博客《Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA》了解 4-bit 量化與 QLoRA 的背景倉庫內(nèi)文檔 docs/source/integrations.mdx 與參考手冊 docs/source/reference/nn/linear4bit.mdx、docs/source/reference/functional.mdx可查閱Linear4bit與quantize_4bit的完整 API 說明。贊分享人工智能大模型模型量化模型優(yōu)化【免費下載鏈接】bitsandbytesAccessible large language models via k-bit quantization for PyTorch.項目地址https://gitcode.com/gh_mirrors/bi/bitsandbytes點擊查看免費下載相關(guān)推薦如何用FSDP-QLoRA在消費級GPU上訓練70B大模型完整步驟解析如何用FSDP QLoRA在消費級GPU上訓練70B大模型完整步驟解析 FSDP QLoRA是一個結(jié)合了FSDPFully Sharded Data Par人工智能大模型微調(diào)LoRA分布式訓練模型量化QLoRA訓練指南基于bitsandbytes的4-bit量化技術(shù)全面解析QLoRA訓練指南基于bitsandbytes的4 bit量化技術(shù)全面解析 引言大模型訓練的顯存困境與QLoRA解決方案 你是否還在為訓練大語言模型時的顯存人工智能大模型模型量化模型優(yōu)化QLoRA 4-bit量化訓練技術(shù)剖析QLoRA 4 bit量化訓練技術(shù)剖析 QLoRA 4 bit量化訓練技術(shù)是現(xiàn)代大語言模型高效訓練和推理的核心技術(shù)通過將32位浮點權(quán)重壓縮到4位表示實現(xiàn)了顯人工智能大模型模型量化模型優(yōu)化上一篇OpenSpeedy時間函數(shù)攔截技術(shù)游戲幀率突破的工程實踐下一篇3步搞定yuzu模擬器版本管理輕松解決游戲兼容性問題的完整指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考