PaddleLite使用CUDA预测部署

Lite支持在x86_64,arm64架构上(如:TX2)进行CUDA的编译运行。

编译

NOTE: 如果是在TX2等NVIDIA嵌入式硬件上编译,请使用最新的Jetpack 安装依赖库。

一: 下载代码

  1. git clone https://github.com/PaddlePaddle/Paddle-Lite.git

二:编译

  1. # 进入代码目录
  2. cd Paddle-Lite
  3. # 运行编译脚本
  4. # 编译结束会在本目录下生成 build_cuda 目录
  5. # 编译过程中如果提示找不到CUDA,CUDNN,请在环境变量设置CUDA_TOOLKIT_ROOT_DIR, CUDNN_ROOT
  6. # CUDA_TOOLKIT_ROOT_DIR,CUDNN_ROOT分别表示CUDA,CUDNN的根目录
  7. ./lite/tools/build.sh cuda
  8. # 如果使用python接口,需要打开build_python选项
  9. ./lite/tools/build.sh --build_python=ON cuda

编译结束会在 build_cuda/inference_lite_lib/python/lib/ 目录下生成 lite_core.so

运行

以下以Yolov3模型为例,介绍如何在Nvidia GPU硬件上运行模型。

一: 下载darknet_yolov3模型,模型信息请参考这里

  1. # 下载模型
  2. wget https://paddle-inference-dist.cdn.bcebos.com/PaddleLite/yolov3_infer.tar.gz
  3. tar -zxf yolov3_infer.tar.gz
  4. # 下载图片样例
  5. wget https://paddle-inference-dist.cdn.bcebos.com/PaddleLite/kite.jpg

二: 运行

**NOTE:**此处示例使用的是python接口,后续会开放C++接口以及示例。

  1. #-*- coding: utf-8 -*-
  2. from __future__ import print_function
  3. import sys
  4. import numpy as np
  5. import cv2
  6. sys.path.append('build_cuda/inference_lite_lib/python/lib')
  7. from lite_core import *
  8. def read_img(im_path, resize_h, resize_w):
  9. im = cv2.imread(im_path).astype('float32')
  10. im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
  11. h, w, _ = im.shape
  12. im_scale_x = resize_h / float(w)
  13. im_scale_y = resize_w / float(h)
  14. out_img = cv2.resize(im, None, None, fx=im_scale_x, fy=im_scale_y, interpolation=cv2.INTER_CUBIC)
  15. mean = np.array([0.485, 0.456, 0.406]).reshape((1, 1, -1))
  16. std = np.array([0.229, 0.224, 0.225]).reshape((1, 1, -1))
  17. out_img = (out_img / 255.0 - mean) / std
  18. out_img = out_img.transpose((2, 0, 1))
  19. return out_img
  20. # 配置config
  21. a = CxxConfig()
  22. a.set_model_file('./yolov3_infer/__model__') # 指定模型文件路径
  23. a.set_param_file('./yolov3_infer/__params__') # 指定参数文件路径
  24. place_cuda = Place(TargetType.CUDA)
  25. a.set_valid_places([place_cuda])
  26. # 创建predictor
  27. predictor = create_paddle_predictor(a)
  28. # 设置输入
  29. input_tensor = predictor.get_input(0);
  30. height, width = 608, 608
  31. input_tensor.resize([1, 3, height, width])
  32. data = read_img('./kite.jpg', height, width).flatten()
  33. input_tensor.set_float_data(data, TargetType.CUDA)
  34. in2 = predictor.get_input(1);
  35. in2.resize([1, 2])
  36. in2.set_int32_data([height, width], TargetType.CUDA)
  37. # 运行
  38. predictor.run()
  39. # 获取输出
  40. output_tensor = predictor.get_output(0);
  41. print (output_tensor.shape())
  42. # [100L, 6L]
  43. print (output_tensor.target())
  44. # TargetType.Host
  45. print (output_tensor.float_data()[:6])
  46. # [0.0, 0.9862784743309021, 98.51927185058594, 471.2381286621094, 120.73092651367188, 578.33251953125]

NOTE: 对CUDA的支持还在持续开发中。