Bootstrap

鲲鹏主机+昇腾Atlas 300I Pro+龙蜥8.6 全国产化主机使用NPU推理YoloV5环境安装全过程

1.主要资料来源

1.昇腾ModelZoo 魔改版Pytorch安装说明
2.CANN 7.0.0商用版安装说明(这个其实很全)
3.官方ModelZoo容器(这个是适配910的,仅用于参考)

2.核心组件版本

组件版本安装方式
CANN7.0.0自行下载安装
Python3.9.16yum安装
torch1.11.0pip安装
torch_npu1.11.0自编译
torchvision0.12.0自编译
torchvision_npu0.12.0自编译
opencv-python4.9.0自编译
numpy1.23.5pip安装
cmake3.29.0-rc4自行下载安装
ais_bench0.0.2自行下载安装
apex0.1-ascend自编译
YoloV56.1源码
ACL_Pytorch / Yolov5_for_Pytorch6.1源码

3.安装步骤

3.1 安装驱动、升级固件

驱动和固件文件需要合同才能下载,或联系供应商自行获取。不同机型不通用。

./Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run --full --install-for-all
./Ascend-hdk-310p-npu-firmware_7.1.0.4.220.run --full
# 不重启可能存在驱动无法正常加载的情况
reboot

3.2 安装Mindx Toolbox(可选)

此工具为诊断工具,理论上非必须。安装此工具可方便确认当前的整体情况。
官方下载链接
一般下载最新版本即可,笔者安装时的版本为5.0.0.3。
安装完成后,可使用ascend-dmi查看整体安装情况,以及驱动兼容性。(此图为CANN安装完整后的状态)
安装过程中可能提示你/usr或者/usr/local有写权限,不安全,可以修改目录权限修正

chmod 755 /usr
chmod 755 /usr/local
$ source /usr/local/Ascend/toolbox/set_env.sh
$ ascend-dmi -c
|==============================================================================================================================|
|                                                    System Information                                                        |
|==============================================================================================================================|
| Architecture        | aarch64                                                                                                |
+---------------------+--------------------------------------------------------------------------------------------------------+
| Type                | Atlas 300I Pro                                                                                         |
|==============================================================================================================================|
|                                          Compatibility Check Result: Compatible                                              |
|==============================================================================================================================|
| Package             | Version           | Status                    | Innerversion              | Dependencies               |
+---------------------+-------------------+---------------------------+---------------------------+----------------------------+
| npu-driver          | 23.0.1            | OK                        | V100R001C15SPC004B220     | NA                         |
+---------------------+-------------------+---------------------------+---------------------------+----------------------------+
| npu-firmware        | 7.1.0.4.220       | OK                        | NA                        | NA                         |
+---------------------+-------------------+---------------------------+---------------------------+----------------------------+
| tfplugin            | 7.0.0             | OK                        | V100R001C15SPC003B226     | NA                         |
+---------------------+-------------------+---------------------------+---------------------------+----------------------------+
| toolkit             | 7.0.0             | OK                        | V100R001C15SPC003B226     | NA                         |
+---------------------+-------------------+---------------------------+---------------------------+----------------------------+
| toolbox             | 5.0.0.3           | OK                        | NA                        | NA                         |
|==============================================================================================================================|

$ ascend-dmi -i
|=========================+======================================+======================|
| ascend-dmi        5.0.0.3                             Brief Information               |
|=========================+======================================+======================|
| Card   Type             | NPU Count                            | Real-time Card Power |
+-------------------------+--------------------------------------+----------------------+
| Chip   Name             | Health           Used Memory         | Temperature  Voltage |
| Device ID               | Bus ID           AI Core Usage       |                      |
|=========================+======================================+======================|
| 1    Atlas 300I Pro     | 1                                    | 15.1W                |
+-------------------------+--------------------------------------+----------------------+
|    0    Ascend 310P3    | OK               2728MB/23047MB      | 35C          0.79V   |
|    0                    | 0000:01:00.0     0%                  |                      |
|=========================+======================================+======================|

3.3 下载安装CANN

官方下载链接
需要下载安装toolkit、kernels、tfplugin(可选),devicesdk、nnae、nnrt和前面的存在功能重复冲突,千万不要安装。
其中,kernels需要根据机型选择,从上文命令中我们可知300I Pro的芯片为310P3,因此需要选装310p的kernels

export USER=root
./Ascend-cann-toolkit_7.0.0_linux-aarch64.run --install --install-for-all
./Ascend-cann-kernels-310p_7.0.0_linux.run --install --install-for-all
./Ascend-cann-tfplugin_7.0.0_linux-aarch64.run --install --install-for-all

3.4 安装Ascend Docker Runtime(可选)

如果希望最终在容器中使用,务必安装。
一般安装最新版本即可,笔者安装的版本为5.0.0.5。

官方下载链接

./Ascend-docker-runtime_5.0.0.5_linux-aarch64.run --install
systemctl daemon-reload && systemctl restart docker

官方的容器商城中,基本都是适配900的。为了方便后续迁移,因此决定自己做一个。
参考资料可知,需要映射系统资源给容器内使用,才能正常玩转。

