from peft import get_peft_model, LoraConfig, prepare_model_for_int8_training, set_peft_model_state_dict from transformers import AutoTokenizer, AutoModel
model = AutoModel.from pretrained ( “THUDM/chatglm3-6b”,load_in_8bit=True, torch_dtype=torch. float16,
tokenizer = AutoTokenizer.from pretrained (
“THUDM/chatglm3-6b",trust_remote_code=lrue
model = prepare_model_for_int8_
3.2 模型显存占用的部分有哪些?
这里需要介绍一下两个模型显存占用的部分: 1. 静态显存基本由模型参数量级决定; 2. 动态显存在向前传播的过程中每个样本的每个神经元都会计算激活值并存储,用于向后传播时的梯度计算, 这部分和 batchsize 以及参数量级相关;
3.3 模型显存占用优化策略?
模型显存占用有以下两种方式: 1.8bit 量化优化。该方式只要用于优化静态显存; 2. 梯度检查优化。该方式只要用于优化动态显存;
3.3.1 8bit 量化优化策略?
参考:https://huggingface.co/blog/hf-bitsandbytes-integration
from_pretrained 中的 load_in_8bit 参数是 bitsandbytes 库赋予的能力,会把加载模型转化成混合 8bi 的量化模型, 注意这里的 8bit 模型量化只用于模型推理,通过量化 optimizer state 降低训练时显存的时 8bi 优化器是另一个功能 不要搞混哟~ 模型量化本质是对浮点参数进行压缩的同时,降低压缩带来的误差。8-bit quantization 是把原始 FP32 (4 字节) 压缩到 Int8 (1 字节)也就是 1/4 的显存占用。如上加载后会发现除 lora 层外的多数层被转化成 int 类型如下
training (model)