egolearner / paper-note

7 stars 2 forks source link

TensorFlow Estimators: Managing Simplicity vs. Flexibility in High-Level Machine Learning Frameworks[5] #6

Open egolearner opened 4 years ago

egolearner commented 4 years ago

1 引文

对简洁性(Simplicity)的定义:

对健壮性(Robustness)的定义,既指软件开发过程,又指软件产品,对框架健壮性的定义为使用框架容易编写正确而高质量的软件,难以编写有问题或低效的软件。 Estimator的目标是给用户提供容易使用的工具,而不妨碍用户使用Tensorflow的通用功能。因此没有提供DSL,而是提供了通用代码的最佳实践的实现,用户不需要再写类似training loop的代码。作者也提到,Estimator的借口借鉴了Scikit-Learn。

2 总体设计

Estimator构建在Tensorflow之上,继承了一些设计模式:优先使用函数或闭包而非对象,经常使用callback,Layer函数是Tensor进Tensor出的。 Estimator的需求:

3 组件

3.1 Layers

Layer:可重用的代码,可以简单如全连接网络的层,也可以复杂如完整的inception网络。 实现Layer的最佳实践:

特殊的Layer:

3.2 Estimator

Estimator接口包括4个函数:

配置Estimator时向构造函数传递model_fn回调函数,上面的4个函数之一执行时,Estimator创建Tensorflow图,建立输入流水线,使用合适的参数调用model_fn以生成表示模型的图。Estimator包含必要的代码以运行training或evaluation loop,执行预测,或导出模型。 Estimator向用户隐藏了Graph或Session。构造函数接收RunConfig配置对象,以获取环境信息,如可用worker数,checkpoint保存频率。 为了保证封装性,Estimator每次函数调用都创建新的图,并可能从checkpoint中恢复。重建图开销很高,虽然可以缓存,但Estimator显式重建图,牺牲性能换取简洁,防止用户写出在循环中调用estimator函数的低效代码。

以input_fn指定输入 input_fn期望返回两个字典,一个包含输入Tensor,一个包含标签Tensor。将核心模型与输入处理解耦方便用户切换数据集。 以model_fn指定模型 使用一个回调函数返回训练、评估、预测用的OP,优点是鼓励模型开发者只写一次模型,防止写多个函数引入不一致。 以Head指定输出 Head API是模型最后的隐层之后的部分的抽象,以简化model_fn的编写。Head知道如何计算loss、相关评估指标、预测及预测的元数据。 执行计算 Estimator实现并控制training loop,自动将Variable赋给PS以简化分布式计算。 以Hook做代码注入 Hook允许用户定义Session创建、迭代开始或结束、训练结束时的自定义行为。

3.3 内置Estimator

内置Estimator继承自Estimator,仅覆盖构造函数,主要被限制在定义model_fn。内置Estimator的开发者成为Estimator的用户。

4 分布式执行

当前Estimator多副本训练的主要模式是between graph复制和异步训练。

5 案例研究和推广

在Google迅速推广。 image