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=
  • 相关阅读:
    【leetcode-100】 简单 树相关题目
    【leetcode-101】 对称二叉树
    【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树
    【leetcode-102,107,103】 二叉树的层次遍历
    iOS开发
    对称加密和不对称加密原理
    uiimageview 异步加载图片
    如何让IOS中的文本实现3D效果
    SDWebImage使用,图片加载和缓存
    ios 图片处理( 1.按比例缩放 2.指定宽度按比例缩放
  • 原文地址:https://www.cnblogs.com/zl1991/p/15688005.html
Copyright © 2011-2022 走看看