Khả năng tương thích phiên bản TensorFlow

Tài liệu này dành cho những người dùng cần khả năng tương thích ngược trên các phiên bản khác nhau của TensorFlow (đối với mã hoặc dữ liệu) và dành cho các nhà phát triển muốn sửa đổi TensorFlow trong khi vẫn duy trì khả năng tương thích.

Phiên bản ngữ nghĩa 2.0

TensorFlow tuân theo Phiên bản ngữ nghĩa 2.0 ( semver ) cho API công khai của nó. Mỗi phiên bản phát hành của TensorFlow đều có dạng MAJOR.MINOR.PATCH . Ví dụ: TensorFlow phiên bản 1.2.3 có phiên bản MAJOR 1, phiên bản MINOR 2 và phiên bản PATCH 3. Những thay đổi đối với mỗi số có ý nghĩa như sau:

  • CHÍNH : Những thay đổi có khả năng không tương thích ngược. Mã và dữ liệu hoạt động với bản phát hành chính trước đó không nhất thiết phải hoạt động với bản phát hành mới. Tuy nhiên, trong một số trường hợp, các biểu đồ và điểm kiểm tra TensorFlow hiện có có thể được di chuyển sang bản phát hành mới hơn; xem Khả năng tương thích của biểu đồ và điểm kiểm tra để biết chi tiết về khả năng tương thích dữ liệu.

  • NHỎ : Các tính năng tương thích ngược, cải thiện tốc độ, v.v. Mã và dữ liệu hoạt động với bản phát hành nhỏ trước đó chỉ phụ thuộc vào API công khai không thử nghiệm sẽ tiếp tục hoạt động không thay đổi. Để biết chi tiết về API công khai và không phải là API công khai, hãy xem Nội dung được đề cập .

  • PATCH : Sửa lỗi tương thích ngược.

Ví dụ: bản phát hành 1.0.0 có những thay đổi không tương thích ngược so với bản phát hành 0.12.1. Tuy nhiên, bản phát hành 1.1.1 tương thích ngược với bản phát hành 1.0.0.

Những gì được bảo hiểm

Chỉ các API công khai của TensorFlow mới tương thích ngược trên các phiên bản vá lỗi và nhỏ. Các API công khai bao gồm

  • Tất cả các hàm và lớp Python được ghi lại trong mô-đun tensorflow và các mô-đun con của nó, ngoại trừ

    • Ký hiệu riêng: bất kỳ hàm, lớp, v.v. nào có tên bắt đầu bằng _
    • Các biểu tượng thử nghiệm và tf.contrib , xem bên dưới để biết chi tiết.

    Lưu ý rằng mã trong các thư mục examples/tools/ không thể truy cập được thông qua mô-đun Python tensorflow và do đó không được bảo đảm tương thích.

    Nếu một biểu tượng có sẵn thông qua mô-đun tensorflow Python hoặc các mô-đun con của nó nhưng không được ghi lại thì nó không được coi là một phần của API công khai.

  • API tương thích (trong Python, mô-đun tf.compat ). Ở các phiên bản chính, chúng tôi có thể phát hành các tiện ích và điểm cuối bổ sung để giúp người dùng chuyển đổi sang phiên bản chính mới. Các ký hiệu API này không được dùng nữa và không được hỗ trợ (nghĩa là chúng tôi sẽ không thêm bất kỳ tính năng nào và chúng tôi sẽ không sửa các lỗi khác ngoài việc sửa các lỗ hổng), nhưng chúng nằm trong phạm vi đảm bảo về khả năng tương thích của chúng tôi.

  • API TensorFlow C:

  • Các tệp đệm giao thức sau:

Số phiên bản riêng cho TensorFlow Lite

Hiện tại TensorFlow Lite được phân phối như một phần của TensorFlow. Tuy nhiên, chúng tôi có quyền thực hiện các thay đổi trong bản phát hành trong tương lai đối với API TensorFlow Lite theo lịch khác với các API TensorFlow khác hoặc thậm chí chuyển TensorFlow Lite sang một bản phân phối nguồn riêng và/hoặc kho lưu trữ nguồn riêng biệt với TensorFlow.

