การสร้างโมดูลที่ค้นพบเส้นทางที่ให้บริการใหม่

เอกสารนี้จะอธิบายวิธีขยาย TensorFlow Serving เพื่อตรวจสอบระบบจัดเก็บข้อมูลที่แตกต่างกันเพื่อค้นหาโมเดล (เวอร์ชัน) หรือข้อมูลใหม่ที่จะให้บริการ โดยเฉพาะอย่างยิ่งครอบคลุมถึงวิธีการสร้างและใช้โมดูลที่ตรวจสอบเส้นทางของระบบจัดเก็บข้อมูลเพื่อดูลักษณะที่ปรากฏของเส้นทางย่อยใหม่ โดยที่แต่ละเส้นทางย่อยแสดงถึงเวอร์ชันที่ให้บริการใหม่ที่จะโหลด โมดูลประเภทนั้นเรียกว่า Source<StoragePath> เนื่องจากมันส่งเสียงอ็อบเจ็กต์ประเภท StoragePath (typedefed to string ) สามารถประกอบด้วย SourceAdapter ที่สร้าง Loader ที่ให้บริการได้จากเส้นทางที่กำหนดที่แหล่งที่มาค้นพบ

ขั้นแรกให้ทราบเกี่ยวกับเรื่องทั่วไป

ไม่จำเป็นต้องใช้เส้นทางเป็นตัวจัดการข้อมูลที่ให้บริการได้ มันเพียงแสดงให้เห็นวิธีหนึ่งในการนำเข้าบริการเข้าสู่ระบบเท่านั้น แม้ว่าสภาพแวดล้อมของคุณไม่ได้ห่อหุ้มข้อมูลที่สามารถให้บริการได้ในพาธ เอกสารนี้จะทำให้คุณคุ้นเคยกับบทคัดย่อที่สำคัญ คุณมีตัวเลือกในการสร้างโมดูล Source<T> และ SourceAdapter<T1, T2> สำหรับประเภทที่เหมาะกับสภาพแวดล้อมของคุณ (เช่น ข้อความ RPC หรือข้อความ pub/sub บันทึกฐานข้อมูล) หรือเพียงแค่สร้าง Source<std::unique_ptr<Loader>> ที่ปล่อยตัวโหลดที่ให้บริการได้โดยตรง

แน่นอนว่าข้อมูลประเภทใดก็ตามที่แหล่งข้อมูลของคุณปล่อยออกมา (ไม่ว่าจะเป็นเส้นทาง POSIX, เส้นทาง Google Cloud Storage หรือการจัดการ RPC) จำเป็นต้องมีโมดูลประกอบที่สามารถโหลดบริการได้ตามนั้น โมดูลดังกล่าวเรียกว่า SourceAdapters การสร้างแบบกำหนดเองมีอธิบายไว้ในเอกสาร Custom Servable TensorFlow Serving มาพร้อมกับหนึ่งรายการสำหรับสร้างอินสแตนซ์เซสชัน TensorFlow ตามเส้นทางในระบบไฟล์ที่ TensorFlow รองรับ คุณสามารถเพิ่มการรองรับระบบไฟล์เพิ่มเติมให้กับ TensorFlow ได้โดยขยาย RandomAccessFile abstraction ( tensorflow/core/public/env.h )

เอกสารนี้เน้นที่การสร้างแหล่งที่มาที่ปล่อยเส้นทางในระบบไฟล์ที่รองรับ TensorFlow ปิดท้ายด้วยการอธิบายวิธีใช้แหล่งที่มาของคุณร่วมกับโมดูลที่มีอยู่แล้วเพื่อรองรับโมเดล TensorFlow

การสร้างแหล่งที่มาของคุณ

เรามีการใช้งานอ้างอิงของ Source<StoragePath> ที่เรียกว่า FileSystemStoragePathSource (ที่ sources/storage_path/file_system_storage_path_source* ) FileSystemStoragePathSource จะตรวจสอบพาธของระบบไฟล์โดยเฉพาะ เฝ้าดูไดเร็กทอรีย่อยที่เป็นตัวเลข และรายงานล่าสุดเป็นเวอร์ชันที่ต้องการโหลด เอกสารนี้จะอธิบายลักษณะเด่นของ FileSystemStoragePathSource คุณอาจพบว่าสะดวกที่จะทำสำเนา FileSystemStoragePathSource แล้วแก้ไขให้เหมาะกับความต้องการของคุณ

ขั้นแรก FileSystemStoragePathSource ใช้งาน Source<StoragePath> API ซึ่งเป็นความเชี่ยวชาญพิเศษของ Source<T> API ที่มี T เชื่อมโยงกับ StoragePath API ประกอบด้วยเมธอดเดียว SetAspiredVersionsCallback() ซึ่งให้การปิดที่แหล่งที่มาสามารถเรียกใช้เพื่อสื่อสารว่าต้องการให้โหลดเวอร์ชันที่ให้บริการชุดใดชุดหนึ่งโดยเฉพาะ