考虑到宿主机为龙蜥8.6,为了避免不必要的麻烦,基于龙蜥8.6的容器制作。后续所有流程可以宿主机做,也可以容器做。
*示例中因为我们已经有一个龙蜥8.6的c++编译镜像,因此直接拿这个做了
*<your_name> 需要保证每个镜像不同,保证资源复用。不写就是只能启动一份

docker run -u root -it --privileged --name=<your_name> --ipc=host \
--device=/dev/davinci0 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/Ascend:/usr/local/Ascend \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /etc/Ascend:/etc/Ascend \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/vnpu.cfg:/etc/vnpu.cfg \
hub.myhub.io/my/myos_dev:1.0 \
/bin/bash

3.5 安装常规编译环境

yum源上没有Python3.7,因此选了各方面兼容性还都不错的3.9
cmake的yum源上的版本过老,无法编译opencv-python,因此需要自行下载安装

yum install libstdc++-devel python39 python39-devel mesa-libGL
./cmake-3.29.0-rc4-linux-aarch64.sh --skip-license --prefix=/usr

3.5 安装torch和torchvision

3.5.1 安装torch

顺手把后面torchvision用到的依赖一起装了

pip3 install torch==1.11.0 setuptools==65.7.0 

3.5.2 安装torch_npu

参考昇腾官方说明下载whl或自编译
可以直接下载whl安装,也可以自己编译。
两种都用过,似乎没啥区别。

在局域网自编译时,需要注意设置容器内代理

vi ci/docker/ARM/Dockerfile

……
# Set pip source
RUN mkdir /root/.pip \
    && echo "[global]" > /root/.pip/pip.conf \
    && echo "index-url=https://mirrors.aliyun.com/pypi/simple" >> /root/.pip/pip.conf \
    && echo "trusted-host=mirrors.aliyun.com" >> /root/.pip/pip.conf \
    && echo "timeout=120" >> /root/.pip/pip.conf
    
 #此处新增代理配置,前后文都不用动
ENV http_proxy='http://10.1.13.115:50061'
ENV https_proxy='http://10.1.13.115:50061'

#后面一样的
# Install pip package(build)
RUN pip3.7 install pyyaml  \
    && pip3.7 install torch==1.11.0 \
    && pip3.7 install numpy==1.21.3 
 ……

安装完成后,建议用官方示例验证。特别是容器中运行

#后续所有操作,默认都已经source过了,建议加入到~/.bashrc中
$ source /usr/local/Ascend/ascend-toolkit/set_env.sh
$ python3
import torch
import torch_npu

x = torch.randn(2, 2).npu()
y = torch.randn(2, 2).npu()
z = x.mm(y)

print(z)

3.5.3 安装apex

参考昇腾官方说明自编译

git clone -b 5.0.0 https://gitee.com/ascend/apex.git
cd apex/
bash scripts/build.sh --python=3.9
pip3 install apex/dist/apex-0.1_ascend-cp39-cp39-linux_aarch64.whl

3.5.4 安装opencv-python(可选)

按照官方说明,推荐自编译

export GIT_SSL_NO_VERIFY=true
git clone https://github.com/opencv/opencv.git
cd opencv
mkdir -p build
cd build
cmake -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/bin/python3.9 -D PYTHON3_INCLUDE_DIR=/usr/include/python3.9/ -D PYTHON3_LIBRARY=/usr/lib64/libpython3.9.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib64/python3.9/site-packages/numpy/core/include/ -D PYTHON3_PACKAGES_PATH=/usr/local/lib64/python3.9/site-packages -D PYTHON3_DEFAULT_EXECUTABLE=/usr/bin/python3.9 ..
make -j16
make install

3.5.5 安装torchvision + torchvision_npu

按照官方说明,需要自编译。

 git clone -b v0.12.0 https://github.com/pytorch/vision.git
 cd vision
 python3 setup.py bdist_wheel
 pip3 install dist/torchvision-0.12.*.whl
git clone https://gitee.com/ascend/vision.git vision_npu  
cd vision_npu  
git checkout v0.12.0-dev  
pip3 install -r requirement.txt  
python3 setup.py bdist_wheel  
cd dist  
pip3 install torchvision_npu-0.12.*.whl    # 不同环境下编译出的安装包名称有区别,请用户根据实际情况填写安装包名

3.5.6 修改upsampling.py适配YoloV5

修改/usr/local/lib64/python3.9/site-packages/torch/nn/modules/upsampling.py:154

    def forward(self, input: Tensor) -> Tensor:
        return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
#                             ,recompute_scale_factor=self.recompute_scale_factor)

不改的话可能会遭到这样的报错。这个是YoloV5的torch依赖问题,在其他平台下使用新版本torch也需要修改

'Upsample' object has no attribute 'recompute_scale_factor'

3.5.7 验证是否正常安装

>>> import torch
>>> import torch_npu
>>> import torchvision_npu
/usr/local/lib64/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 
  warn(f"Failed to load image Python extension: {e}")
