我正在尝试在Cloud ML上训练一个非常深的模型,但是我遇到了严重的内存问题,而我无法绕过它。该模型是一个非常深的卷积神经网络,用于自动标记音乐。
此模型可在下图中找到。在网络中插入一批20,张量为12x38832x1。
音乐原本是465894x1样本,然后分成12个窗口。因此,12x38832x1。当使用map_fn函数时,每个循环将具有单独的38832x1样本(conv1d)。
一次处理窗口比使用一个CNN的整个音乐产生更好的结果。在将数据存储在TFRecords中之前将其拆分,以便最小化训练期间所需的处理。这将加载到队列中,最大队列大小为200个样本(即10个批次)。
一旦出列,它将被转置为首先具有12维,然后可以在map_fn函数中用于处理窗口。这不会在排队之前进行转置,因为第一个维度需要匹配输出的批量维度[20,50]。其中20是批量大小作为数据,50是不同的标签。
对于每个窗口,处理数据并使用较小的网络对每个map_fn的结果进行超级计算。窗口的处理是由一个非常深的神经网络完成的,这给我提出了问题,因为我给出的所有配置选项都给了我内存错误。
作为模型,我使用类似于Census Tensorflow Model的模型。
首先,我不确定这是否是最佳选择,因为评估时会构建单独的图形而不是共享变量。这将需要双倍的参数。
其次,作为集群设置,我一直在使用一个complex_l master,3个complex_l worker和3个large_model参数服务器。我不知道是否低估了这里所需的内存量。
我的模型之前曾使用过更小的网络。但是,增加它的大小开始给我带来了糟糕的内存错误。
我的问题是:
内存要求很大,但我相信它可以在cloud ml上处理。我低估了所需的内存量吗?您对此类网络的群集有何建议?
在调度函数中使用train.server时,是否需要传递cluster_spec以便在replica_device setter中使用?或者它是自己分配的?当不使用它,并设置日志放置的tf.configProto时,所有变量似乎都在主工作者上。在task.py中的Census Example上,这不会被传递。我可以假设这是正确的吗?
如何计算模型需要多少内存(粗略估计以选择群集)?
还有其他tensorflow核心教程如何设置如此大的工作? (普查除外)
在分布式图形复制中训练大型模型时,所有模型都需要适合工作人员,或者工作人员只执行操作,然后将结果传输给PS。这是否意味着工人只能为单一操作提供低内存?
PS:对于较小的型号,网络训练成功。我正在努力加深网络以获得更好的ROC。
正在进行的问题排查中出现的问题:
当replica_device_setter与参数cluster一起使用时,我注意到master有很少的内存和CPU使用率,并且检查日志放置,master上的操作很少。我检查了加载的TF_CONFIG,并为集群字段显示以下内容:
u'cluster': {u'ps': [u'ps-4da746af4e-0:2222'], u'worker': [u'worker-4da746af4e-0:2222'], u'master': [u'master-4da746af4e-0:2222']}
另一方面,在tf.train.Clusterspec文档中,它仅显示工作人员。这是否意味着主人不被视为工人?在这种情况下会发生什么?
错误是内存还是其他什么? EOF错误?