Dokumen ini untuk pengguna yang membutuhkan kompatibilitas mundur di berbagai versi TensorFlow (baik untuk kode atau data), dan untuk developer yang ingin memodifikasi TensorFlow sambil mempertahankan kompatibilitas.
Versi semantik 2.0
TensorFlow mengikuti Semantic Versioning 2.0 ( semver ) untuk API publiknya. Setiap versi rilis TensorFlow memiliki bentuk MAJOR.MINOR.PATCH
. Misalnya, TensorFlow versi 1.2.3 memiliki MAJOR
versi 1, MINOR
versi 2, dan PATCH
versi 3. Perubahan pada setiap angka memiliki arti sebagai berikut:
UTAMA : Kemungkinan perubahan yang tidak kompatibel ke belakang. Kode dan data yang berfungsi dengan rilis utama sebelumnya belum tentu berfungsi dengan rilis baru. Namun, dalam beberapa kasus, grafik dan checkpoint TensorFlow yang ada mungkin dapat dimigrasikan ke rilis yang lebih baru; lihat Kompatibilitas grafik dan pos pemeriksaan untuk detail tentang kompatibilitas data.
MINOR : Fitur yang kompatibel dengan versi sebelumnya, peningkatan kecepatan, dll. Kode dan data yang berfungsi dengan rilis minor sebelumnya dan yang hanya bergantung pada API publik non-eksperimental akan terus berfungsi tidak berubah. Untuk detail tentang API publik dan bukan, lihat Apa yang dicakup .
PATCH : Perbaikan bug yang kompatibel ke belakang.
Misalnya, rilis 1.0.0 memperkenalkan perubahan yang tidak kompatibel mundur dari rilis 0.12.1. Namun, rilis 1.1.1 kompatibel dengan rilis 1.0.0.
Apa yang tercakup
Hanya API publik TensorFlow yang kompatibel mundur di seluruh versi minor dan patch. API publik terdiri dari
Semua fungsi dan kelas Python yang terdokumentasi dalam modul
tensorflow
dan submodulnya, kecuali untuk- Simbol pribadi: semua fungsi, kelas, dll., yang namanya dimulai dengan
_
- Simbol eksperimental dan
tf.contrib
, lihat di bawah untuk detailnya.
Perhatikan bahwa kode di direktori example
examples/
dantools/
tidak dapat dijangkau melalui modultensorflow
Python dan karenanya tidak tercakup oleh jaminan kompatibilitas.Jika simbol tersedia melalui
tensorflow
modul Python atau submodulnya, tetapi tidak didokumentasikan, maka simbol tersebut tidak dianggap sebagai bagian dari API publik.- Simbol pribadi: semua fungsi, kelas, dll., yang namanya dimulai dengan
API kompatibilitas (dengan Python, modul
tf.compat
). Pada versi utama, kami dapat merilis utilitas dan titik akhir tambahan untuk membantu pengguna melakukan transisi ke versi utama yang baru. Simbol API ini sudah tidak digunakan lagi dan tidak didukung (yaitu, kami tidak akan menambahkan fitur apa pun, dan kami tidak akan memperbaiki bug selain untuk memperbaiki kerentanan), tetapi simbol tersebut termasuk dalam jaminan kompatibilitas kami.File penyangga protokol berikut:
Apa yang tidak tercakup
Beberapa bagian TensorFlow dapat berubah dengan cara yang tidak kompatibel ke belakang kapan saja. Ini termasuk:
API Eksperimental : Untuk memfasilitasi pengembangan, kami mengecualikan beberapa simbol API yang secara jelas ditandai sebagai eksperimental dari jaminan kompatibilitas. Secara khusus, berikut ini tidak dicakup oleh jaminan kompatibilitas apa pun:
- simbol apa pun dalam modul
tf.contrib
atau submodulnya; - simbol apa pun (modul, fungsi, argumen, properti, kelas, atau konstanta) yang namanya mengandung
experimental
atauExperimental
; atau - simbol apa pun yang namanya memenuhi syarat mencakup modul atau kelas yang merupakan eksperimen itu sendiri. Ini termasuk bidang dan subpesan dari buffer protokol apa pun yang disebut
experimental
.
- simbol apa pun dalam modul
Bahasa lain : TensorFlow API dalam bahasa selain Python dan C, seperti:
- C++ (diekspos melalui file header di
tensorflow/cc
). - Jawa ,
- Pergi
- JavaScript
- C++ (diekspos melalui file header di
Detail operasi gabungan: Banyak fungsi publik di Python memperluas ke beberapa operasi primitif dalam grafik, dan detail ini akan menjadi bagian dari grafik apa pun yang disimpan ke disk sebagai
GraphDef
s. Detail ini dapat berubah untuk rilis minor. Secara khusus, uji regresi yang memeriksa pencocokan tepat antara grafik kemungkinan besar akan menembus rilis minor, meskipun perilaku grafik seharusnya tidak berubah dan pos pemeriksaan yang ada akan tetap berfungsi.Detail numerik floating point: Nilai floating point spesifik yang dihitung oleh ops dapat berubah sewaktu-waktu. Pengguna sebaiknya hanya mengandalkan akurasi perkiraan dan stabilitas numerik, bukan pada bit spesifik yang dihitung. Perubahan pada rumus numerik dalam rilis minor dan tambalan harus menghasilkan akurasi yang sebanding atau ditingkatkan, dengan peringatan bahwa peningkatan akurasi pada pembelajaran mesin dari formula tertentu dapat mengakibatkan penurunan akurasi untuk keseluruhan sistem.
Angka acak: Angka acak spesifik yang dihitung dapat berubah sewaktu-waktu. Pengguna harus mengandalkan hanya pada distribusi yang kira-kira benar dan kekuatan statistik, bukan bit spesifik yang dihitung. Lihat panduan pembuatan nomor acak untuk detailnya.
Versi miring dalam Tensorflow terdistribusi: Menjalankan dua versi berbeda dari TensorFlow dalam satu kluster tidak didukung. Tidak ada jaminan tentang kompatibilitas ke belakang dari wire protocol.
Bug: Kami berhak untuk mengubah perilaku yang tidak kompatibel ke belakang (meskipun bukan API) jika implementasi saat ini jelas-jelas rusak, yaitu, jika bertentangan dengan dokumentasi atau jika perilaku yang dimaksudkan dengan baik dan terdefinisi dengan baik tidak diterapkan dengan benar karena ke bug. Misalnya, jika pengoptimal mengklaim menerapkan algoritme pengoptimalan terkenal tetapi tidak cocok dengan algoritme tersebut karena bug, maka kami akan memperbaiki pengoptimal tersebut. Perbaikan kami dapat merusak kode dengan mengandalkan perilaku yang salah untuk konvergensi. Kami akan mencatat perubahan tersebut di catatan rilis.
API yang tidak digunakan: Kami berhak membuat perubahan yang tidak kompatibel ke belakang pada API yang tidak kami temukan penggunaannya yang terdokumentasi (dengan melakukan audit penggunaan TensorFlow melalui pencarian GitHub). Sebelum melakukan perubahan tersebut, kami akan mengumumkan niat kami untuk melakukan perubahan di milis pengumuman@ , memberikan instruksi tentang cara mengatasi kerusakan (jika ada), dan menunggu selama dua minggu untuk memberikan kesempatan kepada komunitas kami untuk membagikan umpan balik mereka .
Perilaku kesalahan: Kami dapat mengganti kesalahan dengan perilaku non-kesalahan. Misalnya, kami dapat mengubah fungsi untuk menghitung hasil alih-alih memunculkan kesalahan, bahkan jika kesalahan itu didokumentasikan. Kami juga berhak mengubah teks pesan kesalahan. Selain itu, jenis kesalahan dapat berubah kecuali jenis pengecualian untuk kondisi kesalahan tertentu ditentukan dalam dokumentasi.
Kompatibilitas SavedModels, grafik, dan pos pemeriksaan
SavedModel adalah format serialisasi pilihan untuk digunakan dalam program TensorFlow. SavedModels berisi dua bagian: Satu atau lebih grafik yang dikodekan sebagai GraphDefs
dan Checkpoint. Grafik menjelaskan aliran data operasi yang akan dijalankan, dan pos pemeriksaan berisi nilai tensor variabel yang disimpan dalam grafik.
Banyak pengguna TensorFlow membuat SavedModels, dan memuat serta menjalankannya dengan rilis TensorFlow yang lebih baru. Sesuai dengan semver , SavedModels yang ditulis dengan satu versi TensorFlow dapat dimuat dan dievaluasi dengan versi TensorFlow yang lebih baru dengan rilis utama yang sama.
Kami memberikan jaminan tambahan untuk SavedModels yang didukung . Kami memanggil SavedModel yang dibuat hanya menggunakan API non-deprecated, non-experimental, non-compatibility di TensorFlow major version N
a SavedModel didukung di versi N
. Semua SavedModel yang didukung di TensorFlow versi utama N
dapat dimuat dan dijalankan dengan TensorFlow versi utama N+1
. Namun, fungsionalitas yang diperlukan untuk membuat atau memodifikasi model tersebut mungkin tidak tersedia lagi, jadi jaminan ini hanya berlaku untuk SavedModel yang tidak dimodifikasi.
Kami akan berusaha untuk menjaga kompatibilitas mundur selama mungkin, sehingga file serial dapat digunakan dalam jangka waktu yang lama.
Kompatibilitas GraphDef
Grafik diserialisasi melalui buffer protokol GraphDef
. Untuk memfasilitasi perubahan yang tidak kompatibel mundur ke grafik, setiap GraphDef
memiliki nomor versi yang terpisah dari versi TensorFlow. Misalnya, GraphDef
versi 17 tidak lagi menggunakan inv
op dan mendukung reciprocal
. semantik adalah:
Setiap versi TensorFlow mendukung interval versi
GraphDef
. Interval ini akan konstan di seluruh rilis tambalan, dan hanya akan bertambah di seluruh rilis minor. Menghentikan dukungan untuk versiGraphDef
hanya akan terjadi untuk rilis utama TensorFlow (dan hanya selaras dengan dukungan versi yang dijamin untuk SavedModels).Grafik yang baru dibuat diberi nomor versi
GraphDef
terbaru.Jika versi TensorFlow tertentu mendukung versi
GraphDef
dari sebuah grafik, itu akan dimuat dan dievaluasi dengan perilaku yang sama seperti versi TensorFlow yang digunakan untuk membuatnya (kecuali untuk detail numerik floating point dan angka acak seperti diuraikan di atas), terlepas dari mayor versi TensorFlow. Secara khusus, GraphDef yang kompatibel dengan file checkpoint di satu versi TensorFlow (seperti yang terjadi di SavedModel) akan tetap kompatibel dengan checkpoint tersebut di versi berikutnya, selama GraphDef didukung.Perhatikan bahwa ini hanya berlaku untuk Grafik berseri di GraphDefs (dan SavedModels): Kode yang membaca pos pemeriksaan mungkin tidak dapat membaca pos pemeriksaan yang dihasilkan oleh kode yang sama yang menjalankan versi berbeda dari TensorFlow.
Jika batas atas
GraphDef
dinaikkan menjadi X dalam rilis (minor), akan ada setidaknya enam bulan sebelum batas bawah dinaikkan menjadi X. Misalnya (kami menggunakan nomor versi hipotetis di sini):- TensorFlow 1.2 mungkin mendukung
GraphDef
versi 4 hingga 7. - TensorFlow 1.3 dapat menambahkan
GraphDef
versi 8 dan mendukung versi 4 hingga 8. - Setidaknya enam bulan kemudian, TensorFlow 2.0.0 dapat menghentikan dukungan untuk versi 4 hingga 7, hanya menyisakan versi 8.
Perhatikan bahwa karena versi utama TensorFlow biasanya diterbitkan lebih dari 6 bulan, jaminan untuk SavedModel yang didukung yang dijelaskan di atas jauh lebih kuat daripada jaminan 6 bulan untuk GraphDefs.
- TensorFlow 1.2 mungkin mendukung
Terakhir, ketika dukungan untuk versi GraphDef
dihentikan, kami akan berupaya menyediakan alat untuk mengonversi grafik secara otomatis ke versi GraphDef
yang didukung lebih baru.
Kompatibilitas grafik dan pos pemeriksaan saat memperluas TensorFlow
Bagian ini hanya relevan saat membuat perubahan yang tidak kompatibel pada format GraphDef
, seperti saat menambahkan operasi, menghapus operasi, atau mengubah fungsionalitas operasi yang ada. Bagian sebelumnya sudah cukup untuk sebagian besar pengguna.
Kompatibilitas mundur dan sebagian maju
Skema pembuatan versi kami memiliki tiga persyaratan:
- Kompatibilitas mundur untuk mendukung grafik pemuatan dan pos pemeriksaan yang dibuat dengan TensorFlow versi lama.
- Meneruskan kompatibilitas untuk mendukung skenario di mana pembuat grafik atau pos pemeriksaan ditingkatkan ke versi TensorFlow yang lebih baru sebelum konsumen.
- Aktifkan TensorFlow yang berkembang dengan cara yang tidak kompatibel. Misalnya menghapus ops, menambahkan atribut, dan menghapus atribut.
Perhatikan bahwa meskipun mekanisme versi GraphDef
terpisah dari versi TensorFlow, perubahan yang tidak kompatibel mundur ke format GraphDef
masih dibatasi oleh Semantic Versioning. Ini berarti fungsionalitas hanya dapat dihapus atau diubah antara versi MAJOR
dari TensorFlow (seperti 1.7
hingga 2.0
). Selain itu, kompatibilitas ke depan diberlakukan dalam rilis Patch ( 1.x.1
hingga 1.x.2
misalnya).
Untuk mencapai kompatibilitas mundur dan maju dan untuk mengetahui kapan harus menerapkan perubahan dalam format, grafik dan pos pemeriksaan memiliki metadata yang menjelaskan kapan diproduksi. Bagian di bawah menjelaskan implementasi dan pedoman TensorFlow untuk mengembangkan versi GraphDef
.
Skema versi data independen
Ada versi data yang berbeda untuk grafik dan pos pemeriksaan. Kedua format data berkembang dengan kecepatan berbeda satu sama lain dan juga dengan kecepatan berbeda dari TensorFlow. Kedua sistem versi didefinisikan dalam core/public/version.h
. Setiap kali versi baru ditambahkan, sebuah catatan ditambahkan ke header yang merinci apa yang berubah dan tanggalnya.
Data, produsen, dan konsumen
Kami membedakan antara jenis informasi versi data berikut:
- produsen : biner yang menghasilkan data. Produser memiliki versi (
producer
) dan versi konsumen minimum yang kompatibel dengan mereka (min_consumer
). - konsumen : biner yang mengkonsumsi data. Konsumen memiliki versi (
consumer
) dan versi produsen minimum yang kompatibel dengan mereka (min_producer
).
Setiap potongan data berversi memiliki bidang VersionDef versions
yang merekam producer
yang membuat data, min_consumer
yang kompatibel dengannya, dan daftar versi bad_consumers
yang tidak diizinkan.
Secara default, saat produser membuat beberapa data, data mewarisi versi producer
dan min_consumer
dari produser. bad_consumers
dapat disetel jika versi konsumen tertentu diketahui mengandung bug dan harus dihindari. Seorang konsumen dapat menerima sepotong data jika semua hal berikut ini benar:
-
consumer
>=min_consumer
data -
producer
data >=min_producer
konsumen -
consumer
tidak ada dalambad_consumers
data
Karena produsen dan konsumen berasal dari basis kode TensorFlow yang sama, core/public/version.h
berisi versi data utama yang diperlakukan sebagai producer
atau consumer
bergantung pada konteks dan min_consumer
dan min_producer
(masing-masing dibutuhkan oleh produsen dan konsumen) . Secara khusus,
- Untuk versi
GraphDef
, kami memilikiTF_GRAPH_DEF_VERSION
,TF_GRAPH_DEF_VERSION_MIN_CONSUMER
, danTF_GRAPH_DEF_VERSION_MIN_PRODUCER
. - Untuk versi pos pemeriksaan, kami memiliki
TF_CHECKPOINT_VERSION
,TF_CHECKPOINT_VERSION_MIN_CONSUMER
, danTF_CHECKPOINT_VERSION_MIN_PRODUCER
.
Tambahkan atribut baru dengan default ke op yang ada
Mengikuti panduan di bawah memberi Anda kompatibilitas ke depan hanya jika rangkaian operasi tidak berubah:
- Jika kompatibilitas maju diinginkan, setel
strip_default_attrs
keTrue
saat mengekspor model menggunakan metodetf.saved_model.SavedModelBuilder.add_meta_graph_and_variables
dantf.saved_model.SavedModelBuilder.add_meta_graph
dari kelasSavedModelBuilder
, atautf.estimator.Estimator.export_saved_model
- Ini menghapus atribut nilai default pada saat memproduksi/mengekspor model. Ini memastikan
tf.MetaGraphDef
yang diekspor tidak berisi atribut op baru saat nilai default digunakan. - Memiliki kontrol ini dapat memungkinkan konsumen yang sudah usang (misalnya, melayani binari yang tertinggal dari binari pelatihan) untuk terus memuat model dan mencegah gangguan dalam penyajian model.
Versi GraphDef yang berkembang
Bagian ini menjelaskan cara menggunakan mekanisme pembuatan versi ini untuk membuat berbagai jenis perubahan pada format GraphDef
.
Tambahkan op
Tambahkan op baru untuk konsumen dan produsen secara bersamaan, dan jangan ubah versi GraphDef
apa pun. Jenis perubahan ini secara otomatis kompatibel ke belakang, dan tidak memengaruhi rencana kompatibilitas ke depan karena skrip produser yang sudah ada tidak akan tiba-tiba menggunakan fungsionalitas baru.
Tambahkan op dan alihkan pembungkus Python yang ada untuk menggunakannya
- Terapkan fungsionalitas konsumen baru dan tingkatkan versi
GraphDef
. - Jika memungkinkan untuk membuat pembungkus menggunakan fungsionalitas baru hanya dalam kasus yang sebelumnya tidak berfungsi, pembungkus dapat diperbarui sekarang.
- Ubah pembungkus Python untuk menggunakan fungsionalitas baru. Jangan menaikkan
min_consumer
, karena model yang tidak menggunakan operasi ini tidak boleh rusak.
Hapus atau batasi fungsionalitas operasi
- Perbaiki semua skrip produsen (bukan TensorFlow itu sendiri) agar tidak menggunakan op atau fungsionalitas yang dilarang.
- Tingkatkan versi
GraphDef
dan implementasikan fungsionalitas konsumen baru yang melarang op yang dihapus atau fungsionalitas untuk GraphDefs di versi baru dan yang lebih baru. Jika memungkinkan, buat TensorFlow berhenti memproduksiGraphDefs
dengan fungsi yang dilarang. Untuk melakukannya, tambahkanREGISTER_OP(...).Deprecated(deprecated_at_version, message)
. - Tunggu rilis utama untuk tujuan kompatibilitas mundur.
- Tingkatkan
min_producer
ke versi GraphDef dari (2) dan hapus seluruh fungsionalitasnya.
Mengubah fungsionalitas operasi
- Tambahkan op serupa baru bernama
SomethingV2
atau serupa dan lakukan proses penambahannya dan alihkan pembungkus Python yang ada untuk menggunakannya. Untuk memastikan kompatibilitas ke depan, gunakan pemeriksaan yang disarankan di compat.py saat mengubah pembungkus Python. - Hapus op lama (Hanya dapat dilakukan dengan perubahan versi besar karena kompatibilitas ke belakang).
- Tingkatkan
min_consumer
untuk mengesampingkan konsumen dengan op lama, tambahkan kembali op lama sebagai alias untukSomethingV2
, dan lakukan proses untuk mengganti pembungkus Python yang ada untuk menggunakannya. - Ikuti proses untuk menghapus
SomethingV2
.
Larang satu versi konsumen yang tidak aman
- Bump versi
GraphDef
dan tambahkan versi buruk kebad_consumers
untuk semua GraphDefs baru. Jika memungkinkan, tambahkan kebad_consumers
hanya untuk GraphDefs yang berisi op tertentu atau serupa. - Jika konsumen yang ada memiliki versi yang buruk, keluarkan mereka sesegera mungkin.