нет ускорения в пакетной обработке Caffe, в режиме GPU - PullRequest
0 голосов
/ 13 сентября 2018

использование партии в кофе даже замедляет скорость, что не ожидается. Что-нибудь изменилось в моей реализации?

Это мой прототекст.

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_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 = 4 мс, но теперь это 20 мс, что-то не так в моей реализации, заранее спасибо за все комментарии.

...