我有一个基于NLP的神经网络,由Conv和LSTM层组成,使用Keras构建并导出到Tensorflow服务 . Tensorflow服务r1.5在GPU支持下编译,并部署在功能强大的GPU机器(Tesla V100)上 . 对我来说重要的是推理吞吐量,我尽可能多地需要它,而我根本不关心延迟 . 客户端是具有非阻塞I / O调用的Java gRPC . 每个调用都有一个大小为1的张量 . 打开批处理,玩不同的 max_batch_size 和足够的 batch_timeout_micros 我不能得到超过5000 TPS . 客户端设置为一次最多两次 max_batch_size 传出RPC调用 . 几乎任何超过4000的 max_batch_size 都会给出相同的TPS . 更大的批次,如100,000崩溃TF服务时出现以下错误: terminate called after throwing an instance of 'std::system_error' what(): Resource temporarily unavailable Aborted 当我关闭服务器端的批处理并在客户端实现批处理,即一次调用大小为100,000的张量时,我获得了更好的吞吐量 - 100,000次推断时间不到500毫秒 . 什么与服务器端批处理有关?

还有一点值得注意的是,当在服务器端进行批处理并进行大量RPC调用时,CPU利用率非常高 . 对于每个批次的客户端批处理和相同数量的请求,CPU处于空闲状态 .