首页 文章

张量流宽线性模型推理对gpu的缓慢影响

提问于
浏览
0

我正在训练一个关于张量流的稀疏逻辑回归模型 . 该问题具体涉及推理部分 . 我正在尝试对cpu和gpu进行基准测试 . 我在我目前的GCE盒子上使用Nvidia P100 gpu(4个模具) . 我是gpu的新手,很抱歉天真的问题 .

该模型相当大〜54k操作(与dnn或imagenet模型相比,它被认为是大的吗?) . 当我记录设备放置时,我只看到正在使用的gpu:0,其余的未使用?我不会在训练期间进行任何设备放置,但在推理期间我希望它能够最佳地放置和使用gpu . 我观察到的一些事情:我的输入节点placehoolder(feed_dict)放在cpu上,所以我假设我的数据是从cpu复制到gpu的? feed_dict如何正好在幕后工作?

1)如何在gpu上直接放置我想要运行预测的数据?注意:我的训练运行在具有多TB的分布式cpu上,所以我在训练期间不能直接在我的图形中使用常量或变量,但我推断我肯定会有小批量的数据,我会直接放在gpu上 . 我有办法实现这个目标吗? 2)由于我使用的是P100 gpu,我认为它与主机有统一的内存,是否有可能有zerocopy并直接将我的数据加载到gpu中?我怎么能从python,java和c代码中做到这一点 . 目前我使用来自各种谷歌来源的feed_dict我认为根本不是最佳的 . 3)我可以使用一些工具或分析器来查看我的代码,例如:

for epoch_step in epochs:
    start_time = time.time()
    for i in range(epoch_step):
            result = session.run(output, feed_dict={input_example: records_batch})
    end_time = time.time()
    print("Batch {} epochs {} :time {}".format(batch_size, epoch_step, str(end_time - start_time)))

花费了多少时间花在1)cpu到gpu数据传输2)会话运行开销3)gpu利用率(目前我定期使用nvidia-smi监视4)cpu vs gpu上的内核调用开销(我假设每次调用sess . run调用1内核调用对吗?

我目前的替补标记结果:CPU:

Batch size : 10
NumberEpochs   TimeGPU    TimeCPU 
10             5.473      0.484
20             11.673     0.963
40             22.716     1.922
100            56.998     4.822
200            113.483    9.773

Batch size : 100
NumberEpochs   TimeGPU    TimeCPU 
10             5.904      0.507
20             11.708     1.004
40             23.046     1.952
100            58.493     4.989
200            118.272    9.912

Batch size : 1000 
NumberEpochs   TimeGPU    TimeCPU   
10             5.986      0.653
20             12.020     1.261
40             23.887     2.530
100            59.598     6.312
200            118.561    12.518

Batch size : 10k
NumberEpochs   TimeGPU    TimeCPU 
10             7.542      0.969
20             14.764     1.923
40             29.308     3.838
100            72.588     9.822
200            146.156    19.542

Batch size : 100k
NumberEpochs   TimeGPU    TimeCPU 
10             11.285     9.613
20             22.680     18.652
40             44.065     35.727
100            112.604    86.960
200            225.377    174.652

Batch size : 200k
NumberEpochs   TimeGPU    TimeCPU 
10             19.306     21.587
20             38.918     41.346
40             78.730     81.456
100            191.367    202.523
200            387.704    419.223

一些值得注意的观察:随着批量大小的增加,我看到我的gpu利用率增加(它使用的唯一gpu达到100%,有没有办法告诉tf使用其他gpu)批量大小200k是我唯一看到的时间我的天真基准测试显示,与cpu相比,gpu有微小的收益 . 增加给定时期的批量大小对cpu和gpu的时间影响最小,直到批量大小<= 10k . 但是在增加批量大小从10k - > 100k - > 200k后,时间也增加得相当快,即对于给定的时代让我们说10批量大小10,100,1k,10k的cpu时间和gpu时间保持相当稳定~5-5对于gpu为7秒,对于cpu为0.48-0.96秒(这意味着sess.run比计算图本本身有更高的开销?),但是进一步增加批量大小计算时间以更快的速度增加,即对于纪元10 100k-> 200k gputime从11 - > 19秒增加,cpu时间也增加一倍,为什么呢?似乎更大的批量大小,即使我只有一个sess.run,但在内部它将它分成较小的批次并调用sess.run两次因为epoch 20批量大小100k与epoch 10批次200k匹配更紧密 .

我怎样才能进一步改进我的推论,我相信我并没有最佳地使用所有gpus . 是否有任何想法可以更好地进行基准测试,以便更好地分解cpu-> gpu传输的时间和从cpu到gpu的图形计算的实际加速?如果可能零拷贝到gpu,直接加载数据更好?我可以在推理期间将一些节点放到gpu中以获得更好的性能吗?量化或优化推理图的想法?

任何更多的想法,以改善基于推理的gpu . 可能是基于xla的优化还是紧张?我希望有高性能的推理代码在应用程序服务器在cpu上运行时在gpu上运行这些计算 .

1 回答

  • 0

    一个信息来源是关于性能的TensorFlow文档,包括Optimizing for GPUHigh Performance Models .

    也就是说,这些指南倾向于针对培训而不是批量推断,但肯定有些原则仍然适用 .

    我会注意到,除非您使用的是DistributionStrategy,否则TensorFlow不会自动将操作放在多个GPU上(source) .

    在您的特殊情况下,我不认为GPU已经很好地调整了您的模型所需的稀疏操作类型,因此我实际上并不希望它在GPU上做得那么好(如果您记录设备放置有可能在CPU上完成查找 . 逻辑回归模型只有(稀疏)输入层和输出层,因此通常只有很少的数学欢声笑语 . GPU在进行大量矩阵乘法,卷积等时表现最为出色 .

    最后,我鼓励您使用TensorRT来优化您的图表,但对于您的特定型号,不能保证它会做得更好 .

相关问题