Do đó, chúng tôi sử dụng số phiên bản khác cho TensorFlow Lite ( TFLITE_VERSION_STRING trong tensorflow/lite/version.hTfLiteVersion() trong tensorflow/lite/c/c_api.h ) so với TensorFlow ( TF_VERSION_STRING trong tensorflow/core/public/version.hTF_Version() trong tensorflow/c/c_api.h ). Hiện tại, hai số phiên bản này có cùng giá trị. Nhưng trong tương lai, chúng có thể khác nhau; ví dụ: chúng tôi có thể tăng số phiên bản chính cho TensorFlow Lite mà không tăng số phiên bản chính cho TensorFlow hoặc ngược lại.

Bề mặt API được bao phủ bởi số phiên bản TensorFlow Lite bao gồm các API công khai sau:

Các ký hiệu thí nghiệm không được đề cập; xem bên dưới để biết chi tiết.

Số phiên bản riêng cho API tiện ích mở rộng TensorFlow Lite

TensorFlow Lite cung cấp các API C để mở rộng trình thông dịch TensorFlow Lite với "ops tùy chỉnh", cung cấp các hoạt động do người dùng xác định trong biểu đồ hoặc "đại biểu", cho phép ủy quyền tính toán cho biểu đồ (hoặc cho một tập hợp con của biểu đồ) cho một phụ trợ tùy chỉnh. Các API này, mà chúng tôi gọi chung là "API mở rộng TensorFlow Lite", yêu cầu sự phụ thuộc chặt chẽ hơn vào một số chi tiết của quá trình triển khai TensorFlow Lite.

Chúng tôi có quyền phát hành các thay đổi trong tương lai đối với các API này, có thể bao gồm các thay đổi không tương thích ngược, theo lịch khác với các API TensorFlow Lite khác. Vì vậy, chúng tôi sử dụng số phiên bản cho API tiện ích mở rộng TensorFlow Lite khác với số phiên bản cho TensorFlow Lite hoặc TensorFlow (đã được mô tả trong phần trước). Chúng tôi đang giới thiệu một số API mới trong TensorFlow Lite phiên bản 2.15 để có phiên bản API mở rộng TensorFlow Lite ( TFLITE_EXTENSION_APIS_VERSION_STRING trong tensorflow/lite/version.h và TfLiteExtensionApisVersion() trong tensorflow/lite/c/c_api.h ). Số phiên bản của API tiện ích mở rộng TensorFlow Lite hiện giống với số phiên bản của TensorFlow và TensorFlow Lite. Nhưng trong tương lai, chúng có thể khác nhau; ví dụ: chúng tôi có thể tăng số phiên bản chính cho API tiện ích mở rộng TensorFlow Lite mà không tăng số phiên bản chính cho TensorFlow Lite hoặc ngược lại.

Bề mặt API được bao phủ bởi số phiên bản API mở rộng TensorFlow Lite bao gồm các API công khai sau:

Một lần nữa, các ký hiệu thử nghiệm không được đề cập; xem bên dưới để biết chi tiết.

Những gì không được bảo hiểm

