Trả lời cho sự kiện TensorFlow Everywhere tại địa phương của bạn ngay hôm nay!
Trang này được dịch bởi Cloud Translation API.
Switch to English

Khả năng tương thích với 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 giữ được tính 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 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. Các thay đổi đối với mỗi số có ý nghĩa sau:

  • CHÍNH : Những thay đổi không tương thích ngược có thể xảy ra. Mã và dữ liệu đã hoạt động với bản phát hành chính trước đó sẽ 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 đồ thị và điểm kiểm tra TensorFlow hiện có có thể được chuyển sang phiên bản mới hơn; xem Tính tương thích của đồ thị và điểm kiểm tra để biết chi tiết về tính tương thích của dữ liệu.

  • MINOR : Các tính năng tương thích ngược, cải tiế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ề cái gì được và không phải là API công khai, hãy xem Cái gì được đề cập .

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

Ví dụ: bản phát hành 1.0.0 đã giới thiệu các thay đổi không tương thích ngược từ 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 tương thích ngược trên các phiên bản nhỏ và vá lỗi. Các API công khai bao gồm

  • Tất cả các hàm và lớp Python được lập thành văn bản 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 nào, v.v., có tên bắt đầu bằng _
    • Các ký hiệu thử nghiệm và tf.contrib , xem bên dưới để biết chi tiết.

    Lưu ý rằng mã trong các examples/tools/ thư mục không thể truy cập được thông qua mô-đun tensorflow Python và do đó không được bảo đảm tính 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 (bằng Python, mô-đun tf.compat ). Tại các phiên bản chính, chúng tôi có thể phát hành các tiện ích và thiết bị đầu 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ợ (tức 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 ngoài việc sửa các lỗ hổng bảo mật), nhưng chúng nằm trong sự đảm bảo về tính tương thích của chúng tôi.

  • API C.

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

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

Một số phần của TensorFlow có thể thay đổi theo những 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ột số ký hiệu API được đánh dấu rõ ràng là thử nghiệm khỏi các đảm bảo về tính tương thích. Đặc biệt, những điều sau đây không nằm trong 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 hoặc hằng số) có tên chứa experimental hoặc Experimental ; hoặc là

    • bất kỳ ký hiệu nào có tên đủ điều kiện bao gồm một mô-đun hoặc lớp tự nó là thử nghiệm. Điều này bao gồm các trường và trang 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 : Các API TensorFlow bằng các ngôn ngữ khác ngoài Python và C, chẳng hạn như:

  • 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 ban đầu trong biểu đồ và những 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. Các chi tiết này có thể thay đổi đối với các bản phát hành nhỏ. Đặc biệt, các bài kiểm tra hồi quy để kiểm tra sự khớp chính xác giữa các biểu đồ có khả năng bị phá vỡ trong các bản phát hành nhỏ, mặc dù hành vi của biểu đồ sẽ không thay đổi và các điểm kiểm tra hiện tại 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 ops có thể thay đổi bất cứ 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 số, không dựa trên các bit cụ thể được tính toán. Các thay đổi đối với các công thức số trong các bản phát hành nhỏ và bản vá sẽ dẫn đến độ chính xác tương đương hoặc được cải thiện, với lưu ý rằng trong học máy, độ chính xác được cải thiện của các công thức cụ thể có thể làm giảm độ chính xác của hệ thống tổng thể.

  • 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 phối 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 thêm chi tiết.

  • Phiên bản lệch trong Tensorflow phân tán: Việc chạy hai phiên bản khác nhau của TensorFlow trong một cụm không được hỗ trợ. Không có đả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 bảo lưu 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 quá trình 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ự định nổi tiếng và được xác định rõ không được triển khai đúng cho một lỗi. Ví dụ: nếu một trình tối ưu hóa tuyên bố triển khai một thuật toán tối ưu hóa nổi tiếng nhưng không khớp với thuật toán đó do lỗi, thì chúng tôi sẽ sửa chữ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 trên hành vi hội tụ sai. Chúng tôi sẽ ghi nhận 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 bảo lưu quyền thực hiện các thay đổi không tương thích ngược lại đối với các API mà chúng tôi không tìm thấy cách sử dụng được ghi lại bằng tài liệu nào (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ư thông báo @ , cung cấp hướng dẫn cách giải quyết bất kỳ sự cố nào (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 lỗi. Ví dụ: chúng tôi có thể thay đổi một hàm để tính toán 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 điều kiện lỗi cụ thể được chỉ định trong tài liệu.

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

SavedModel là định dạng tuần tự hóa được ưu tiên sử dụng trong các chương trình TensorFlow. SavedModels chứa hai phần: Một hoặc nhiều đồ thị được mã hóa dưới dạng GraphDefs và một Điểm kiểm tra. 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 SavedModels, tải và thực thi chúng với bản phát hành sau của TensorFlow. Tuân theo semver , SavedModels đượ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 đảm bảo bổ sung cho các SavedModels được hỗ trợ . Chúng tôi gọi SavedModel chỉ được tạo bằng cách sử dụng các API không tương thích, không dùng để thử nghiệm, không dùng trong TensorFlow phiên bản chính NSavedModel được hỗ trợ trong phiên bản N Bất kỳ SavedModel nào được hỗ trợ trong TensorFlow phiên bản chính N đều có thể được tải và thực thi với 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ột 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 SavedModel chưa được sửa đổi.

Chúng tôi sẽ cố gắng duy trì khả năng tương thích ngược lâu nhất có thể, để 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 GraphDef

Đồ thị được tuần tự hóa qua bộ đệm giao thức GraphDef . Để tạo điều kiện thuận lợi cho các thay đổi không tương thích ngược đối với đồ thị, mỗi GraphDef có một 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 phép inv op ủng hộ reciprocal . Các ngữ nghĩa là:

  • Mỗi phiên bản của TensorFlow hỗ trợ một khoảng các phiên bản GraphDef . Khoảng thời gian này sẽ không đổi giữa 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 giảm 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 SavedModels).

  • Các đồ thị 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 nhất định của TensorFlow 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 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 của 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 SavedModel) 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 Đồ thị được tuần tự hóa trong GraphDefs (và SavedModels): đọc điểm kiểm tra có thể không đọ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 GraphDef 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 từ 4 đến 8.
    • Ít nhất sáu tháng sau, TensorFlow 2.0.0 có thể ngừng hỗ trợ cho 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 đảm bảo cho các Mô hình đã lưu được hỗ trợ nêu chi tiết ở trên mạnh hơn nhiều so với bảo đảm 6 tháng cho GraphDefs.

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

