多Batch推理的基本流程与单Batch类似,请参见模型推理基本场景。
多Batch推理与单Batch推理的不同点在于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
batch_size = 8 device_num = 1 device_id = 0 # 获取模型第一个输入的大小 model_input_size = acl.mdl.get_input_size_by_index(model_desc, 0) # 获取每个Batch输入数据的大小 single_buff_size = model_input_size / batch_size # 定义该变量,用于累加Batch数是否达到8Batch。 cnt = 0 # 定义该变量,用于描述每个文件读入内存时的位置偏移。 pos = 0 infer_file_vec = [] for i in len(files_list): # 每8个文件,申请一次Device上的内存,存放8Batch的输入数据 。 if cnt % batch_size == 0: pos = 0 infer_file_vec.clear() # 申请Device上的内存 p_batch_dst, ret = acl.rt.malloc(model_input_size, ACL_MEM_MALLOC_NORMAL_ONLY) # TODO: 从某个目录下读入文件,计算文件大小file_size。 # 根据文件大小,申请Host上的内存,存放文件数据。 p_img_buf, ret = acl.rt.malloc_host(file_size) # 将Host上的文件数据复制到Device的内存中。 ret = acl.rt.memcpy(p_batch_dst + pos, file_size, p_img_buf, file_size, ACL_MEMCPY_HOST_TO_DEVICE) pos += file_size # 释放Host上的内存。 acl.rt.free_host(p_img_buf) # 将第i个文件存入vector中,同时cnt++ infer_file_vec.append(files_list[i]) cnt++ # 每8Batch的输入数据送给模型推理进行推理。 if cnt % batch_size == 0: # TODO: 创建aclmdlDataset、aclDataBuffer类型的数据,用于描述模型的输入、输出数据。 # TODO: 调用acl.mdl.execute接口执行模型推理。 # TODO: 推理结束后,调用acl.rt.free接口释放Device上的内存。 # 如果最后循环遍历所有的输入数据后,仍不满足多Batch的要求,则直接将剩余数据作为模型推理的输入。 if cnt % batch_size != 0: # TODO: 创建aclmdlDataset、aclDataBuffer类型的数据,用于描述模型的输入、输出数据。 # TODO: 调用acl.mdl.execute接口执行模型推理。 # TODO: 推理结束后,调用acl.rt.free接口释放Device上的内存。 # ...... |