当前位置: 首页 > 知识库问答 >
问题:

Gpu慢速的TensorFlow宽线性模型推断

上官凯歌
2023-03-14

我正在训练一个关于tensorflow的稀疏逻辑回归模型。这个问题是关于推理部分的。我试图在cpu和gpu上对推理进行基准测试。我使用英伟达P100 GPU(4个骰子)在我目前的GCE盒上。我是gpu新手,很抱歉提出了一些幼稚的问题。

模型相当大~54k操作(与dnn或Imagenet模型相比,它算大吗?)。当我记录设备放置,我只看到gpu: 0正在使用,其余的未使用?我在训练期间不做任何设备放置,但在推断期间,我希望它能最佳地放置和使用图形处理器。我观察到的一些事情:我的输入节点放置(feed_dict)放在cpu上,所以我假设我的数据正从cpu复制到gpu?feed_dict幕后是怎么运作的?

1) 如何将要运行预测的数据直接放在gpu上?注意:我的训练是在分布式cpu上运行的,有好几TB的内存,所以在训练过程中我不能在图形中直接使用常量或变量,但我的推断是,我可以直接在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和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是我唯一一次看到我的幼稚基准测试显示gpu与cpu相比增益较小。在给定的时间段内增加批处理大小对cpu和gpu直到批处理大小的时间影响最小

如何进一步改进我的推理,我相信我并没有优化所有GPU。关于如何更好地进行基准测试以获得更好的cpu时间细分,有什么想法吗-

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

共有1个答案

黄聪
2023-03-14

一个信息来源是关于性能的TensorFlow文档,包括针对GPU和高性能模型的优化。

也就是说,这些指南倾向于针对训练而不是批量推理,尽管某些原则仍然适用。

我会注意到,除非您使用DistributionStrategy,否则TensorFlow不会自动将ops放在多个GPU(源)上。

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

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

 类似资料:
  • 我最近在我的笔记本电脑上安装了GPU tenstorflow、CUDA和cuDNN,使用本教程使用我的GPU训练我的模型。我的笔记本电脑是联想ideapad 510,处理器=i5-7代,GPU=GForce 940MX(4GB)。根据教程,我安装并配置了使用GPU所需的所有更改。 每个epoc只需6秒钟就可以编译60000张图像。在表中,我可以看到我的GPU内存使用量是19MiB。在本教程中,他的

  • 我目前正在将一个模型从TensorFlow转换为TensorFlow Lite。通过首先创建一个检查点和一个保存的失重图(.pbtxt),然后使用freeze\u graph()函数将模型冻结为具有图权重的.pb,最后在冻结的模型文件上运行tflite\u convert命令,我将模型从常规TF1.x会话转换为.tflite文件。在此过程中没有量化-保留了浮动。在那之后,我把模型放进Android

  • 问题内容: 我已经训练了3个模型,现在正在运行代码,依次加载3个检查点中的每一个并使用它们运行预测。我正在使用GPU。 加载第一个模型时,它会预先分配整个GPU内存(我希望通过它来处理第一批数据)。但是它不会在完成时卸载内存。当第二模型被加载,同时使用和GPU存储器仍从第一模型完全消耗,并且所述第二模型然后饥饿的存储器。 除了使用Python子进程或多进程来解决该问题(我通过Google搜索找到的

  • 本文向大家介绍使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比),包括了使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)的使用技巧和注意事项,需要的朋友参考一下 禁用GPU设置 CPU与GPU对比 显卡:GTX 1066 CPU GPU 简单测试:GPU比CPU快5秒 补充知识:tensorflow使用CPU可以跑(运行),但是使用GPU却不能用的情况

  • 我正在尝试测试Aparapi的性能。我看到过一些博客,其中的结果显示,Aparapi确实在做数据并行操作的同时提高了性能。 但我在测试中没有看到这一点。这里是我所做的,我写了两个程序,一个使用Aparapi,另一个使用普通循环。 方案1:在Aparapi 程序2:使用循环 程序1需要大约330ms,而程序2只需要大约55ms。我是不是做错什么了?我在Aparpai程序中打印出了执行模式,它打印出的

  • 我正在开发一个Android应用程序,该应用程序将包含用于离线推理的张量流精简模型。 我知道要完全避免有人偷我的模型是不可能的,但我想让尝试它的人很难受。 我想将我的. tflite模型保留在. apk中,但没有顶层的权重。然后,在执行时,我可以下载最后一层的权重并将其加载到内存中。 因此,如果有人试图窃取我的模型,他会得到一个无用的模型,因为它无法使用,因为最后一层的权重缺失。 是否可以在没有最