视觉任务服务器端LinuxSDK集成文档-C++
所有文档

          BML 全功能AI开发平台

          视觉任务服务器端LinuxSDK集成文档-C++

          简介

          本文档介绍EasyEdge/BML的Linux CPP SDK的使用方法。

          • 网络类型支持:图像分类,物体检测,图像分割
          • 硬件支持:

            • CPU 基础版: x86_64
            • CPU 加速版 - Intel Xeon with Intel®AVX2 and AVX512 - Intel Core Processors with AVX2 - Intel Atom Processors with SSE
            • NVIDIA GPU: x86_64 PC
          • 操作系统支持:Linux

          性能数据参考算法性能及适配硬件

          Release Notes

          时间 版本 说明
          2021.01.27 1.1.0 EasyDL经典版分类高性能模型升级;部分SDK不再需要单独安装OpenCV
          2020.12.18 1.0.0 1.0版本发布!安全加固升级、性能优化、引擎升级、接口优化等多项更新
          2020.11.26 0.5.8 EasyDL经典版分类模型CPU加速版里新增量化压缩模型
          2020.10.29 0.5.7 新增CPU加速版支持:EasyDL经典版高精度、超高精度物体检测模型和EasyDL经典版图像分割模型
          2020.09.17 0.5.6 性能优化,支持更多模型
          2020.08.11 0.5.5 提升预测速度;支持百度昆仑芯片
          2020.05.15 0.5.3 优化性能,支持专业版更多模型
          2020.04.16 0.5.2 支持CPU加速版;CPU基础版引擎升级;GPU加速版支持多卡多线程
          2020.03.12 0.5.0 x86引擎升级;更新本地http服务接口;GPU加速版提速,支持批量图片推理
          2020.01.16 0.4.7 ARM引擎升级;增加推荐阈值支持
          2019.12.26 0.4.6 支持海思NNIE
          2019.11.02 0.4.5 移除curl依赖;支持自动编译OpenCV;支持EasyDL 专业版 Yolov3; 支持EasyDL经典版高精度物体检测模型升级
          2019.10.25 0.4.4 ARM引擎升级,性能提升30%; 支持EasyDL专业版模型
          2019.09.23 0.4.3 增加海思NNIE加速芯片支持
          2019.08.30 0.4.2 ARM引擎升级;支持分类高性能与高精度模型
          2019.07.25 0.4.1 引擎升级,性能提升
          2019.07.25 0.4.0 支持Xeye, 细节完善
          2019.06.11 0.3.3 paddle引擎升级;性能提升
          2019.05.16 0.3.2 新增NVIDIA GPU支持;新增armv7l支持
          2019.04.25 0.3.1 优化硬件支持
          2019.03.29 0.3.0 ARM64 支持;效果提升
          2019.02.20 0.2.1 paddle引擎支持;效果提升
          2018.11.30 0.1.0 第一版!

          2020-12-18: 【接口升级】 参数配置接口从1.0.0版本开始已升级为新接口,以前的方式被置为deprecated,并将在未来的版本中移除。请尽快考虑升级为新的接口方式,具体使用方式可以参考下文介绍以及demo工程示例,谢谢。

          快速开始

          SDK在以下环境中测试通过

          • x86_64, Ubuntu 16.04, gcc 5.4
          • x86_64, Ubuntu 18.04, gcc 7.4
          • Tesla P4, Ubuntu 16.04, cuda 9.0, cudnn 7.5
          • x86_64, Ubuntu 16.04, gcc 5.4, XTCL r1.0

          依赖包括

          • cmake 3+
          • gcc 5.4 (需包含 GLIBCXX_3.4.22) ,gcc / glibc版本请以实际SDK ldd的结果为准
          • opencv3.4.5 (可选)
          • cuda9.0_cudnn7 (使用NVIDIA-GPU时必须)
          • XTCL 1.0.0.187 (使用昆仑服务器时必须)

          1. 安装依赖

          以下步骤均可选,请开发者根据实际运行环境选择安装。

          (可选) 安装cuda&cudnn

          在NVIDIA GPU上运行必须(包括GPU基础版,GPU加速版)

          默认依赖的版本为cuda9.0, cudnn7。

          对于GPU基础版,若开发者需求不同的依赖版本,请在PaddlePaddle官网 下载对应版本的libpaddle_fluid.so或参考其文档进行编译,覆盖lib文件夹下的相关库文件。

          (可选) 安装TensorRT

          在NVIDIA GPU上运行GPU加速版必须

          下载包中提供了对应 cuda9.0 和 cuda10.0 两个版本的 SDK,SDK 默认依赖的 TensorRT 版本为 TensorRT7.0.0.11,请在这里下载对应 cuda 版本的 TensorRT7.0.0.11,并把其中的lib文件拷贝到系统lib目录,或其他目录并设置环境变量。

          (可选) 安装OpenVINO

          在Intel CPU上运行CPU加速版必须

          例外:高精度、超高精度物体检测模型CPU加速版和图像分割模型CPU加速版不需要安装OpenVINO

          请在这里下载并安装2020.3.1LTS版本。如果不是默认路径,请根据OpenVINO的安装路径修改demo的CMakeList.txt文件里的InferenceEngine_DIR配置。

          set(InferenceEngine_DIR /opt/intel/openvino/deployment_tools/inference_engine/share)

          安装完毕,运行之前,请按照OpenVino的文档 设置环境变量

          source /opt/intel/openvino/bin/setupvars.sh

          否则,会有undefined reference to报错

          libinference_engine.so: undefined reference to `ngraph::pass::.....

          (可选) 安装XTCL

          使用昆仑服务器及对应SDK时必须 请安装与1.0.0.187版本兼容的XTCL。必要时,请将运行库路径添加到环境变量。

          2. 使用序列号激活

          在控制台获取的序列号请通过参数配置结构体EdgePredictorConfig的成员函数set_config(easyedge::params::PREDICTOR_KEY_SERIAL_NUM, "this-is-serial-num")设置。

          具体请参考SDK自带的Demo.cpp文件的使用方法。

          3. 测试Demo

          模型资源文件默认已经打包在开发者下载的SDK包中。Demo工程直接编译即可运行。

          请先将tar包整体拷贝到具体运行的设备中,再解压缩编译

          请在官网获取序列号,填写在demo.cpp

          部分SDK中已经包含预先编译的二进制, bin/easyedge_demo, bin/easyedge_serving,配置LD_LIBRARY_PATH后,可直接运行: LD_LIBRARY_PATH=../lib ./bin/easyedge_serving

          编译运行:

          cd demo
          mkdir build && cd build
          cmake .. && make
          ./easyedge_demo {模型RES文件夹}  {测试图片路径}
          # 如果是NNIE引擎,使用sudo运行
          sudo ./easyedge_demo {模型RES文件夹}  {测试图片路径}

          如果希望SDK自动编译安装所需要的OpenCV库,修改cmake的optionEDGE_BUILD_OPENCVON即可。 SDK会自动从网络下载opencv源码,并编译需要的module、链接。注意,此功能必须需联网。

          cmake -DEDGE_BUILD_OPENCV=ON

          若需自定义library search path或者gcc路径,修改CMakeList.txt即可。

          demo运行效果:

           > ./easyedge_demo ../../../../RES 2.jpeg
          2019-02-13 16:46:12,659 INFO [EasyEdge] [easyedge.cpp:34] 140606189016192 Baidu EasyEdge Linux Development Kit 0.2.1(20190213)
          2019-02-13 16:46:14,083 INFO [EasyEdge] [paddlev2_edge_predictor.cpp:60] 140606189016192 Allocate graph success.
          2019-02-13 16:46:14,326 DEBUG [EasyEdge] [paddlev2_edge_predictor.cpp:143] 140606189016192 Inference costs 168 ms
          1, 1:txt_frame, p:0.994905 loc: 0.168161, 0.153654, 0.920856, 0.779621
          Done

          4. 测试Demo HTTP 服务

          编译demo完成之后,会同时生成一个http服务 运行

          # ./easyedge_serving {res_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}
           ./easyedge_serving ../../../RES "1111-1111-1111-1111" 0.0.0.0  24401

          后,日志中会显示

          HTTP is now serving at 0.0.0.0:24401

          字样,此时,开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试。

          同时,可以调用HTTP接口来访问服务,具体参考下文接口说明。

          使用说明

          使用该方式,将运行库嵌入到开发者的程序当中。

          使用流程

          请优先参考Demo的使用流程。遇到错误,请优先参考文件中的注释解释,以及日志说明。

              // step 1: 配置模型资源目录
              EdgePredictorConfig config;
              config.model_dir = {模型文件目录};
              
              // step 2: 创建并初始化Predictor;在这里选择合适的引擎
              auto predictor = global_controller()->CreateEdgePredictor(config);
          
              auto img = cv::imread({图片路径});
              // step 3: 预测图像
              std::vector<EdgeResultData> result2;
              predictor->infer(img, result2);

          输入图片不限制大小

          SDK参数配置

          SDK的参数通过EdgePredictorConfig::set_configglobal_controller()->set_config配置。set_config的所有key在easyedge_xxxx_config.h中。其中

          • PREDICTOR前缀的key是不同模型相关的配置,通过EdgePredictorConfig::set_config设置
          • CONTROLLER前缀的key是整个SDK的全局配置,通过global_controller()->set_config设置

          以序列号为例,KEY的说明如下:

          /**
           * @brief 序列号设置;序列号不设置留空时,SDK将会自动尝试使用本地已经激活成功的有效期内的序列号
           * 值类型:string
           * 默认值:空
           */
          static constexpr auto PREDICTOR_KEY_SERIAL_NUM = "PREDICTOR_KEY_SERIAL_NUM";

          使用方法如下:

          EdgePredictorConfig config;
          config.model_dir = ...;
          config.set_config(params::PREDICTOR_KEY_SERIAL_NUM, "1DB7-1111-1111-D27D");

          具体支持的运行参数可以参考开发工具包中的头文件的详细说明。

          初始化

          • 接口
          auto predictor = global_controller()->CreateEdgePredictor(config);
          predictor->init();

          若返回非0,请查看输出日志排查错误原因。

          预测图像

          • 接口
           /**
            * @brief
            * 通用接口
            * @param image: must be BGR , HWC format (opencv default)
            * @param result
            * @return
            */
           virtual int infer(
                   cv::Mat& image, std::vector<EdgeResultData>& result
           ) = 0;
          
           /**
            * @brief
            * GPU加速版批量图片推理接口
            * @param image: must be BGR , HWC format (opencv default)
            * @param result
            * @return
            */
           virtual int infer(
                   std::vector<cv::Mat>& image, std::vector<std::vector<EdgeResultData>>& result
           ) = 0;

          图片的格式务必为opencv默认的BGR, HWC格式。

          • 返回格式

          EdgeResultData中可以获取对应的分类信息、位置信息。

          struct EdgeResultData {
              int index;  // 分类结果的index
              std::string label;  // 分类结果的label
              float prob;  // 置信度
          
              // 物体检测活图像分割时才有
              float x1, y1, x2, y2;  // (x1, y1): 左上角, (x2, y2): 右下角; 均为0~1的长宽比例值。
          
              // 图像分割时才有
              cv::Mat mask;  // 0, 1 的mask
              std::string mask_rle;  // Run Length Encoding,游程编码的mask
          };

          关于矩形坐标

          x1 * 图片宽度 = 检测框的左上角的横坐标

          y1 * 图片高度 = 检测框的左上角的纵坐标

          x2 * 图片宽度 = 检测框的右下角的横坐标

          y2 * 图片高度 = 检测框的右下角的纵坐标

          关于图像分割mask

          cv::Mat mask为图像掩码的二维数组
          {
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
            {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          }
          其中1代表为目标区域,0代表非目标区域

          关于图像分割mask_rle

          该字段返回了mask的游程编码,解析方式可参考 http demo

          以上字段可以参考demo文件中使用opencv绘制的逻辑进行解析

          设置序列号

          请在网页控制台中申请序列号,并在init初始化前设置。 LinuxSDK 首次使用需联网授权。

          EdgePredictorConfig config;
          config.set_config(easyedge::params::PREDICTOR_KEY_SERIAL_NUM, "this-is-serial-num");

          日志配置

          设置 EdgeLogConfig 的相关参数。具体含义参考文件中的注释说明。

          EdgeLogConfig log_config;
          log_config.enable_debug = true;
          global_controller()->set_log_config(log_config);

          http服务

          1. 开启http服务

          http服务的启动可以参考demo_serving.cpp文件。

           /**
               * @brief 开启一个简单的demo http服务。
               * 该方法会block直到收到sigint/sigterm。
               * http服务里,图片的解码运行在cpu之上,可能会降低推理速度。
               * @tparam ConfigT
               * @param config
               * @param host
               * @param port
               * @param service_id service_id  user parameter, uri '/get/service_id' will respond this value with 'text/plain'
               * @param instance_num 实例数量,根据内存/显存/时延要求调整
               * @return
               */
              template<typename ConfigT>
              int start_http_server(
                      const ConfigT &config,
                      const std::string &host,
                      int port,
                      const std::string &service_id,
                      int instance_num = 1);

          2. 请求http服务

          开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试。

          URL中的get参数:

          参数 说明 默认值
          threshold 阈值过滤, 0~1 如不提供,则会使用模型的推荐阈值

          HTTP POST Body即为图片的二进制内容(无需base64, 无需json)

          Python请求示例

          import requests
          
          with open('./1.jpg', 'rb') as f:
              img = f.read()
              result = requests.post(
          	    'http://127.0.0.1:24401/',
          	    params={'threshold': 0.1},
          	    data=img).json()

          Java请求示例

          http 返回数据

          字段 类型说明 其他
          error_code Number 0为成功,非0参考message获得具体错误信息
          results Array 内容为具体的识别结果。其中字段的具体含义请参考预测图像-返回格式一节
          cost_ms Number 预测耗时ms,不含网络交互时间

          返回示例

          {
              "cost_ms": 52,
              "error_code": 0,
              "results": [
                  {
                      "confidence": 0.94482421875,
                      "index": 1,
                      "label": "IronMan",
                      "x1": 0.059185408055782318,
                      "x2": 0.18795496225357056,
                      "y1": 0.14762254059314728,
                      "y2": 0.52510076761245728
                  },
                  {
                      "confidence": 0.94091796875,
                      "index": 1,
                      "label": "IronMan",
                      "x1": 0.79151463508605957,
                      "x2": 0.92310667037963867,
                      "y1": 0.045728668570518494,
                      "y2": 0.42920106649398804
                  }
                ]
          }

          其他配置

          1. 日志名称、HTTP 网页标题设置

          通过global_controller的set_config方法设置:

          global_controller()->set_config(easyedge::params::CONTROLLER_KEY_LOG_BRAND, "MY_BRAND");

          效果如下: 图片

          2. CPU线程数设置

          CPU线程数可通过 EdgePredictorConfig::set_config配置

          EdgePredictorConfig config;
          config.set_config(easyedge::params::PREDICTOR_KEY_CPU_THREADS_NUM, 4);

          3. CPU加速版特殊设置

          CPU加速版RES文件夹有int8量化压缩模型的,在创建并初始化Predictor之前通过如下设置使用int8模型推理:

          // step optional
          bool use_int8 = false; //只有RES里存在model.int8, 设置use_int8为true
          config.set_config(easyedge::params::PREDICTOR_KEY_VINO_USE_INT8, use_int8);

          GPU 加速版

          预测接口

          GPU 加速版 SDK 除了支持上面介绍的通用接口外,还支持图片的批量预测,预测接口如下:

           /**
            * @brief
            * GPU加速版批量图片推理接口
            * @param image: must be BGR , HWC format (opencv default)
            * @param result
            * @return
            */
           virtual int infer(
                   std::vector<cv::Mat>& image,
                   std::vector<std::vector<EdgeResultData>>& result
           ) = 0;
          
          /**
            * @brief
            * GPU加速版批量图片推理接口,带阈值
            * @related infer(cv::Mat & image, EdgeColorFormat origin_color_format, std::vector<EdgeResultData> &result, float threshold)
            */
          virtual int infer(
                      std::vector<cv::Mat> &images,
                      EdgeColorFormat origin_color_format,
                      std::vector<std::vector<EdgeResultData>> &results,
                      float threshold
          ) = 0;

          批量图片的预测接口的使用要求在调用 init 接口的时候设置一个有效的 PREDICTOR_KEY_GTURBO_MAX_BATCH_SIZE,其含义见下方参数配置接口的介绍。

          运行参数选项

          在上面的内容中我们介绍了如何使用EdgePredictorConfig进行运行参数的配置。针对GPU加速版开发工具包,目前EdgePredictorConfig的运行参数所支持的Key包括如下项:

          /**
           * @brief 当有同类型的多个设备的时候,使用哪一个设备,如:
           * GPU: 使用哪张GPU卡
           * EdgeBoard(VMX),Movidius NCS :使用哪一张加速卡
           * 值类型:int
           * 默认值:0
           */
          static constexpr auto PREDICTOR_KEY_DEVICE_ID = "PREDICTOR_KEY_DEVICE_ID";
          
          /**
           * @brief 生成最大 batch_size 为 max_batch_size 的优化模型,单次预测图片数量可以小于或等于此值
           * 值类型: int
           * 默认值:4
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_MAX_BATCH_SIZE = "PREDICTOR_KEY_GTURBO_MAX_BATCH_SIZE";
          
          /**
           * @brief 设置device对应的GPU卡可以支持的最大并发量
           * 实际预测的时候对应GPU卡的最大并发量不超过这里设置的范围,否则预测请求会排队等待预测执行
           * 值类型: int
           * 默认值:1
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_MAX_CONCURRENCY = "PREDICTOR_KEY_GTURBO_MAX_CONCURRENCY";
          
          /**
           * @brief 是否开启fp16模式预测,开启后预测速度会更快,但精度会略有降低。并且需要硬件支持fp16
           * 值类型: bool
           * 默认值:false
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_FP16 = "PREDICTOR_KEY_GTURBO_FP16";
          
          /**
           * @brief 模型编译等级
           * 0:无论当前设置的max_batch_size是多少,仅使用历史编译产出(如果存在)
           * 1:如果当前max_batch_size与历史编译产出的max_batch_size不相等时,则重新编译模型(推荐)
           * 2:无论历史编译产出的max_batch_size为多少,均根据当前max_batch_size重新编译模型
           * 值类型: int
           * 默认值:1
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_COMPILE_LEVEL = "PREDICTOR_KEY_GTURBO_COMPILE_LEVEL";
          
          /**
           * @brief GPU工作空间大小设置
           * workspace_size = workspace_prefix * (1 << workspace_offset)
           * workspace_offset: 10 = KB, 20 = MB, 30 = GB
           * 值类型: int
           * 默认值:WORKSPACE_PREFIX: 16, WORKSPACE_OFFSET: 20
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_WORKSPACE_PREFIX = "PREDICTOR_KEY_GTURBO_WORKSPACE_PREFIX";
          static constexpr auto PREDICTOR_KEY_GTURBO_WORKSPACE_OFFSET = "PREDICTOR_KEY_GTURBO_WORKSPACE_OFFSET";
          
          /**
           * @brief 需要使用的dla core
           * 值类型: int
           * 默认值:-1(不使用)
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_DLA_CORE = "PREDICTOR_KEY_GTURBO_DLA_CORE";
          
          /**
           * @brief 自定义缓存文件命名,默认即可
           * 值类型: string
           * 默认值: m_cache
           */
          static constexpr auto PREDICTOR_KEY_GTURBO_CACHE_NAME = "PREDICTOR_KEY_GTURBO_CACHE_NAME";
          
          /**
           * @brief 序列号设置;序列号不设置留空时,SDK将会自动尝试使用本地已经激活成功的有效期内的序列号
           * 值类型:string
           * 默认值:空
           */
          static constexpr auto PREDICTOR_KEY_SERIAL_NUM = "PREDICTOR_KEY_SERIAL_NUM";

          PREDICTOR_KEY_GTURBO_CACHE_NAME:首次加载模型会先对模型进行编译优化,通过此值可以设置优化后的产出文件名,这在多进程加载同一个模型的时候是有用的。

          PREDICTOR_KEY_GTURBO_WORKSPACE_PREFIXPREDICTOR_KEY_GTURBO_WORKSPACE_OFFSET:设置运行时可以被用来使用的最大临时显存。

          PREDICTOR_KEY_GTURBO_MAX_BATCH_SIZE:此值用来控制批量图片预测可以支持的最大图片数,实际预测的时候单次预测图片数不可大于此值,但可以是不大于此值的任意图片数。

          PREDICTOR_KEY_DEVICE_ID:设置需要使用的 GPU 卡号。

          PREDICTOR_KEY_GTURBO_COMPILE_LEVEL:模型编译等级。通常模型的编译会比较慢,但编译产出是可以复用的。可以在第一次加载模型的时候设置合理的 max_batch_size 并在之后加载模型的时候直接使用历史编译产出。是否使用历史编译产出可以通过此值 compile_level 来控制。当此值为 0 时,表示忽略当前设置的 max_batch_size 而仅使用历史产出(无历史产出时则编译模型);当此值为 1 时,会比较历史产出和当前设置的 max_batch_size 是否相等,如不等,则重新编译;当此值为 2 时,无论如何都会重新编译模型。

          PREDICTOR_KEY_GTURBO_MAX_CONCURRENCY:通过此值设置单张 GPU 卡上可以支持的最大 infer 并发量,其上限取决于硬件限制。init 接口会根据此值预分配 GPU 资源,建议结合实际使用控制此值,使用多少则设置多少。注意:此值的增加会降低单次 infer 的速度,建议优先考虑 batch inference 和 multi predictor。

          PREDICTOR_KEY_GTURBO_FP16:默认是 fp32 模式,置 true 可以开启 fp16 模式预测,预测速度会有所提升,但精度也会略微下降,权衡使用。注意:不是所有模型都支持 fp16 模式。目前已知不支持fp16的模型包括:图像分类高精度模型。

          多线程预测

          GPU 加速版 SDK 的多线程分为单卡多线程和多卡多线程两种。 单卡多线程:创建一个 predictor,并通过 PREDICTOR_KEY_GTURBO_MAX_CONCURRENCY 控制单卡所支持的最大并发量,只需要 init 一次,多线程调用 infer 接口。 多卡多线程:多卡的支持是通过创建多个 predictor,每个 predictor 对应一张 GPU 卡,predictor 的创建和 init 的调用放在主线程,通过多线程的方式调用 infer 接口。

          已知问题

          1. 多线程时图片按线程分配不均 或 不同batch size的图片交叉调用infer接口时,部分结果错误 A:EasyDL图像分类高精度模型在有些显卡上可能存在此问题,可以考虑填充假图片数据到图片比较少的线程或batch以使得infer间的图片绝对平均。

          2. 显存持续增长或遇到 terminate called after throwing an instance of 'std::runtime_error' what(): Failed to create object A:部分显卡存在此问题,如果遇到此问题,请确认没有频繁调用 init 接口,通常调用 infer 接口即可满足需求。

          3. 开启 fp16 后,预测结果错误 A:不是所有模型都支持 fp16 模式。目前已知的不支持fp16的模型包括:图像分类高精度模型。目前不支持的将会在后面的版本陆续支持。

          昆仑服务器

          昆仑服务器SDK支持将EasyDL的模型部署到昆仑服务器上。SDK提供的接口风格一致,简单易用,轻松实现快速部署。Demo的测试可参考上文中的测试Demo部分。

          参数配置接口

          在上面的内容中我们介绍了如何使用EdgePredictorConfig进行运行参数的配置。针对昆仑服务器开发工具包,目前EdgePredictorConfig的运行参数所支持的Key包括如下项:

          /**
           * @brief 序列号设置;序列号不设置留空时,SDK将会自动尝试使用本地已经激活成功的有效期内的序列号
           * 值类型:string
           * 默认值:空
           */
          static constexpr auto PREDICTOR_KEY_SERIAL_NUM = "PREDICTOR_KEY_SERIAL_NUM";
          
          /**
           * @brief 当有同类型的多个设备的时候,使用哪一个设备,如:
           * 使用哪张加速卡
           * 值类型:int
           * 默认值:0
           */
          static constexpr auto PREDICTOR_KEY_DEVICE_ID = "PREDICTOR_KEY_DEVICE_ID";
          
          /**
           * @brief 设置需要同时预测的图片数量
           * 值类型: int
           * 默认值:1
           */
          static constexpr auto PREDICTOR_KEY_KUNLUN_BATCH_SIZE = "PREDICTOR_KEY_KUNLUN_BATCH_SIZE";

          PREDICTOR_KEY_DEVICE_ID:设置需要使用的加速卡的卡号。

          PREDICTOR_KEY_KUNLUN_BATCH_SIZE:设置单次预测可以支持的图片数量。

          使用方法:

          int batch_size = 1;
          config.set_config(easyedge::params::PREDICTOR_KEY_KUNLUN_BATCH_SIZE, batch_size);

          模型调优

          通过设置如下环境变量,可以在初始化阶段对模型调优,从而让预测的速度更快。

          export XPU_CONV_AUTOTUNE=5

          FAQ

          1. 如何处理一些 undefined reference?

          如:undefined reference to `curl_easy_setopt@CURL_OPENSSL_3'

          方案1:通过安装libcurl3 libcurl-openssl1.0-dev来解决。 方案2:如果开发者想不想使用低版本的openssl(如Ubuntu 18.04), 可以link静态库easyedge_static.a,自己指定需要的Library的版本:

          示例:修改CMakeList.txt

          find_package(CURL REQUIRED)
          target_link_libraries(easyedge_demo  ${OpenCV_LIBS} easyedge_static pthread ${CURL_LIBRARIES} verify_static ${其他需要的库})

          其中, 其他需要的库视具体sdk中包含的库而定。

          2. BML SDK与云服务效果不一致,如何处理?

          后续我们会消除这部分差异,如果开发者发现差异较大,可联系我们协助处理。

          3. NVIDIA GPU预测时,报错显存不足

          如以下错误字样:

          paddle.fluid.core.EnforceNotMet: Enforce failed. Expected allocating <= available, but received allocating:20998686233 > available:19587333888.
          Insufficient GPU memory to allocation. at [/paddle/paddle/fluid/platform/gpu_info.cc:170]

          请根据显存大小和模型配置。调整合适的初始 fraction_of_gpu_memory。 参数的含义参考这里

          4. 如何将我的模型运行为一个http服务?

          目前cpp sdk暂未集成http运行方式; 0.4.7版本之后,可以通过start_http_server方法开启http服务。

          5. 运行NNIE引擎报permission denied

          日志显示:

          open sys: Permission denied
          open err
          : Permission denied
          open err
          : Permission denied

          请使用sudo在root下运行。

          6. 运行SDK报错 Authorization failed

          日志显示 Http perform failed: null respond 在新的硬件上首次运行,必须联网激活。

          SDK 能够接受HTTP_PROXY 的环境变量通过代理处理自己的网络请求。如

          export HTTP_PROXY="http://192.168.1.100:8888"
          ./easyedge_demo ...

          7. 使用libcurl请求http服务时,速度明显变慢

          这是因为libcurl请求continue导致server等待数据的问题,添加空的header即可

          headers = curl_slist_append(headers, "Expect:");

          8. 运行二进制时,提示 libverify.so cannot open shared object file

          可能cmake没有正确设置rpath, 可以设置LD_LIBRARY_PATH为sdk的lib文件夹后,再运行:

          LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./easyedge_demo

          9. 编译时报错:file format not recognized

          可能是因为在复制SDK时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译

          上一篇
          视觉任务服务器端LinuxSDK集成文档-Python
          下一篇
          视觉任务服务器端WindowsSDK集成文档