使用Keras进行分布式培训
概述
的特遣部队分发美元策略
API为跨多个处理单元分布培训提供了抽象。目标是允许用户使用现有的模型和训练代码,通过最小的更改来启用分布式训练。
本教程使用特遣部队分发MirroredStrategy美元
它在一台机器上的多个gpu上进行同步训练,实现图内复制。本质上,它将模型的所有变量复制到每个处理器。然后,它使用减少组合来自所有处理器的梯度,并将组合值应用于模型的所有副本。
MirroredStategy
是TensorFlow核心中可用的几个分发策略之一。
Keras API
此示例使用keras
API来构建模型和训练循环。
下载数据集
下载MNIST数据集并使用tfds.返回一个数据集tfdatasets
格式。
如果你还没有这样做:# tfds:: install_tfds ()mnist<-tfds_load(“mnist”)信息<-总结(mnist)
定义分配策略
创建一个MirroredStrategy
对象。这将处理分发,并提供一个上下文管理器(特遣部队分发MirroredStrategy美元美元范围
)在里面建立你的模型。
策略<-特遣部队$分发$MirroredStrategy()策略$num_replicas_in_sync
设置输入管道
当使用多个gpu训练模型时,您可以通过增加批处理大小有效地使用额外的计算能力。一般情况下,选择最适合GPU内存的批处理大小,并相应地调整学习速率。
num_train_examples<-as.integer(信息$分裂[[2]]$统计数据$numExamples)num_test_examples<-as.integer(信息$分裂[[1]]$统计数据$numExamples)BUFFER_SIZE<-10000BATCH_SIZE_PER_REPLICA<-64BATCH_SIZE<-BATCH_SIZE_PER_REPLICA*策略$num_replicas_in_sync
像素值(0-255)必须归一化到0-1的范围内。此外,我们对训练数据集和测试数据集进行了洗牌和批处理。注意,为了提高性能,我们还在内存中保留了训练数据的缓存。
train_dataset<-mnist$火车% > %dataset_map(函数(记录){记录$图像<-特遣部队$投(记录$图像,特遣部队$float32)/255记录})% > %dataset_cache()% > %dataset_shuffle(BUFFER_SIZE)% > %dataset_batch(BATCH_SIZE)% > %dataset_map(unname)test_dataset<-mnist$测验% > %dataset_map(函数(记录){记录$图像<-特遣部队$投(记录$图像,特遣部队$float32)/255记录})% > %dataset_batch(BATCH_SIZE)% > %dataset_map(unname)
创建模型
的上下文中创建和编译Keras模型美元战略范围
.
与(策略$范围(),{模型<-keras_model_sequential()% > %layer_conv_2d(过滤器=32, kernel_size=3.,激活=“relu”, input_shape=c(28,28,1))% > %layer_max_pooling_2d()% > %layer_flatten()% > %layer_dense(单位=64,激活=“relu”)% > %layer_dense(单位=10,激活=“softmax”)模型% > %编译(损失=“sparse_categorical_crossentropy”,优化器=“亚当”、指标=“准确性”)})
定义回调函数
这里使用的回调函数是:
- TensorBoard:这个回调函数为TensorBoard写一个日志,允许你可视化图形。
- 模型检查点:这个回调在每个历之后保存模型。
- 学习率调度器:使用这个回调,您可以在每个epoch/批处理之后安排学习率的变化。
为了便于说明,添加一个打印回调来显示学习速率。
定义检查点目录来存储检查点checkpoint_dir<-”。/ training_checkpoints '#检查点文件名checkpoint_prefix<-file.path(checkpoint_dir,“ckpt_{时代}”)
#衰减学习率函数。#你可以定义任何你需要的衰减函数。衰变<-函数(时代,lr){如果(时代<3.)1 e - 3其他的如果(时代> =3.& &时代<7)1的军医其他的1 e-5}
#回调函数,用于在每个历元结束时打印LR。PrintLR<-R6::R6Class(“PrintLR”,继承=KerasCallback、公共=列表(损失=零, on_epoch_end=函数(时代,日志=列表()){特遣部队$打印(胶水('\n epoch {epoch}的学习率为{as.numeric(model$optimizer$lr)}\n'))}))print_lr<-PrintLR$新()
回调<-列表(callback_tensorboard(log_dir=“/ tmp /日志”),callback_model_checkpoint(filepath=checkpoint_prefix, save_weights_only=真正的),callback_learning_rate_scheduler(衰变),print_lr)
培训和评估
现在,以通常的方式训练模型,在模型上调用fit并传入本教程开始时创建的数据集。无论你是否分发培训,这一步都是一样的。
模型% > %适合(train_dataset,时代=12,回调=回调)
正如您在下面看到的,检查点被保存了。
list.files(checkpoint_dir)
要查看模型的执行情况,请加载最新的检查点并对测试数据调用evaluate。
模型% > %load_model_weights_tf(特遣部队$火车$latest_checkpoint(checkpoint_dir))模型% > %评估(test_dataset)
tensorboard(log_dir=“/ tmp /日志”)
出口到SavedModel
将图和变量导出为与平台无关的SavedModel格式。保存模型之后,您可以在有或没有作用域的情况下加载它。
路径<-“saved_model /”模型% > %save_model_tf(路径)
加载模型美元战略范围
.
unreplicated_model<-load_model_tf(路径)unreplicated_model% > %编译(损失=“sparse_categorical_crossentropy”,优化器=“亚当”、指标=“准确性”)unreplicated_model% > %评估(test_dataset)
用美元战略范围
.
与(策略$范围(),{replicated_model<-load_model_tf(路径)replicated_model% > %编译(损失=“sparse_categorical_crossentropy”,优化器=“亚当”、指标=“准确性”)replicated_model% > %评估(test_dataset)})