Một số phần của TensorFlow có thể thay đổi theo cách không tương thích ngược vào bất kỳ thời điểm nào. Bao gồm các:

  • API thử nghiệm : Để tạo điều kiện phát triển, chúng tôi miễn đảm bảo tính tương thích cho một số ký hiệu API được đánh dấu rõ ràng là thử nghiệm. Đặc biệt, những điều sau đây không được bảo đảm bởi bất kỳ đảm bảo tương thích nào:

    • bất kỳ ký hiệu nào trong mô-đun tf.contrib hoặc các mô-đun con của nó;
    • bất kỳ ký hiệu nào (mô-đun, hàm, đối số, thuộc tính, lớp, hằng số, loại, gói, v.v.) có tên chứa experimental hoặc Experimental ; hoặc
    • bất kỳ biểu tượng nào có tên đủ điều kiện bao gồm một mô-đun hoặc lớp hoặc gói mà bản thân nó mang tính thử nghiệm. Điều này bao gồm các trường và tin nhắn con của bất kỳ bộ đệm giao thức nào được gọi là experimental .
  • Các ngôn ngữ khác : API TensorFlow bằng các ngôn ngữ khác ngoài Python và C, chẳng hạn như:

    và API TensorFlow Lite bằng các ngôn ngữ khác ngoài Java/Kotlin, C, Objective-C và Swift, đặc biệt

    • C++ (được hiển thị thông qua các tệp tiêu đề trong tensorflow/lite/ )
  • Chi tiết về các hoạt động tổng hợp: Nhiều hàm công khai trong Python mở rộng thành một số hoạt động nguyên thủy trong biểu đồ và các chi tiết này sẽ là một phần của bất kỳ biểu đồ nào được lưu vào đĩa dưới dạng GraphDef s. Những chi tiết này có thể thay đổi đối với các bản phát hành nhỏ. Cụ thể, các thử nghiệm hồi quy kiểm tra sự khớp chính xác giữa các biểu đồ có khả năng vượt qua các bản phát hành nhỏ, mặc dù hoạt động của biểu đồ sẽ không thay đổi và các điểm kiểm tra hiện có vẫn hoạt động.

  • Chi tiết số dấu phẩy động: Các giá trị dấu phẩy động cụ thể được tính toán bởi các op có thể thay đổi bất kỳ lúc nào. Người dùng chỉ nên dựa vào độ chính xác gần đúng và độ ổn định bằng số chứ không nên dựa vào các bit cụ thể được tính toán. Những thay đổi đối với công thức số trong các bản phát hành nhỏ và bản vá sẽ mang lại độ chính xác tương đương hoặc được cải thiện, với lời cảnh báo rằng trong quá trình học máy cải thiện độ chính xác của các công thức cụ thể có thể dẫn đến giảm độ chính xác cho toàn bộ hệ thống.

  • Số ngẫu nhiên: Các số ngẫu nhiên cụ thể được tính có thể thay đổi bất kỳ lúc nào. Người dùng chỉ nên dựa vào các phân bố gần đúng và cường độ thống kê chứ không phải các bit cụ thể được tính toán. Xem hướng dẫn tạo số ngẫu nhiên để biết chi tiết.

  • Phiên bản lệch trong Tensorflow phân tán: Việc chạy hai phiên bản TensorFlow khác nhau trong một cụm không được hỗ trợ. Không có sự đảm bảo nào về khả năng tương thích ngược của giao thức dây.

  • Lỗi: Chúng tôi có quyền thực hiện các thay đổi về hành vi không tương thích ngược (mặc dù không phải API) nếu việc triển khai hiện tại bị hỏng rõ ràng, nghĩa là nếu nó mâu thuẫn với tài liệu hoặc nếu một hành vi dự kiến ​​được biết rõ và được xác định rõ không được triển khai đúng cách do đến một lỗi. Ví dụ: nếu trình tối ưu hóa tuyên bố triển khai thuật toán tối ưu hóa phổ biến nhưng không khớp với thuật toán đó do lỗi thì chúng tôi sẽ sửa trình tối ưu hóa. Bản sửa lỗi của chúng tôi có thể phá vỡ mã dựa vào hành vi hội tụ sai. Chúng tôi sẽ lưu ý những thay đổi như vậy trong ghi chú phát hành.

  • API không được sử dụng: Chúng tôi có quyền thực hiện các thay đổi không tương thích ngược đối với các API mà chúng tôi nhận thấy không có cách sử dụng nào được ghi lại (bằng cách thực hiện kiểm tra việc sử dụng TensorFlow thông qua tìm kiếm GitHub). Trước khi thực hiện bất kỳ thay đổi nào như vậy, chúng tôi sẽ thông báo ý định thực hiện thay đổi trên danh sách gửi thư notification@ , cung cấp hướng dẫn về cách giải quyết mọi sai sót (nếu có) và đợi hai tuần để cộng đồng của chúng tôi có cơ hội chia sẻ phản hồi của họ .

  • Hành vi lỗi: Chúng tôi có thể thay thế lỗi bằng hành vi không có lỗi. Ví dụ: chúng ta có thể thay đổi hàm để tính kết quả thay vì đưa ra lỗi, ngay cả khi lỗi đó được ghi lại. Chúng tôi cũng có quyền thay đổi nội dung của thông báo lỗi. Ngoài ra, loại lỗi có thể thay đổi trừ khi loại ngoại lệ cho một tình trạng lỗi cụ thể được chỉ định trong tài liệu.

