在Caffe批处理,GPU模式下无法加快速度

时间:2018-09-13 01:55:23

标签: c++ neural-network deep-learning gpu caffe

在咖啡因中使用批处理甚至会减慢速度,这是无法预期的。 我的执行过程中有什么困扰吗?

这是我的原型。

layer{   name: "data"   type: "MemoryData"   top: "data"   top: "label"
     transform_param {
    scale: some value   }

  memory_data_param{
    batch_size:5  
    channels:1
    height:128
    width:128   } }

这是我的Caffe代码,我只在此处添加必要的部分。 。

caffe_init(){
......
    _net = Net_Init_Load<NetF>(prototxt, caffemodel, caffe::TEST);

    m_layer_ = (caffe::MemoryDataLayer<NetF> *)_net->layers()[0].get();

    m_layer_->set_batch_size(BATCH_SIZE);
......
}

caffe_run(cv::Mat input){
{

#ifdef BATCH
    temp_holder.push_back(input);

    if (temp_holder.size() < 5)
        return -1;        
#endif

    if (0 == flag_caffe_init) {
        flag_caffe_init = 1;
        caffe_init();
    }

    string layer_name = "eltwise_fc1";

    Caffe::SetDevice(0);
    Caffe::set_mode(Caffe::GPU);

    string f_deploy = parser.caffe_deploy_file;
    string f_caffemodel = parser.caffe_model_file;


#ifdef BATCH
    for (int i = 0; i < BATCH_SIZE; i++) {
        dv.push_back(resized_image.clone());
    }
#else
    dv = { input }
#endif


    m_layer_->AddMatVector(dv, label);

    std::vector<caffe::Blob<NetF>*> input_vec;


#ifdef BATCH
    auto t_single_forward_start = std::chrono::high_resolution_clock::now();
    _net->Forward(input_vec);
    auto t_single_forward_end = std::chrono::high_resolution_clock::now();
    float ms = std::chrono::duration<float, std::milli>(t_single_forward_end - t_single_forward_start).count();
    printf("batch forward timer: %f\n", ms);

    dv.clear();
    temp_holder.clear();

#else
    auto t_single_forward_start = std::chrono::high_resolution_clock::now();
    _net->Forward(input_vec);
    auto t_single_forward_end = std::chrono::high_resolution_clock::now();
    float ms = std::chrono::duration<float, std::milli>(t_single_forward_end - t_single_forward_start).count();
    printf("single forward timer: %f\n", ms);

#endif

}


main{

    while(1){
        cap >> input;
        caffe_run(input)
    }

    return 0;
}

当批处理大小为1时,第一帧花费60毫秒,随后每帧花费0.8毫秒。 当批处理大小为5时,第一帧花费116毫秒,随后每帧花费20毫秒。

分析时间仅用于前进功能。

除了第一帧外,当批处理大小为5时,我希望一个批处理(5帧)的时间应少于0.8x5 = 4ms, 但是现在是20毫秒,我的实现中有任何错误,在此先感谢大家的评论。

0 个答案:

没有答案