Horovodは、Uberが開発したオープンソースの分散型深層学習トレーニングフレームワークです。その目標は、分散型深層学習トレーニングをより簡単、高速、かつ使いやすくすることです。Horovodは、TensorFlow、Keras、PyTorch、Apache MXNetなどの一般的な深層学習フレームワークをサポートしています。
Horovodは、主に以下の深層学習フレームワークをサポートしています。
Horovodは、以下の通信メカニズムをサポートしています。
Horovodのインストールプロセスは、使用する深層学習フレームワークと通信メカニズムによって異なります。通常、最初にMPIまたはNCCLをインストールしてから、pipを使用してHorovodをインストールする必要があります。
たとえば、pipを使用してHorovodをインストールし、TensorFlowとNCCLをサポートするには、次のコマンドを実行します。
pip install horovod[tensorflow,gpu]
詳細なインストール手順については、Horovodの公式ドキュメントを参照してください:https://github.com/horovod/horovod
Horovodを使用して分散型トレーニングを行うには、通常、次の手順を実行します。
horovod.init()
を呼び出してHorovodを初期化します。DistributedOptimizer
の使用: Horovodが提供するDistributedOptimizer
を使用して、元のオプティマイザをラップします。以下は、Horovodを使用してTensorFlowで分散型トレーニングを行う簡単な例です。
import tensorflow as tf
import horovod.tensorflow as hvd
# 1. Horovodの初期化
hvd.init()
# 2. GPUの固定
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')
# 3. データセットのロード
(mnist_images, mnist_labels), _ = tf.keras.datasets.mnist.load_data()
dataset = tf.data.Dataset.from_tensor_slices(
(tf.cast(mnist_images[..., None] / 255.0, tf.float32),
tf.cast(mnist_labels, tf.int64)))
dataset = dataset.repeat().shuffle(10000).batch(128)
# 4. モデルの構築
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
tf.keras.layers.Conv2D(64, [3, 3], activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10, activation='softmax')
])
# 5. オプティマイザの定義
opt = tf.keras.optimizers.Adam(0.001 * hvd.size()) # 学習率のスケーリング
# 6. DistributedOptimizerの使用
opt = hvd.DistributedOptimizer(opt)
# 7. 損失関数と指標の定義
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()
metric = tf.keras.metrics.SparseCategoricalAccuracy()
# 8. トレーニングステップの定義
@tf.function
def train_step(images, labels):
with tf.GradientTape() as tape:
probs = model(images, training=True)
loss = loss_fn(labels, probs)
tape = hvd.DistributedGradientTape(tape)
gradients = tape.gradient(loss, model.trainable_variables)
opt.apply_gradients(zip(gradients, model.trainable_variables))
metric.update_state(labels, probs)
return loss
# 9. 初期変数のブロードキャスト
@tf.function
def initialize_vars():
if hvd.rank() == 0:
model(tf.zeros((1, 28, 28, 1)))
hvd.broadcast_variables(model.variables, root_rank=0)
hvd.broadcast_variables(opt.variables(), root_rank=0)
initialize_vars()
# 10. トレーニングループ
for batch, (images, labels) in enumerate(dataset.take(10000 // hvd.size())):
loss = train_step(images, labels)
if batch % 10 == 0 and hvd.rank() == 0:
print('batch: %d, loss: %.4f, accuracy: %.2f' % (batch, loss, metric.result()))
Horovodは、大規模な深層学習モデルをより簡単かつ迅速にトレーニングするのに役立つ強力な分散型深層学習フレームワークです。複数のGPUまたはCPUノードを利用することで、Horovodはトレーニング時間を大幅に短縮し、モデルの精度を向上させることができます。