简介
本文探讨了Hugging Face的Transformers库与Bitsandbytes库的集成,该集成简化了模型量化的过程,使其更加易于访问和用户友好。
什么是模型量化?
量化是一种技术,用于降低模型中数值的精度。量化使用较低精度的数据类型(例如8位整数)来表示值,而不是使用高精度的数据类型(例如32位浮点数)。这个过程显著减少了内存使用,并可以加速模型的执行,同时保持可接受的准确性。
Hugging Face和Bitsandbytes的用途
Hugging Face的Transformers库是处理预训练语言模型的首选选择。为了使模型量化的过程更加易于访问,Hugging Face已经与Bitsandbytes库无缝集成。这种集成简化了量化过程,并使用户只需几行代码就能实现高效的模型。
从源码安装最新的加速器:
pip install git+https://github.com/huggingface/accelerate.git
从source和bitsandbytes安装最新的变压器:
pip install git+https://github.com/huggingface/transformers.git
pip install bitsandbytes
以4位量化中加载模型
这个集成的一个关键特性是可以加载4位量化的模型。可以通过在调用.from_pretrained方法时设置load_in_4bit=True参数来实现。这样做可以将内存使用减少约四倍。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "bigscience/bloom-1b7"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", load_in_4bit=True)
以8位量化加载模型
为了进一步优化内存,你可以将模型加载为8位量化。可以通过在调用.from_pretrained时使用load_in_8bit=True参数来实现。这将将内存占用减少约一半。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "bigscience/bloom-1b7"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", load_in_8bit=True)
你甚至可以使用get_memory_footprint方法检查模型的内存占用:
print(model.get_memory_footprint())
其他用例:
Hugging Face和Bitsandbytes的集成不仅限于基本的量化技术。以下是你可以探索的一些用例:
更改计算数据类型
你可以通过将bnb_4bit_compute_dtype设置为其他值(例如torch.bfloat16)来修改计算过程中使用的数据类型。这可能会在特定场景下提高速度。以下是一个示例:
from transformers import BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)
使用NF4数据类型
NF4数据类型设计用于使用正态分布初始化权重。你可以通过指定bnb_4bit_quant_type="nf4"来使用它:
from transformers import BitsAndBytesConfig
nf4_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")
model_nf4 = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=nf4_config)
嵌套量化以提高内存效率
该集成还建议使用嵌套量化技术,以更大程度地提高内存效率而不牺牲性能。这种技术已被证明对于微调大型模型特别有益:
from transformers import BitsAndBytesConfig
double_quant_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_use_double_quant=True)
model_double_quant = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=double_quant_config)
从Hub加载量化模型
可以使用from_pretrained方法轻松地加载量化模型。确保已保存的权重是量化的,可以通过检查模型配置中的quantization_config属性来确认:
model = AutoModelForCausalLM.from_pretrained("model_name", device_map="auto")
在这种情况下,你不需要指定load_in_8bit=True参数,但必须安装Bitsandbytes和Accelerate库。
探索高级技术和配置
还有其他技术和配置需要考虑:
在CPU和GPU之间的卸载
一种高级用例涉及加载模型并在CPU和GPU之间分配权重。可以通过设置llm_int8_enable_fp32_cpu_offload=True来实现。这个功能对于需要安装大型模型并在GPU和CPU之间分配它们的用户非常有用。
调整异常值阈值
尝试使用llm_int8_threshold参数来改变离群值的阈值。这个参数会影响推理速度,并可根据你的特定用例进行微调。
跳过部分模块的转换
在某些情况下,你可能想要跳过将特定模块转换为8位的过程。你可以使用llm_int8_skip_modules参数来实现。
在8位加载的模型上进行微调
在Hugging Face生态系统中使用适配器的支持下,可以对以8位量化加载的模型进行微调,从而轻松实现对大型模型的微调。
结论
量化是优化机器学习模型的强大技术。Hugging Face的Transformers库与Bitsandbytes库的集成使这种技术可以被更广泛的用户所使用。无论你是想要减少内存使用,加速模型执行,还是与社区共享量化模型,这个集成提供了你所需的工具和灵活性。这是向所有人提供高效的机器学习模型的重要步骤。