Skip to content

Commit

Permalink
[NNAdapter][KunlunxinXTCL] Update kunlunxin_xtcl doc (PaddlePaddle#9625)
Browse files Browse the repository at this point in the history
  • Loading branch information
daydayup-lh committed Nov 2, 2022
1 parent 6b88c17 commit 7016ebf
Showing 1 changed file with 54 additions and 60 deletions.
114 changes: 54 additions & 60 deletions docs/demo_guides/kunlunxin_xtcl.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
# 昆仑芯 XTCL 部署示例

Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部署。 目前支持子图接入方式,其接入原理是在线分析 Paddle 模型,将 Paddle 算子先转为统一的 NNAdapter 标准算子,再通过 XTCL 组网 API 进行网络构建,在线生成并执行模型。
Paddle Lite 已支持昆仑芯系列芯片及板卡 在 X86 和 ARM 服务器上进行预测部署。 目前支持子图接入方式,其接入原理是在线分析 Paddle 模型,将 Paddle 算子先转为统一的 NNAdapter 标准算子,再通过 XTCL 组网 API 进行网络构建,在线生成并执行模型。
XPU Tensor Compilation Library (XTCL),即昆仑芯针对机器学习领域实践而提供的图编译引擎库,可提供基于昆仑芯硬件相关的图层分析框架和加速优化能力。

## 支持现状

### 已支持的芯片

- 昆仑 818-100(推理芯片)
- 昆仑 818-300(训练芯片)
- 昆仑芯1代AI芯片CK10/CK20
- 昆仑芯2代AI芯片CR20

### 已支持的设备
### 已支持的AI加速卡

- K100/K200 昆仑 AI 加速卡
- R200 昆仑 AI 加速卡
- 昆仑芯 AI 加速卡 K100/K200
- 昆仑芯 AI 加速卡 R200

### 已验证支持的 Paddle 模型

Expand Down Expand Up @@ -72,6 +73,10 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部

- [开源模型支持列表](../quick_start/support_model_list.md)

**Note: 以上全部模型目前只在R200上测试验证通过,部分模型支持K100/K200.**



#### 性能

性能仅供参考,以实际运行效果为准。
Expand All @@ -85,9 +90,9 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部
| [Inception-v4](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/InceptionV4.tgz) | 151.721399 | 3.128800 |
| [MobileNet-v1](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/MobileNetV1.tgz) | 23.442400 | 0.500800 |
| [MobileNet-v2](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/MobileNetV2.tgz) | 19.889200 | 1.411200 |
| [ResNet-101](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/ResNet101.tgz) | 200.134998 | 1.392200 |
| [ResNet-18](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/ResNet18.tgz) | 47.691199 | 0.429400 |
| [ResNet-50](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/ResNet50.tgz) | 108.112999 | 0.815200 |
| [ResNet-101](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/ResNet101.tgz) | 200.134998 | 1.392200 |
| [ResNeXt50](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/ResNeXt50_32x4d.tgz) | 110.684799 | 1.648600 |
| [SqueezeNet-v1](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/SqueezeNet1_0.tgz) | 33.140800 | 0.902400 |
| [VGG16](https://paddlelite-demo.bj.bcebos.com/NNAdapter/models/PaddleClas/VGG16.tgz) | 491.237994 | 1.542200 |
Expand Down Expand Up @@ -116,15 +121,15 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部

## 参考示例演示

### 测试设备( K100 昆仑 AI 加速卡)
### 测试设备( 昆仑芯AI加速卡R200)

![kunlunxin_xpu](https://paddlelite-demo.bj.bcebos.com/devices/baidu/baidu_xpu.jpg)
<img src="https://baidu-kunlun-public.su.bcebos.com/paddle_lite/R200.jpg" alt="kunlunxin_xtcl" style="zoom: 33%;" />

### 准备设备环境

- K100/200 昆仑 AI 加速卡[规格说明书](https://paddlelite-demo.bj.bcebos.com/devices/baidu/K100_K200_spec.pdf)
- K100 为全长半高 PCI-E 卡,K200 为全长全高 PCI-E 卡,要求使用 PCI-E x16 插槽,且需要单独的 8 针供电线进行供电;
- 安装 K100/K200 驱动,目前支持 Ubuntu 和 CentOS 系统,由于驱动依赖 Linux kernel 版本,请正确安装对应版本的驱动安装包。
- 昆仑芯AI加速卡R200[产品手册](https://baidu-kunlun-public.su.bcebos.com/paddle_lite/R200%20%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8C%E5%A4%96%E9%83%A8%E7%89%88_0923.pdf)
- R200 为全高全长 PCI-E 卡,要求使用 PCIe4.0 x16 插槽,且需要单独的 8 针供电线进行供电;
- 安装 [R200 XRE 驱动](https://baidu-kunlun-public.su.bcebos.com/paddle_lite/XRE%20%E5%AE%89%E8%A3%85%E6%89%8B%E5%86%8C_v1.0.pdf),目前支持 Ubuntu 和 CentOS 系统,由于驱动依赖 Linux kernel 版本,请正确安装对应版本的驱动安装包。

### 准备本地编译环境
- 为了保证编译环境一致,建议根据机器的实际情况参考[ linux(x86) 编译](../source_compile/linux_x86_compile_linux_x86.rst)[ linux(ARM) 编译](../source_compile/arm_linux_compile_arm_linux.rst)中的``准备编译环境``进行环境配置
Expand Down Expand Up @@ -189,11 +194,9 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部
- ssd_detection_demo # 基于 ssd 的目标检测示例程序
```


- 进入 `PaddleLite-generic-demo/image_classification_demo/shell/`

- 执行以下命令比较 mobilenet_v1_fp32_224 模型的性能和结果;

```shell
运行 mobilenet_v1_fp32_224 模型
Expand Down Expand Up @@ -233,29 +236,24 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部
$ ./build.sh linux arm64
```

### 更新支持昆仑芯XTCL 的 Paddle Lite 库
### 更新支持昆仑芯XTCL的Paddle Lite库

- 下载 Paddle Lite 源码

```shell
$ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
$ cd Paddle-Lite
$ git checkout <release-version-tag>
```

- 编译并生成 PaddleLite+NNAdapter+kunlunxin_xtcl for amd64 and arm64 的部署库

- For amd64

- full_publish 编译

- For amd64
- full_publish 编译
```shell
# 默认自动从云上下载kunlunxin_xtcl_sdk,如需指定,请使用参数--nnadapter_kunlunxin_xtcl_sdk_root
$ ./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_kunlunxin_xtcl=ON full_publish
```

- 替换头文件和库

- 替换头文件和库
```shell
# 清理原有 include 目录
$ rm -rf PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/include/
Expand All @@ -272,64 +270,60 @@ Paddle Lite 已支持昆仑芯 XPU 在 X86 和 ARM 服务器上进行预测部
```

- For arm64

- full_publish 编译

```shell
# arm 环境下需要设置环境变量 CC 和 CXX,分别指定 C 编译器和 C++ 编译器的路径
# 默认自动从云上下载kunlunxin_xtcl_sdk,如需指定,请使用参数--nnadapter_kunlunxin_xtcl_sdk_root
$ export CC=<path_to_your_c_compiler>
$ export CXX=<path_to_your_c++_compiler>
$ ./lite/tools/build_linux.sh --arch=armv8 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_kunlunxin_xtcl=ON full_publish
```

- 替换头文件和库

```shell
# 清理原有 include 目录
$ rm -rf PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
# 替换 include 目录
$ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
# 替换 NNAdapter 运行时库
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libnnadapter.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
# 替换 NNAdapter device HAL 库
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libkunlunxin_xtcl.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
# 替换 libpaddle_full_api_shared.so
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
# 替换 libpaddle_light_api_shared.so
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
```

- 替换头文件后需要重新编译示例程序
- full_publish 编译
```shell
# arm 环境下需要设置环境变量 CC 和 CXX,分别指定 C 编译器和 C++ 编译器的路径
# 默认自动从云上下载kunlunxin_xtcl_sdk,如需指定,请使用参数--nnadapter_kunlunxin_xtcl_sdk_root
$ export CC=<path_to_your_c_compiler>
$ export CXX=<path_to_your_c++_compiler>
$ ./lite/tools/build_linux.sh --arch=armv8 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_kunlunxin_xtcl=ON full_publish
```

- 替换头文件和库
```shell
# 清理原有 include 目录
$ rm -rf PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
# 替换 include 目录
$ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
# 替换 NNAdapter 运行时库
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libnnadapter.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
# 替换 NNAdapter device HAL 库
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libkunlunxin_xtcl.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
# 替换 libpaddle_full_api_shared.so
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
# 替换 libpaddle_light_api_shared.so
$ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
```

## 高级特性
本节主要说明在不同的昆仑芯AI加速卡上如何设置不同的参数。以下列出了paddle lite下支持的两种高级参数。

- 高级参数

- KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS

指定昆仑芯 XPU 的 ID号,例如KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0,1,2,3或KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0。
指定昆仑芯产品的 ID号。例如KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0或KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0,1,2,3

- KUNLUNXIN_XTCL_DEVICE_TARGET
指定昆仑芯的不同类型的AI加速卡。例如KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu1或者KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu2
XPU 代指昆仑芯自主研发的芯片硬件架构,XPU1 用在昆仑芯 1 代系列产品,包括K100和K200;XPU2 用在昆仑芯 2 代系列产品,包括R200等。

指定昆仑芯 XPU 的不同类型的推理卡。例如KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu1或者KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu2

**使用方式**
c++代码示例
- 使用方式
- c++代码示例
```c++
// Run inference by using light api with MobileConfig
paddle::lite_api::MobileConfig mobile_config;
// nnadapter_context_properties, 多个参数之间使用;进行分割
std::string nnadapter_context_properties = "KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0;KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu1"
mobile_config.set_nnadapter_context_properties(nnadapter_context_properties);
```
shell脚本示例

- shell脚本示例
```shell
export KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0
export KUNLUNXIN_XTCL_DEVICE_TARGET="xpu -libs=xdnn -device-type=xpu1"
```


## 其他说明

- 昆仑芯的研发同学正在持续适配更多的 Paddle 算子,以便支持更多的 Paddle 模型。
- 昆仑芯的研发团队正在持续适配更多的 Paddle 算子,以便支持更多的 Paddle 模型。

0 comments on commit 7016ebf

Please sign in to comment.