如何用Transformers正确加载Hugging Face的4-bit量化Ovis1.6-Gemma VLM模型?
问题描述
作为量化技术和视觉语言模型(VLM)新手,尝试用transformers库加载4-bit量化版Ovis1.6-Gemma模型,使用代码如下:
from transformers import AutoModelForCausalLM, BitsAndBytesConfig # Define the quantization configuration kwargs = { "quantization_config": BitsAndBytesConfig( load_in_4bit=True, load_in_8bit=False, bnb_4bit_compute_dtype="float32", bnb_4bit_quant_storage="uint8", bnb_4bit_quant_type="fp4", bnb_4bit_use_double_quant=False, llm_int8_enable_fp32_cpu_offload=False, llm_int8_has_fp16_weight=False, llm_int8_skip_modules=None, llm_int8_threshold=6.0 ) } model = AutoModelForCausalLM.from_pretrained( "ThetaCursed/Ovis1.6-Gemma2-9B-bnb-4bit", trust_remote_code=True, **kwargs ).cuda()
运行后出现警告:
warnings.warn(_BETA_TRANSFORMS_WARNING) Unused kwargs: ['_load_in_4bit', '_load_in_8bit', 'quant_method']. Loading checkpoint shards: 100%|██████████| 2/2 [00:06<00:00, 3.06s/it] You shouldn't move a model that is dispatched using accelerate hooks.
尝试获取tokenizer时执行以下代码:
text_tokenizer = model.get_text_tokenizer() visual_tokenizer = model.get_visual_tokenizer()
触发错误:
AttributeError: 'NoneType' object has no attribute 'get_text_tokenizer'
解决方案
一、消除模型加载警告
问题根源
- 配置中包含了与4-bit量化无关的
llm_int8系列参数,这类参数属于8-bit量化专属配置,加载预量化4-bit模型时会被判定为无效参数,触发Unused kwargs警告。 - 手动调用
.cuda()会与accelerate的自动设备调度机制冲突,触发模型移动相关警告。
修改后的加载代码
from transformers import AutoModelForCausalLM, BitsAndBytesConfig # 仅保留4-bit量化必要配置参数 kwargs = { "quantization_config": BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype="float32", bnb_4bit_quant_type="fp4", bnb_4bit_use_double_quant=False ), "device_map": "auto" # 由accelerate自动分配设备,替代手动.cuda() } model = AutoModelForCausalLM.from_pretrained( "ThetaCursed/Ovis1.6-Gemma2-9B-bnb-4bit", trust_remote_code=True, **kwargs )
二、解决Tokenizer获取错误
问题根源
get_text_tokenizer()并非transformers模型的标准方法,模型实例本身不会内置tokenizer对象,需通过专用工具类单独加载。对于VLM,文本tokenizer和视觉tokenizer(图像处理器)需分开加载。
正确加载方式
from transformers import AutoTokenizer, AutoImageProcessor # 加载文本tokenizer text_tokenizer = AutoTokenizer.from_pretrained("ThetaCursed/Ovis1.6-Gemma2-9B-bnb-4bit") # 加载视觉tokenizer(图像预处理工具) visual_tokenizer = AutoImageProcessor.from_pretrained("ThetaCursed/Ovis1.6-Gemma2-9B-bnb-4bit")
内容的提问来源于stack exchange,提问作者meysam
相关产品推荐
相关产品推荐

