👁 74 次阅读
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=True | V100 等不支持 flash-attention 的卡 | 维护者评论 |
| 显卡架构 | 是否支持 Flash-attention | ||
| Turing (sm75) | 支持 | ||
| Ampere (sm80, 86, 89) | 支持 | ||
| Hopper (sm90) | 支持 | ||
| 其它(如 V100) | 不支持 |
常见错误排查
- 报错字符串是
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 的报错。
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 版本路径。
🔗 相关阅读(你可能还想看)
📄 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