创建多个Caffe实例 - C ++

时间:2017-06-13 15:44:49

标签: c++ machine-learning computer-vision gpu caffe

我想在单个C ++程序中创建多个Caffe实例,这样我就可以使用多个GPU,但Caffe似乎是一个单例实例。我可以运行使用Caffe的单独程序,并为每个程序分配一个独特的GPU。多程序方法不像我从一个程序中运行它们那样容易管理。

1 个答案:

答案 0 :(得分:3)

@Apexdev,我在处理类似的问题。我想在同一个数据集上测试多个模型。以前我曾经尝试使用不同的脚本进行测试,现在我可以使用相同的脚本调用所有脚本。 这是适合我的解决方案...... 头文件:

#include <pthread.h>

步骤1:定义一个我们将传递给线程参数的结构

Ex. struct thread_Arguments {
    int GPU_id;
    std::string Model;
    std::vector<std::string> list;
};

步骤2:创建一个可执行任何所需操作的功能

 void *MultiscriptInvoke(void *threadarg) {
    struct thread_Arguments *Newthread;
    Newthread = (struct thread_Arguments *) threadarg;
    std::string modelFile = Newthread->Model;
    int GPU_ID = Newthread->GPU_ID;
    // Terminate thread using
    pthread_exit(NULL);
}

第3步:定义线程创建

pthread_t threads[NUM_THREADS];
pthread_attr_t attr;
void *status;

第4步:初始化线程

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
struct thread_Arguments td[NUM_THREADS];

第5步:创建线程

for (i = 0; i < NUM_THREADS; i++) {
    td[i].GPU_ID = GPU1[i];
    td[i].Model = ModelName[i];
    rc = pthread_create(&threads[i], NULL, MultiscriptInvoke, (void *)i );
    if (rc) {
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
     }
}

步骤6:等待线程完成

   pthread_attr_destroy(&attr);
   for( i = 0; i < NUM_THREADS; i++ ) {
      rc = pthread_join(threads[i], &status);
      if (rc) {
         cout << "Error:unable to join," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL); 

我希望这会对你有所帮助。根据需要修改结构并创建多个实例。 参考:感谢tutorialspoint