ความเข้ากันได้ของเวอร์ชัน TensorFlow

เอกสารนี้มีไว้สำหรับผู้ใช้ที่ต้องการความเข้ากันได้แบบย้อนหลังใน 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 ที่มีอยู่อาจสามารถย้ายไปยังรีลีสที่ใหม่กว่าได้ ดู ความเข้ากันได้ของกราฟและจุดตรวจสอบ สำหรับรายละเอียดเกี่ยวกับความเข้ากันได้ของข้อมูล

  • ผู้เยาว์ : คุณสมบัติที่เข้ากันได้แบบย้อนหลัง การปรับปรุงความเร็ว ฯลฯ โค้ดและข้อมูลที่ทำงานร่วมกับรุ่นรองก่อนหน้านี้ และ ขึ้นอยู่กับ 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 จึงไม่ครอบคลุมอยู่ในการรับประกันความเข้ากันได้

    หากสัญลักษณ์พร้อมใช้งานผ่านโมดูล tensorflow Python หรือโมดูลย่อย แต่ไม่มีการบันทึกไว้ จะ ไม่ ถือว่าเป็นส่วนหนึ่งของ API สาธารณะ

  • API ความเข้ากันได้ (ใน Python โมดูล tf.compat ) ในเวอร์ชันหลัก เราอาจเผยแพร่ยูทิลิตี้และอุปกรณ์ปลายทางเพิ่มเติมเพื่อช่วยเหลือผู้ใช้ในการเปลี่ยนไปใช้เวอร์ชันหลักใหม่ สัญลักษณ์ API เหล่านี้เลิกใช้แล้วและไม่รองรับ (กล่าวคือ เราจะไม่เพิ่มคุณสมบัติใดๆ และจะไม่แก้ไขข้อบกพร่องอื่นใดนอกจากการแก้ไขช่องโหว่) แต่อยู่ภายใต้การรับประกันความเข้ากันได้ของเรา

  • TensorFlow C API:

  • ไฟล์บัฟเฟอร์โปรโตคอลต่อไปนี้:

หมายเลขเวอร์ชันแยกต่างหากสำหรับ TensorFlow Lite

ปัจจุบัน TensorFlow Lite ได้รับการเผยแพร่โดยเป็นส่วนหนึ่งของ TensorFlow อย่างไรก็ตาม เราขอสงวนสิทธิ์ในการเปลี่ยนแปลง TensorFlow Lite API ในกำหนดการที่แตกต่างจาก TensorFlow API อื่นๆ ในอนาคต หรือแม้แต่ย้าย 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/version.h และ TF_Version() ใน tensorflow/c/c_api.h ) ปัจจุบันหมายเลขทั้งสองเวอร์ชันนี้มีค่าเท่ากัน แต่ในอนาคตอาจแตกต่างออกไป ตัวอย่างเช่น เราอาจเพิ่มหมายเลขเวอร์ชันหลักสำหรับ TensorFlow Lite โดยไม่ต้องเพิ่มหมายเลขเวอร์ชันหลักสำหรับ TensorFlow หรือในทางกลับกัน

พื้นผิว API ที่ครอบคลุมโดยหมายเลขเวอร์ชัน TensorFlow Lite ประกอบด้วย API สาธารณะต่อไปนี้:

ไม่ครอบคลุมถึงสัญลักษณ์การทดลอง ดูรายละเอียด ด้านล่าง

หมายเลขเวอร์ชันแยกต่างหากสำหรับ TensorFlow Lite Extension API

TensorFlow Lite มี C API สำหรับขยายล่าม TensorFlow Lite ด้วย "การดำเนินการที่กำหนดเอง" ซึ่งให้การดำเนินการที่ผู้ใช้กำหนดในกราฟหรือ "ผู้รับมอบสิทธิ์" ซึ่งช่วยให้สามารถมอบหมายการคำนวณสำหรับกราฟ (หรือสำหรับชุดย่อยของกราฟ) ไปยัง แบ็กเอนด์ที่กำหนดเอง API เหล่านี้ ซึ่งเราเรียกรวมกันว่า "API ส่วนขยายของ TensorFlow Lite" จำเป็นต้องมีการพึ่งพารายละเอียดบางส่วนในการใช้งาน TensorFlow Lite อย่างใกล้ชิดมากขึ้น

