Skip to content

Support Huawei NPU#2812

Open
xtuhcy wants to merge 1 commit intomodelscope:mainfrom
xtuhcy:patch-1
Open

Support Huawei NPU#2812
xtuhcy wants to merge 1 commit intomodelscope:mainfrom
xtuhcy:patch-1

Conversation

@xtuhcy
Copy link

@xtuhcy xtuhcy commented Feb 12, 2026

华为NPU适配方法

测试环境

NPU相关软件版本

  1. NPU驱动
    npu-smi 25.0.rc1.1 Version: 25.0.rc1.1
  2. CANN相关
  • ./Ascend-cann-toolkit_8.5.0_linux-aarch64.run --install
  • ./Ascend-cann-{npu-version}-ops_8.5.0_linux-aarch64.run --install # 请根据不同型号下载不同安装程序

依赖包安装

  1. pip install torch==2.8.0 pytorch-wpe pytorch-wavelets rotary-embedding-torch torch-complex torchaudio
  2. pip install torch_npu==2.8.0
  3. pip install funasr==1.3.1

代码修改

模型适配代码

修改 ~/funasr/auto/auto_model.py

try:
    import torch_npu
    npu_is_available = torch_npu.npu.is_available()
except ImportError:
    npu_is_available = False

build_model(**kwargs):
    ...
    or (device == "npu" and not npu_is_available)
    ...

测试验证代码

from funasr import AutoModel

model = AutoModel(
    model="iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
    disable_update=True,
    device="npu"
)

res = model.generate(
    input="https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav"
    hotword="达摩院 磨搭",
)
print(res)

# 华为NPU适配方法

## 测试环境

### NPU相关软件版本
1. NPU驱动
 npu-smi 25.0.rc1.1                               Version: 25.0.rc1.1
2. CANN相关
- ./Ascend-cann-toolkit_8.5.0_linux-aarch64.run --install
- ./Ascend-cann-{npu-version}-ops_8.5.0_linux-aarch64.run --install # 请根据不同型号下载不同安装程序

### 依赖包安装
1. pip install torch==2.8.0 pytorch-wpe pytorch-wavelets rotary-embedding-torch torch-complex torchaudio
2. pip install torch_npu==2.8.0
3. pip install funasr==1.3.1

## 代码修改
### 模型适配代码
修改 ~/funasr/auto/auto_model.py
```
try:
    import torch_npu
    npu_is_available = torch_npu.npu.is_available()
except ImportError:
    npu_is_available = False

build_model(**kwargs):
    ...
    or (device == "npu" and not npu_is_available)
    ...
```
### 测试验证代码
```
from funasr import AutoModel

model = AutoModel(
    model="iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
    disable_update=True,
    device="npu"
)

res = model.generate(
    input="https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav"
    hotword="达摩院 磨搭",
)
print(res)
```
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @xtuhcy, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request integrates support for Huawei NPU devices into the funasr library. It enables the system to detect the presence of an NPU and, if specified as the target device, will attempt to utilize it. In cases where an NPU is requested but not found, the system will gracefully revert to using the CPU, ensuring broader compatibility and robustness for users with Huawei NPU hardware.

Highlights

  • Huawei NPU Support: Introduced a mechanism to detect the availability of Huawei NPU devices using torch_npu.
  • Device Fallback Logic: Modified the build_model function to automatically fall back to CPU if 'npu' is specified as the device but a Huawei NPU is not detected or available.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • funasr/auto/auto_model.py
    • Added torch_npu import and a try-except block to check for NPU availability.
    • Updated the build_model function to include a condition for NPU device unavailability, causing a fallback to CPU.
Activity
  • No specific activity (comments, reviews, etc.) has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

此拉取请求增加了对华为NPU的支持。主要修改是在 funasr/auto/auto_model.py 中添加了对 torch_npu 的可用性检查,当用户指定使用 'npu' 设备但环境不可用时,会自动回退到 'cpu' 设备。代码修改方向正确,但我提出了一些重构建议以提高代码质量和一致性:将NPU可用性检查封装到一个函数中,以实现懒加载并与其他设备检查方式保持一致,并在设备检查逻辑中调用这个新函数。这些修改将使代码更易于维护和理解。

Comment on lines +32 to +36
try:
import torch_npu
npu_is_available = torch_npu.npu.is_available()
except ImportError:
npu_is_available = False
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

为了与 torch.cuda.is_available() 等检查保持一致性,并提高代码的封装性,建议将NPU可用性检查封装在一个函数中。这样可以避免在模块加载时就尝试导入 torch_npu,只在需要时执行检查。请在 build_model 方法中也相应地调用此函数。

Suggested change
try:
import torch_npu
npu_is_available = torch_npu.npu.is_available()
except ImportError:
npu_is_available = False
def is_npu_available():
"""检查NPU是否可用。"""
try:
import torch_npu
return torch_npu.npu.is_available()
except ImportError:
return False

if ((device =="cuda" and not torch.cuda.is_available())
or (device == "xpu" and not torch.xpu.is_available())
or (device == "mps" and not torch.backends.mps.is_available())
or (device == "npu" and not npu_is_available)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

为了与建议的 is_npu_available() 函数保持一致,请在此处调用该函数进行检查。

Suggested change
or (device == "npu" and not npu_is_available)
or (device == "npu" and not is_npu_available())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant