我正在使用MXNet在以下示例中对Caltech 256数据集上的Resnet模型进行微调:
https://mxnet.incubator.apache.org/how_to/finetune.html
我主要是为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
我使用hacky方式进行分区(使用IP地址),因为我无法使kv.num_workers
和kv.rank
工作。
答案 0 :(得分:2)
所以我的问题是这是正常的吗?我主要想使用分布式培训来减少培训时间。但如果需要两倍或更多的时代来达到相同的准确度,那么有什么优势呢?
不,通常情况下,分布式培训确实应该用于加速培训过程,而不是减慢培训过程。但是,有很多方法可以用错误的方式做到这一点。
根据提供的数据,工作人员仍然在单一培训('设备')模式下运行,或者可能错误地创建了kv_store。因此,每个工人只是自己训练模型。在这种情况下,您应该看到16个纪元后的验证结果接近具有8个纪元的单个机器(仅仅因为在群集中您正在分割数据)。在您的情况下,它是0.797006对比0.809072。取决于您执行了多少次实验,这些数字可能会被视为相等。我会集中研究集群引导的方式。
如果您需要深入了解如何创建kv_store(或者这是什么)并将其与分布式培训一起使用,请参阅this article。
一般来说,为了给出更好的答案,将来至少提供以下信息:
修改强>
即使开始训练的电话看起来是正确的:
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,因此可以很容易地发现这些问题,因此集群没有进行任何培训(只有独立的机器正在做某事)。