PyTorch C++中批量推理实现及最优批次确定方法问询
多特征请求的批量堆叠实现
每个请求包含多个特征(比如每个request对应一个std::vector<torch::Tensor>,其中每个Tensor是该请求的一个特征),要生成批量输入,核心是对每个特征维度分别做堆叠处理,具体步骤如下:
先对齐请求特征格式
确保所有请求的特征数量一致,且对应位置的特征形状(除了待添加的batch维度)完全匹配,否则无法完成堆叠。按特征位置批量堆叠
遍历每个特征索引,收集所有请求的对应特征Tensor,再用torch::stack将它们堆叠成带batch维度的Tensor,最终组成模型的批量输入列表。
举个实际代码示例:
// 模拟一批请求的特征集合,每个请求包含2个特征 std::vector<std::vector<torch::Tensor>> requests_features = { {feat1_req1, feat2_req1}, {feat1_req2, feat2_req2}, {feat1_req3, feat2_req3} }; std::vector<torch::Tensor> batch_inputs; int feature_count = requests_features[0].size(); // 对每个特征维度单独堆叠 for (int i = 0; i < feature_count; ++i) { std::vector<torch::Tensor> same_feature_group; for (const auto& req_feats : requests_features) { same_feature_group.push_back(req_feats[i]); } // stack默认在第0维添加batch维度,得到[N, ...]形状的批量特征 torch::Tensor batch_feat = torch::stack(same_feature_group); batch_inputs.push_back(batch_feat); } // 将批量输入传入模型推理 auto outputs = model->forward(batch_inputs);
如果模型使用命名参数输入(比如torch::Dict),只需要把每个堆叠后的batch特征对应到参数名即可。
最优批次大小的确定
没有基于CPU核心数的绝对推导公式,但可以结合以下原则快速找到合适的批次:
CPU核心数的参考范围:
可以先从CPU核心数的1~2倍开始测试,比如8核CPU先试8、16的批次。这个范围的逻辑是:CPU推理时,大批次能尽可能利用多核并行,但超过核心数2倍后,容易因内存带宽瓶颈导致效率下降。实际测试是核心方法:
- 固定总推理样本数,测试不同批次大小的总耗时,取耗时最短的批次。
- 同时监控内存占用:如果批次过大导致内存不足(比如系统开始频繁使用swap),必须立刻降低批次。
- 在线服务场景要兼顾延迟:过大的批次会增加单批次处理时间,导致请求等待变长,需要在吞吐量和延迟之间做权衡。
额外影响因素:
- 单个样本的特征大小:特征越大,能容纳的最大批次就越小。
- 模型计算密集度:计算密集型模型(比如大MLP)更能发挥大批次的并行优势;IO密集型模型提升有限。
内容的提问来源于stack exchange,提问作者progr
相关产品推荐
相关产品推荐

