一、什么是Horovod
Horovod是基于Ring-AllReduce方法的深度分布式学习插件,以支持多种流行架构包括TensorFlow、Keras、PyTorch等。这样平台开发者只需要为Horovod进行配置,而不是对每个架构有不同的配置方法。
Ring-AllReduce方法是把每个计算单元构建成一个环,要做梯度平均的时候每个计算单元先把自己梯度切分成N块,然后发送到相邻下一个模块。现在有N个节点,那么N-1次发送后就能实现所有节点掌握所有其他节点的数据。这个方法被证明是一个带宽最优算法。
二、什么是分布式
1、模型并行
即把复杂的神经网络拆分,分布在计算单元或者GPU里面进行学习,让每个GPU同步进行计算。这个方法通常用在模型比较复杂的情况下。
2、数据并行
即让每个机器里都有一个完整模型,然后把数据切分成n块,把n块分发给每个计算单元,每个计算单元独自计算出自己的梯度。同时每个计算单元的梯度会进行平均、同步,同步后的梯度可以在每个节点独立去让它修正模型,整个过程结束后每个节点会得到同样的模型。这个方法可以让能够处理的数据量增加,变成了原来的n倍。
三、TensorFlow、Keras、PyTorch代码怎么使用Horovod
1、keras实例
单机Keras训练
from tensorflow import keras
import tensoflow.keras.backend as K
import tensorflow as tf
model = ...
x_train, y_train, x_test, y_test = ...
opt = keras.optimizers.Adadelta(lr=1.0)
model.complie(
loss = 'categprical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
Horovod+Keras分布式训练
from tensorflow import keras
import tensoflow.keras.backend as K
import tensorflow as tf
import horovod.tensorflow.keras as hvd
#Initialize Horovod
hvd.init()
#Pin GPU to be used
config = tf.ConfigProton