Khả năng tương thích của SavingModels, đồ thị và điểm kiểm tra

SavingModel là định dạng tuần tự hóa ưa thích để sử dụng trong các chương trình TensorFlow. SavedModels chứa hai phần: Một hoặc nhiều biểu đồ được mã hóa dưới dạng GraphDefs và Điểm kiểm tra. Các biểu đồ mô tả luồng dữ liệu của các hoạt động sẽ được chạy và các điểm kiểm tra chứa các giá trị tensor đã lưu của các biến trong biểu đồ.

Nhiều người dùng TensorFlow tạo SavingModels, tải và thực thi chúng bằng bản phát hành TensorFlow sau này. Để tuân thủ semver , các SavingModel được viết bằng một phiên bản TensorFlow có thể được tải và đánh giá bằng phiên bản TensorFlow mới hơn với cùng một bản phát hành chính.

Chúng tôi đưa ra các đảm bảo bổ sung cho các SavingModels được hỗ trợ . Chúng tôi gọi một SavingModel được tạo bằng cách chỉ sử dụng các API không dùng nữa, không thử nghiệm, không tương thích trong phiên bản chính của TensorFlow NSavingModel được hỗ trợ trong phiên bản N Bất kỳ SavingModel nào được hỗ trợ trong TensorFlow phiên bản chính N đều có thể được tải và thực thi bằng TensorFlow phiên bản chính N+1 . Tuy nhiên, chức năng cần thiết để xây dựng hoặc sửa đổi mô hình như vậy có thể không còn khả dụng nữa, vì vậy đảm bảo này chỉ áp dụng cho SavingModel chưa sửa đổi.

Chúng tôi sẽ cố gắng duy trì khả năng tương thích ngược càng lâu càng tốt để các tệp được tuần tự hóa có thể sử dụng được trong thời gian dài.

Khả năng tương thích của GraphDef

