เอกสารนี้มีไว้สำหรับผู้ใช้ที่ต้องการความเข้ากันได้แบบย้อนหลังในเวอร์ชันต่างๆ ของ TensorFlow (สำหรับโค้ดหรือข้อมูล) และสำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการแก้ไข TensorFlow ในขณะที่คงความเข้ากันได้ไว้
เวอร์ชันความหมาย 2.0
TensorFlow เป็นไปตาม Semantic Versioning 2.0 ( semver ) สำหรับ API สาธารณะ TensorFlow รุ่นที่วางจำหน่ายแต่ละรุ่นมีรูปแบบ MAJOR.MINOR.PATCH
ตัวอย่างเช่น TensorFlow เวอร์ชัน 1.2.3 มี MAJOR
เวอร์ชัน 1, MINOR
เวอร์ชัน 2 และ PATCH
เวอร์ชัน 3 การเปลี่ยนแปลงในแต่ละตัวเลขมีความหมายดังต่อไปนี้:
MAJOR : อาจย้อนกลับการเปลี่ยนแปลงที่เข้ากันไม่ได้ รหัสและข้อมูลที่ทำงานกับรีลีสหลักก่อนหน้าไม่จำเป็นต้องใช้งานได้กับรีลีสใหม่ อย่างไรก็ตาม ในบางกรณี กราฟและจุดตรวจสอบ TensorFlow ที่มีอยู่อาจย้ายข้อมูลไปยังรุ่นที่ใหม่กว่าได้ ดู ความเข้ากันได้ของกราฟและจุดตรวจสอบ สำหรับรายละเอียดเกี่ยวกับความเข้ากันได้ของข้อมูล
MINOR : คุณลักษณะที่เข้ากันได้แบบย้อนกลับ การปรับปรุงความเร็ว ฯลฯ โค้ดและข้อมูลที่ทำงานกับรีลีสย่อยก่อนหน้านี้ และ ขึ้นอยู่กับ API สาธารณะที่ไม่ใช่การทดลองเท่านั้นจะยังคงทำงานต่อไปโดยไม่มีการเปลี่ยนแปลง สำหรับรายละเอียดเกี่ยวกับสิ่งที่เป็นและไม่ใช่ API สาธารณะ โปรดดู สิ่งที่ครอบคลุม
PATCH : แก้ไขข้อบกพร่องที่เข้ากันได้ย้อนหลัง
ตัวอย่างเช่น รีลีส 1.0.0 นำเสนอการเปลี่ยนแปลงที่ เข้ากันไม่ได้ ย้อนหลังจากรีลีส 0.12.1 อย่างไรก็ตาม รีลีส 1.1.1 เข้ากันได้ กับรีลีส 1.0.0 แบบย้อนหลัง
สิ่งที่ครอบคลุม
เฉพาะ API สาธารณะของ TensorFlow เท่านั้นที่เข้ากันได้แบบย้อนหลังในเวอร์ชันรองและแพตช์ API สาธารณะประกอบด้วย
ฟังก์ชันและคลาส Python ที่จัดทำเป็นเอกสารทั้งหมดในโมดูล
tensorflow
และโมดูลย่อย ยกเว้น- สัญลักษณ์ส่วนตัว: ฟังก์ชัน คลาส และอื่นๆ ที่มีชื่อขึ้นต้นด้วย
_
- สัญลักษณ์การทดลองและ
tf.contrib
ดูรายละเอียด ด้านล่าง
โปรดทราบว่าโค้ดใน
examples/
และtools/
ไดเร็กทอรีไม่สามารถเข้าถึงได้ผ่านโมดูลtensorflow
Python ดังนั้นจึงไม่ครอบคลุมในการรับประกันความเข้ากันได้หากมีสัญลักษณ์ผ่านโมดูล Python ของ
tensorflow
หรือโมดูลย่อย แต่ไม่มีการบันทึกเป็นเอกสาร แสดงว่าสัญลักษณ์นั้น ไม่ ถือว่าเป็นส่วนหนึ่งของ API สาธารณะ- สัญลักษณ์ส่วนตัว: ฟังก์ชัน คลาส และอื่นๆ ที่มีชื่อขึ้นต้นด้วย
API ความเข้ากันได้ (ใน Python โมดูล
tf.compat
) ในเวอร์ชันหลัก เราอาจปล่อยยูทิลิตี้และจุดสิ้นสุดเพิ่มเติมเพื่อช่วยผู้ใช้ในการเปลี่ยนไปใช้เวอร์ชันหลักใหม่ สัญลักษณ์ API เหล่านี้เลิกใช้แล้วและไม่รองรับ (กล่าวคือ เราจะไม่เพิ่มคุณสมบัติใดๆ และเราจะไม่แก้ไขข้อบกพร่องอื่นนอกจากเพื่อแก้ไขช่องโหว่) แต่อยู่ภายใต้การรับประกันความเข้ากันได้ของเราไฟล์บัฟเฟอร์โปรโตคอลต่อไปนี้:
สิ่งที่ ไม่ ครอบคลุม
บางส่วนของ TensorFlow สามารถเปลี่ยนแปลงไปในทางที่เข้ากันไม่ได้ย้อนหลังได้ทุกเมื่อ เหล่านี้รวมถึง:
API ทดลอง : เพื่ออำนวยความสะดวกในการพัฒนา เรายกเว้นสัญลักษณ์ API บางตัวที่ระบุอย่างชัดเจนว่าเป็นการทดลองจากการรับประกันความเข้ากันได้ โดยเฉพาะอย่างยิ่ง ต่อไปนี้จะไม่ครอบคลุมในการรับประกันความเข้ากันได้:
- สัญลักษณ์ใดๆ ในโมดูล
tf.contrib
หรือโมดูลย่อย - สัญลักษณ์ใดๆ (โมดูล ฟังก์ชัน อาร์กิวเมนต์ คุณสมบัติ คลาส หรือค่าคงที่) ที่มีชื่อประกอบด้วย
experimental
หรือการExperimental
หรือ - สัญลักษณ์ใด ๆ ที่มีชื่อแบบเต็มรวมถึงโมดูลหรือคลาสที่เป็นการทดลอง ซึ่งรวมถึงฟิลด์และข้อความย่อยของบัฟเฟอร์โปรโตคอลใดๆ ที่เรียกว่า
experimental
- สัญลักษณ์ใดๆ ในโมดูล
ภาษาอื่นๆ : TensorFlow API ในภาษาอื่นที่ไม่ใช่ Python และ C เช่น:
- C ++ (แสดงผ่านไฟล์ส่วนหัวใน
tensorflow/cc
) - ชวา ,
- ไป
- จาวาสคริปต์
- C ++ (แสดงผ่านไฟล์ส่วนหัวใน
รายละเอียดของ ops แบบผสม: ฟังก์ชันสาธารณะจำนวนมากใน Python ขยายเป็น ops ดั้งเดิมหลายตัวในกราฟ และรายละเอียดเหล่านี้จะเป็นส่วนหนึ่งของกราฟใดๆ ที่บันทึกไว้ในดิสก์ในรูป
GraphDef
s รายละเอียดเหล่านี้อาจมีการเปลี่ยนแปลงสำหรับการเผยแพร่เล็กน้อย โดยเฉพาะอย่างยิ่ง การทดสอบการถดถอยที่ตรวจสอบการจับคู่ที่แน่นอนระหว่างกราฟมีแนวโน้มที่จะแยกออกจากรุ่นย่อย แม้ว่าพฤติกรรมของกราฟจะไม่เปลี่ยนแปลงและจุดตรวจสอบที่มีอยู่จะยังคงใช้งานได้รายละเอียดตัวเลขทศนิยม: ค่าทศนิยมเฉพาะที่คำนวณโดย ops อาจเปลี่ยนแปลงได้ตลอดเวลา ผู้ใช้ควรพึ่งพาความแม่นยำโดยประมาณและความเสถียรของตัวเลขเท่านั้น ไม่ใช่บิตเฉพาะที่คำนวณ การเปลี่ยนแปลงสูตรตัวเลขในรุ่นย่อยและแพตช์ควรส่งผลให้มีความแม่นยำที่เทียบเท่าหรือดีขึ้น โดยมีคำเตือนว่าในแมชชีนเลิร์นนิง การปรับปรุงความแม่นยำของสูตรเฉพาะอาจส่งผลให้ความแม่นยำลดลงสำหรับระบบโดยรวม
ตัวเลขสุ่ม: ตัวเลข สุ่มเฉพาะที่คำนวณอาจเปลี่ยนแปลงได้ตลอดเวลา ผู้ใช้ควรพึ่งพาการแจกแจงที่ถูกต้องโดยประมาณและความแข็งแกร่งทางสถิติเท่านั้น ไม่ใช่บิตเฉพาะที่คำนวณ ดูคู่มือ การสร้างหมายเลขสุ่ม สำหรับรายละเอียด
เวอร์ชันเอียงใน Tensorflow แบบกระจาย: ไม่รองรับ การเรียกใช้ TensorFlow สองเวอร์ชันที่แตกต่างกันในคลัสเตอร์เดียว ไม่มีการรับประกันเกี่ยวกับความเข้ากันได้ย้อนหลังของโปรโตคอลสาย
ข้อ บกพร่อง: เราขอสงวนสิทธิ์ในการเปลี่ยนแปลงพฤติกรรมที่เข้ากันไม่ได้แบบย้อนกลับ (แม้ว่าจะไม่ใช่ API) หากการใช้งานปัจจุบันนั้นใช้งานไม่ได้อย่างชัดเจน กล่าวคือ ถ้ามันขัดแย้งกับเอกสารประกอบหรือหากพฤติกรรมที่ตั้งใจไว้ซึ่งเป็นที่รู้จักและกำหนดไว้อย่างดีไม่ได้ถูกนำไปใช้อย่างถูกต้องเนื่องจาก เพื่อจุดบกพร่อง ตัวอย่างเช่น หากเครื่องมือเพิ่มประสิทธิภาพอ้างว่าใช้อัลกอริธึมการปรับให้เหมาะสมที่รู้จักกันดี แต่ไม่ตรงกับอัลกอริทึมนั้นเนื่องจากข้อบกพร่อง เราจะแก้ไขเครื่องมือเพิ่มประสิทธิภาพ การแก้ไขของเราอาจทำลายรหัสโดยอาศัยพฤติกรรมที่ไม่ถูกต้องสำหรับการบรรจบกัน เราจะบันทึกการเปลี่ยนแปลงดังกล่าวในบันทึกประจำรุ่น
API ที่ไม่ได้ใช้: เราขอสงวนสิทธิ์ในการเปลี่ยนแปลงที่เข้ากันไม่ได้ย้อนหลังกับ API ที่เราไม่พบการใช้งานที่เป็นเอกสาร (โดยการตรวจสอบการใช้งาน TensorFlow ผ่านการค้นหา GitHub) ก่อนทำการเปลี่ยนแปลงใดๆ เราจะประกาศความตั้งใจของเราในการเปลี่ยนแปลง ประกาศ@ รายชื่อผู้รับจดหมาย พร้อมให้คำแนะนำเกี่ยวกับวิธีจัดการกับความแตกแยกใดๆ (ถ้ามี) และรอเป็นเวลาสองสัปดาห์เพื่อให้ชุมชนของเรามีโอกาสแบ่งปันความคิดเห็น .
พฤติกรรมข้อผิดพลาด: เราอาจแทนที่ข้อผิดพลาดด้วยพฤติกรรมที่ไม่ใช่ข้อผิดพลาด ตัวอย่างเช่น เราอาจเปลี่ยนฟังก์ชันเพื่อคำนวณผลลัพธ์แทนการแจ้งข้อผิดพลาด แม้ว่าข้อผิดพลาดนั้นจะได้รับการบันทึกไว้แล้วก็ตาม เราขอสงวนสิทธิ์ในการเปลี่ยนแปลงข้อความแสดงข้อผิดพลาด นอกจากนี้ ประเภทของข้อผิดพลาดอาจเปลี่ยนแปลงได้ เว้นแต่จะระบุประเภทข้อยกเว้นสำหรับเงื่อนไขข้อผิดพลาดเฉพาะไว้ในเอกสารประกอบ
ความเข้ากันได้ของ SavedModels กราฟและจุดตรวจสอบ
SavedModel เป็นรูปแบบการทำให้เป็นอนุกรมที่ต้องการใช้ในโปรแกรม TensorFlow SavedModels ประกอบด้วยสองส่วน: กราฟอย่างน้อยหนึ่งกราฟที่เข้ารหัสเป็น GraphDefs
และจุดตรวจสอบ กราฟอธิบายการไหลของข้อมูลของ ops ที่จะดำเนินการ และจุดตรวจสอบมีค่าเทนเซอร์ที่บันทึกไว้ของตัวแปรในกราฟ
ผู้ใช้ TensorFlow จำนวนมากสร้าง SavedModels และโหลดและดำเนินการด้วย TensorFlow รุ่นที่ใหม่กว่า เพื่อให้เป็นไปตามข้อกำหนดของ semver สามารถโหลด SavedModels ที่เขียนด้วย TensorFlow เวอร์ชันหนึ่งและประเมินด้วย TensorFlow เวอร์ชันที่ใหม่กว่าที่มีรีลีสหลักเดียวกันได้
เราทำการรับประกันเพิ่มเติมสำหรับ SavedModels ที่ รองรับ เราเรียก SavedModel ซึ่งสร้างขึ้นโดยใช้ เฉพาะ API ที่ไม่สนับสนุน ไม่ใช่การทดลอง และไม่เข้ากันได้ ใน TensorFlow เวอร์ชันหลัก N
และ SavedModel ที่ได้รับการสนับสนุนในเวอร์ชัน N
SavedModel ใดๆ ที่รองรับใน TensorFlow เวอร์ชันหลัก N
สามารถโหลดและดำเนินการได้ด้วย TensorFlow เวอร์ชันหลัก N+1
อย่างไรก็ตาม ฟังก์ชันการทำงานที่จำเป็นในการสร้างหรือแก้ไขโมเดลดังกล่าวอาจไม่สามารถใช้งานได้อีกต่อไป ดังนั้นการรับประกันนี้จึงมีผลเฉพาะกับ SavedModel ที่ยังไม่ได้แก้ไขเท่านั้น
เราจะพยายามรักษาความเข้ากันได้แบบย้อนหลังไว้ให้นานที่สุดเท่าที่จะเป็นไปได้ เพื่อให้ไฟล์ซีเรียลไลซ์สามารถใช้งานได้เป็นระยะเวลานาน
ความเข้ากันได้ของ GraphDef
กราฟจะถูกทำให้เป็นอนุกรมผ่านบัฟเฟอร์โปรโตคอล GraphDef
เพื่ออำนวยความสะดวกในการเปลี่ยนแปลงกราฟย้อนหลังที่เข้ากันไม่ได้ GraphDef
แต่ละรายการจะมีหมายเลขเวอร์ชันแยกจากเวอร์ชัน TensorFlow ตัวอย่างเช่น GraphDef
เวอร์ชัน 17 เลิกใช้งาน inv
op แทน reciprocal
ความหมายคือ:
TensorFlow แต่ละเวอร์ชันรองรับช่วงเวลาของเวอร์ชัน
GraphDef
ช่วงเวลานี้จะคงที่ในการเผยแพร่แพตช์ และจะเพิ่มขึ้นในรีลีสย่อยเท่านั้น การเลิกรองรับเวอร์ชันGraphDef
จะเกิดขึ้นเฉพาะกับ TensorFlow รุ่นหลักเท่านั้น (และสอดคล้องกับการรองรับเวอร์ชันที่รับประกันสำหรับ SavedModels เท่านั้น)กราฟที่สร้างขึ้นใหม่จะได้รับหมายเลขเวอร์ชันล่าสุดของ
GraphDef
หากเวอร์ชันของ TensorFlow รองรับกราฟเวอร์ชัน
GraphDef
กราฟจะโหลดและประเมินด้วยลักษณะการทำงานเดียวกันกับเวอร์ชัน TensorFlow ที่ใช้ในการสร้างกราฟ (ยกเว้นรายละเอียดตัวเลขทศนิยมและตัวเลขสุ่มตามที่ระบุไว้ด้านบน) โดยไม่คำนึงถึงหลัก เวอร์ชันของ TensorFlow โดยเฉพาะอย่างยิ่ง GraphDef ซึ่งเข้ากันได้กับไฟล์จุดตรวจสอบใน TensorFlow เวอร์ชันหนึ่ง (เช่นในกรณีของ SavedModel) จะยังคงเข้ากันได้กับจุดตรวจสอบนั้นในเวอร์ชันถัดไป ตราบใดที่ GraphDef รองรับโปรดทราบว่านี่ใช้ได้กับกราฟที่ต่อเนื่องกันใน GraphDefs (และ SavedModels เท่านั้น): โค้ด ที่อ่านจุดตรวจสอบอาจไม่สามารถอ่านจุดตรวจสอบที่สร้างโดยโค้ดเดียวกันที่เรียกใช้ 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 เดือน การรับประกันสำหรับ SavedModels ที่รองรับซึ่งมีรายละเอียดด้านบนนั้นแข็งแกร่งกว่าการรับประกัน 6 เดือนสำหรับ GraphDefs มาก
- TensorFlow 1.2 อาจรองรับ
สุดท้าย เมื่อการรองรับเวอร์ชัน GraphDef
ลดลง เราจะพยายามจัดหาเครื่องมือสำหรับการแปลงกราฟเป็น GraphDef
เวอร์ชันใหม่ที่รองรับโดยอัตโนมัติ
ความเข้ากันได้ของกราฟและจุดตรวจสอบเมื่อขยาย TensorFlow
ส่วนนี้เกี่ยวข้องเฉพาะเมื่อทำการเปลี่ยนแปลงที่เข้ากันไม่ได้กับรูปแบบ GraphDef
เช่น เมื่อเพิ่ม ops ลบ ops หรือเปลี่ยนฟังก์ชันการทำงานของ ops ที่มีอยู่ ส่วนก่อนหน้านี้ควรเพียงพอสำหรับผู้ใช้ส่วนใหญ่
ความเข้ากันได้ย้อนหลังและไปข้างหน้าบางส่วน
รูปแบบการกำหนดเวอร์ชันของเรามีข้อกำหนดสามประการ:
- ความเข้ากันได้แบบ ย้อนกลับ เพื่อรองรับการโหลดกราฟและจุดตรวจสอบที่สร้างด้วย TensorFlow เวอร์ชันเก่า
- ส่งต่อความเข้ากันได้ เพื่อรองรับสถานการณ์ที่ผู้ผลิตกราฟหรือจุดตรวจสอบได้รับการอัปเกรดเป็น TensorFlow เวอร์ชันใหม่ก่อนผู้บริโภค
- เปิดใช้งานการพัฒนา TensorFlow ด้วยวิธีที่เข้ากันไม่ได้ ตัวอย่างเช่น ลบ ops เพิ่มแอตทริบิวต์ และลบแอตทริบิวต์
โปรดทราบว่าแม้ว่ากลไกเวอร์ชัน GraphDef
จะแยกจากเวอร์ชัน TensorFlow แต่การเปลี่ยนแปลงรูปแบบ GraphDef
ที่เข้ากันไม่ได้แบบย้อนกลับยังคงถูกจำกัดโดย Semantic Versioning ซึ่งหมายความว่าฟังก์ชันการทำงานสามารถลบหรือเปลี่ยนแปลงระหว่าง TensorFlow เวอร์ชัน MAJOR
เท่านั้น (เช่น 1.7
ถึง 2.0
) นอกจากนี้ ความเข้ากันได้แบบส่งต่อถูกบังคับใช้ในแพทช์รีลีส ( 1.x.1
ถึง 1.x.2
)
เพื่อให้เกิดความเข้ากันได้ทั้งแบบย้อนกลับและไปข้างหน้า และเพื่อให้ทราบว่าเมื่อใดควรบังคับใช้การเปลี่ยนแปลงในรูปแบบ กราฟและจุดตรวจสอบจะมีข้อมูลเมตาที่อธิบายว่าสร้างขึ้นเมื่อใด ส่วนด้านล่างให้รายละเอียดเกี่ยวกับการใช้งาน TensorFlow และแนวทางสำหรับการพัฒนาเวอร์ชัน GraphDef
แบบแผนเวอร์ชันข้อมูลอิสระ
มีเวอร์ชันข้อมูลที่แตกต่างกันสำหรับกราฟและจุดตรวจสอบ รูปแบบข้อมูลทั้งสองมีวิวัฒนาการในอัตราที่ต่างกันและมีอัตราที่แตกต่างจาก TensorFlow ระบบการกำหนดเวอร์ชันทั้งสองถูกกำหนดไว้ใน core/public/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
ส่วนนี้อธิบายวิธีใช้กลไกการกำหนดเวอร์ชันนี้เพื่อทำการเปลี่ยนแปลงประเภทต่างๆ กับรูปแบบ GraphDef
เพิ่มตัวเลือก
เพิ่ม op ใหม่ให้กับทั้งผู้บริโภคและผู้ผลิตพร้อมกัน และไม่ต้องเปลี่ยนเวอร์ชัน GraphDef
ใดๆ การเปลี่ยนแปลงประเภทนี้จะเข้ากันได้แบบย้อนกลับโดยอัตโนมัติ และไม่ส่งผลกระทบต่อแผนความเข้ากันได้ในอนาคต เนื่องจากสคริปต์ผู้ผลิตที่มีอยู่จะไม่ใช้ฟังก์ชันใหม่ในทันที
เพิ่ม op และสลับตัวห่อ Python ที่มีอยู่เพื่อใช้งาน
- ใช้ฟังก์ชันผู้บริโภคใหม่และเพิ่มเวอร์ชัน
GraphDef
- หากเป็นไปได้ที่จะทำให้ wrapper ใช้ฟังก์ชันใหม่เฉพาะในกรณีที่ไม่เคยทำงานมาก่อน คุณสามารถอัพเดต wrapper ได้ในขณะนี้
- เปลี่ยน Python wrappers เพื่อใช้ฟังก์ชันใหม่ อย่าเพิ่ม
min_consumer
เนื่องจากโมเดลที่ไม่ได้ใช้ op นี้ไม่ควรแตก
ลบหรือจำกัดการทำงานของ op
- แก้ไขสคริปต์ผู้ผลิตทั้งหมด (ไม่ใช่ TensorFlow เอง) เพื่อไม่ใช้ op หรือฟังก์ชันที่ถูกแบน
- เพิ่มเวอร์ชัน
GraphDef
และนำฟังก์ชันการทำงานของผู้บริโภคใหม่ที่ห้าม op หรือฟังก์ชันที่ถูกลบออกสำหรับ GraphDefs ในเวอร์ชันใหม่ขึ้นไป หากเป็นไปได้ ให้ TensorFlow หยุดสร้างGraphDefs
ด้วยฟังก์ชันที่ถูกแบน ในการดำเนินการดังกล่าว ให้เพิ่มREGISTER_OP(...).Deprecated(deprecated_at_version, message)
- รอรุ่นใหญ่เพื่อความเข้ากันได้แบบย้อนหลัง
- เพิ่ม
min_producer
เป็นเวอร์ชัน GraphDef จาก (2) และลบฟังก์ชันการทำงานทั้งหมด
เปลี่ยนการทำงานของ op
- เพิ่ม op ใหม่ที่คล้ายกันชื่อ
SomethingV2
หรือคล้ายกัน และดำเนินการตามขั้นตอนการเพิ่มและสลับตัวห่อ Python ที่มีอยู่เพื่อใช้งาน เพื่อให้แน่ใจว่าสามารถส่งต่อกันได้ ให้ใช้การตรวจสอบที่แนะนำใน compat.py เมื่อเปลี่ยน Python wrappers - ลบ op เก่า (สามารถเกิดขึ้นได้กับการเปลี่ยนแปลงเวอร์ชันหลักเท่านั้นเนื่องจากความเข้ากันได้แบบย้อนหลัง)
- เพิ่ม
min_consumer
เพื่อแยกแยะผู้บริโภคด้วย op เก่า เพิ่ม op เก่ากลับเป็นนามแฝงสำหรับSomethingV2
และดำเนินการตามกระบวนการเพื่อสลับตัวห่อ Python ที่มีอยู่เพื่อใช้งาน - ทำตามขั้นตอนเพื่อลบ
SomethingV2
แบนเวอร์ชันผู้บริโภคที่ไม่ปลอดภัยเพียงเวอร์ชันเดียว
- ชนเวอร์ชัน
GraphDef
และเพิ่มเวอร์ชันที่ไม่ดีให้กับbad_consumers
สำหรับ GraphDefs ใหม่ทั้งหมด หากเป็นไปได้ ให้เพิ่มbad_consumers
เฉพาะสำหรับ GraphDefs ซึ่งมี op บางอย่างหรือคล้ายกัน - หากผู้บริโภคที่มีอยู่มีเวอร์ชันที่ไม่ดี ให้ผลักออกโดยเร็วที่สุด