เอกสารนี้จะอธิบายวิธีขยาย 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
คือโมดูลที่รับคำขอเวอร์ชันที่ต้องการ เช่น อะแดปเตอร์หรือผู้จัดการ ).