Deep learning MXNet分布式训练精度

Deep learning MXNet分布式训练精度,deep-learning,mxnet,Deep Learning,Mxnet,我正在使用MXNet对Caltech 256数据集上的Resnet模型进行微调,示例如下: 我主要是为了一个POC来测试分布式培训(稍后我将在我的实际项目中使用) 首先,我在一台机器上运行了这个例子,使用2个GPU运行了8个时代。我花了大约20分钟,最终验证准确度为0.809072 然后,我在两台机器上运行它(相同,每个机器有2个GPU),使用分布式设置,并将这两台机器的训练数据分成两半(使用num\u parts和part\u index) 8个时代只需10分钟,但最终验证精度仅为0.772

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

我主要是为了一个POC来测试分布式培训(稍后我将在我的实际项目中使用)

首先,我在一台机器上运行了这个例子,使用2个GPU运行了8个时代。我花了大约20分钟,最终验证准确度为0.809072

然后,我在两台机器上运行它(相同,每个机器有2个GPU),使用分布式设置,并将这两台机器的训练数据分成两半(使用
num\u parts
part\u index

8个时代只需10分钟,但最终验证精度仅为0.772847(两者中最高)。即使使用16个纪元,我也只能达到0.797006

所以我的问题是这正常吗?我主要想使用分布式培训来减少培训时间。但如果需要两次或更多的时间才能达到相同的精度,那么优势是什么?也许我错过了什么

如果需要,我可以发布代码并运行命令

谢谢

编辑

有关答案的更多信息:

MXNet版本:0.11.0

拓扑:2个工人(每个工人在单独的机器上)

代码:

启动命令:

python3-mxnet/tools/launch.py-n2-H主机——同步dst目录/tmp/mxnet-python3-training.py——千伏存储区同步——GPU 0,1

我使用了一种黑客方法来进行分区(使用IP地址),因为我无法让
kv.num_workers
kv.rank
工作

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

不,这不是正常情况,分布式培训确实应该用来加速培训过程,而不是减慢培训过程。然而,有很多方法是错误的

根据提供的数据,感觉工人仍在单一培训(“设备”)模式下运行,或者可能kv_商店创建不正确。因此,每个工人只是训练自己的模特儿。在这种情况下,您应该看到16个历元之后的验证结果接近于8个历元的单机(因为在集群中您正在分割数据)。你的情况是0.797006对0.809072。取决于你做了多少次实验,这些数字可能会被视为相等。我将重点研究集群如何引导

如果您需要更深入地了解如何创建kv_存储(或这是什么),并将其与分布式培训结合使用,请参阅

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

  • MXNet的版本是什么
  • 集群的拓扑结构是什么,包含以下信息:
    • 使用了多少逻辑工作者
    • 使用了多少台服务器(它们与工人在同一台机器上)
  • 如何开始培训(最好是使用代码)
  • 如果无法提供代码,则至少指定kv_存储的类型
  • 如何在工作线程之间划分数据
编辑

尽管开始训练的呼叫看起来是正确的:

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本身至少存在一个问题。如果您看一下,它实际上并不尊重输入参数中的kv存储类型,而是使用“device”。因此,所有工人都在单独培训模型(而不是在集群中)。我相信修正这一行应该会有帮助

为了熟悉MXNet集群是如何工作的,我再次建议您阅读。通过分析调试日志并观察到并没有创建kv存储,所以集群并没有进行任何培训(只有独立的机器在做一些事情),可以很容易地发现这些问题

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

不,这不是正常情况,分布式培训确实应该用来加速培训过程,而不是减慢培训过程。然而,有很多方法是错误的

根据提供的数据,感觉工人仍在单一培训(“设备”)模式下运行,或者可能kv_商店创建不正确。因此,每个工人只是训练自己的模特儿。在这种情况下,您应该看到16个历元之后的验证结果接近于8个历元的单机(因为在集群中您正在分割数据)。你的情况是0.797006对0.809072。取决于你做了多少次实验,这些数字可能会被视为相等。我将重点研究集群如何引导

如果您需要更深入地了解如何创建kv_存储(或这是什么),并将其与分布式培训结合使用,请参阅

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

  • MXNet的版本是什么
  • 集群的拓扑结构是什么,包含以下信息:
    • 使用了多少逻辑工作者
    • 使用了多少台服务器(它们与工人在同一台机器上)
  • 如何开始培训(最好是使用代码)
  • 如果无法提供代码,则至少指定kv_存储的类型
  • 如何在工作线程之间划分数据
编辑

尽管开始训练的呼叫看起来是正确的:

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本身至少存在一个问题。如果您看一下,它实际上并不尊重输入参数中的kv存储类型,而是使用“device”。因此