已关闭
[Bug]: 在没有npu的环境下import mindiesd报错 #85
changetheway创建于  4月16日关闭于  5月25日
changetheway成员
4月16日 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

  • CANN软件版本:8.5
  • torch:2.9.0
  • torch_npu:2.9.0

🐛 问题描述

File "/workspace/MindIE-SD/mindiesd/init.py", line 35, in
from .layers import (
File "/workspace/MindIE-SD/mindiesd/layers/init.py", line 18, in
from .adalayernorm import layernorm_scale_shift
File "/workspace/MindIE-SD/mindiesd/layers/adalayernorm.py", line 21, in
npu_device = get_npu_device()
^^^^^^^^^^^^^^^^
File "/workspace/MindIE-SD/mindiesd/utils/get_platform.py", line 28, in get_npu_device
soc = torch_npu.npu.get_device_name()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/torch_npu/npu/init.py", line 468, in get_device_name
if device_id < 0 or device_id >= device_count():
^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'NoneType' and 'int'

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
Cchangetheway成员
4月16日 添加了label:bug
Cchangetheway成员
4月16日 关联了pull request:修复bug
changetheway成员
5月7日 评论:

根因分析

从错误堆栈可以看出,问题发生在 mindiesd/utils/get_platform.py:28 的 get_npu_device() 函数中:

  1. adalayernorm.py:21 在模块导入时立即调用 get_npu_device()
  2. get_npu_device() 调用 torch_npu.npu.get_device_name()
  3. torch_npu 的 get_device_name() 内部对 device_id 做了 device_id < 0 的检查
  4. 在无 NPU 环境下,device_id 为 None,导致 TypeError: '<' not supported between instances of 'NoneType' and 'int'

本质原因:代码在导入阶段就尝试获取 NPU 设备信息,且未处理无 NPU 设备的降级场景。get_npu_device() 没有先检查 torch_npu.npu.is_available() 或捕获异常,而是直接调用 get_device_name()。

建议修复方向:

  • 在 get_npu_device() 中先判断 NPU 是否可用(torch_npu.npu.is_available()),不可用则返回 None 或默认值
  • 或在 adalayernorm.py 中将 npu_device 的获取改为惰性加载(lazy initialization),避免模块导入时立即执行
  • torch_npu 侧也可以增强 get_device_name() 对 None 入参的兼容性
likedislike
Cchangetheway成员
5月7日 将 changetheway 设为负责人
Cchangetheway成员
5月7日 将 AtlasAccount 设为负责人
Cchangetheway成员
5月7日 移除了负责人 changetheway
changetheway成员
5月7日 评论:

@changetheway 请跟进此 Issue,负责修复无 NPU 环境下 import 报错的问题。

likedislike
changetheway成员
5月7日 评论:

Issue 自动评审结果

分类

  • 类型: Bug
  • 优先级: Medium
  • 建议标签: bug, compatibility

问题根因分析

在无 NPU 环境下导入 mindiesd 时报错,错误发生在 get_platform.py 第 28 行的 get_npu_device() 函数。

根因: torch_npu.npu.get_device_name() 在无 NPU 设备时返回 None,代码未处理 device_id 为 None 的情况,导致 TypeError。

排查方向

  1. 检查 get_platform.py 中的 get_npu_device() 函数实现
  2. 添加对 torch_npu.npu.is_available() 的前置检查
  3. 考虑在无 NPU 环境下提供 fallback 实现

优化建议

添加 NPU 可用性检查后再调用 get_device_name()。

推荐责任人

@AtlasAccount(已被分配)

相关 Issue

可能与 #71 编译安装问题相关,建议一并考虑纯 CPU 环境的支持。

likedislike
changetheway成员
5月7日 评论:

PR 关联

发现相关 PR 可以解决此问题:

此 PR 直接针对本 Issue 描述的问题提供了修复方案。

likedislike
changetheway成员
5月11日 评论:

🤖 【AI 自动分析】

感谢提交此 Bug 报告!我是 AI 助手,已将此 Issue 分类为 bug 类型并添加 ai-triaged 标记。


🔍 根因分析

问题核心:在没有 NPU 的环境下导入 mindiesd 时,torch_npu.npu.get_device_name() 返回 None,导致类型比较 None < 0 失败。

错误堆栈:

File "/workspace/MindIE-SD/mindiesd/layers/adalayernorm.py", line 21
    npu_device = get_npu_device()
                 ^^^^^^^^^^^^^^^^
File "/workspace/MindIE-SD/mindiesd/utils/get_platform.py", line 28
    soc = torch_npu.npu.get_device_name()
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/torch_npu/npu/__init__.py", line 468
    if device_id < 0 or device_id >= device_count():
       ^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'NoneType' and 'int'

根本原因:

  1. get_npu_device() 函数在没有 NPU 环境中未做空值检查
  2. torch_npu.npu.get_device_name() 在没有 NPU 时返回 None
  3. 调用方直接使用返回值进行整数比较

🛠 排查方向

  1. 确认环境:

    # 检查 NPU 是否可见
    npu-smi 2>/dev/null || echo "No NPU found"
    
    # 检查 torch_npu 安装
    pip show torch_npu
    
  2. 环境变量检查:

    echo $ASCEND_VISIBLE_DEVICES
    
  3. 临时解决方案:

    • 设置环境变量模拟 NPU 存在
    • 或在无 NPU 机器上使用 CPU 开发测试

💡 优化建议

  1. 优雅降级(高优先级):

    # get_platform.py 修改建议
    def get_npu_device():
        try:
            device_count = torch_npu.npu.device_count()
            if device_count == 0:
                return None
            device_id = os.getenv("ASCEND_VISIBLE_DEVICES", "0")
            return torch_npu.npu.set_device(device_id)
        except Exception:
            return None
    
  2. 懒加载:

    • 将 mindiesd/layers/__init__.py 中的导入改为延迟加载
    • 只在真正使用 NPU 功能时才导入
  3. 环境检测:

    def is_npu_available():
        try:
            return torch_npu.npu.device_count() > 0
        except:
            return False
    

📎 关联 PR 分析

暂无直接关联的 PR。建议维护者:

  1. 确认此问题是否在 PR #217 或 PR #247 中已修复
  2. 检查 mindiesd/utils/get_platform.py 的最新实现

⚠️ 确认请求:

  1. 当前使用的是 pip 安装还是源码安装的 mindiesd?
  2. 是否有 NPU 驱动已安装但未正确识别?

本分析由 AI 自动生成,如有问题请指正

likedislike
changetheway成员
5月11日 评论:

🤖 【AI 关联分析】

发现 PR #255 (修复bug:TypeError: '<' not supported between instances of 'NoneType' and 'int') 可能与本 Issue 相关。
该 PR 状态:Open,目标分支:dev。
建议维护者确认关联关系。


本分析由 AI 助手自动生成

likedislike
changetheway成员
5月11日 评论:

🤖 【AI 自动回复】

感谢提交此 Bug 报告!

Bug 类型 Issue 深度分析

根因分析

根据您提供的错误堆栈,问题发生在 mindiesd/utils/get_platform.py 第28行的 get_npu_device() 函数中。错误信息:

TypeError: '<' not supported between instances of 'NoneType' and 'int'

根因定位:

  1. 在没有 NPU 的环境中,torch_npu.npu.device_count() 返回 None
  2. 代码未对 device_count() 返回值进行空值检查就直接与 0 比较
  3. 模块在 __init__.py 中是顶层导入,缺少容错机制

排查方向

  1. 环境检查:

    • 确认运行环境是否有 NPU 设备:npu-smi 或 ascend-smz
    • 检查 torch_npu 版本与驱动兼容性
  2. 临时解决方案:
    在导入前设置环境变量跳过 NPU 检查,或使用延迟导入

  3. 代码修复建议:
    在 mindiesd/utils/get_platform.py 中添加空值保护,对 device_count() 返回值进行 None 检查

优化建议

  1. 延迟导入:将 NPU 相关导入延迟到实际使用时
  2. 优雅降级:在无 NPU 环境下提供纯 CPU 回退路径
  3. 友好提示:给出明确的安装/环境配置指导

⚠️ Token 安全提醒:请勿在公开评论中暴露任何 API Token 或内部路径信息。

已收到您的报告,维护团队将尽快评估修复方案。如有补充信息(操作系统完整版本、环境变量配置等),请追加到 Issue 中。

likedislike
changetheway成员
5月11日 评论:

关联分析

关联分析:发现 PR #284 (代码质量门禁对齐Ascend社区统一标准) 可能与本 Issue 相关。

该 PR 状态:merged,目标分支:dev。

关联说明:

  • PR #284 将 pre-commit 开源代码检查工具替换为 Ascend 社区统一规范
  • 此变更可能涉及依赖管理和环境配置,有助于改善无 NPU 环境下的导入问题

建议维护者确认关联关系,评估是否需要进一步优化环境检测机制。

likedislike
changetheway成员
5月11日 评论:

您好!我是 AI 评审助手。

感谢您提交的 Bug 报告,本 Issue 已标记为 bug 和 ai-triaged。

深度分析:

根因定位:
错误发生在 mindiesd/utils/get_platform.py:28 的 get_npu_device() 函数中。当没有 NPU 环境时,torch_npu.npu.get_device_name() 内部的 device_count() 返回 None,导致与 int 类型比较时抛出 TypeError。

排查方向:

  1. device_count() 在无 NPU 环境下返回 None 而非 0
  2. get_npu_device() 在模块导入时即被调用,未做环境检查
  3. __init__.py 中直接导入 layers 模块,触发级联初始化

优化建议:

  1. 在 get_platform.py 中添加 NPU 环境预检
  2. 对 device_count() 返回值进行类型检查
  3. 可参考 torch.cuda.is_available() 模式实现 NPU 可用性检测
  4. 使用延迟导入 (lazy import) 避免顶层初始化失败

临时解决方案:

import os
os.environ['FORCE_NPU_AVAILABLE'] = '1'  # 或设置正确的 NPU 可见性

感谢您的报告,这将帮助我们改进非 NPU 环境的兼容性!

likedislike
changetheway成员
5月11日 评论:

关联分析:发现 PR #255 可能与本 Issue 相关。
该 PR 状态:open,目标分支:dev。
PR 内容:[Bugfix] 移除 pyproject.toml 动态依赖声明并修复 get_platform 平台检测逻辑。
PR 描述中明确指出:

  • 问题原因:在 import mindiesd 时会触发 get_npu_device() 接口的调用,在没有 npu 的环境下该函数内部调用的 torch_npu.npu.get_device_name() 会报错
  • 解决方案:加入是否有 npu 设备的判断条件和容错机制

建议维护者确认关联关系并加速该 PR 的审查进度。

likedislike
changetheway成员
5月11日 评论:

🤖 AI 评审

感谢提交此 Bug 报告!

问题分类: Bug

初步分析:
错误发生在 get_platform.py 中 torch_npu.npu.get_device_name() 返回 None 后与整数比较时抛出 TypeError。

根因分析:

  1. 在没有 NPU 的环境中,torch_npu 可能未正确初始化
  2. get_device_name() 返回 None 而不是抛出异常
  3. 代码未对此情况进行保护

排查方向:

  1. 建议在 import 时增加环境检测
  2. 可以参考 PR #255 中的平台检测逻辑修复

关联分析:
发现 PR #255 (移除 pyproject.toml 动态依赖声明并修复 get_platform 平台检测逻辑) 可能与本 Issue 直接相关。
该 PR 状态:open,目标分支:dev
建议维护者确认此 PR 是否已解决您的问题。


此评论由 AI 自动生成

likedislike
changetheway成员
5月11日 评论:

🤖 【AI自动分析】

感谢提交此问题!

分类标签: 已有 bug 标签


🔍 深度分析

问题描述

在没有 NPU 的环境下 import mindiesd 报错

根因分析

  1. 直接原因: mindiesd 在导入时会尝试初始化 NPU 相关组件,在无 NPU 环境下会失败

  2. 可能场景:

    • 开发/测试环境没有 NPU 硬件
    • CI/CD 环境未配置 NPU
    • 用户想在没有硬件的机器上进行代码开发
  3. 代码层面:

    • 可能是 __init__.py 或 torch_npu_helper 相关模块在导入时强制检查 NPU 可用性

优化建议

  1. 优雅降级: 建议在导入时增加 NPU 可用性检查,无 NPU 时给出友好提示而非报错
  2. 条件导入: 将 NPU 特定代码放在延迟导入或条件导入中
  3. 文档说明: 在 README 中明确说明无 NPU 环境的使用限制

本评论由 AI 自动生成,仅供参考。

likedislike
吴铭泾吴铭泾成员
5月25日 关闭了 issue
吴铭泾吴铭泾成员
5月25日 重新打开了 issue
吴铭泾吴铭泾成员
5月25日 issue状态由 TODO 改变为 DONE
吴铭泾吴铭泾成员
5月25日 关闭了 issue
ascend-robotascend-robot成员
5月26日 添加了label:resolved
lijinxilijinxi成员
8月31日 关联了看板:MindIE-SD