在知识提炼中,如何并行运行学生和教师模型?

问题描述

我正在使用知识提炼实现快速DNN模型训练,如下图所示,以并行运行教师和学生模型。

我检查了一些受欢迎的存储库,例如NervanaSystems/distillerpeterliht/knowledge-distillation-pytorch。他们逐步执行学生和教师模型的正向操作,即在不同设备(GPU或cpu)上不并行执行。

我正在尝试加快训练过程,以便使用多个设备同时运行2个模型(例如,将一个模型加载到cpu上,而不中断其他模型的GPU训练)。

并行运行2个模型的正确方法是什么?我可以使用Python multiprocessing库为2个模型启动2个过程,即加载2个模型实例并运行forward()吗?我正在使用MXNet,但这是所有ML框架的普遍问题。

编辑:
我的计划是在cpu上建立一个轻量级的预训练教师模型,该模型仅在冻结参数的情况下向前运行。
学生模型是要在GPU上(分布式)训练的大型模型。 此任务不适用于模型压缩。 我想将一个轻量级任务(教师的前向传递)移到cpu上会增加重叠,并使该流水线更快。
这个想法来自研讨会文件Infer2Train: leveraging inference for better training of deep networks

knowledge distillation illustration

解决方法

我正在尝试加快此训练过程的运行速度,以便在 同时使用多个设备

我怀疑这不会提高速度,尤其是在以下情况下:

(例如,在CPU上加载一个模型并且不中断GPU训练 另一个模型)。

深度学习是一条管道,它也利用CPU,可能还使用多个内核(例如,用于加载数据,但也可以接收指标,收集指标等)。

此外,与GPU / TPU相比,CPU在神经网络训练中效果不佳,除非您具有一些量身定制的CPU架构(诸如MobileNet之类的东西)。如果要在CPU上对学生进行培训,则可能会大大降低teacher的流水线元素。

并行运行2个模型的正确方法是什么?

同样,取决于型号,但是最好利用2 GPU进行训练,并为它们之间的其他任务分配CPU内核。不过,在您的情况下,您将不得不在两个设备之间同步教师和学生的预测。

我可以使用Python多处理库为2个模型启动2个进程,即加载2个模型实例并运行forward()吗?

PyTorch提供了可能用于此目的的原语(例如“其” multiprocessing包装,期货等),不确定mxnet或类似的东西。