>>> from torch_npu.contrib import transfer_to_npu
/usr/local/lib64/python3.9/site-packages/torch_npu/contrib/transfer_to_npu.py:144: ImportWarning: 
    *************************************************************************************************************
    The torch.Tensor.cuda and torch.nn.Module.cuda are replaced with torch.Tensor.npu and torch.nn.Module.npu now..
    The torch.cuda.DoubleTensor is replaced with torch.npu.FloatTensor cause the double type is not supported now..
    The backend in torch.distributed.init_process_group set to hccl now..
    The torch.cuda.* and torch.cuda.amp.* are replaced with torch.npu.* and torch.npu.amp.* now..
    The device parameters have been replaced with npu in the function below:
    torch.logspace, torch.randint, torch.hann_window, torch.rand, torch.full_like, torch.ones_like, torch.rand_like, torch.randperm, torch.arange, torch.frombuffer, torch.normal, torch._empty_per_channel_affine_quantized, torch.empty_strided, torch.empty_like, torch.scalar_tensor, torch.tril_indices, torch.bartlett_window, torch.ones, torch.sparse_coo_tensor, torch.randn, torch.kaiser_window, torch.tensor, torch.triu_indices, torch.as_tensor, torch.zeros, torch.randint_like, torch.full, torch.eye, torch._sparse_csr_tensor_unsafe, torch.empty, torch._sparse_coo_tensor_unsafe, torch.blackman_window, torch.zeros_like, torch.range, torch.sparse_csr_tensor, torch.randn_like, torch.from_file, torch._cudnn_init_dropout_state, torch._empty_affine_quantized, torch.linspace, torch.hamming_window, torch.empty_quantized, torch._pin_memory, torch.autocast, torch.Tensor.new_empty, torch.Tensor.new_empty_strided, torch.Tensor.new_full, torch.Tensor.new_ones, torch.Tensor.new_tensor, torch.Tensor.new_zeros, torch.Tensor.to, torch.nn.Module.to, torch.nn.Module.to_empty
    *************************************************************************************************************
    
  warnings.warn(msg, ImportWarning)
>>> print(torch.cuda.is_available())
True

成功完成了cuda 的模拟。不过很可惜,这样直接简易修改YoloV5的源码,会各种抛错,需要官方的魔改版。

4 使用官方魔改版YoloV5

整体基于modelzoo-GPL
ACL_Pytorch下为离线推理,PyTorch下为在线训练与在线推理。
在线推理模型加载(不含训练)大约需要半分钟以上,而且会吃满一个CPU核,感觉就是在临时转格式,因此不推荐。
本次只讲解离线推理部分。
官方站点

4.1 签出yolov5

前期在测试YoloV5 7.0时遇到坐标全0 的奇怪问题,回退到了6.1.本次介绍以6.1为准。

git clone -b v6.1 https://github.com/ultralytics/yolov5.git

按照官方说明,把当前目录(Yolov5_for_Pytorch)下的绝大多数文件放到yolov5目录下

4.2 安装依赖

理论上,yolov5的requirement和Yolov5_for_Pytorch下的requirement都需要安装。由于部分组件是自行编译的,因此进行少量修改

matplotlib>=3.2.2
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.41.0
numpy==1.23.5
tensorboard>=2.4.1
pandas>=1.1.4
seaborn>=0.11.0
onnx==1.12.0
onnxruntime==1.12.0
pycocotools>=2.0
decorator
psutil

4.3 修改Model.yaml(可选)

如官方评测,我们打算使用各方面都较好的nms_script方式,该方式需要修改model.yaml中的conf_thres和iou_thres

conf_thres: 0.001  # object confidence threshold
iou_thres: 0.6  # IOU threshold for NMS

4.4 准备数据集

在yolov5下新建coco目录,按照下述结构放置图片文件。其实可以不放coco 2017数据集,原版yolo默认配套的coco128或者其他图片都行

- Yolov5_for_Pytorch
  - yolov5
    - coco
      - val2017
        - 000000000139.jpg
        - 000000000285.jpg
        - 000000000632.jpg
        - ...

在coco目录下生成val2017.txt

find ./val2017/ -type f

4.5 运行推理

#以YOLOv5S官方模型示例
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
#转成ONNX
bash pth2onnx.sh --tag 6.1 --model yolov5s --nms_mode nms_script
#转成离线模型.OM
bash onnx2om.sh --tag 6.1 --model yolov5s --nms_mode nms_script --bs 4 --soc Ascend310P3 
#运行推理验证
python3 om_val.py --tag 6.1 --model=yolov5s_bs4.om --nms_mode nms_script --batch_size=4

查看推理结果文件yolov5s_nms_bs4_6.1_predictions.json

[{
	"image_id": 139, //对应图片名称,如果图片是英文就是字符串
	"category_id": 1, //对应检测到的物体类型ID,从1开始编号(person)
	"bbox": [411.25, 155.625, 54.75, 143.125],//实际图的xywh
	"score": 0.83203 
}]

5 后记

参考om_valy.py,集成进Label Studio验证坐标系,看起来没啥问题
在这里插入图片描述

;