NPU上运行onnxruntime

举报
zjun 发表于 2025/03/10 19:36:53 2025/03/10
【摘要】 ## 1 问题背景在Ascend环境上,使用onnxruntime推理时,报错:```bash/onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1193 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : ...

## 1 问题背景

在Ascend环境上,使用onnxruntime推理时,报错:

```bash
/onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1193 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so 
with error: libcudart.so.11.0: cannot open shared object file: No such file or directorys
```

显示的是cuda的组件找不到。由于是Ascend环境,肯定是没有GPU的,很明显是onnxruntime的包装错了。

```bash
pip show onnxruntime-gpu
```

通过如上命令,可以看到环境上确实安装的是gpu版本的。这里先**卸载**onnxruntime-gpu。

## 2 解决办法

通过查找onnxruntime社区,可以发现npu已经对onnxruntime进行了适配,参考如下文档:
[onnxruntime/docs/execution-providers/community-maintained/CANN-ExecutionProvider.md at gh-pages · microsoft/onnxruntime](https://github.com/microsoft/onnxruntime/blob/gh-pages/docs/execution-providers/community-maintained/CANN-ExecutionProvider.md)
那么该如何才能构建onnxruntime适配Ascend上的whl包呢?
这里提供源码构建的办法:

### 2.1 克隆源码

git clone https://github.com/microsoft/onnxruntime.git
cd onnxruntime
### 2.2 构建whl包
注意**--use_cann**参数

```bash
# 先初始化CANN环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
 
# 执行build脚本
./build.sh --config Release --build_shared_lib --parallel --use_cann --build_wheel
若构建成功,whl包会生成在build/Linux/Release/dist/目录下。安装onnxruntime-cann
pip3 install onnxruntime_cann-x.xx.x-xxxx-xxxxx-xxxxx_xxx_xx.whl
```

## 3 推理示例

```bash
import numpy as np
import onnxruntime as ort
 
# 模型路径
model = "./resnet34.onnx"
 
# 以CANN作为EP的配置,参数说明可见:https://github.com/microsoft/onnxruntime/blob/gh-pages/docs/execution-providers/community-maintained/CANN-ExecutionProvider.md
providers = [
    ("CANNExecutionProvider", {
        "device_id": 0,                                 
        "arena_extend_strategy": "kNextPowerOfTwo",     
        "npu_mem_limit": 4 * 1024 * 1024 * 1024,
        "enable_cann_graph": True,
    }),
]
 
# options可以用来对推理session进行配置,例如开启profiling功能
options = ort.SessionOptions()
 
# 创建推理session
session = ort.InferenceSession(model, providers=providers, sess_options=options)
 
# 构造纯推理数据
ndata = np.zeros([1, 3, 224, 224], dtype=np.float32)
 
# 执行推理
session.run(["class"], {"image": ndata}])
```

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。