使用Hugging Face Transformers和Bitsandbytes集成进行模型量化

2023年09月05日 由 alex 发表 1709 0

简介


本文探讨了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


2


以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库的集成使这种技术可以被更广泛的用户所使用。无论你是想要减少内存使用,加速模型执行,还是与社区共享量化模型,这个集成提供了你所需的工具和灵活性。这是向所有人提供高效的机器学习模型的重要步骤。

文章来源:https://medium.com/@rakeshrajpurohit/model-quantization-with-hugging-face-transformers-and-bitsandbytes-integration-b4c9983e8996
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消