FileSystemStoragePathSource ใช้การเรียกกลับรุ่น aspired ในวิธีที่ง่ายมาก: มันจะตรวจสอบระบบไฟล์เป็นระยะ (โดยพื้นฐานแล้วทำ ls ) และหากพบหนึ่งเส้นทางหรือมากกว่านั้นที่ดูเหมือนเวอร์ชันที่ให้บริการได้ มันจะกำหนดว่าอันใดเป็นเวอร์ชันล่าสุดและเรียกใช้ การโทรกลับพร้อมรายการขนาดหนึ่งที่มีเฉพาะเวอร์ชันนั้น (ภายใต้การกำหนดค่าเริ่มต้น) ดังนั้น ณ เวลาใดก็ตาม FileSystemStoragePathSource จะร้องขอให้โหลดบริการได้มากที่สุดหนึ่งรายการ และการใช้งานจะใช้ประโยชน์จาก idempotence ของการโทรกลับเพื่อรักษาสถานะไร้สถานะ (ไม่มีอันตรายใด ๆ ในการเรียกใช้การโทรกลับซ้ำ ๆ ด้วยอาร์กิวเมนต์เดียวกัน)

FileSystemStoragePathSource มีโรงงานการเริ่มต้นแบบคงที่ (เมธอด Create() ) ซึ่งรับข้อความโปรโตคอลการกำหนดค่า ข้อความการกำหนดค่าประกอบด้วยรายละเอียด เช่น เส้นทางพื้นฐานในการตรวจสอบและช่วงเวลาการตรวจสอบ รวมถึงชื่อของสตรีมที่ให้บริการที่จะปล่อยออกมาด้วย (แนวทางทางเลือกอาจแยกชื่อสตรีมที่ให้บริการได้จากพาธพื้นฐาน เพื่อปล่อยสตรีมที่ให้บริการได้หลายรายการโดยอิงจากการสังเกตลำดับชั้นไดเรกทอรีที่ลึกกว่า ตัวแปรเหล่านั้นอยู่นอกเหนือขอบเขตของการดำเนินการอ้างอิง)

การใช้งานส่วนใหญ่ประกอบด้วยเธรดที่จะตรวจสอบระบบไฟล์เป็นระยะ พร้อมด้วยตรรกะบางอย่างสำหรับการระบุและเรียงลำดับเส้นทางย่อยที่เป็นตัวเลขที่ค้นพบ เธรดเปิดตัวภายใน SetAspiredVersionsCallback() (ไม่ใช่ใน Create() ) เพราะนั่นคือจุดที่แหล่งที่มาควร "เริ่มต้น" และรู้ว่าจะส่งคำขอเวอร์ชันที่ต้องการไปที่ใด

การใช้ Source ของคุณเพื่อโหลดเซสชัน TensorFlow

คุณอาจต้องการใช้โมดูลซอร์สใหม่ของคุณร่วมกับ SavedModelBundleSourceAdapter ( servables/tensorflow/saved_model_bundle_source_adapter* ) ซึ่งจะตีความแต่ละพาธที่ซอร์สของคุณส่งออกมาเป็นการส่งออก TensorFlow และแปลงแต่ละพาธเป็นตัวโหลดสำหรับ TensorFlow SavedModelBundle ที่ให้บริการได้ คุณน่าจะเสียบอะแดปเตอร์ SavedModelBundle เข้ากับ AspiredVersionsManager ซึ่งจะดูแลการโหลดและให้บริการจริง ภาพประกอบที่ดีของการเชื่อมโยงโมดูลทั้งสามประเภทนี้เข้าด้วยกันเพื่อรับไลบรารีเซิร์ฟเวอร์ที่ใช้งานได้มีอยู่ใน servables/tensorflow/simple_servers.cc ต่อไปนี้เป็นการแนะนำโฟลว์โค้ดหลัก (พร้อมการจัดการข้อผิดพลาดที่ไม่ดี โค้ดจริงควรระมัดระวังมากขึ้น):

ขั้นแรก สร้างผู้จัดการ:

std::unique_ptr<AspiredVersionsManager> manager = ...;

จากนั้น สร้างอะแด็ปเตอร์ต้นทาง SavedModelBundle และเสียบเข้ากับตัวจัดการ:

std::unique_ptr<SavedModelBundleSourceAdapter> bundle_adapter;
SavedModelBundleSourceAdapterConfig config;
// ... populate 'config' with TensorFlow options.
TF_CHECK_OK(SavedModelBundleSourceAdapter::Create(config, &bundle_adapter));
ConnectSourceToTarget(bundle_adapter.get(), manager.get());

สุดท้าย สร้างแหล่งที่มาของเส้นทางของคุณและเสียบเข้ากับอะแดปเตอร์ SavedModelBundle :

auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());

ฟังก์ชัน ConnectSourceToTarget() (กำหนดใน core/target.h ) เพียงเรียกใช้ SetAspiredVersionsCallback() เพื่อเชื่อมต่อ Source<T> กับ Target<T> ( Target คือโมดูลที่รับคำขอเวอร์ชันที่ต้องการ เช่น อะแดปเตอร์หรือผู้จัดการ ).