Qwen 推理报缺少 flash_atten 依赖包怎么办

👁 75 次阅读

Qwen 推理报缺少 flash_atten 依赖包怎么办

来源链接:https://github.com/QwenLM/Qwen/issues/12

现象描述

按照 README 里的加载 model 代码运行 Qwen 推理时,加载环节直接抛出依赖缺失错误,报错信息为:
This modeling file requires the following packages that were not found in your environment: flash_atten
该问题的触发位置在 Hugging Face 模型目录中自带的 modeling_qwen.py,该文件内部引用了 flash_atten。issue 发起人仅描述为”如题”,后续讨论围绕这个报错展开,issue 最终状态为 closed,关闭原因为 completed,关闭时间 2023-08-07。

背景原因

维护者 logicwong 在 issue 中的定位是:flash-attn 并非 Qwen 推理的必需依赖,但推荐安装,理由是”可以节省显存和提升推理速度”。 针对报错中出现的 flash_atten 这一名字,维护者 logicwong 提出疑问: > flash_atten 这个名字也很奇怪,要报错的话应该也得报 flash_attn 才对吧。 也就是说,异常信息中的包名与社区通用包名 flash-attn / flash_attn 不一致,这一点在讨论中未被单独解释清楚。据 issue 讨论,后续有用户反馈该问题实际与 transformers 版本相关,而非真的缺少某个名为 flash_atten 的包。 硬件层面存在硬性限制。用户 Michael-Steven 引用 flash-attention 仓库 issue 的说明(链接见 https://github.com/Dao-AILab/flash-attention/issues/292#issuecomment-1614741373): > 只有 Turing (sm75), Ampere (sm80, 86, 89) and Hopper (sm90) 架构的卡可以用 Flash-attention 这意味着 V100 等不在上述列表中的显卡无法使用 flash-attention,相关用户在 issue 中表达了无奈,例如 lucasjinreal 评论”可能 v100 用户是被上帝遗弃的”,yangtianyu92 也再次确认了这一限制。

排查或量化方法

据 issue 讨论,可按以下顺序判断自己属于哪一类:
  • 确认报错字符串是否确实为 flash_atten,与标准包名 flash_attn / flash-attn 区分。
  • 检查当前安装的 transformers 版本。多位用户在讨论中提到,老版本 transformers 会触发该依赖校验报错。
  • 检查显卡所属架构是否在支持列表内。Turing (sm75)、Ampere (sm80, 86, 89)、Hopper (sm90) 之外架构的显卡无法使用 flash-attention。
  • 如果决定安装 flash-attn,需确认 Python 版本与构建环境能否成功编译,讨论中有用户反馈在 Python 3.8 / 3.10 下安装失败。

完整解决方案(含必要代码)

讨论中给出了两条互相独立、且并不互斥的处理路径,均来自 issue 参与者的实际反馈,并非官方声明的修复。 路径一:升级 transformers。据 issue 讨论,将 transformers 升级到 4.31.0 可以绕开该报错,且不需要安装 flash-attn 也能正常跑。用户在讨论中写道: > 之前这个问题是transformers老版本的问题,用最新的transformers 4.31.0可以fix掉,不用flash-attn也可以正常跑。 同时另一位用户在复述该结论时也确认: > 实测transformers换成4.31.0可以fix这个问题,不需要安装fla(flash-attn) 路径二:安装正确的 flash-attn。据 issue 讨论,有用户反馈在安装正确的 flash-attn 之后解决了该问题: > 这个问题我安装正确的flash-attn之后解决掉了。 维护者针对 V100 等无法使用 flash-attention 的场景,给出了手动打开 fp16 精度加载模型的写法。logicwong 表示”刚刚更新了config.json,你可以手动打开fp16精度加载模型”:
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B", device_map="auto", trust_remote_code=True, fp16=True).eval()

参数或对比表格

处理路径具体做法适用场景来源
升级 transformers升级到 4.31.0不安装 flash-attn 也可正常推理据 issue 讨论
安装 flash-attn安装正确的 flash-attn需要节省显存、提升推理速度据 issue 讨论
fp16 手动加载fp16=True + trust_remote_code=TrueV100 等不支持 flash-attention 的卡维护者评论
显卡架构是否支持 Flash-attention
Turing (sm75)支持
Ampere (sm80, 86, 89)支持
Hopper (sm90)支持
其它(如 V100)不支持
flash-attention 的架构限制来自 Dao-AILab/flash-attention 仓库的说明,由用户 Michael-Steven 在讨论中引用。

常见错误排查

  • 报错字符串是 flash_atten 而非 flash_attn:讨论中维护者对此命名表示疑惑,但未被单独解释,建议按 transformers 版本路径优先排查。
  • 安装 flash-attn 构建失败:有用户反馈在 Python 3.8 / 3.10 下报错 Running setup.py clean for flash-attn、Failed to build flash-attn、ERROR: Could not build wheels for flash-attn, which is required to install pyproject.toml-based projects,该用户在 issue 中追问是否有其他人遇到同样问题,讨论中未给出该构建失败的解决方案。
  • V100 等旧架构卡无法使用 flash-attention:属于架构层面的限制,需改用 fp16 手动加载的方式绕开。
  • 升级 transformers 到 4.31.0 后是否仍报错:讨论中未出现按此版本升级后仍失败的反馈,也没有维护者对该版本的官方确认。
  • 更换精度加载后推理速度下降:flash-attn 的收益在于节省显存与提升推理速度,改用 fp16 加载牺牲的正是这部分收益,这是取舍而非故障。

实践建议

结合 issue 讨论,可按显卡架构分流处理:
  • 使用 Turing / Ampere / Hopper 架构显卡,且对显存占用与推理速度有要求的场景,可尝试安装 flash-attn;安装前先确认 Python 环境能成功编译该包。
  • 使用 V100 等不支持 flash-attention 的显卡,直接采用维护者给出的 fp16=True 加载写法,不必在 flash-attn 安装上耗费时间。
  • 无论何种显卡,若只是希望跑通推理,可先尝试将 transformers 升级到 4.31.0,据 issue 讨论该版本可绕开缺少 flash_atten 的报错。
需要说明的是,issue 关闭原因为 completed,但讨论中并未出现维护者明确回复”已复现并给出修复版本号”的记录。已确认修复的说法均来自参与讨论的普通用户,属于社区结论,不构成官方对具体修复版本的确认。

FAQ

Q:flash_atten 是必须安装的依赖吗? A:不是。维护者 logicwong 明确回复”不是必须的。但推荐安装,可以节省显存和提升推理速度”。 Q:不安装 flash-attn 能不能跑 Qwen 推理? A:据 issue 讨论可以。将 transformers 升级到 4.31.0 后,不用 flash-attn 也能正常跑。 Q:为什么报错里的包名是 flash_atten 而不是 flash_attn? A:维护者在讨论中也提出了同样的疑问,认为”要报错的话应该也得报 flash_attn 才对吧”,该命名差异在 issue 中未被单独解释。 Q:V100 显卡为什么装不上 flash-attention? A:用户 Michael-Steven 引用 flash-attention 仓库说明指出,只有 Turing (sm75)、Ampere (sm80, 86, 89) and Hopper (sm90) 架构的卡可以用 Flash-attention,V100 不在此列。替代方案是使用维护者给出的 fp16=True 手动加载写法。 Q:升级到 transformers 4.31.0 会带来什么副作用? A:issue 讨论中未提及该版本的副作用,也没有维护者对 4.31.0 这一结论作出官方确认,属于社区实测反馈。 Q:安装 flash-attn 时构建失败怎么办? A:讨论中有用户在 Python 3.8 / 3.10 下遇到 Failed to build flash-attn 与 ERROR: Could not build wheels for flash-attn 报错,但该问题在 issue 中未获得解答,可考虑改走 transformers 版本路径。

订阅 AI 百事知

每周精选 AI 工具评测、行业资讯与使用教程,第一时间送达。

🔗 相关阅读(你可能还想看)

📄 Outlook 节点创建草稿添加附件为何报 UnableToDeserializePostBody?
📄 Flowise 点击市场或聊天页为何整页白屏?
📄 如何解决 Azure AI Search 向量存储的 $filter 递归深度超限错误?
📄 如何解决 shadcn/ui Sidebar 与 Header 重叠的问题?
📄 Next.js 开发服务器为何会 JavaScript heap out of memory?
📄 Nuxt 偶发 Cannot read properties of undefined 报错是怎么回事
📄 如何解决「Visual Studio Code for ipad」相关的问题?
📄 如何在AutoGen中实现企业级代理治理的加密行动收据(AAR)?
📄 记忆内容未清洗直接注入系统提示词,如何防范间接提示注入?
crewAI LiteAgent 将记忆内容直接拼接到系统提示词,存在间接提示注入风险。社区提出分层防御方案,但 iss
🤖 想直接和 AI 对话?
免费体验 DeepSeek V4 等顶级模型,无需注册,随问随答
🎯 立即体验 AI 工具

发表评论

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

🤖 嘟嘟客服
滚动至顶部
🤖 嘟嘟客服
🤖 嘟嘟客服
';i.value='';m.innerHTML+='
...
';fetch('/dify-chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({query:q,user:'w'+Date.now()})}).then(function(r){return r.json()}).then(function(d){var a=d.answer||'暂时无法回复';m.removeChild(m.lastChild);m.innerHTML+='
'+a+'
'}).catch(function(){m.removeChild(m.lastChild);m.innerHTML+='
网络异常
'})">发送