Skip to content

[Framework] Fix the issue that CreatePaddlePredictor method is not safe for multi-thread condition #4014

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 29, 2020

Conversation

DannyIsFunny
Copy link
Collaborator

@DannyIsFunny DannyIsFunny commented Jul 29, 2020

【Issue】 Unknown segmentation error may occur when we use multi-thread to create many predictors at the same time.
eg.

#include <iostream>
#include <vector>
#include "paddle_api.h"  // NOLINT
#include <unistd.h>
#include <pthread.h>

using namespace paddle::lite_api;  // NOLINT

#define NUM_THREADS     2

struct thread_data{
   int  thread_id;
   char *message;
};

int64_t ShapeProduction(const shape_t& shape) {
  int64_t res = 1;
  for (auto i : shape) res *= i;
  return res;
}
void* RunModel(void*arg) {
  for(int i =0; i < 10; i++) {
    // 1. Create CxxConfig
    std::string model_dir = "mobilenet_v1";
    CxxConfig config;
    config.set_model_dir(model_dir);
    config.set_valid_places({Place{TARGET(kX86), PRECISION(kFloat)},
                             Place{TARGET(kHost), PRECISION(kFloat)}});
    // 2. Create PaddlePredictor by CxxConfig
    std::shared_ptr<PaddlePredictor> predictor1 =
        CreatePaddlePredictor<CxxConfig>(config);
    std::cout << "Succeed!" << std::endl;
  }
    return 0;
}

int main(int argc, char** argv) {
  if (argc < 2) {
    std::cerr << "[ERROR] usage: ./" << argv[0] << " naive_buffer_model_dir\n";
    exit(1);
  }
  std::string model_dir = argv[1];

   pthread_t threads[NUM_THREADS];
   struct thread_data td[NUM_THREADS];
   int rc;
   int i;

   for( i=0; i < NUM_THREADS; i++ ){
      std::cout <<"main() : creating thread, " << i << std::endl;
      td[i].thread_id = i;
      td[i].message = (char*)"This is message";
      rc = pthread_create(&threads[i], NULL,
                          RunModel, NULL);
      if (rc){
         std::cout << "Error:unable to create thread," << rc << std::endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);

  return 0;
}

【Reason】CreatePaddlePredictor method is not safe for multi-thread condition. Further more, we have located that inside optimizer->GenRuntimeProgram() has caused this problem.
【Effect of Current PR】
Add thread lock to CreatePaddlePredictor, so that CreatePaddlePredictor method will be operated sequently in multi-thread program to avoid unknown error.

@DannyIsFunny DannyIsFunny merged commit c670848 into PaddlePaddle:develop Jul 29, 2020
@DannyIsFunny DannyIsFunny deleted the multi_thread branch July 29, 2020 11:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants