Python 如何使用Tensorflow进行分布式预测/推断

Python 如何使用Tensorflow进行分布式预测/推断,python,tensorflow,Python,Tensorflow,我想使用TF2.0在我的GPU集群上运行分布式预测。我用镜像策略训练了一个由Keras制作的CNN,并保存了它。我可以加载模型并在其上使用.predict(),但我想知道这是否会使用可用的GPU自动进行分布式预测。如果没有,我如何运行分布式预测来加速推理并使用所有可用的GPU内存 目前,在运行许多大型预测时,我的一个GPU(12gb)的内存(需要17gb),推断失败,因为内存不足: Allocator (GPU_0_bfc) ran out of memory trying to allocat

我想使用TF2.0在我的GPU集群上运行分布式预测。我用镜像策略训练了一个由Keras制作的CNN,并保存了它。我可以加载模型并在其上使用.predict(),但我想知道这是否会使用可用的GPU自动进行分布式预测。如果没有,我如何运行分布式预测来加速推理并使用所有可用的GPU内存

目前,在运行许多大型预测时,我的一个GPU(12gb)的内存(需要17gb),推断失败,因为内存不足:

Allocator (GPU_0_bfc) ran out of memory trying to allocate 1.12GiB

但我有多个GPU,我也想使用它们的内存。谢谢。

我能够按照如下方式拼凑出单个工人、多个GPU的预测(将其视为草图-它使用的管道代码通常不适用,但应该给您一个模板):

#https://github.com/tensorflow/tensorflow/issues/37686
# https://www.tensorflow.org/tutorials/distribute/custom_training
def compute_和write_ious_multi_gpu(路径:str,文件名:str,包含:bool):
strategy=tf.distribute.MirroredStrategy()
log('Number of devices:{}'。格式(strategy.num\u replications\u in\u sync))
(ds,s,n)=数据集(路径,随机播放=False,重复=False,掩码作为输入=True)
dist\u ds=策略。实验性分布数据集(ds)
def预测_步骤(输入):
图像、标签=输入
返回模型(图像,训练=假)
@功能
def分布式预测步骤(数据集输入):
每副本损失=策略。运行(预测步骤,参数=(数据集输入,)
按副本返回损失?展开!?
# https://stackoverflow.com/questions/57549448/how-to-convert-perreplica-to-tensor
def展开(每个复制副本):#->numpy阵列列表
如果同步中的strategy.num副本>1:
out=每个复制副本的值
其他:
out=(每个复制副本,)
返回列表(映射(lambda x:x.numpy(),out))
使用strategy.scope():
模型=包裹模型()
log(f'Starting{filename\u csv}的分布式预测)
ious=[在距离ds中x的展开(分布式预测步进(x))]
t=欠条
ious=[t中的子列表项对应于中的项
子列表]#https://stackoverflow.com/questions/952914/how-to-make-a-flat-list-out-of-list-of-lists
util.log(f'Distributed prediction done for{filename\u csv}')
ious=np.concatenate(ious.ravel().tolist())
ious=圆形(ious)
ious=list(zip(ious,ds.all\u image\u路径))
ious.sort()
写借条(借条、文件名、csv、包含样本)
这确实会在GPU之间分配负载,但不幸的是,它们的使用非常糟糕——在我的特殊情况下,相应的单个GPU代码运行时间约为12小时,运行时间为7.7小时,因此即使是2倍的加速,也不会有8倍的GPU数量

我认为这主要是一个数据传输问题,但我不知道如何解决它。希望其他人能提供一些更好的见解