页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

如 图形和检查点的兼容性中所述,TensorFlow使用版本信息标记每种数据,以保持向后兼容性。本文档提供有关版本控制机制的其他详细信息,以及如何使用它来安全地更改数据格式。

向后和部分向前兼容性

从TensorFlow导出并导入到TensorFlow中的两个核心工件是检查点(序列化变量状态)和GraphDefs(序列化计算图)。对这些工件进行版本控制的任何方法都必须考虑以下要求:

  • 向后兼容性支持GraphDefs使用旧版本的TensorFlow创建的加载。
  • 向前兼容性,以支持GraphDef在消费者之前将生产者 升级到较新版本的TensorFlow的场景。
  • 以不兼容的方式启用不断发展的TensorFlow。例如,删除Ops,添加属性和删除属性。

对于GraphDefs,向后兼容性在主要版本中实施。这意味着只能在主要版本之间移除功能。在Patch版本(例如,1.x.1 - > 1.x.2)中强制执行前向兼容性。

为了实现向后和向前的兼容性以及知道何时执行格式更改,图形和可变状态的序列化表示需要具有描述生成时间的元数据。以下各节详细介绍了TensorFlow实现和演进GraphDef版本的指导 。

独立数据版本方案

GraphDefs和检查点的数据版本。两种数据格式都以不同的速度进行演化,并且速度也不同于TensorFlow版本。这两个版本的系统中定义 core/public/version.h。每当添加新版本时,会在头文件中添加一个注释,说明更改的内容和日期。

数据,生产者和消费者

本节讨论数据的版本信息,产生数据(生产者)的二进制文件和消费数据(消费者)的二进制文件:

  • 生产者二进制文件具有producer与(min_consumer))兼容的版本()和最低消费者版本。
  • 消费者二进制文件具有consumer与(min_producer))兼容的version()和最小生产者版本。
  • 每个版本化数据都有一个VersionDef versions 字段,用于记录与producer数据min_consumer 兼容的数据,以及不允许的bad_consumers版本列表。

默认情况下,当制作者制作一些数据时,数据会继承制作 producer人和min_consumer版本。bad_consumers如果已知具体的消费者版本包含错误并且必须避免,可以设置它们。如果消费者可以接受一条数据

  • consumer > =数据 min_consumer
  • 数据的producer> =消费者min_producer
  • consumer 不在数据中 bad_consumers

由于生产者和消费者都来自同一个TensorFlow代码库, core/public/version.h 它包含一个主要的二进制版本,它被视为producer或者 consumer依赖于上下文和两者min_consumer,分别min_producer 由生产者和消费者来处理。特别,

  • 对于GraphDef版本中,我们有TF_GRAPH_DEF_VERSION, TF_GRAPH_DEF_VERSION_MIN_CONSUMERTF_GRAPH_DEF_VERSION_MIN_PRODUCER
  • 对于检查点的版本,我们有TF_CHECKPOINT_VERSION, TF_CHECKPOINT_VERSION_MIN_CONSUMERTF_CHECKPOINT_VERSION_MIN_PRODUCER

演进GraphDef版本

本节介绍使用此版本控制机制来更改GraphDef格式的示例。

添加新的操作:

  1. 同时向消费者和生产者添加新的Op,不要更改任何GraphDef版本。这种类型的更改自动向后兼容,并且不会影响向前兼容性计划,因为现有的生产者脚本不会突然使用新功能。

添加一个新的Op并切换现有的Python包装器来使用它:

  1. 实现新的消费者功能并增加二进制版本。
  2. 如果可以使包装器仅在以前不工作的情况下使用新功能,则可以现在更新包装器。
  3. 更改Python包装器以使用新功能。不要增加 min_consumer,因为不使用此Op的模型不应该中断。

删除Op或限制Op的功能:

  1. 修复所有的生产者脚本(不是TensorFlow本身),以不使用被禁止的操作或功能。
  2. 增加二进制版本并实现新的消费者功能,禁用新版本及更高版本的GraphDefs的已删除Op或功能。如果可能,使TensorFlow停止生产GraphDefs与禁止的功能。这可以做到REGISTER_OP(...).Deprecated(deprecated_at_version, message)
  3. 等待主要版本的向后兼容性目的。
  4. 增加min_producer从(2)GraphDef版本和完全删除的功能。

改变Op的功能:

  1. 添加一个新的类似的Op命名SomethingV2或类似的,并通过添加它并切换现有的Python包装器来使用它的过程(如果需要向前兼容,可能需要3周)。
  2. 删除旧的操作(只能由于向后兼容性而发生主版本更改)。
  3. 增加min_consumer消除旧的Op的消费者,添加旧的Op作为别名SomethingV2,并通过该过程来切换现有的Python包装器来使用它。
  4. 通过该过程去除SomethingV2

禁止无法安全运行的单个用户端版本:

  1.  bad_consumers颠覆二进制版本,并为所有新的GraphDefs 添加不良版本。如果可能,bad_consumers仅添加到包含某个Op或类似的GraphDefs。
  2. 如果现有的消费者有坏的版本,尽快推出。

 

  • 无标签