文章目录
本文档适用于需要向后兼容的用户 TensorFlow(用于代码或数据)的版本,以及需要的开发人员 在保持兼容性的同时修改TensorFlow。
语义版本2.0
TensorFlow遵循语义版本2.0(semver) 公共API。每个发布版本的TensorFlow都有MAJOR.MINOR.PATCH的形式。
例如,TensorFlow 1.2.3版本有MAJOR版本1,MINOR版本2, 和PATCH版本3.每个数字的更改具有以下含义:
主要:潜在的后向不兼容的变化。代码和数据 与以前的主要版本一起工作不一定与新的工作 发布。但是,在某些情况下,现有的TensorFlow图和检查点
可能会迁移到较新的版本;看到 图形和检查点的兼容性 有关数据兼容性的细节。 MINOR:向后兼容功能,速度提升等等
与之前的次要版本一起工作的数据,并且仅依赖于 公共API将继续工作不变。关于什么是和是的细节 不是公共API,看看是什么涵盖。
补丁:向后兼容的错误修复。
例如,1.0.0版引入了向后不兼容的更改 释放0.12.1。但是,版本1.1.1与版本向后兼容 1.0.0。
什么是覆盖
只有TensorFlow的公共API向后兼容minor和 补丁版本。公共API包含
所有记录在Python中的函数和类 tensorflow模块及其子模块除外 tf.contrib的功能和类别
名称以_开头的函数和类(因为它们是私有的) 请注意,examples/和tools/目录中的代码不是 可通过tensorflow
Python模块访问,因此不在此列 兼容性保证。
如果一个符号可以通过tensorflow Python模块或者它的 子模块,但没有记录,那么它不被视为的一部分 公共API。
C API。 以下协议缓冲区文件: attr_value config event graph op_def reader_base
summary tensor tensor_shape types
什么不包括
某些API函数明确标记为“实验性”,可以更改 后向不兼容的方式在次要版本之间。这些包括:
实验性API:Python中的tf.contrib模块及其子模块 以及C API中的任何函数或协议缓冲区中的字段 明确表示是实验性的。
其他语言:Python和C以外的其他语言的TensorFlow API, 如: C ++(通过头文件公开的
tensorflow/cc)。 Java中, 走 复合操作的细节:Python中的许多公共函数扩展为
图中的几个原始操作,这些细节将成为任何的一部分 以GraphDef的形式保存到磁盘。这些细节可能会改变
次要版本。尤其是,回归测试,确切地检查 甚至,图形之间的匹配可能会跨越次要版本 尽管图的行为应该不变并存在 检查站仍然有效。
浮点数值细节:具体的浮点值 由运营商计算可能会随时改变。用户应该只依靠 近似精度和数值稳定性,而不是特定的位
计算。在次要和补丁版本中对数字公式的更改应该是 导致准确性相当或提高,与机器中的警告 学习提高特定公式的准确性可能会导致下降
整个系统的准确性。 随机数字:由特定的随机数字计算的 随机操作可能随时改变。 用户应该只依靠大致正确的分配和
统计强度,而不是计算的具体位数。但是,我们会做出 随机位的变化很少(也可能永远不会)发布。我们 当然会记录所有这些变化。
分布式Tensorflow中的版本偏差:运行两个不同的版本 TensorFlow在单个群集中不受支持。没有保证 关于有线协议的向后兼容性。
错误:我们保留向后兼容行为的权利 (尽管不是API)如果当前实现明显中断, 也就是说,如果它与文档相矛盾,或者如果是知名的
明确的预期行为由于错误而不能正确执行。 例如,如果一个优化器宣称要实现一个众所周知的优化 算法,但由于错误而不匹配该算法,则我们将修复
优化器。我们的修复可能会破坏依赖于错误行为的代码 收敛。我们会在发行说明中注意到这些变化。 错误消息:我们保留更改错误文本的权利
消息。另外,错误的类型可能会改变,除非类型是 在文档中指定。例如,一个函数记录到 举一个InvalidArgument异常会继续
提高InvalidArgument,但人类可读的信息内容可以改变。
图形和检查点的兼容性
你有时需要保存图形和检查点。 图表描述了在训练期间运行的操作的数据流 推理和检查点包含保存在变量中的张量值 图形。
许多TensorFlow用户将图形和训练好的模型保存到磁盘 后来的评估或额外的培训,但最终运行他们保存的图表
或更高版本的模型。符合semver,任何图形或检查点 用一个版本的TensorFlow写出来就可以加载和评估一个
更高版本的TensorFlow与主要版本相同。但是,我们会 尽力在主要版本之间保持向后兼容性 可能的,以便序列化的文件可以长时间使用。
图表通过GraphDef协议缓冲区进行序列化。为了方便(罕见) 向后不兼容的图形变化,每个GraphDef都有一个版本号
与TensorFlow版本分开。例如,GraphDef版本17 inv不赞成使用reciprocal。语义是:
TensorFlow的每个版本都支持GraphDef版本的间隔。这个 间隔将在不同的补丁版本之间保持不变,并且只会越来越大
次要版本。只能删除对GraphDef版本的支持 为TensorFlow的主要版本。 新创建的图表分配了最新的GraphDef版本号。
如果给定版本的TensorFlow支持图形的GraphDef版本, 它将加载和评估与TensorFlow版本相同的行为
用于生成它(除了浮点数字细节和随机 数字),而不考虑TensorFlow的主要版本。尤其是所有 检查点文件将是兼容的。
如果GraphDef上限在(次要)版本中增加到X,那么 在下限增加到X之前至少6个月 例子(我们在这里使用假设的版本号): TensorFlow
1.2可能支持GraphDef版本4至7。 TensorFlow 1.3可以添加GraphDef版本8并支持版本4到8。
至少半年后,TensorFlow 2.0.0可能会放弃支持 版本4到7,只剩下版本8。
最后,在支持GraphDef版本的时候,我们会试着去做 提供自动将图形转换为新的支持的工具 GraphDef版本。
扩展TensorFlow时的图形和检查点兼容性
只有在对GraphDef进行不兼容的更改时,本节才有意义 格式,如添加操作,删除操作或更改功能 现有的操作。上一节应该足以满足大多数用户的需求。
向后和部分向前兼容
我们的版本方案有三个要求:
向后兼容性,支持加载图形和检查点 用旧版本的TensorFlow创建。 向前兼容性,以支持生产者的场景
图形或检查点之前升级到更新版本的TensorFlow 消费者。 以不兼容的方式启用进化的TensorFlow。例如,删除Ops,
添加属性和删除属性。
请注意,GraphDef版本机制与TensorFlow分离 版本,向后不兼容GraphDef格式的更改仍然存在
受语义版本的限制。这意味着功能只能被删除 或在MAJOR版本的TensorFlow(如1.7到2.0)之间进行更改。
另外,在补丁版本(1.x.1)中强制执行向前兼容性 以1.x.2为例)。
实现向前和向后兼容性,并知道何时执行更改 在格式中,图形和检查点都有描述它们的时间的元数据 被生产了。下面的章节详细介绍了TensorFlow的实现和
不断发展的GraphDef版本指南。
独立的数据版本计划
图形和检查点有不同的数据版本。这两个数据 格式的演变速度不同,速度也不同 来自TensorFlow。两个版本控制系统都在
core/public/version.h。 每当添加新版本时,会在标题中添加注释,详细说明内容 改变和日期。
数据,生产者和消费者
我们区分以下几种数据版本信息: 生产者:生成数据的二进制文件。生产者有一个版本 (producer)以及兼容的最低消费版本
(min_consumer)。 消费者:消耗数据的二进制文件。消费者有一个版本 (consumer)和它们兼容的最低生产者版本
(min_producer)。
每个版本化数据都有一个VersionDef 版本 记录制作数据的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_CONSUMER,和 TF_GRAPH_DEF_VERSION_MIN_PRODUCER。
对于检查点版本,我们有TF_CHECKPOINT_VERSION, TF_CHECKPOINT_VERSION_MIN_CONSUMER,和
TF_CHECKPOINT_VERSION_MIN_PRODUCER。
不断发展的GraphDef版本
本节介绍如何使用这个版本机制来做出不同的 GraphDef格式的更改类型。
添加操作
同时向消费者和生产者添加新的作品,而不是 改变任何GraphDef版本。这种改变是自动的 向后兼容,并且不影响兼容性计划
现有的生产者脚本不会突然使用新的功能。
添加一个操作并切换现有的Python包装来使用它
实现新的消费者功能并增加GraphDef版本。 如果有可能使包装仅使用新功能 以前没有用过的情况下,包装可以现在更新。
更改Python包装以使用新功能。不要增加 min_consumer,因为不使用此操作的模型不应该中断。
删除或限制操作的功能
修复所有的生产者脚本(而不是TensorFlow本身)不使用禁止的操作或 功能。 增加GraphDef版本并实现新的消费者功能
禁止在新版本中删除GraphDefs的操作或功能 以上。如有可能,使TensorFlow停止生产GraphDefs
禁止功能。为此,请添加 REGISTER_OP(…)。已过时(deprecated_at_version, 信息)。
等待主要版本的向后兼容性的目的。 将min_producer从(2)中增加到GraphDef版本,然后删除 功能完全。
更改操作的功能
添加一个新的类似的操作命名为SomethingV2或类似的,并通过 将其添加并切换现有的Python包装来使用它的过程
如果需要向前兼容,可能需要三周的时间。 删除旧的操作(只能发生与主要版本的变化,由于 向后兼容)。
增加min_consumer排除消费者与旧的欧普,加回 旧的Op作为SomethingV2的别名,并经过这个过程切换
现有的Python包装来使用它。 通过该过程删除SomethingV2。
禁止单个不安全的消费者版本
碰撞GraphDef版本并添加坏的版本到bad_consumers
所有新的GraphDefs。如有可能,只能将GraphDefs添加到bad_consumers 其中包含一定的操作或类似的。
如果现有的消费者有不好的版本,尽快将其推出 可能。
未经作者同意,本文严禁转载,违者必究!