Đồ thị được tuần tự hóa thông qua bộ đệm giao thức GraphDef . Để tạo điều kiện thuận lợi cho những thay đổi không tương thích ngược đối với biểu đồ, mỗi GraphDef có số phiên bản riêng biệt với phiên bản TensorFlow. Ví dụ: GraphDef phiên bản 17 không dùng inv op mà thay vào đó là reciprocal . Ngữ nghĩa là:

  • Mỗi phiên bản TensorFlow hỗ trợ một khoảng phiên bản GraphDef . Khoảng thời gian này sẽ không đổi trên các bản vá lỗi và sẽ chỉ tăng lên trên các bản phát hành nhỏ. Việc ngừng hỗ trợ cho phiên bản GraphDef sẽ chỉ xảy ra đối với bản phát hành chính của TensorFlow (và chỉ phù hợp với hỗ trợ phiên bản được đảm bảo cho SavingModels).

  • Các biểu đồ mới tạo được gán số phiên bản GraphDef mới nhất.

  • Nếu một phiên bản TensorFlow nhất định hỗ trợ phiên bản GraphDef của biểu đồ, nó sẽ tải và đánh giá với hành vi tương tự như phiên bản TensorFlow được sử dụng để tạo ra nó (ngoại trừ các chi tiết số dấu phẩy động và số ngẫu nhiên như đã nêu ở trên), bất kể chính phiên bản TensorFlow. Cụ thể, GraphDef tương thích với tệp điểm kiểm tra trong một phiên bản của TensorFlow (chẳng hạn như trường hợp trong SavingModel) sẽ vẫn tương thích với điểm kiểm tra đó trong các phiên bản tiếp theo, miễn là GraphDef được hỗ trợ.

    Lưu ý rằng điều này chỉ áp dụng cho các Biểu đồ được tuần tự hóa trong GraphDefs (và SavingModels): đọc điểm kiểm tra có thể không đọc được các điểm kiểm tra được tạo bởi cùng một mã chạy phiên bản TensorFlow khác.

  • Nếu giới hạn trên của GraphDef được tăng lên X trong một bản phát hành (nhỏ), sẽ có ít nhất sáu tháng trước khi giới hạn dưới được tăng lên X. Ví dụ: (chúng tôi đang sử dụng số phiên bản giả định ở đây):

    • TensorFlow 1.2 có thể hỗ trợ GraphDef phiên bản 4 đến 7.
    • TensorFlow 1.3 có thể thêm GraphDef phiên bản 8 và hỗ trợ các phiên bản 4 đến 8.
    • Ít nhất sáu tháng sau, TensorFlow 2.0.0 có thể ngừng hỗ trợ các phiên bản 4 đến 7, chỉ còn lại phiên bản 8.

    Lưu ý rằng vì các phiên bản chính của TensorFlow thường được xuất bản cách nhau hơn 6 tháng nên các cam kết dành cho các SavingModel được hỗ trợ nêu chi tiết ở trên mạnh hơn nhiều so với cam kết 6 tháng dành cho GraphDefs.

Cuối cùng, khi ngừng hỗ trợ phiên bản GraphDef , chúng tôi sẽ cố gắng cung cấp các công cụ để tự động chuyển đổi biểu đồ sang phiên bản GraphDef được hỗ trợ mới hơn.

Khả năng tương thích đồ thị và điểm kiểm tra khi mở rộng TensorFlow

Phần này chỉ liên quan khi thực hiện các thay đổi không tương thích với định dạng GraphDef , chẳng hạn như khi thêm các hoạt động, loại bỏ các hoạt động hoặc thay đổi chức năng của các hoạt động hiện có. Phần trước sẽ đủ cho hầu hết người dùng.

Khả năng tương thích ngược và một phần về phía trước

Sơ đồ lập phiên bản của chúng tôi có ba yêu cầu:

  • Khả năng tương thích ngược để hỗ trợ tải biểu đồ và điểm kiểm tra được tạo bằng các phiên bản TensorFlow cũ hơn.
  • Khả năng tương thích chuyển tiếp để hỗ trợ các tình huống trong đó nhà sản xuất biểu đồ hoặc điểm kiểm tra được nâng cấp lên phiên bản TensorFlow mới hơn trước người tiêu dùng.
  • Cho phép phát triển TensorFlow theo những cách không tương thích. Ví dụ: xóa hoạt động, thêm thuộc tính và xóa thuộc tính.

Lưu ý rằng mặc dù cơ chế phiên bản GraphDef tách biệt với phiên bản TensorFlow, nhưng những thay đổi không tương thích ngược đối với định dạng GraphDef vẫn bị hạn chế bởi Phiên bản ngữ nghĩa. Điều này có nghĩa là chức năng chỉ có thể bị xóa hoặc thay đổi giữa các phiên bản MAJOR của TensorFlow (chẳng hạn như 1.7 đến 2.0 ). Ngoài ra, khả năng tương thích về phía trước được thực thi trong các bản phát hành Bản vá (ví dụ 1.x.1 đến 1.x.2 ).

