此问题最初发布在Github#3320上.最好从那里开始,因为在该线程中有更多关于原始问题的细节而且体积庞大,所以我不希望在StackOverflow上重新发布.问题摘要是使用GPU时性能比CPU处理TensorFlow图表要慢.包含CPU/GPU时间轴(调试)以进行评估.其中一条评论涉及优化图表以加速处理,并要求讨论玩具示例." 原始解决方案 "是我的强化学习代码,表现出缓慢的性能,并为社区讨论和评估创建了一些已发布的代码.
我附上了测试脚本以及一些原始数据,Trace Files和TensorBoard日志文件,以加快审查速度. CPUvsGPU testing.zip
讨论已移至StackOverflow,因为此主题将使所有Tensorflow用户受益.我希望发现的是优化已发布图表性能的方法.可以通过更高效的TensorFlow图解决GPU与CPU的问题.
我做的是采取我的原始解决方案并剥离"游戏环境".我用随机数据生成代替了它.在此游戏环境中,不会创建/修改TensorFlow图.该结构密切关注/利用nivwusquorum的Github强化学习示例.
2016年7月15日,我做了一个"git pull"前往Tensorflow.我在启用和启用GPU的情况下执行图表并记录时间(参见附图).意想不到的结果是GPU的性能超过了CPU(这是最初的期望未达到).因此,带有支持库的代码"cpuvsgpu.py"在GPU上表现更好.所以我把注意力转向了原始解决方案和已发布代码之间的不同之处.我还将头部更新为2016年7月17日.由于原始解决方案上的CPU和GPU之间的整体差异比一周再次接近,因为我看到47s CPU与71s GPU相比,有些东西确实有所改善.快速浏览新的Traces与我的初始跟踪,似乎"摘要"可能已经改变,但也可能有其他改进.

我尝试了其他两种组合来更好地反映原始解决方案的功能.那些CPU负载很重(~60% - 70%),并通过并发执行该脚本进行模拟.另一个变化是增加"数据IO",原始解决方案使用观察列表随机选择观察训练.此列表具有固定的上限,然后在附加新列表时开始删除列表中的第一个项目.我想其中一个可能是放慢了数据流到GPU的速度.不幸的是,这些版本都没有导致CPU超越GPU.我还运行了一个快速的GPUTESTER应用程序,它可以进行大型矩阵乘法,以了解与任务大小的时序差异,并且符合预期.
我真的想知道如何改进这个图表并减少小OPS的数量.似乎这是大部分性能可能会发生的地方.学习将较小的ops组合成较大的ops而不影响图形的逻辑(功能)的任何技巧都会很好.
有一些实验依赖于梯度上升而不是梯度下降。我已经研究了一些使用“成本”和最小化函数来模拟“最大化”函数的方法,但是我仍然不确定我是否知道如何正确地实现一个maximize()函数。另外,在大多数情况下,我会说它们更接近于无监督的学习。因此,考虑到成本函数的以下代码概念:
cost = (Yexpected - Ycalculated)^2
train_step = tf.train.AdamOptimizer(0.5).minimize(cost)
Run Code Online (Sandbox Code Playgroud)
如果我遵循正梯度并且可能没有Yexpected值,我想写点东西:
maxMe = Function(Ycalculated)
train_step = tf.train.AdamOptimizer(0.5).maximize(maxMe)
Run Code Online (Sandbox Code Playgroud)
带有循环强化学习的 “ http://cs229.stanford.edu/proj2009/LvDuZhai.pdf ” 就是这种需求的一个很好的例子。
我已经阅读了几篇论文和参考文献,指出改变符号的状态会将运动方向翻转为逐渐增加的梯度,但是鉴于TensorFlow对梯度的内部计算,我不确定这是否会最大化,因为我不知道验证结果的方法:
maxMe = Function(Ycalculated)
train_step = tf.train.AdamOptimizer(0.5).minimize( -1 * maxMe )
Run Code Online (Sandbox Code Playgroud) 我正在使用来自MS Windows 10上的C#平台的gRPC写回TensorFlow服务系统的连接.我已经看到许多对gRPC的C++ API的超时和死线的引用,但似乎无法弄清楚如何在C#下进行超时.
我只是打开一个到服务器的通道,设置客户端和调用服务器.我希望这个Classify在5秒左右后超时.任何帮助或方向将不胜感激.
channel = new Channel(modelServer,ChannelCredentials.Insecure);
var client = MyService.NewClient(channel);
MyResponse classvalue = client.Classify(featureSet);