Tính tương thích của đồ thị và điểm kiểm tra khi mở rộng TensorFlow

Phần này chỉ có 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 hoạt động, xóa 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 lùi và chuyển tiếp một phần

Chương trình 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 đồ thị và các đ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 trạm kiểm soát được nâng cấp lên phiên bản TensorFlow mới hơn trước người tiêu dùng.
  • Bật TensorFlow phát triển 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 trong khi cơ chế phiên bản GraphDef tách biệt với phiên bản TensorFlow, các 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 GraphDef phiên bản ngữ nghĩa. Điều này có nghĩa là chỉ có thể loại bỏ hoặc thay đổi chức năng 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 chuyển tiếp đượ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à chuyển tiếp và biết khi nào cần thực thi các thay đổi trong đị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 ra. Các phần bên dưới trình bày chi tiết việc triển khai TensorFlow và hướng dẫn để phát triển các phiên bản GraphDef .

Các lược đồ phiên bản dữ liệu độc lập

Có các phiên bản dữ liệu khác nhau cho đồ thị 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 với tốc độ khác nhau so với TensorFlow. Cả hai hệ thống lập phiên bản đều được định nghĩa 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 : mã nhị phân sản xuất dữ liệu. Nhà sản xuất có 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 với ( min_consumer ).
  • người tiêu dùng : mã nhị phân sử dụng dữ liệu. Người tiêu dùng có 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 tạo phiên bản có trường VersionDef versions min_consumer ghi lại producer đã tạo ra dữ liệu, min_consumer mà nó 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 một nhà sản xuất tạo một số dữ liệu, dữ liệu sẽ kế thừa phiên bản trình min_consumermin_consumer của producer . 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ó chứa 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 những điều sau đây đều đúng:

  • consumer > = data's min_consumer
  • data's producer > = min_producer 's min_producer
  • consumer không thuộc 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 nên core/public/version.h chứa 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 (tương ứng được nhà sản xuất và người tiêu dùng cần) . Đặ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 trạm kiểm soát, 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 với thuộc tính mặc định vào tùy chọn hiện có

Thực hiện theo hướng dẫn bên dưới chỉ cung cấp cho bạn khả năng tương thích chuyển tiếp nếu nhóm hoạt động không thay đổi:

  1. Nếu tính tương thích là mong muốn, thiết lập strip_default_attrs để True trong khi xuất khẩu các mô hình sử dụng một trong hai tf.saved_model.SavedModelBuilder.add_meta_graph_and_variablestf.saved_model.SavedModelBuilder.add_meta_graph phương pháp của SavedModelBuilder lớp, 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 giá trị mặc định được sử dụng.
  3. 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 chậm hơn so với các tệp nhị phân đào tạo) tiếp tục tải các mô hình và ngăn chặn sự gián đoạn trong việc phân phát 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 op

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 chuyển tiếp vì các tập lệnh nhà sản xuất hiện có sẽ không đột nhiên sử dụng chức năng mới.

Thêm op và chuyển đổi 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 không hoạt động trước đó, 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ị min_consumer .

Xóa hoặc hạn chế chức năng của một 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 tùy chọn bị cấm.
  2. GraphDef phiên bản GraphDef và triển khai chức năng tiêu dùng mới cấm op 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 với 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 các mục đích tương thích ngược.
  4. Tăng min_producer lên phiên bản GraphDef từ (2) và loại bỏ hoàn toàn chức năng.

Thay đổi chức năng của một 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 tính 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. Loại bỏ op cũ (Chỉ có thể diễn ra với sự thay đổi phiên bản lớ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 quá trình chuyển đổi các trình bao bọc Python hiện có sang sử dụng nó.
  4. Thực hiện quá trình xóa SomethingV2 .

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

  1. Bump 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 GraphDefs 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 càng sớm càng tốt.