Để đạt được khả năng tương thích ngược và xuôi cũng như để biết thời điểm thực thi các thay đổi về định dạng, biểu đồ và điểm kiểm tra có siêu dữ liệu mô tả thời điểm chúng được tạo. Các phần bên dưới nêu chi tiết cách triển khai TensorFlow và hướng dẫn để phát triển các phiên bản GraphDef .

Đề án phiên bản dữ liệu độc lập

Có nhiều phiên bản dữ liệu khác nhau cho biểu đồ và điểm kiểm tra. Hai định dạng dữ liệu phát triển với tốc độ khác nhau và cũng ở tốc độ khác nhau từ TensorFlow. Cả hai hệ thống phiên bản đều được xác định trong core/public/version.h . Bất cứ khi nào một phiên bản mới được thêm vào, một ghi chú sẽ được thêm vào tiêu đề nêu chi tiết những gì đã thay đổi và ngày tháng.

Dữ liệu, nhà sản xuất và người tiêu dùng

Chúng tôi phân biệt giữa các loại thông tin phiên bản dữ liệu sau:

  • nhà sản xuất : nhị phân tạo ra dữ liệu. Nhà sản xuất có một phiên bản ( producer ) và phiên bản dành cho người tiêu dùng tối thiểu mà họ tương thích ( min_consumer ).
  • người tiêu dùng : nhị phân tiêu thụ dữ liệu. Người tiêu dùng có một phiên bản ( consumer ) và phiên bản nhà sản xuất tối thiểu mà họ tương thích với ( min_producer ).

Mỗi phần dữ liệu được phiên bản có trường VersionDef versions ghi lại producer đã tạo dữ liệu, min_consumer tương thích và danh sách các phiên bản bad_consumers không được phép.

Theo mặc định, khi nhà sản xuất tạo một số dữ liệu, dữ liệu sẽ kế thừa phiên bản producermin_consumer của nhà sản xuất đó. bad_consumers có thể được đặt nếu các phiên bản dành cho người tiêu dùng cụ thể được biết là có lỗi và phải tránh. Người tiêu dùng có thể chấp nhận một phần dữ liệu nếu tất cả những điều sau đây đều đúng:

  • consumer >= min_consumer của dữ liệu
  • producer dữ liệu >= min_producer của người tiêu dùng
  • consumer không có trong bad_consumers của dữ liệu

Vì cả nhà sản xuất và người tiêu dùng đều đến từ cùng một cơ sở mã TensorFlow, core/public/version.h chứa một phiên bản dữ liệu chính được coi là producer hoặc consumer tùy thuộc vào ngữ cảnh và cả min_consumermin_producer (lần lượt là cần thiết cho nhà sản xuất và người tiêu dùng) . Đặc biệt,

  • Đối với các phiên bản GraphDef , chúng tôi có TF_GRAPH_DEF_VERSION , TF_GRAPH_DEF_VERSION_MIN_CONSUMERTF_GRAPH_DEF_VERSION_MIN_PRODUCER .
  • Đối với các phiên bản điểm kiểm tra, chúng tôi có TF_CHECKPOINT_VERSION , TF_CHECKPOINT_VERSION_MIN_CONSUMERTF_CHECKPOINT_VERSION_MIN_PRODUCER .

Thêm thuộc tính mới có mặc định vào op hiện có

Việc làm theo hướng dẫn bên dưới chỉ mang lại cho bạn khả năng tương thích về phía trước nếu tập hợp các hoạt động không thay đổi:

  1. Nếu muốn có khả năng tương thích về phía trước, hãy đặt strip_default_attrs thành True trong khi xuất mô hình bằng cách sử dụng các phương thức tf.saved_model.SavedModelBuilder.add_meta_graph_and_variablestf.saved_model.SavedModelBuilder.add_meta_graph của lớp SavedModelBuilder hoặc tf.estimator.Estimator.export_saved_model
  2. Điều này loại bỏ các thuộc tính có giá trị mặc định tại thời điểm sản xuất/xuất mô hình. Điều này đảm bảo rằng tf.MetaGraphDef đã xuất không chứa thuộc tính op mới khi sử dụng giá trị mặc định.
  3. Việc có quyền kiểm soát này có thể cho phép người tiêu dùng lỗi thời (ví dụ: phân phối các tệp nhị phân tụt hậu so với tệp nhị phân đào tạo) tiếp tục tải mô hình và ngăn chặn sự gián đoạn trong việc phân phối mô hình.

