首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于gpu的tensorflow宽线性模型推理

基于gpu的tensorflow宽线性模型推理
EN

Stack Overflow用户
提问于 2018-05-17 06:31:35
回答 1查看 485关注 0票数 0

我正在tensorflow上训练一个稀疏逻辑回归模型。这个问题是关于推理部分的。我正在尝试在cpu和gpu上进行基准测试。我正在使用Nvidia P100图形处理器(4个芯片)在我当前的GCE盒上。我是gpu的新手,所以对于一些幼稚的问题,我很抱歉。

这个模型相当大,大约54k的运算量(与dnn或imagenet模型相比,它被认为是大的吗?)当我记录设备放置时,我只看到gpu:0正在使用,其余的都没有使用?在训练期间,我不做任何设备放置,但在推理过程中,我希望它最佳地放置和使用gpu。我观察到的几件事:我的输入节点占位器(feed_dict)放在cpu上,所以我假设我的数据正在从cpu复制到gpu?feed_dict到底是如何在幕后工作的?

1)如何将我想要运行预测的数据直接放在gpu上?注意:我的训练运行在具有数to的分布式cpu上,因此在训练期间我不能在图形中直接使用常量或变量,但根据我的推断,我肯定可以将小批量数据直接放到gpu上。有什么方法可以做到这一点吗? 2)由于我使用的是P100图形处理器,我认为它与主机具有统一的内存,是否可以进行零拷贝并直接将数据加载到图形处理器中?我如何从python,java和c++代码中做到这一点。目前我使用的是feed_dict,它来自谷歌的各种资源,我认为它并不是最优的。3)当我分析代码时,有没有一些工具或分析器可以用来查看:

代码语言:javascript
复制
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与gpu上的内核调用开销(我假设每次调用sess.run都调用1个内核调用,对吗?

我当前的基准测试结果: CPU:

代码语言:javascript
复制
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是我唯一一次看到我的朴素基准测试显示gpu与cpu相比有微小的收益。在批处理大小为<= 10k之前,增加给定时期的批处理大小对cpu和gpu的影响都很小。但是增加批处理大小后,从10kGPU100kGPU200k的时间也增加得相当快,也就是说,对于给定的时期,假设10批处理大小10,100,1k,10k的->时间和->时间保持相当稳定~5-7秒的图形处理器和中央处理器的0.48-0.96秒(这意味着sess.run有比图形本身的计算更高的开销?),但进一步增加批量大小的计算时间以更快的速度增加,即对于10 100k -> 200k的gputime从11 -> 19秒增加,cpu时间也加倍,为什么?虽然我只有一个sess.run,但它似乎适合更大的批处理大小,但在内部它将其拆分为较小的批处理,并调用sess.run两次,因为纪元20批处理大小100k与纪元10批处理200k更匹配。

我如何才能进一步改进我的推断,我相信我没有以最佳方式使用所有的gpus。关于如何更好地进行基准测试以获得更好的cpu-> gpu传输的时间分解和从cpu到gpu的图形计算的实际加速,有什么想法吗?更好地直接加载数据,如果可能的话零拷贝到gpu?是否可以仅在推理过程中将一些节点放到gpu中以获得更好的性能?围绕量化或优化推理图的想法?

更多关于改进基于gpu的推理的想法。可能是基于xla的优化或tensrort?我想要有高性能的推理代码来运行这些计算在gpu上,而应用服务器在cpu上运行。

EN

回答 1

Stack Overflow用户

发布于 2018-05-17 13:34:01

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

也就是说,这些指南倾向于更多地针对培训而不是批量推理,尽管其中一些原则肯定仍然适用。

我要指出的是,除非你使用的是DistributionStrategy,否则TensorFlow不会自动在多个图形处理器(source)上运行操作。

在你的特殊情况下,我不相信GPU还没有很好地调整到你的模型所需的稀疏操作类型,所以我实际上不希望它在GPU上做得那么好(如果你记录设备放置,就有可能在CPU上完成查找)。逻辑回归模型只有一个(稀疏)输入层和一个输出层,因此通常只有很少的数学运算。当GPU进行大量的矩阵乘法、卷积等运算时,GPU的表现最为出色。

最后,我鼓励您使用TensorRT来优化您的图形,尽管对于您的特定模型,不能保证它会做得更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50380826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档