开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
EasyDL零门槛AI开发平台

    目标跟踪服务器端SDK集成文档-Linux-C++

    简介

    本文档介绍EasyEdge/EasyDL的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

    根据开发者的选择,实际下载的版本可能是以下版本之一:

    • EasyDL视频

      • x86 CPU 基础版
      • x86 CPU 加速版
      • Nvidia GPU 基础版
      • Nvidia GPU 加速版

    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文件夹下的相关库文件。

    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);

    运行参数选项

    在上面的内容中我们介绍了如何使用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. EasyDL 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时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译

    上一篇
    目标跟踪服务器端SDK简介
    下一篇
    EasyDL 结构化数据使用说明