在咖啡因中使用批处理甚至会减慢速度,这是无法预期的。 我的执行过程中有什么困扰吗?
这是我的原型。
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毫秒,我的实现中有任何错误,在此先感谢大家的评论。