混合TensorFlow和TensorFlow联合代码的推荐方法是什么?

时间:2019-03-21 18:09:57

标签: python tensorflow tensorflow-federated

TensorFlow(TF)和TensorFlow联合(TFF)是不同的功能层,旨在共同发挥作用(顾名思义)。

仍然,它们是旨在解决不同问题的不同事物。

我想知道以哪种方式来描述计算的最佳方式,这种方式既可以用于普通TF也可以用于TFF工作负载,以及人们可能希望避免的那种陷阱。

1 个答案:

答案 0 :(得分:3)

很好的问题。实际上,至少有3种方法来处理与TFF一起使用的TensorFlow代码的组成,每种方法各有优点。

  1. 假设TensorFlow适用于您的特定情况,建议使用TensorFlow的合成机制(defuns)。 TensorFlow已经具有用于编写代码的机制,我们不想重新发明轮子。我们在TFF(@ tff.tf_computation)中创建了自己的合成机制的原因是为了应对特定的限制(例如,在TF的接口级别上缺乏对数据集的支持,以及TF组件需要与之互操作的原因) TFF的其余部分),我们最好将这种机制的使用限制在真正需要它的情况下。

在可能的情况下,使用@ tf.function装饰TensorFlow组件,并将整个TensorFlow块仅在顶层包装为@ tff.tf_computation,然后再将其嵌入@ tff.federated_computation。这样做的许多好处之一是,它允许您使用标准的TensorFlow工具在TFF之外测试组件。

因此,建议采取以下措施:

# here using TensorFlow's compositional mechanism (defuns)
# rather than TFF's to decorate "foo"
@tf.function(...)
def foo(...):
  ...

@tff.tf_computation(...)
def bar(...):
  # here relying on TensorFlow to embed "foo" as a component of "bar"
  ...foo(...)...
  1. 使用Python的组合机制(普通的未经修饰的Python函数)也是一个不错的选择,尽管它不如(1)更好,因为在TFF跟踪时,它只会在定义时将一个代码主体嵌入到另一个代码主体中所有使用TFF装饰的Python函数都可以构造要执行的计算的序列化表示,而不会给您带来孤立或任何其他特殊好处。

您可能仍希望使用此模式来在TFF之外或在(1)或(3)都不起作用的情况下对组件进行测试。

因此,如果(1)不起作用,则应首先考虑以下替代方法:

# here composing things in Python, no special TF or TFF mechanism employed
def foo(...):
  # keep in mind that in this case, "foo" can access and tamper with
  # the internal state of "bar" - you get no isolation benefits
  ... 

@tff.tf_computation(...)
def bar(...):
  # here effectively just executing "foo" within "bar" at the
  # time "bar" is traced
  ...foo(...)...
  1. 不建议使用TFF的合成机制(@ tff.tf_computation),除非-如上所述-在需要它的情况下,例如TensorFlow组件需要接受数据集作为参数,或者是否要使用仅从@ tff.federated_computation调用。请记住,TFF对数据集作为参数的支持仍处于试验阶段,尽管在某些情况下它可能是唯一的解决方案,但您仍然可能会遇到问题。您可以期望实现会不断发展。

不鼓励(尽管目前有时是必要的):

# here using TFF's compositional mechanism
@tff.tf_computation(...)
def foo(...):
  # here you do get isolation benefits - "foo" is traced and
  # serialized by TFF, but you can expect that e.g., some
  # tf.data.Dataset features won't work
  ...

@tff.tf_computation(...)
def bar(...):
  # here relying on TFF to embed "foo" within "bar"
  ...foo(...)...