tensorflow - 在 Tensorflow/Keras 中需要一种清晰简单的分布式学习方法
问题描述
我有多台机器,有些有 GPU,有些没有。我还有一个 keras 模型可以在单台机器上正常工作,但我想在分布式模式下训练它,因为我想用一个巨大的数据集和更多的层数来测试它。在 tf.distribute 中有很多页面讨论分配策略,但同时还有很多其他页面显示如何使用估计器封装 keras 模型,设置 TF_CONFIG 参数然后调用tf.estimator.train_and_evaluate
. 我个人使用了第二种方法,因为它更简单,并且正在努力调整和调试它。无论如何它都有效,但我很困惑所有与策略相关的东西有什么意义,因为我没有看到在第二种方法中使用它们,并且文档无助于清除它。
我也有些怀疑我的文件设置环境是否正确:我的理解是 PS 服务器将保存模型参数,而主服务器将管理整个训练过程,分发数据,保存摘要和检查点。所以我假设:
0- 我只需要一台主服务器,至少一台 PS 服务器,可能还有一些工人和一名评估员。所有这些服务器之间的数据和参数共享和通信都是由系统完成的,我不参与。
1-所有机器的主要 python 代码应该完全相同,除了定义特定机器的任务和索引的 TF_CONFIG 定义。
2- 我应该在所有主管和工人都可以使用的文件夹中拥有一份共享的数据副本。
3- 我应该有一个共享日志目录,所有机器都可以访问,如 tf.estimator.RunConfig 中定义的那样。
4- 有了这个设置,下面的一段代码就可以完成这项工作(假设model
已经在别处定义并且read_datasets
函数返回用于运行模型的特征和标签):
runConfig = tf.estimator.RunConfig(
session_config=config,
model_dir=log_dir,
save_summary_steps=1,
save_checkpoints_steps=train_steps
)
estimator = tf.keras.estimator.model_to_estimator(model, model_dir=log_dir, config=runConfig)
train_spec = tf.estimator.TrainSpec(input_fn=lambda: read_datasets(...), max_steps=epochs*train_steps)
eval_spec = tf.estimator.EvalSpec(input_fn=lambda: read_datasets(...), start_delay_secs=1, throttle_secs=1)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
尽管上述方法似乎工作正常,但我仍然难以理解酋长如何在工作人员之间划分数据集以及如何在这种方法中设置 train_step 和 batch_size。此外,我不知道如何在tf.estimator.evaluate
不为封装的 keras 估计器编写自定义 model_fn 的情况下报告准确性和其他指标,例如精度/召回率/F1 以及运行时的损失。
解决方案
推荐阅读
- botframework - 在发送消息之前等待 HeroCard 图像加载
- gradle - IntelliJ 在 build.gradle 文件中给出了不必要的合格参考警告
- arrays - 使用 for 循环计算 2 个数组
- python - pygame中的移动图像不起作用
- postgresql - 在 JSON 数据类型中选择最大值
- aem - AEM 独立组件库站点
- javascript - 在 node.js / discord.js 中导出/导入
- arrays - 如何将数组添加到 Workbook.Names 并在数据验证中引用它?
- nginx - Nginx 不提供资产文件
- anaconda - 无法从终端 ubuntu 16.04 启动 spyder