尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【Bug已解决】Fine-tuning TheBloke/Llama-2-13B-chat-GPTQ model with Hugging Face Transformers library…

【Bug已解决】Fine-tuning TheBloke/Llama-2-13B-chat-GPTQ model with Hugging Face Transformers library… 【Bug已解决】Fine-tuning TheBloke/Llama-2-13B-chat-GPTQ model with Hugging Face Transformers library throws Exllama error 解决方案一、现象长什么样有人想直接微调 TheBloke 发布的量化模型TheBloke/Llama-2-13B-chat-GPTQ于是一边from_pretrained一边挂 LoRA结果在加载或训练第一步抛出 Exllama 相关错误ValueError: Exllama kernel is not compatible with training. Please disable exllama by setting use_exllamaFalse, or load the model without the exllama backend.或者根本加载不了ImportError: auto_gptq is not installed. GPTQ models require auto-gptq and optimum.还有一种是内核层直接崩RuntimeError: exllama: cuda error ...更让人困惑的是这个模型用text-generation-webui或transformers做推理明明很正常、速度很快但一换成训练就 Exllama 报错。这正是 GPTQ 这种推理专用量化格式与训练之间的根本矛盾。二、背景TheBloke/Llama-2-13B-chat-GPTQ是经过GPTQ 后训练量化的模型权重从 fp16 压成了 4-bit分组量化体积只有原来的约 1/4显存占用骤降非常适合本地推理。TheBloke 在发布时通常会附带两种推理内核配置exllama / exllamav2专为 GPTQ 推理高度优化的 CUDA 内核速度快、显存低但只支持前向不支持反向传播autograd backward。auto-gptqeager GPTQ由auto_gptq库提供的参考实现能用标准 PyTorch 算子跑 GPTQ 权重支持训练所需的反向但速度慢于 exllama。transformers在加载 GPTQ 模型时如果环境里装了exllama会默认优先使用 exllama 内核以获得最快推理。一旦你在这个加载好的模型上挂 LoRA 并调用trainer.train()反向传播需要 exllama 内核提供梯度而它根本没有——于是抛出Exllama kernel is not compatible with training。此外GPTQ 权重本身是被量化的直接在原位做全参微调在数学上也不理想你更新的是反量化后的伪量化权重优化信号会被量化误差稀释。因此社区公认的正确做法是要么先反量化为 fp16 再训练要么干脆从原始 fp16 基座如meta-llama/Llama-2-13b-chat-hf开始做 LoRA。三、根因根因 Aexllama 内核不支持训练。这是报错的直接原因。exllama 是纯推理内核没有实现 backward训练时 autograd 找不到梯度函数就报错。根因 B默认走 exllama 后端。transformers检测到exllama可用时默认启用用户并没有主动选择却因此踩坑。根因 C缺失auto_gptq/optimum。即使你想关掉 exllama 改用 eager GPTQ 后端也需要auto_gptq与optimum提供加载逻辑没装就直接ImportError。根因 D对 GPTQ 做全参微调本身不合理。量化权重做原位更新梯度经过量化/反量化链路被严重扭曲训练效果差且容易数值不稳定。这是更深层的方法论错误。四、最小可运行复现复现默认 exllama 不可训练的报错逻辑from transformers import AutoModelForCausalLM, AutoTokenizer # TheBloke 的 GPTQ 默认会尝试用 exllama 内核 try: model AutoModelForCausalLM.from_pretrained( TheBloke/Llama-2-13B-chat-GPTQ, device_mapauto, # 没关 exllama训练必然失败 ) # 假设下面挂 LoRA 并 trainer.train() # 反向传播时抛 ValueError: Exllama kernel is not compatible with training except Exception as e: print(type(e).__name__, str(e)[:160])复现缺 auto_gptqtry: from auto_gptq import GPTQModel except ImportError as e: print(需要安装:, e)五、解决方案第一层最小直接修复方案 1推荐反量化为 fp16 再训练。这是最稳的彻底绕开 exllama 与量化权重的问题import torch from transformers import AutoModelForCausalLM, AutoTokenizer # 用 auto_gptq 的加载入口关掉 exllama使用 eager 后端 from auto_gptq import GPTQModel gptq_model GPTQModel.from_pretrained( TheBloke/Llama-2-13B-chat-GPTQ, use_exllamaFalse, # 关键禁用推理内核 device_mapauto, ) # 反量化把伪量化权重提升到 fp16 fp16 gptq_model.to(torch.float16) # 保存为普通 fp16 模型之后按常规方式做 LoRA/全参微调 fp16.save_pretrained(./llama2-13b-chat-fp16) AutoTokenizer.from_pretrained(TheBloke/Llama-2-13B-chat-GPTQ)\ .save_pretrained(./llama2-13b-chat-fp16)之后用./llama2-13b-chat-fp16这个普通 fp16 模型挂 LoRA 训练就和训练任何标准 Llama-2 一样完全不涉及 exllama。方案 2直接从原始 fp16 基座开训更省事。如果只是为了微调 Llama-2-13B-chat根本不必碰 GPTQfrom transformers import AutoModelForCausalLM import torch model AutoModelForCausalLM.from_pretrained( meta-lllama/Llama-2-13b-chat-hf, # 原始 fp16无需反量化 torch_dtypetorch.bfloat16, device_mapauto, ) # 挂 LoRA 正常训练即可方案 3若坚持直接训练 GPTQ必须关 exllama 且装齐依赖pip install auto-gptq optimumfrom auto_gptq import GPTQModel model GPTQModel.from_pretrained( TheBloke/Llama-2-13B-chat-GPTQ, use_exllamaFalse, # 训练必须关 )但注意方案 3 训练的是量化权重本身效果通常不如方案 1/2仅在你显存极度紧张、必须原地训练时才考虑。六、解决方案第二层结构化改进把GPTQ 模型要不要反量化、用哪个后端、最终拿什么去训练收口成配置对象避免每次凭记忆拼参数。from dataclasses import dataclass from typing import Literal dataclass class GptqFinetuneLoadPolicy: gptq_repo: str TheBloke/Llama-2-13B-chat-GPTQ fp16_base: str meta-lllama/Llama-2-13b-chat-hf strategy: Literal[dequantize, use_fp16_base, train_gptq_inplace] dequantize use_exllama: bool False # 任何训练路径都必须 False dtype: str float16 def _torch_dtype(self): return {float16: __import__(torch).float16, bfloat16: __import__(torch).bfloat16}[self.dtype] def resolve_training_source(self) - str: # 返回真正用于训练的模型标识符 if self.strategy use_fp16_base: return self.fp16_base return self.gptq_repo def needs_dequantize(self) - bool: return self.strategy dequantize def build(self): import torch if self.strategy use_fp16_base: from transformers import AutoModelForCausalLM return AutoModelForCausalLM.from_pretrained( self.fp16_base, torch_dtypeself._torch_dtype(), device_mapauto) # dequantize 或 train_gptq_inplace 都要关 exllama from auto_gptq import GPTQModel model GPTQModel.from_pretrained( self.gptq_repo, use_exllamaFalse, device_mapauto) if self.strategy dequantize: return model.to(self._torch_dtype()) return model通过strategy一个字段切换三种路径且无论哪条训练路径都把use_exllama锁成False从配置上杜绝 Exllama 训练报错。七、解决方案第三层断言 / CI 守护把训练绝不使用 exllamaGPTQ 训练前依赖齐备做成断言。import pytest def test_training_never_uses_exllama(policy): assert policy.use_exllama is False, 训练路径必须禁用 exllama否则反向传播报错 def test_dequantize_requires_auto_gptq(policy): if policy.strategy in (dequantize, train_gptq_inplace): try: __import__(auto_gptq) except ImportError: pytest.fail(使用 GPTQ 模型必须安装 auto_gptq 与 optimum) def test_strategy_valid(policy): assert policy.strategy in (dequantize, use_fp16_base, train_gptq_inplace) def test_dtype_supported(policy): assert policy.dtype in (float16, bfloat16)把这些断言放进训练启动前的检查脚本能在真正加载大模型耗时又占显存之前就拦住exllama 没关 / 依赖没装的低级错误。八、排查清单遇到 Fine-tuning ...GPTQ... throws Exllama error认清 GPTQ 是推理格式exllama 内核只为前向优化不支持 backward训练必炸。训练前务必use_exllamaFalse任何 GPTQ 训练路径都必须禁用 exllama。装齐auto_gptq与optimum否则连 GPTQ 模型都加载不了ImportError。最稳方案反量化为 fp16 再训练或直接从原始 fp16 基座meta-llama/Llama-2-13b-chat-hf做 LoRA彻底绕开量化。不要对量化权重做全参微调梯度被量化误差稀释效果差且数值不稳。推理正常 ≠ 训练正常webui 跑得动只说明 exllama 推理 OK和训练无关。用配置对象锁死use_exllamaFalse与策略选择避免人为写错参数。九、小结微调 TheBloke 的 GPTQ 模型报 Exllama error根因是 GPTQ 默认的 exllama 推理内核不支持反向传播而训练必须 backward。解决思路分三层最稳的是先把 GPTQ 反量化为 fp16或从原始 fp16 基座开始再做 LoRA彻底脱离 exllama若坚持直接训练 GPTQ则必须use_exllamaFalse且装好auto_gptq/optimum但效果通常不如反量化方案。用GptqFinetuneLoadPolicy把策略 后端开关固化并保证任何训练路径都禁用 exllama这类问题就能在配置阶段消弭。
返回列表