1.主要资料来源
1.昇腾ModelZoo 魔改版Pytorch安装说明
2.CANN 7.0.0商用版安装说明(这个其实很全)
3.官方ModelZoo容器(这个是适配910的,仅用于参考)
2.核心组件版本
组件 | 版本 | 安装方式 |
---|---|---|
CANN | 7.0.0 | 自行下载安装 |
Python | 3.9.16 | yum安装 |
torch | 1.11.0 | pip安装 |
torch_npu | 1.11.0 | 自编译 |
torchvision | 0.12.0 | 自编译 |
torchvision_npu | 0.12.0 | 自编译 |
opencv-python | 4.9.0 | 自编译 |
numpy | 1.23.5 | pip安装 |
cmake | 3.29.0-rc4 | 自行下载安装 |
ais_bench | 0.0.2 | 自行下载安装 |
apex | 0.1-ascend | 自编译 |
YoloV5 | 6.1 | 源码 |
ACL_Pytorch / Yolov5_for_Pytorch | 6.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验证坐标系,看起来没啥问题