问题描述
我正在使用知识提炼实现快速DNN模型训练,如下图所示,以并行运行教师和学生模型。
我检查了一些受欢迎的存储库,例如NervanaSystems/distiller和peterliht/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。
解决方法
我正在尝试加快此训练过程的运行速度,以便在 同时使用多个设备
我怀疑这不会提高速度,尤其是在以下情况下:
(例如,在CPU上加载一个模型并且不中断GPU训练 另一个模型)。
深度学习是一条管道,它也利用CPU,可能还使用多个内核(例如,用于加载数据,但也可以接收指标,收集指标等)。
此外,与GPU / TPU相比,CPU在神经网络训练中效果不佳,除非您具有一些量身定制的CPU架构(诸如MobileNet之类的东西)。如果要在CPU上对学生进行培训,则可能会大大降低teacher
的流水线元素。
并行运行2个模型的正确方法是什么?
同样,取决于型号,但是最好利用2
GPU进行训练,并为它们之间的其他任务分配CPU内核。不过,在您的情况下,您将不得不在两个设备之间同步教师和学生的预测。
我可以使用Python多处理库为2个模型启动2个进程,即加载2个模型实例并运行forward()吗?
PyTorch提供了可能用于此目的的原语(例如“其” multiprocessing
包装,期货等),不确定mxnet
或类似的东西。