เราขอสงวนสิทธิ์ในการเปลี่ยนแปลง API เหล่านี้ที่เผยแพร่ในอนาคต ซึ่งอาจรวมถึงการเปลี่ยนแปลงที่เข้ากันได้แบบย้อนหลังไม่ได้ ในกำหนดเวลาที่แตกต่างจาก TensorFlow Lite API อื่นๆ ดังนั้นเราจึงใช้หมายเลขเวอร์ชันที่แตกต่างกันสำหรับ TensorFlow Lite Extension API มากกว่าหมายเลขเวอร์ชันสำหรับ TensorFlow Lite หรือ TensorFlow (ซึ่งอธิบายไว้ในส่วนก่อนหน้า) เรากำลังเปิดตัว API ใหม่ใน TensorFlow Lite เวอร์ชัน 2.15 เพื่อรับเวอร์ชัน API ของ TensorFlow Lite Extension ( TFLITE_EXTENSION_APIS_VERSION_STRING ใน tensorflow/lite/version.h และ TfLiteExtensionApisVersion() ใน tensorflow/lite/c/c_api.h ) ปัจจุบันหมายเลขเวอร์ชันสำหรับ TensorFlow Lite Extension API เหมือนกับหมายเลขเวอร์ชันสำหรับ TensorFlow และ TensorFlow Lite แต่ในอนาคตอาจแตกต่างออกไป ตัวอย่างเช่น เราอาจเพิ่มหมายเลขเวอร์ชันหลักสำหรับ TensorFlow Lite Extension API โดยไม่ต้องเพิ่มหมายเลขเวอร์ชันหลักสำหรับ TensorFlow Lite หรือในทางกลับกัน

พื้นผิว API ที่ครอบคลุมโดยหมายเลขเวอร์ชัน API ของ TensorFlow Lite Extension ประกอบด้วย API สาธารณะต่อไปนี้:

ขอย้ำอีกครั้งว่าไม่ครอบคลุมถึงสัญลักษณ์การทดลอง ดูรายละเอียด ด้านล่าง

สิ่งที่ ไม่ ครอบคลุม

บางส่วนของ TensorFlow สามารถเปลี่ยนแปลงในลักษณะที่เข้ากันไม่ได้แบบย้อนหลังได้ทุกเมื่อ ซึ่งรวมถึง:

  • API แบบทดลอง : เพื่ออำนวยความสะดวกในการพัฒนา เราได้ยกเว้นสัญลักษณ์ API บางตัวที่ทำเครื่องหมายไว้อย่างชัดเจนว่าเป็นแบบทดลองจากการรับประกันความเข้ากันได้ โดยเฉพาะอย่างยิ่งสิ่งต่อไปนี้ไม่ครอบคลุมอยู่ในการรับประกันความเข้ากันได้ใดๆ:

    • สัญลักษณ์ใด ๆ ในโมดูล tf.contrib หรือโมดูลย่อย
    • สัญลักษณ์ใดๆ (โมดูล ฟังก์ชัน อาร์กิวเมนต์ คุณสมบัติ คลาส ค่าคงที่ ประเภท แพ็คเกจ ฯลฯ) ที่มีชื่อประกอบด้วย experimental หรือ Experimental ; หรือ
    • สัญลักษณ์ใดๆ ที่มีชื่อแบบเต็มรวมถึงโมดูลหรือคลาสหรือแพ็คเกจซึ่งตัวมันเองอยู่ในช่วงทดลอง ซึ่งรวมถึงฟิลด์และข้อความย่อยของบัฟเฟอร์โปรโตคอลที่เรียกว่า experimental
  • ภาษาอื่น : TensorFlow API ในภาษาอื่นที่ไม่ใช่ Python และ C เช่น:

    และ TensorFlow Lite API ในภาษาอื่นที่ไม่ใช่ Java/Kotlin, C, Objective-C และ Swift โดยเฉพาะ

    • C++ (เปิดเผยผ่านไฟล์ส่วนหัวใน tensorflow/lite/ )
  • รายละเอียดของ 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 มาก

