使用Keras进行分布式培训

    概述

    特遣部队分发美元策略API为跨多个处理单元分布培训提供了抽象。目标是允许用户使用现有的模型和训练代码,通过最小的更改来启用分布式训练。

    本教程使用特遣部队分发MirroredStrategy美元它在一台机器上的多个gpu上进行同步训练,实现图内复制。本质上,它将模型的所有变量复制到每个处理器。然后,它使用减少组合来自所有处理器的梯度,并将组合值应用于模型的所有副本。

    MirroredStategy是TensorFlow核心中可用的几个分发策略之一。

    Keras API

    此示例使用kerasAPI来构建模型和训练循环。

    图书馆tensorflow图书馆keras图书馆tfdatasets#用于加载MNIST数据集图书馆tfds图书馆purrr图书馆胶水

    下载数据集

    下载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统计数据numExamplesnum_test_examples<-as.integer信息分裂[[1统计数据numExamplesBUFFER_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_shuffleBUFFER_SIZE% > %dataset_batchBATCH_SIZE% > %dataset_mapunnametest_dataset<-mnist测验% > %dataset_map函数记录记录图像<-特遣部队记录图像特遣部队float32/255记录% > %dataset_batchBATCH_SIZE% > %dataset_mapunname

    创建模型

    的上下文中创建和编译Keras模型美元战略范围

    策略范围模型<-keras_model_sequential% > %layer_conv_2d过滤器32, kernel_size3.,激活“relu”, input_shapec28281% > %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.pathcheckpoint_dir“ckpt_{时代}”
    #衰减学习率函数。#你可以定义任何你需要的衰减函数。衰变<-函数时代lr如果时代<3.1 e - 3其他的如果时代> =3.& &时代<71的军医其他的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_tensorboardlog_dir“/ tmp /日志”callback_model_checkpointfilepathcheckpoint_prefix, save_weights_only真正的callback_learning_rate_scheduler衰变print_lr

    培训和评估

    现在,以通常的方式训练模型,在模型上调用fit并传入本教程开始时创建的数据集。无论你是否分发培训,这一步都是一样的。

    模型% > %适合train_dataset,时代12,回调回调

    正如您在下面看到的,检查点被保存了。

    list.filescheckpoint_dir

    要查看模型的执行情况,请加载最新的检查点并对测试数据调用evaluate。

    模型% > %load_model_weights_tf特遣部队火车latest_checkpointcheckpoint_dir模型% > %评估test_dataset
    tensorboardlog_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