Các phiên bản GraphDef đang phát triển

Phần này giải thích cách sử dụng cơ chế lập phiên bản này để thực hiện các loại thay đổi khác nhau đối với định dạng GraphDef .

Thêm một lựa chọn

Thêm op mới cho cả người tiêu dùng và nhà sản xuất cùng một lúc và không thay đổi bất kỳ phiên bản GraphDef nào. Loại thay đổi này tự động tương thích ngược và không ảnh hưởng đến kế hoạch tương thích về phía trước vì các tập lệnh của nhà sản xuất hiện tại sẽ không đột nhiên sử dụng chức năng mới.

Thêm một op và chuyển các trình bao bọc Python hiện có để sử dụng nó

  1. Triển khai chức năng tiêu dùng mới và tăng phiên bản GraphDef .
  2. Nếu có thể làm cho các trình bao bọc chỉ sử dụng chức năng mới trong các trường hợp trước đây không hoạt động thì các trình bao bọc có thể được cập nhật ngay bây giờ.
  3. Thay đổi trình bao bọc Python để sử dụng chức năng mới. Không tăng min_consumer , vì các mô hình không sử dụng op này sẽ không bị hỏng.

Loại bỏ hoặc hạn chế chức năng của op

  1. Sửa tất cả các tập lệnh của nhà sản xuất (không phải chính TensorFlow) để không sử dụng chức năng hoặc chức năng bị cấm.
  2. Tăng phiên bản GraphDef và triển khai chức năng tiêu dùng mới cấm hoạt động hoặc chức năng đã bị loại bỏ đối với GraphDefs ở phiên bản mới trở lên. Nếu có thể, hãy yêu cầu TensorFlow ngừng sản xuất GraphDefs có chức năng bị cấm. Để làm như vậy, hãy thêm REGISTER_OP(...).Deprecated(deprecated_at_version, message) .
  3. Chờ bản phát hành chính cho mục đích tương thích ngược.
  4. Tăng min_producer lên phiên bản GraphDef từ (2) và xóa hoàn toàn chức năng.

Thay đổi chức năng của op

  1. Thêm một op tương tự mới có tên SomethingV2 hoặc tương tự và thực hiện quá trình thêm nó và chuyển đổi các trình bao bọc Python hiện có để sử dụng nó. Để đảm bảo khả năng tương thích về phía trước, hãy sử dụng các kiểm tra được đề xuất trong compat.py khi thay đổi trình bao bọc Python.
  2. Xóa op cũ (Chỉ có thể diễn ra khi có thay đổi lớn về phiên bản do tính tương thích ngược).
  3. Tăng min_consumer để loại trừ người tiêu dùng với op cũ, thêm lại op cũ làm bí danh cho SomethingV2 và thực hiện quy trình chuyển đổi các trình bao bọc Python hiện có để sử dụng nó.
  4. Thực hiện quy trình để xóa SomethingV2 .

Cấm một phiên bản tiêu dùng không an toàn

  1. Thay đổi phiên bản GraphDef và thêm phiên bản xấu vào bad_consumers cho tất cả các GraphDef mới. Nếu có thể, hãy thêm vào bad_consumers chỉ cho các GraphDef có chứa một op nhất định hoặc tương tự.
  2. Nếu người tiêu dùng hiện tại có phiên bản xấu, hãy đẩy họ ra ngoài càng sớm càng tốt.