English | 简体中文
SHL 是 T-HEAD 提供的一组针对玄铁 CPU 平台的神经网络库 API。抽象了各种常用的网络层的接口,并且提供一系列已优化的二进制库。
SHL 的特性:
- C 代码版本的参考实现。
- 提供玄铁系列 CPU 的汇编优化实现。
- 支持对称量化和非对称量化。
- 支持8位定点,16位定点和16位浮点等数据类型。
- 兼容 NCHW 和 NHWC 格式。
- 搭配 HHB 实现代码自动调用。
- 覆盖 CPU,NPU 等不同体系结构。
- 附加异构参考实现。
SHL 提供了完成的接口声明和接口的参考实现,各个设备提供商可以依此针对性的完成各个接口的优化工作。
SHL 的预编译库可以通过 PyPi 安装 hhb 时,一起安装。
pip3 install hhb
二进制库的安装目录在 /usr/local/lib/python3.6/dist-packages/tvm/install_nn2/
以 Ubuntu 上编译 c906 优化为例。
编译 C906 需要用到 T-HEAD RISC-V GCC, 从 OCC 下载 GCC 2.6 版本,解压并设置路径。
wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1663142514282/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-20220906.tar.gz
tar xf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-20220906.tar.gz
export PATH=${PWD}/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1/bin:$PATH
下载源码
git clone https://github.com/T-head-Semi/csi-nn2.git
编译 c906
cd csi-nn2
make nn2_c906
安装 c906
make install_nn2
以玄铁 CPU C906 执行 mobilenetv1 为例,可以参考 example 中的示例,示例中以较简易的方式描述了如何调用 SHL 的接口。
编译命令如下:
cd example
make c906_m1_f16
完成后会生成 c906_mobilenetv1_f16.elf 文件。将其复制到带 C906 CPU 的开发板【比如 D1】后,执行:
./c906_mobilenetv1_f16.elf
NOTE: 原始 mobilenetv1 中每层 conv2d 后接一层 batch norm,示例中假设已经通过部署工具将其融合进 conv2d。关于如何使用部署工具融合 batch norm,以及生成对应的权重数值,可以参考 HHB 的使用。
SHL 参考、借鉴了下列项目: