zoukankan      html  css  js  c++  java
  • PaddlePaddle inference 源码分析(一)

    本文针对代码版本为Paddle/2.2,主要针对预测流程的梳理。

    1、paddle inference的使用较为简单,其基本代码如下:

    // 创建predictor
    std::shared_ptr<Predictor> InitPredictor() {
      Config config;
      if (FLAGS_model_dir != "") {
        config.SetModel(FLAGS_model_dir);
      }
      config.SetModel(FLAGS_model_file, FLAGS_params_file);
      if (FLAGS_use_gpu) {
        config.EnableUseGpu(100, 0);
      } else {
        config.EnableMKLDNN();
      }
    
      // Open the memory optim.
      config.EnableMemoryOptim();
      return CreatePredictor(config);
    }
    
    // 执行预测
    void run(Predictor *predictor, const std::vector<float> &input,
             const std::vector<int> &input_shape, std::vector<float> *out_data) {
      int input_num = std::accumulate(input_shape.begin(), input_shape.end(), 1,
                                      std::multiplies<int>());
    
      auto input_names = predictor->GetInputNames();
      auto output_names = predictor->GetOutputNames();
      auto input_t = predictor->GetInputHandle(input_names[0]);
      input_t->Reshape(input_shape);
      input_t->CopyFromCpu(input.data());
    
      for (size_t i = 0; i < FLAGS_warmup; ++i)
        CHECK(predictor->Run());
    
      auto st = time();
      for (size_t i = 0; i < FLAGS_repeats; ++i) {
        CHECK(predictor->Run());
        auto output_t = predictor->GetOutputHandle(output_names[0]);
        std::vector<int> output_shape = output_t->shape();
        int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1,
                                      std::multiplies<int>());
        out_data->resize(out_num);
        output_t->CopyToCpu(out_data->data());
      }
      LOG(INFO) << "run avg time is " << time_diff(st, time()) / FLAGS_repeats
                << " ms";
    }

    2、代码库地址:https://github.com/PaddlePaddle/Paddle

    目录结构如下:

    --cmake #cmake编译脚本以及编译链接的第三方库等
    --doc
    --paddle #c++代码
        -fluid
            -distributed #分布式相关代码,主要为训练使用,包括模型内all_reduce进行跨卡通信、跨机通信等
            -extension #
            -framework #基础组件代码
            -imperative #分布式通信相关代码,包括nccl、all_reduce、bkcl等
            -inference #预测相关代码以及api定义
            -memory
            -operators #算子
            -platform #平台相关代码
            -pybind #pybind接口定义
            -string
        -scripts
        -testing
        -utils
    --patches
    --python #python部分代码
    --r
    --tools
    --CMakeLists.txt #编译脚本,包括大部分编译参数、三方库依赖等逻辑

    3、编译产出

      产出目录如下:

      

    build
        -python #whl安装包
        -paddle_install_dir #产出的所有头文件及库
        -paddle_inference_install_dir #预测c++依赖库
        -paddle_inference_c_install_dir #预测c依赖库
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    js 为表格增加行 动态
    百度测试新搜索结果页面 改进灵感来自谷歌?
    多线程程序中使用fork的问题
    C++ struct和class的区别
    J2SE 5 HotSpot JVM 解释
    并行优化、xvout
    C++基础:纯虚函数和抽象类
    C++的四种cast
    logcat过滤输出
    C++虚函数和纯虚函数(2)
  • 原文地址:https://www.cnblogs.com/zl1991/p/15688005.html
Copyright © 2011-2022 走看看