我正在尝试在 Cloud ML 上训练一个非常深的模型,但是我遇到了严重的内存问题,我无法解决。该模型是一个非常深的卷积神经网络,用于自动标记音乐。
可以在下图中找到此模型。将张量为 12x38832x1 的 20 个批次插入网络中。
音乐最初是 465894x1 样本,然后被分成 12 个窗口。因此,12x38832x1。当使用 map_fn 函数时,每个循环都会有单独的 38832x1 个样本(conv1d)。
一次处理窗口比使用一个 CNN 处理整个音乐产生更好的结果。这是在将数据存储到 TFRecords 之前进行拆分的,以最大程度地减少训练期间所需的处理。这被加载到最大队列大小为 200 个样本(即 10 个批次)的队列中。
一旦出队,它首先被转置为具有 12 维,然后可以在 map_fn 函数中用于处理窗口。这在排队之前不会转置,因为第一个维度需要匹配输出的批次维度,即 [20, 50]。其中 20 是作为数据的批量大小,50 是不同的标签。
对于每个窗口,处理数据并使用较小的网络对每个 map_fn 的结果进行超级池化。窗口的处理是由一个非常深的神经网络完成的,这给我带来了一些问题,因为我给出的所有配置选项都给了我内存不足的错误。
作为模型,我使用的是类似于Census Tensorflow 模型的模型。
首先,我不确定这是否是最好的选择,因为为了评估,构建了一个单独的图表而不是共享变量。这将需要双倍数量的参数。
其次,作为集群设置,我一直在使用一个 complex_l master、3 complex_l worker 和 3 large_model 参数服务器。我不知道我是否低估了这里所需的内存量。
我的模型以前使用过一个小得多的网络。但是,增加它的大小开始给我带来严重的内存不足错误。
我的问题是:
内存需求很大,但我确信它可以在 cloud ml 上处理。我是否低估了所需的内存量?您对此类网络的集群有何建议?
在 dispatch 函数中使用 train.server 时,是否需要传递 cluster_spec 以便在 replica_device 设置器中使用它?还是它自己分配?当不使用它并设置日志放置的 tf.configProto 时,所有变量似乎都在 master worker 上。在 task.py 中的人口普查示例中,这不会被传递。我可以假设这是正确的吗?
如何计算模型需要多少内存(粗略估计选择集群)?
还有其他 tensorflow 核心教程如何设置如此大的工作吗?(人口普查除外)
在分布式图间复制中训练一个大模型时,是所有模型都需要适合worker,还是worker只做ops然后将结果传输到PS。这是否意味着工人可以只为单一操作而拥有低内存?
PS:使用较小的模型,网络训练成功。我正在努力加深网络以获得更好的 ROC。
正在进行的故障排除中出现的问题:
当使用带有参数 cluster 的 replica_device_setter 时,我注意到 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 错误?