สุดท้ายนี้ เมื่อการรองรับเวอร์ชัน 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 มีเวอร์ชัน ( 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 ที่มีอยู่

การปฏิบัติตามคำแนะนำด้านล่างจะช่วยให้คุณใช้งานร่วมกันได้ต่อเมื่อชุดการดำเนินการไม่มีการเปลี่ยนแปลง:

  1. หากต้องการความเข้ากันได้แบบส่งต่อ ให้ตั้ง 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
  2. ซึ่งจะตัดคุณลักษณะที่เป็นค่าเริ่มต้นในขณะที่ผลิต/ส่งออกโมเดล เพื่อให้แน่ใจว่า tf.MetaGraphDef ที่ส่งออกไม่มีแอตทริบิวต์ op ใหม่เมื่อใช้ค่าเริ่มต้น
  3. การมีการควบคุมนี้อาจทำให้ผู้บริโภคที่ล้าสมัย (เช่น ให้บริการไบนารี่ที่ล้าหลังไบนารีการฝึกอบรม) สามารถโหลดโมเดลต่อไปได้ และป้องกันการหยุดชะงักในการให้บริการโมเดล

เวอร์ชัน GraphDef ที่กำลังพัฒนา

ส่วนนี้จะอธิบายวิธีใช้กลไกการกำหนดเวอร์ชันนี้เพื่อทำการเปลี่ยนแปลงประเภทต่างๆ ให้กับรูปแบบ GraphDef

เพิ่มปฏิบัติการ

เพิ่ม op ใหม่ให้กับทั้งผู้บริโภคและผู้ผลิตในเวลาเดียวกัน และอย่าเปลี่ยนเวอร์ชัน GraphDef ใดๆ การเปลี่ยนแปลงประเภทนี้เข้ากันได้แบบย้อนหลังโดยอัตโนมัติ และไม่ส่งผลกระทบต่อแผนความเข้ากันได้แบบไปข้างหน้า เนื่องจากสคริปต์ผู้ผลิตที่มีอยู่จะไม่ใช้ฟังก์ชันใหม่ทันที

เพิ่ม op และสลับ wrappers Python ที่มีอยู่เพื่อใช้งาน

  1. ใช้ฟังก์ชันการทำงานของผู้บริโภคใหม่และเพิ่มเวอร์ชัน GraphDef
  2. หากเป็นไปได้ที่จะทำให้ wrapper ใช้ฟังก์ชันใหม่เฉพาะในกรณีที่ไม่เคยทำงานมาก่อน คุณสามารถอัปเดต wrapper ได้ทันที
  3. เปลี่ยน wrappers Python เพื่อใช้ฟังก์ชันใหม่ อย่าเพิ่มค่า min_consumer เนื่องจากโมเดลที่ไม่ได้ใช้ op นี้ไม่ควรพัง

ลบหรือจำกัดการทำงานของ op

  1. แก้ไขสคริปต์ผู้ผลิตทั้งหมด (ไม่ใช่ TensorFlow) เพื่อไม่ใช้ op หรือฟังก์ชันการทำงานที่ถูกแบน
  2. เพิ่มเวอร์ชัน GraphDef และใช้ฟังก์ชันการทำงานของผู้บริโภคใหม่ที่ห้าม op หรือฟังก์ชันที่ถูกลบออกสำหรับ GraphDefs ในเวอร์ชันใหม่ขึ้นไป หากเป็นไปได้ ให้ TensorFlow หยุดสร้าง GraphDefs ด้วยฟังก์ชันที่ถูกแบน โดยเพิ่ม REGISTER_OP(...).Deprecated(deprecated_at_version, message)
  3. รอรุ่นหลักเพื่อวัตถุประสงค์ด้านความเข้ากันได้แบบย้อนหลัง
  4. เพิ่ม min_producer เป็นเวอร์ชัน GraphDef จาก (2) และลบฟังก์ชันการทำงานทั้งหมด

เปลี่ยนฟังก์ชันการทำงานของ op

  1. เพิ่ม op ที่คล้ายกันใหม่ชื่อ SomethingV2 หรือคล้ายกัน และทำตามขั้นตอนการเพิ่มและสลับ Python wrappers ที่มีอยู่เพื่อใช้งาน เพื่อให้แน่ใจว่าความเข้ากันได้ของการส่งต่อให้ใช้การตรวจสอบที่แนะนำใน compat.py เมื่อเปลี่ยนตัวห่อ Python
  2. ลบ op เก่าออก (เกิดขึ้นได้เฉพาะกับการเปลี่ยนแปลงเวอร์ชันหลักเนื่องจากความเข้ากันได้แบบย้อนหลัง)
  3. เพิ่ม min_consumer เพื่อแยกแยะผู้บริโภคที่ใช้ op แบบเก่า เพิ่ม op เก่ากลับเป็นนามแฝงสำหรับ SomethingV2 และดำเนินการตามกระบวนการเพื่อเปลี่ยน Wrapper Python ที่มีอยู่เพื่อใช้งาน
  4. ทำตามขั้นตอนเพื่อลบ SomethingV2

แบนเวอร์ชันสำหรับผู้บริโภคที่ไม่ปลอดภัยเพียงเวอร์ชันเดียว

  1. ชนเวอร์ชัน GraphDef และเพิ่มเวอร์ชันที่ไม่ดีให้กับ bad_consumers สำหรับ GraphDefs ใหม่ทั้งหมด หากเป็นไปได้ ให้เพิ่ม bad_consumers เฉพาะสำหรับ GraphDefs ซึ่งมี op บางอย่างหรือคล้ายกัน
  2. หากผู้บริโภคปัจจุบันมีเวอร์ชันที่ไม่ดี ให้ผลักดันพวกเขาออกโดยเร็วที่สุด