我正在使用MXNet对Caltech 256数据集上的Resnet模型进行细化,如下示例所示:
我主要是为了POC来测试分布式培训(稍后我将在我的实际项目中使用)。
首先,我在一台带有2个GPU的单机上运行了这个示例,运行时间为8个周期。我花了大约20分钟,最终验证的准确性是0.809072。
然后,我使用分布式设置在2台机器上运行它(相同,每个机器都有2个GPU),并将这两台机器的训练数据分成两部分(使用num_parts和part_index)。
8个历元仅需10分钟,但最终验证精度仅为0.772847 (两者中最高)。即使我用了16个年代,我也只能达到0.797006。
所以我的问题是这很正常吗?我主要想使用分布式培训来减少培训时间。但是,如果需要两次或更多的时间才能达到同样的精度,那么有什么好处呢?也许我遗漏了什么。
如果需要,我可以发布我的代码并运行命令。
谢谢
编辑
一些更多的信息可以帮助我们找到答案:
MXNet版本: 0.11.0
拓扑:2工作人员(每个在一台单独的机器上)
代码: https://gist.github.com/reactivefuture/2a1f9dcd3b27c0fe8215b4e3d25056ce
命令启动:
python3 mxnet/tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet python3 training.py --kv-store dist_sync --gpus 0,1
由于无法让kv.num_workers和kv.rank工作,我使用了一种恶意的方式来进行分区(使用IP地址)。
发布于 2017-10-02 23:07:34
所以我的问题是这很正常吗?我主要想使用分布式培训来减少培训时间。但是,如果需要两次或更多的时间才能达到同样的精度,那么有什么好处呢?
不,这不是正常情况,分散的训练确实应该用来加速训练的过程,而不是减缓它的速度。然而,有很多方法可以用错误的方式来做。
根据所提供的数据,感觉员工仍在以单一培训(“device”)模式运行,或者kv_store的创建可能不正确。因此,每个工人都只是训练自己的榜样。在这种情况下,您应该会看到验证结果,在16个历元之后,它已经接近于单机的8个历元(仅仅是因为在集群中,您正在分割数据)。在你的例子中,是0.797006比0.809072。取决于您执行了多少次实验,这个数字可能被视为相等。我将重点研究集群是如何引导的。
如果您需要深入探讨如何创建kv_store(或者这是什么),并将其与分布式培训一起使用,请参阅这篇文章。
一般来说,为了给出一个更好的答案,今后请至少提供以下信息:
编辑
尽管开始训练的呼叫看起来是正确的:
python3 mxnet/tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet python3 training.py --kv-store dist_sync --gpus 0,1training.py本身至少有一个问题。如果您查看这里,实际上它不尊重输入参数中的kv存储类型,而只使用“设备”。因此,所有员工都在单独培训该模型(而不是在集群中)。我认为修这条线会有帮助。
我再次建议您阅读文章,以便熟悉MXNet集群是如何工作的。这样的问题可以很容易地通过分析调试日志和观察没有创建kv存储来发现,因此集群没有训练任何东西(只有独立的机器正在做一些事情)。
https://stackoverflow.com/questions/46460492
复制相似问题