
Как TensorFlow обрабатывает обратную совместимость в разных версиях
14 августа 2025 г.Обзор контента
- Семантические версии 2.0
- Что покрыто
- Отдельный номер версии Forthensorflow Lite
- Отдельный номер версии для API расширения TensorFlow Lite
- Что не покрыто
- Совместимость сохраненных моделей, графиков и контрольных точек
- Совместимость графика
- Совместимость с графиками и контрольной точкой при расширении TensorFlow
- Обратная и частичная совместимость вперед
- Независимые схемы версий данных
- Данные, производители и потребители
- Добавить новый атрибут по умолчанию к существующему OP
- Развивающиеся версии графика
Этот документ предназначен для пользователей, которые нуждаются в обратной совместимости в разных версиях TensorFlow (для кода или данных), и для разработчиков, которые хотят изменить TensorFlow при сохранении совместимости.
Семантические версии 2.0
TensorFlow в основном следует за семантическими версиями 2.0 (Семвер) для своего публичного API. Каждая версия TensorFlow имеет формуMAJOR.MINOR.PATCH
Полем Например, TensorFlow версия 1.2.3MAJOR
Версия 1,MINOR
Версия 2, иPATCH
Версия 3. Изменения в каждом номере имеют следующее значение:
- ГЛАВНЫЙ: Потенциально назад несовместимые изменения. Код и данные, которые работали с предыдущим крупным выпуском, не обязательно будут работать с новым выпуском. Тем не менее, в некоторых случаях существующие графики тензора и контрольные точки могут быть перенесены на более новый релиз; видетьСовместимость графиков и контрольных точекДля получения подробной информации о совместимости данных.
- НЕЗНАЧИТЕЛЬНЫЙ: Обратно совместимые функции, улучшения скорости и т. Д. Код и данные, которые работали с предыдущим незначительным выпускомичто зависит только от неэкспериментального общественного API, будет продолжать работать без изменений. Для получения подробной информации о том, что является и не является публичным API, см.Что покрытоПолем Обратите внимание, что TensorFlow иногда вносит нарушающие изменения в новых незначительных выпусках, где ожидается, что воздействие будет незначительным. Примеры таких изменений см. В разделе «Разрушенные изменения» для прошлых незначительных выпусков вhttps://github.com/tensorflow/tensorflow/releases
- ПЛАСТЫРЬ: Обратно совместимых исправлений ошибок.
Например, релиз 1.0.0 введен назаднесовместимыйИзменения от выпуска 0,12,1. Тем не менее, релиз 1.1.1 был задом напередсовместимыйС выпуском 1.0.0.
Что покрыто
Только публичные APIS Tensorflow являются обратно, совместимы с минорными и патч -версиями. Общественные API состоят из
Все задокументированоПитонфункции и классы в
tensorflow
модуль и его подмодули, за исключением- Частные символы: любая функция, класс и т. Д., чье имя начинается с
_
- Экспериментальный и
tf.contrib
Символы, смнижеДля получения подробной информации.
Обратите внимание, что код в
examples/
иtools/
каталоги не доступны черезtensorflow
Модуль Python и, таким образом, не покрывается гарантией совместимости.Если символ доступен через
tensorflow
Модуль Python или его подмодули, но не задокументирован, тогда оннетсчитается частью публичного API.- Частные символы: любая функция, класс и т. Д., чье имя начинается с
API совместимости (в Python,
tf.compat
модуль). В основных версиях мы можем выпустить утилиты и дополнительные конечные точки, чтобы помочь пользователям переходить к новой крупной версии. Эти символы API устарели и не поддерживаются (то есть мы не будем добавлять никаких функций, и мы не будем исправлять ошибки, кроме как исправлять уязвимости), но они подпадают под наши гарантии совместимости.TensorFlow C API:
- TensorFlow/C/C_API.H
Следующие файлы буфера протокола:
attr_value
config
event
graph
op_def
reader_base
summary
tensor
tensor_shape
types
Отдельный номер версии для TensorFlow Lite
В настоящее время Tensorflow Lite распределяется как часть Tensorflow. Тем не менее, мы оставляем за собой право в будущих изменениях выпуска на API -интерфейсы Tensorflow Lite в другом графике, чем для других API -интерфейсов Tensorflow, или даже перемещать Tensorflow Lite в отдельное распределение источника и/или отдельное хранилище источника, чем TensorFlow.
Из -за этого мы используем другой номер версии для Tensorflow Lite (TFLITE_VERSION_STRING
вtensorflow/lite/version.h
, иTfLiteVersion()
вtensorflow/lite/c/c_api.h
), чем для TensorFlow (TF_VERSION_STRING
вtensorflow/core/public/release_version.h
, иTF_Version()
вtensorflow/c/c_api.h
) В настоящее время эти два номера версий имеют одинаковое значение. Но в будущем они могут расходиться; Например, мы можем увеличить основной номер версии для Tensorflow Lite, не увеличивая основной номер версии для TensorFlow, или наоборот.
Поверхность API, покрытая номером версии TensorFlow Lite, состоит из следующих публичных API:
- TensorFlow Lite C API:
- tensorflow/lite/c/c_api.h
- tensorflow/lite/c/c_api_types.hПолем
- Tensorflow Lite Android (Java/Kotlin) API:
- В
org.tensorflow.lite
:- org.tensorflow.lite.tensorflowtite
- org.tensorflow.lite.interpreterapi
- org.tensorflow.lite.delegate
- org.tensorflow.lite.delegatefactory
- org.tensorflow.lite.tensor
- org.tensorflow.lite.datatype
- org.tensorflow.lite.runtimeflavor
- В
org.tensorflow.lite.gpu
:- org.tensorflow.lite.gpu.gpudelegate
- org.tensorflow.lite.gpu.gpudelegatefactory
- В
- Tensorflow Lite Objective-C APIS:
- tensorflow/lite/objc/apis/
- Tflcoremldelegate.h
- Tfldelegate.h
- Tflinterpreter.h
- Tflinterpreteroptions.h
- Tflmetaldelegate.h
- TflquantizationParameters.h
- Tflsignaturerunner.h
- Tfltensorflowlite.h
- Tfltensor.h
- tensorflow/lite/objc/apis/
- Tensorflow Lite Swift API:
- tensorflow/lite/swift/источники/Полем
- Coremldelegate.swift
- Delegate.swift
- Interpretererror.swift
- Переводчик.swift
- Metalledelegate.swift
- Model.Swift
- Квантование PPARAMETERS.Swift
- SignatureRunnerRor.swift
- Signaturerunner.swift
- Tensorflowlite.swift
- Tensor.Swift
- tensorflow/lite/swift/источники/Полем
Экспериментальные символы не покрыты; видетьнижеДля получения подробной информации.
Отдельный номер версии для API расширения TensorFlow Lite
TensorFlow Lite предоставляет API C для расширения интерпретатора TensorFlow Lite с помощью «пользовательские операции», которые предоставляют пользовательские операции на графике или «делегаты», которые позволяют делегировать вычисление для графа (или для подмножества графа) в пользовательскую подкладную. Эти API, которые мы в совокупности называем «API расширения TensorFlow Lite», требуют более интимных зависимостей от некоторых деталей реализации Tensorflow Lite.
Мы оставляем за собой право в будущих изменениях в этих API, которые потенциально включают в себя не совместимые с Backwards изменения, в другом графике, чем для других API-интерфейсов Tensorflow Lite. Таким образом, мы используем другой номер версии для API расширения Tensorflow Lite, чем номера версий для Tensorflow Lite или TensorFlow (которые были описаны в предыдущем разделе). Мы представляем некоторые новые API в Tensorflow Lite версии 2.15, чтобы получить версию API расширения TensorFlow Lite (TFLITE_EXTENSION_APIS_VERSION_STRING
вtensorflow/lite/version.h
и tfliteextensionApisversion () вtensorflow/lite/c/c_api.h
) Номер версии для API расширения Tensorflow Lite в настоящее время совпадает с номером версии для Tensorflow и Tensorflow Lite. Но в будущем они могут расходиться; Например, мы можем увеличить основной номер версии для API расширения TensorFlow Lite, не увеличивая основной номер версии для TensorFlow Lite, или наоборот.
Поверхность API, покрытая номером версии API удлинения TensorFlow Lite, состоит из следующих публичных API:
- tensorflow/lite/c/c_api_opaque.h
- tensorflow/lite/c/common.h
- tensorflow/lite/c/buldin_op_data.h
- Tensorflow/lite/buldin_ops.h
Опять же, экспериментальные символы не покрыты; видетьнижеДля получения подробной информации.
Что такоенетпокрытый
Некоторые части TensorFlow могут в любой точке изменяться в любой точке. К ним относятся:
Экспериментальные API: Чтобы облегчить развитие, мы освобождаем некоторые символы API, четко обозначенные как экспериментальные из гарантий совместимости. В частности, следующее не покрывается какими -либо гарантиями совместимости:
- любой символ в
tf.contrib
модуль или его подмодули; - Любой символ (модуль, функция, аргумент, свойство, класс, константа, тип, пакет и т. Д.)
experimental
илиExperimental
; или - Любой символ которого полностью квалифицированное имя, включает в себя модуль, класс или пакет, который сам по себе является экспериментальным. Это включает в себя поля и подводные материалы любого буфера протокола под названием
experimental
Полем
- любой символ в
Другие языки: TensorFlow API в языках, отличных от Python и C, например:
- C ++(выставлены через файлы заголовков в
tensorflow/cc/
) - ЯваВ
- Идти
- JavaScript
и TensorflowЛайтAPI в языках, отличных от Java/Kotlin, C, Objective-C и Swift, в частности
- C ++(выставлены через файлы заголовков в
tensorflow/lite/
)
- C ++(выставлены через файлы заголовков в
Детали композитных операций:Многие публичные функции в Python расширяются до нескольких примитивных OPS на графике, и эти детали будут частью любых графиков, сохраненных на диск как
GraphDef
с Эти детали могут измениться для незначительных выпусков. В частности, регрессионные тесты, которые проверяют точное сопоставление между графиками, вероятно, будут разорвать незначительные выбросы, даже если поведение графика должно быть неизменным, и существующие контрольные точки все равно будут работать.Численные детали с плавающей запятой:Конкретные значения с плавающей запятой, рассчитанные с помощью OPS, могут измениться в любое время. Пользователи должны полагаться только на приблизительную точность и численную стабильность, а не на конкретные вычисленные биты. Изменения в численных формулах в выпусках минор и патчах должны привести к сопоставимой или улучшенной точности, причем предостережение в том, что в машинном обучении улучшенная точность определенных формул может привести к снижению точности для общей системы.
Случайные числа:Конкретные вычисленные случайные числа могут измениться в любое время. Пользователи должны полагаться только на приблизительно правильные распределения и статистическую силу, а не на конкретные вычисленные биты. Увидетьгенерация случайных чиселРуководство для деталей.
Версия перекосит в распределенном тензорфлоу:Запуск двух разных версий Tensorflow в одном кластере не поддерживается. Нет никаких гарантий о обратной совместимости протокола провода.
Ошибки:Мы оставляем за собой право внести обратный несовместимый поведение (хотя и не API), если текущая реализация четко сломана, то есть, если она противоречит документации или если хорошо известное и хорошо определенное предполагаемое поведение не осуществляется должным образом из-за ошибки. Например, если оптимизатор утверждает, что реализует хорошо известный алгоритм оптимизации, но не соответствует этому алгоритму из-за ошибки, то мы исправим оптимизатор. Наше исправление может нарушить код, основываясь на неправильном поведении для конвергенции. Мы отмечаем такие изменения в примечаниях по выпуску.
Неиспользованный API:Мы оставляем за собой право внести отсталые несовместимые изменения в API, для которых мы не находим документированного использования (проведя аудит использования TensorFlow с помощью поиска GitHub). Прежде чем внести какие -либо такие изменения, мы объявим о нашем намерении внести изменения вобъявить@ почтовый список, предоставляя инструкции о том, как решить любые поломки (если применимо), и подождать две недели, чтобы дать нашему сообществу возможность поделиться своими отзывами.
Поведение ошибки:Мы можем заменить ошибки на неверно-поведение. Например, мы можем изменить функцию для вычисления результата вместо того, чтобы увеличить ошибку, даже если эта ошибка задокументирована. Мы также оставляем за собой право изменить текст сообщений об ошибках. Кроме того, тип ошибки может измениться, если в документации не указан тип исключения для конкретного условия ошибки.
Совместимость сохраненных моделей, графиков и контрольных точек
SaveedModel - это предпочтительный формат сериализации для использования в программах Tensorflow. Сохраненные модели содержат две части: один или несколько графиков, кодируемых какGraphDefs
и контрольно -пропускной пункт. Графики описывают поток данных OPS, который будет выполнен, а контрольные точки содержат сохраненные тензорные значения переменных на графике.
Многие пользователи TensorFlow создают SaveedModels, загружают и выполняют их с помощью более позднего выпуска Tensorflow. В соответствии сСемвер, Сохраненные модели, написанные с одной версией TensorFlow, могут быть загружены и оценены с помощью более поздней версии TensorFlow с таким же крупным выпуском.
Мы делаем дополнительные гарантии дляПоддерживаетсяСохраненные модели. Мы называем SavedModel, которая была создана с помощьюТолько не изящные, неэкспериментальные, не совместимые APISв основной версии TensorFlowN
аSaveedModel поддержана в версииN
Полем Любая сохраненная модель, поддерживаемая в основной версии TensorFlowN
может быть загружен и выполнен с помощью основной версии TensorFlowN+1
Полем Тем не менее, функциональность, необходимая для создания или изменения такой модели, может больше не быть доступна, поэтому эта гарантия применяется только к немодифицированной сохраненной модели.
Мы постараемся сохранить обратную совместимость как можно дольше, чтобы сериализованные файлы использовались в течение длительных периодов времени.
Совместимость графика
Графики сериализованы черезGraphDef
протокол буфер. Облегчить обратные несовместимые изменения в графиках, каждыйGraphDef
Имеет номер версии отдельно от версии TensorFlow. Например,GraphDef
Версия 17 установилаinv
в пользуreciprocal
Полем Семантика:
Каждая версия TensorFlow поддерживает интервал
GraphDef
версии. Этот интервал будет постоянным в разных выпусках и будет расти только по незначительным выпускам. Отброшение поддержки дляGraphDef
Версия будет происходить только для крупного выпуска TensorFlow (и только выровнен с гарантированной поддержкой версий для SaveDmodels).Недавно созданному графикам назначается последняя
GraphDef
номер версии.Если данная версия TensorFlow поддерживает
GraphDef
Версия графика, он будет загружать и оценивать с тем же поведением, что и версия TensorFlow, используемая для его генерации (за исключением численных деталей с плавающей запятой и случайными числами, как указано выше), независимо от основной версии TensorFlow. В частности, GraphDef, который совместим с файлом контрольной точки в одной версии TensorFlow (например, в случае SaveDmodel), останется совместимой с этой контрольной точкой в последующих версиях, если поддерживается график.Обратите внимание, что это относится только к сериализованным графикам в графиках (и сохраненных моделях):Кодкоторый считывает контрольно -пропускной пункт, может быть не в состоянии прочитать контрольные точки, сгенерированные одним и тем же кодом с другой версией TensorFlow.
Если
GraphDef
верхнийсвязанность увеличивается до x в (второстепенном) выпуске, будет не менее шести месяцев донижеОграничение увеличивается до X. Например (мы используем гипотетические номера версий здесь):- TensorFlow 1.2 может поддержать
GraphDef
Версии от 4 до 7. - TensorFlow 1.3 может добавить
GraphDef
Версия 8 и поддержка версий 4 по 8. - По крайней мере, шесть месяцев спустя Tensorflow 2.0.0 может отказаться от поддержки для версий с 4 по 7, оставив только версию 8.
Обратите внимание, что, поскольку основные версии TensorFlow обычно публикуются с интервалом более 6 месяцев, гарантии для поддерживаемых сохраненных моделей, подробно описанных выше, намного сильнее, чем гарантия GraphDefs 6 месяцев.
- TensorFlow 1.2 может поддержать
Наконец, когда поддержкаGraphDef
Версия отброшена, мы попытаемся предоставить инструменты для автоматического преобразования графиков в более новую поддержкуGraphDef
версия.
Совместимость с графиками и контрольной точкой при расширении TensorFlow
Этот раздел актуален только при внесении несовместимых изменений вGraphDef
Формат, например, при добавлении OPS, удаление OPS или изменение функциональности существующих OPS. Предыдущий раздел должно быть достаточно для большинства пользователей.
Обратная и частичная совместимость вперед
Наша схема управления версиями имеет три требования:
- Обратная совместимостьЧтобы поддержать графики загрузки и контрольные точки, созданные с более старыми версиями 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
иcore/public/release_version.h
Полем Всякий раз, когда добавляется новая версия, в заголовок добавляется заметка, подробно описывающая то, что изменилось, и дату.
Данные, производители и потребители
Мы различаем следующие виды информации о версии данных:
- производители: двоичные файлы, которые производят данные. У продюсеров есть версия (
producer
) и минимальная потребительская версия, с которой они совместимы (min_consumer
) - потребители: двоичные файлы, которые потребляют данные. У потребителей есть версия (
consumer
) и минимальная версия продюсера, с которой они совместимы (min_producer
)
Каждая часть данных имеет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_CONSUMER
, иTF_GRAPH_DEF_VERSION_MIN_PRODUCER
Полем - Для версий контрольно -пропускного пункта у нас есть
TF_CHECKPOINT_VERSION
ВTF_CHECKPOINT_VERSION_MIN_CONSUMER
, иTF_CHECKPOINT_VERSION_MIN_PRODUCER
Полем
Добавить новый атрибут по умолчанию к существующему OP
Следуя указаниям ниже, дает вам совместимость вперед только в том случае, если набор OPS не изменился:
- Если требуется совместимость вперед, установите
strip_default_attrs
кTrue
при экспорте модели с использованием любогоtf.saved_model.SavedModelBuilder.add_meta_graph_and_variables
иtf.saved_model.SavedModelBuilder.add_meta_graph
МетодыSavedModelBuilder
класс, илиtf.estimator.Estimator.export_saved_model
- Это снимает ценные атрибуты по умолчанию во время производства/экспорта моделей. Это гарантирует, что экспортируемый
tf.MetaGraphDef
не содержит нового OP-атрибута при использовании значения по умолчанию. - Наличие этого контроля может позволить устаревшему потребителям (например, служить двоичным файлам, которые отстают от тренировочных двоичных файлов) продолжать загружать модели и предотвратить перерывы в модельной службе.
Развивающиеся версии графика
В этом разделе объясняется, как использовать этот механизм управления версиями, чтобы внести различные типы изменений вGraphDef
формат.
Добавить оп
Добавьте новый OP к потребителям и производителям одновременно и не меняйтеGraphDef
версии. Этот тип изменения автоматически совместим с обратно и не влияет на план совместимости вперед, поскольку существующие сценарии производителей не будут внезапно использовать новые функциональные возможности.
Добавьте OP и переключатель существующих оберток Python, чтобы использовать его
- Реализовать новые потребительские функции и увеличить
GraphDef
версия. - Если можно заставить обертки использовать новые функциональные возможности только в тех случаях, которые не работали раньше, обертки могут быть обновлены сейчас.
- Измените обертки Python, чтобы использовать новую функциональность. Не увеличивайте
min_consumer
, поскольку модели, которые не используют этот OP, не должны ломаться.
Удалить или ограничить функциональность OP
- Исправьте все сценарии производителей (не сами по саму Tensorflow), чтобы не использовать запрещенную OP или функциональность.
- Приращение
GraphDef
Версия и реализовать новые потребительские функции, которые запрещают удаленную OP или функциональность для GraphDefs в новой версии и выше. Если возможно, заставьте тензорфлоу прекратить производствоGraphDefs
с запрещенной функциональностью. Для этого добавьтеREGISTER_OP(...).Deprecated(deprecated_at_version, message)
Полем - Дождитесь серьезного выпуска в целях обратной совместимости.
- Увеличивать
min_producer
к версии GraphDef из (2) и полностью удалите функциональность.
Изменить функциональность OP
- Добавить новый аналогичный OP с именем
SomethingV2
или аналогично и пройдите процесс добавления его и переключения существующих оберток Python для его использования. Чтобы обеспечить совместимость прямого использования чеков, предложенных вcompat.pyПри изменении обертка Python. - Удалите старый OP (может иметь место только с помощью основного изменения версии из -за обратной совместимости).
- Увеличивать
min_consumer
Чтобы исключить потребителей старым OP, добавьте старый OP в качестве псевдонимаSomethingV2
и пройдите через процесс, чтобы переключить существующие обертки Python, чтобы использовать его. - Пройти через процесс, чтобы удалить
SomethingV2
Полем
Запретить одну небезопасную версию потребителя
- Убить
GraphDef
версия и добавьте плохую версию вbad_consumers
Для всех новых графиков. Если возможно, добавьте вbad_consumers
Только для графиков, которые содержат определенный OP или аналогичный. - Если у существующих потребителей есть плохая версия, вытолкните их как можно скорее.
Первоначально опубликовано на
Оригинал