多Batch推理的基本流程与单Batch类似,请参见模型推理基本场景。
多Batch推理与单Batch推理的不同点在于:
uint32_t batchSize = 8; uint32_t deviceNum = 1; uint32_t deviceId = 0; //获取模型第一个输入的大小 uint32_t modelInputSize = aclmdlGetInputSizeByIndex(modelDesc, 0); //获取每个Batch输入数据的大小 uint32_t singleBuffSize = modelInputSize / batchSize; //定义该变量,用于累加Batch数是否达到8Batch uint32_t cnt = 0; //定义该变量,用于描述每个文件读入内存时的位置偏移 uint32_t pos = 0; void* p_batchDst = NULL; std::vector<std::string>inferFile_vec; for (int i = 0; i < files.size(); ++i) { //每8个文件,申请一次Device上的内存,存放8Batch的输入数据 if (cnt % batchSize == 0) { pos = 0; inferFile_vec.clear(); //申请Device上的内存 ret = aclrtMalloc(&p_batchDst, modelInputSize, ACL_MEM_MALLOC_NORMAL_ONLY); } //TODO: 从某个目录下读入文件,计算文件大小fileSize //根据文件大小,申请内存,存放文件数据 ret = aclrtMallocHost(&p_imgBuf, fileSize); //将数据传输到Device的内存 ret = aclrtMemcpy((uint8_t *)p_batchDst + pos, fileSize, p_imgBuf, fileSize, ACL_MEMCPY_HOST_TO_DEVICE); pos += fileSize; //及时释放不使用的内存 aclrtFreeHost(p_imgBuf); //将第i个文件存入vector中,同时cnt+1 inferFile_vec.push_back(files[i]); cnt++; //每8Batch的输入数据送给模型推理进行推理 if (cnt % batchSize == 0) { //TODO: 创建aclmdlDataset、aclDataBuffer类型的数据,用于描述模型的输入、输出数据 //TODO: 调用aclmdlExecute接口执行模型推理 //TODO: 推理结束后,调用aclrtFree接口释放Device上的内存 } } //如果最后循环遍历所有的输入数据后,仍不满足多Batch的要求,则直接将剩余数据作为模型推理的输入。 if (cnt % batchSize != 0) { //TODO: 创建aclmdlDataset、aclDataBuffer类型的数据,用于描述模型的输入、输出数据 //TODO: 调用aclmdlExecute接口执行模型推理 //TODO: 推理结束后,调用aclrtFree接口释放Device上的内存 }