昇腾开发板 pyACL 快速入门(tbc)

更新-260422 | 发布-260422

本文档描述 昇腾开发板 AscendCL 应用开发指南(Python)快速入门。

pyACL(Python Ascend Computing Language)是一套在AscendCL的基础上使用CPython封装得到的Python API库,使用户可以通过Python进行昇腾AI处理器的运行管理、资源管理等,实现在昇腾CANN平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。

参考资料:昇腾pyACL↗

目录


搭建环境

新建用户

用 root 用户创建新用户 gdv2:

adduser --home /home/gdv2 --shell /bin/bash gdv2

并把 gdv2 加入 HwHiAiUser 组:

adduser gdv2 HwHiAiUser
  1. 问题的根源在于对硬件设备文件的访问权限不足。将用户加入HwHiAiUser组,这是最安全、规范的永久性解决方案。HwHiAiUser 是昇腾CANN平台安装时创建的专用用户组,拥有访问 /dev/davinci_manager 等硬件设备文件的权限。
  1. sudo 方式不一定能把环境变量带入。虽然有权限访问硬件设备文件,但还是报错说找不到 acl。

并把 gdv2 加入 sudo 组:(可选,主要是方便执行 apt 等)

adduser gdv2 sudo

设置环境变量

在安装完CANN软件包之后,请务必自行配置以下环境变量,否则,将无法正常使用“import acl”。设置完环境变量后,在Python脚本中加入“import acl”,就可以使用pyACL中的函数了。

在创建的 gdv2 用户的 .bashrc 文件最后,增加一行:

source /usr/local/Ascend/ascend-toolkit/set_env.sh

增加完成后,执行 source .bashrc

测试 acl

用 gdv2 用户执行:

import acl
print("hello world!")

创建 Python 虚拟环境

在创建的 gdv2 用户的 .bashrc 文件最后,增加一行:

export PATH="/usr/local/miniconda3/bin:$PATH"

gdv2@davinci-mini:~$ conda activate pyacl 提示信息如下: ```bash
CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’.
To initialize your shell, run

$ conda init <SHELL_NAME>

Currently supported shells are:

  • bash
  • fish
  • tcsh
  • xonsh
  • zsh
  • powershell

See ‘conda init –help’ for more information and options.

IMPORTANT: You may need to close and restart your shell after running ‘conda init’.


按提示执行

```bash
gdv2@davinci-mini:~$ conda init bash
no change     /usr/local/miniconda3/condabin/conda
no change     /usr/local/miniconda3/bin/conda
no change     /usr/local/miniconda3/bin/conda-env
no change     /usr/local/miniconda3/bin/activate
no change     /usr/local/miniconda3/bin/deactivate
no change     /usr/local/miniconda3/etc/profile.d/conda.sh
no change     /usr/local/miniconda3/etc/fish/conf.d/conda.fish
no change     /usr/local/miniconda3/shell/condabin/Conda.psm1
no change     /usr/local/miniconda3/shell/condabin/conda-hook.ps1
no change     /usr/local/miniconda3/lib/python3.9/site-packages/xontrib/conda.xsh
no change     /usr/local/miniconda3/etc/profile.d/conda.csh
modified      /home/gdv2/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

执行完成后,conda 在 .bashrc 中增加了

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/usr/local/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/usr/local/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/usr/local/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/usr/local/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

重新登录 gdv2,再执行如下命令激活新创建的 pyacl 虚拟环境:

conda activate pyacl

按文档要求,在虚拟环境 pyacl 中安装 Python 包:

pip3 install pillow numpy

有一些警告,但不影响使用 pillow 和 numpy。可执行以下命令检查是否干净:

(pyacl) gdv2@davinci-mini:~$ pip3 check
op-compile-tool 0.1.0 requires getopt, which is not installed.
op-compile-tool 0.1.0 requires inspect, which is not installed.
op-compile-tool 0.1.0 requires multiprocessing, which is not installed.
op-test-frame 0.1 is not supported on this platform
te 0.4.0 is not supported on this platform

创建代码目录

依次执行以下命令,创建目录,并下载图片和模型:

# 创建目录
mkdir -p $HOME/first_app/data
mkdir -p $HOME/first_app/model

# 下载图片和模型
cd $HOME/first_app/data
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg
cd $HOME/first_app/data
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg
cd $HOME/first_app/model  
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/resnet50/resnet50.onnx

模型转换,对于开源框架的模型,不能直接在昇腾AI处理器上进行推理,需要使用ATC(Ascend Tensor Compiler)工具将开源框架的网络模型转换为适配昇腾AI处理器的离线模型(.om文件)。 执行以下命令,将原始模型转换为昇腾AI处理器能识别的.om模型文件。请注意,执行命令的用户需具有命令中相关路径的可读、可写权限。

atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224"  --soc_version=Ascend310B4
(pyacl) gdv2@davinci-mini:~$ sudo npu-smi info
[sudo] password for gdv2: 
+--------------------------------------------------------------------------------------------------------+
| npu-smi 23.0.rc3                                 Version: 23.0.rc3                                     |
+-------------------------------+-----------------+------------------------------------------------------+
| NPU     Name                  | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
| Chip    Device                | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
+===============================+=================+======================================================+
| 0       310B4                 | OK              | 7.2          37                15    / 15            |
| 0       0                     | NA              | 0            1797 / 3513                             |
+===============================+=================+======================================================+

如果无法确定当前设备的soc_version,则在安装NPU驱动包的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的soc_version值为Ascendxxxyy。

atc 报错 numpy Failed to import Python module [AttributeError: np.float_ was removed in the NumPy 2.0 release. Use np.float64 instead..].

pip3 install "numpy<2.0"

Failed to import Python module [ModuleNotFoundError: No module named ‘sympy’.].

pip3 install sympy
atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224"  --soc_version=Ascend310B4
ATC start working now, please wait for a moment.
<frozen importlib._bootstrap>:914: ImportWarning: TEMetaPathFinder.find_spec() not found; falling back to find_module()
<frozen importlib._bootstrap>:914: ImportWarning: TEMetaPathFinder.find_spec() not found; falling back to find_module()
<frozen importlib._bootstrap>:671: ImportWarning: TBEMetaPathLoader.exec_module() not found; falling back to load_module()
...
...
ATC run success, welcome to the next use.

准备环境

conda create -n pyacl39 python=3.9.1
pip3 install numpy==1.24.0 pillow

numpy==1.24.0


开发应用


运行应用

python3 first_app.py 
Traceback (most recent call last):
  File "/home/gdv2/first_app/first_app.py", line 164, in <module>
    result = resnet50.forward([image])
  File "/home/gdv2/first_app/first_app.py", line 79, in forward
    self.input_data[i]["buffer"],  # 目标地址 device
IndexError: list index out of range