ValueError: SiglipVisionModel does not support `device_map=’auto’`

该报错通常出现在使用 Hugging Face Transformers 加载 BERT 系列模型并同时指定 device_map='auto' (例如配合 load_in_8bit=True 进行量化推理)时。优先排查方向是确认模型权重是否能被自动切分到多设备,以及是否可通过关掉 device_m

快速结论:该报错通常出现在使用 Hugging Face Transformers 加载 BERT 系列模型并同时指定 device_map='auto'(例如配合 load_in_8bit=True 进行量化推理)时。优先排查方向是确认模型权重是否能被自动切分到多设备,以及是否可通过关掉 device_map 参数来解决。

适用环境:Hugging Face Transformers 库,模型类型为 BertForSequenceClassification 或相关 BERT 模型。Issue 中未明确提及操作系统、Python 版本、CUDA 或显卡型号。

最快修复方案:暂无确认的一步修复方案。Issue 维护者明确指出这是当前 BERT 模型不支持该功能的已知限制,需要修改库代码才能支持。

注意事项:社区维护者建议的代码改动方法(添加 _no_split_modules 属性)仍处于提 PR 讨论阶段,尚未在 Issue 中被验证为可直接使用的解决方案。如果您只是想加载模型而非参与开发,建议先移除 device_map='auto' 参数,改用单设备加载。

问题场景

用户在本地训练了一个 BERT 模型,随后尝试通过 Hugging Face Transformers 加载并量化该模型(8-bit 量化),在调用 AutoModelForSequenceClassification.from_pretrained() 并传入 device_map='auto'load_in_8bit=True 时,触发了这一报错。

报错原文

ValueError: SiglipVisionModel does not support `device_map='auto'`

注:虽然 Issue 标题是 BERT 模型报错,但讨论中维护者提到完整报错信息应为:

BertForSequenceClassification not support `device_map="auto"`. To implement support, the model class needs to implement the `_no_split_modules` attribute.

原因分析

可能是 Transformers 库在加载模型时会根据模型的某些属性来决定是否能将不同层分配到不同 GPU 上。device_map='auto' 依赖模型中的 _no_split_modules 属性来确定哪些模块不可拆分(例如包含 skip connection 的层)。BERT 系列模型目前尚未实现该属性,因此库直接拒绝了自动设备映射请求。

这一点在 Issue 评论中由维护者确认:“BERT models don’t support the use of device_map=xxx yet”,并提出需要为 BERT 模型添加 _no_split_modules 属性才有望支持该功能。

环境排查

  • 确认您使用的 Transformers 库版本(建议升级到最新版,但请注意在本次 Issue 讨论时该问题仍未被修复)。
  • 确认模型类型是否为 BertForSequenceClassification 或相关 BERT 变体。
  • 如计划参与代码修复,请检查是否存在多 GPU 环境以及 accelerate 库版本。

解决步骤

  1. 如果是普通用户,可优先尝试直接在加载模型时移除 device_map='auto' 参数,只保留 load_in_8bit=True,让模型加载到默认设备(一般为主 GPU 或 CPU)。
  2. 如果确实需要多 GPU 加载,可尝试手动指定 device_map 为一个明确的设备映射字典,而不是使用 'auto' 字符串。
  3. 如果您打算为 Transformers 贡献代码以解决该问题,可参考维护者在 Issue 评论中的指引:
    1. 在 BERT 模型定义的类中实现 _no_split_modules 属性。
    2. 该属性需要列出包含跳连接(skip connection)的模块名称(例如 "BertEmbeddings" 等),参考 RoBERTa 相应实现。
    3. 使用 infer_auto_device_map 指定一个空的 no_split_module_classes 来检查模块分配情况,再找出哪些模块不能拆分。
    4. 完成后在 1 张和 2 张 GPU 上分别运行 accelerate 测试以验证映射是否生效。

验证方法

修复或绕过该问题后,重新运行 model = AutoModelForSequenceClassification.from_pretrained(),如果模型能正常加载且没有抛出类似“不支持 device_map”的报错信息,即为已解决。

参考来源

huggingface/transformers #25296

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20080

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注