OpenPPL也已支持了在RISC-V的D1上跑啦!
-
本文转自OpenPPL公众号
原文链接:https://mp.weixin.qq.com/s/6h-r-xWzcHf2SksmQyJf_QRISC-V 最近风头正劲,各家都在紧锣密鼓打造基于 RISC-V 指令集的各种处理器。在 AI 热潮的推动下,RISC-V 上面部署 AI 的需求也越发凸显。
同时市场上终于出了带 V 指令的 RVBoards,基于玄铁 C906 架构,我们就决定开启 RISC-V 后端。初版支持 128 位向量,fp32 和 fp16 两种数据格式,性能较现有开源框架更优,欢迎体验!
RISC-V 支持情况概述
OpenPPL 针对 RISC-V 指令集进行了深度优化,支持部分分类网络(比如 alexnet, resnet, resnext, shufflenet, squeezenet, mobilenet, mnasnet 等)在 fp32 和 fp16 精度下的推理。
同时,与 OpenPPL 其他架构类似,RISC-V 架构支持算子融合等图优化策略进行网络性能优化,从而达到理想的性能效果。
目前市面上支持 RISC-V 向量指令集 (RVV) 的开发板较少,OpenPPL RISC-V 暂时仅支持全志D1(rvv-0.71,128bit 向量长度),后续会逐步添加对 rvv-1.0 和动态向量长度的支持。
RISC-V 算子支持
在 RISC-V 向量指令集 (RVV) 的使用上,我们主要采用了 intrinsic 和内联汇编的方式。
由于编译器的限制,intrinsic 并不能达到非常优秀的性能,因此我们选择在卷积的计算代码中使用内联汇编,一方面,这能使性能优化更加准确;另一方面,内联汇编可以借助 C++ 的模板和宏等功能生成不同规模的计算代码。
intrinsic 的可读性更高,用起来也更加方便,在其他执行时间占比较低的算子中,我们选择用 intrinsic 进行开发。
OpenPPL RISC-V 实现了一些常用的卷积优化算法,包括 img2col+gemm,winograd 等。同时,OpenPPL RISC-V 针对 rvv 做了一系列的调优工作,使得卷积算子在全志 D1 上能够拥有不错的性能,但由于某些限制,OpenPPL RISC-V 仍没有发挥出 rvv 的全部能力:
- rvv 提供了功能非常丰富的指令,这提高了 rvv 的可玩性,但也对向量单元的硬件设计提出了挑战。c906 支持了 rvv-0.71 的大部分功能,但仍放弃了一些有用的功能,比如 Vector Register Grouping,OpenPPL RISC-V 也并未支持这些功能。
- RISC-V 的向量寄存器堆独立于浮点寄存器堆,在计算中合理地使用两个寄存器堆往往可以提高计算效率。但需要注意的是,rvv 支持半精度浮点的向量操作,但 RISC-V 并没有和 FD 扩展一样稳定的半精度浮点标量指令规范。如果需要手动操作浮点寄存器,就要用到 c906 自定义的半精度浮点扩展或是一些有损性能的特殊方式。出于芯片兼容性的考虑,OpenPPL RISC-V 在 fp16 精度的推理中并没有使用该自定义的半精度浮点扩展(也没有显式地使用浮点寄存器),而是用 rvv 中的指令进行代替。
在全志 D1 上运行 OpenPPL
首先需要在 occ.t-head.cn 中下载所需的编译工具链并解压,可以选择 riscv64-linux-x86_64-20210512.tar.gz。
https://occ.t-head.cn/community/download?id=3913221581316624384tar -xf riscv64-linux-x86_64-20210512.tar.gz
下载 ppl.nn
git clone https://github.com/openppl-public/ppl.nn.git cd ppl.nn
指定编译工具链的路径,进行交叉编译
./build.sh -DHPCC_TOOLCHAIN_DIR=/path/to/riscv64-linux-x86_64-20210512 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/riscv64-linux-gnu.cmake -DHPCC_USE_RISCV=ON -DPPLNN_ENABLE_KERNEL_PROFILING=ON -DPPLNN_ENABLE_PYTHON_API=OFF -DPPLNN_ENABLE_LUA_API=OFF
编译完成后将文件 pplnn-build/tools/pplnn 传至全志 D1 即可运行
# fp32 ./pplnn --use-riscv --onnx-model model.onnx --inputs input.bin --in-shapes n_c_h_w [--warmup-iterations m] --enable-profiling # fp16 ./pplnn --use-riscv --use-fp16 --onnx-model model.onnx --inputs input.bin --in-shapes n_c_h_w [--warmup-iterations m] --enable-profiling
可以通过添加 --tuning-level=1 开启动态算法选择以达到更高的性能。
性能展示
OpenPPL RISC-V 在全志 D1 上的性能数据统计
欢迎Star
https://github.com/openppl-public
扫码添加小助手,加入 OpenPPL 大家庭! -
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号