MXNet分布式培训准确性

时间:2017-09-28 03:26:55

标签: deep-learning mxnet

我正在使用MXNet在以下示例中对Caltech 256数据集上的Resnet模型进行微调:

https://mxnet.incubator.apache.org/how_to/finetune.html

我主要是为POC测试分布式培训(我后来在实际项目中使用)。

首先,我在一台机器上运行此示例,其中包含2个GPU,共8个时期。我花了大约20分钟,最终验证准确度为0.809072。

然后我在2台机器上运行它们(相同,每个都有2个GPU)并进行分布式设置,并将这两台机器的训练数据分成两半(使用num_partspart_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

我使用hacky方式进行分区(使用IP地址),因为我无法使kv.num_workerskv.rank工作。

1 个答案:

答案 0 :(得分:2)

  

所以我的问题是这是正常的吗?我主要想使用分布式培训来减少培训时间。但如果需要两倍或更多的时代来达到相同的准确度,那么有什么优势呢?

不,通常情况下,分布式培训确实应该用于加速培训过程,而不是减慢培训过程。但是,有很多方法可以用错误的方式做到这一点。

根据提供的数据,工作人员仍然在单一培训('设备')模式下运行,或者可能错误地创建了kv_store。因此,每个工人只是自己训练模型。在这种情况下,您应该看到16个纪元后的验证结果接近具有8个纪元的单个机器(仅仅因为在群集中您正在分割数据)。在您的情况下,它是0.797006对比0.809072。取决于您执行了多少次实验,这些数字可能会被视为相等。我会集中研究集群引导的方式。

如果您需要深入了解如何创建kv_store(或者这是什么)并将其与分布式培训一起使用,请参阅this article

一般来说,为了给出更好的答案,将来至少提供以下信息:

  • MXNet的版本是什么?
  • 群集的拓扑结构是什么,包含以下信息:
    • 使用了多少逻辑工作人员;
    • 使用了多少台服务器(它们与工作人员在同一台机器上)?
  • 你如何开始训练(理想情况下是代码)
  • 如果无法提供代码,至少要指定kv_store的类型
  • 如何在worker
  • 之间对数据进行分区

修改

即使开始训练的电话看起来是正确的:

python3 mxnet/tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet python3 training.py --kv-store dist_sync --gpus 0,1

training.py本身至少存在一个问题。如果你看here,它实际上不尊重输入参数的kv-store类型,只使用'device'。因此,所有工人都在分开训练模型(而不是在集群中)。我相信修复这一行应该会有所帮助。

我会再次建议您阅读the article,以便熟悉MXNet群集的工作原理。通过分析调试日志并观察到没有创建kv-store,因此可以很容易地发现这些问题,因此集群没有进行任何培训(只有独立的机器正在做某事)。