מסמך זה מסביר כיצד להרחיב את TensorFlow Serving לניטור מערכות אחסון שונות כדי לגלות (גרסאות של) דגמים או נתונים חדשים לשרת. בפרט, הוא מכסה כיצד ליצור ולהשתמש במודול המנטר נתיב מערכת אחסון להופעת נתיבים חדשים, כאשר כל נתיב משנה מייצג גרסה חדשה שניתן להגשה לטעינה. סוג זה של מודול נקרא Source<StoragePath>
, מאחר שהוא פולט עצמים מסוג StoragePath
(typedefed כדי string
). זה יכול להיות מורכב עם SourceAdapter
שיוצרת servable Loader
מנתיב לאור העובדה מגלה מקור.
ראשית, הערה לגבי כלליות
אין צורך להשתמש בנתיבים כנקודות אחיזה לנתונים הניתנים להצגה; זה רק ממחיש דרך אחת להכניס חומרי הגשה למערכת. גם אם הסביבה שלך אינה מקפלת נתונים שניתנים להגשה בנתיבים, מסמך זה יכיר את ההפשטות העיקריות. יש לך את האפשרות ליצור Source<T>
ו SourceAdapter<T1, T2>
מודולים עבור סוגים המתאימים לסביבה שלך (למשל RPC או בפאב / הודעות המשנה, רשומות מסד נתונים), או פשוט ליצור מונוליטי Source<std::unique_ptr<Loader>>
פולט מעמיס servable ישירות.
כמובן, כל סוג של נתונים שהמקור שלך פולט (בין אם זה נתיבי POSIX, נתיבים של Google Cloud Storage או מטפל ב-RPC), צריכים להיות מודולים נלווים שמסוגלים לטעון קבצי שרת על סמך זה. מודולים אלו נקראים SourceAdapters
. יצירה אחד מנהג מתואר servable Custom המסמך. TensorFlow Serving מגיע עם אחד להפעלת הפעלות של TensorFlow המבוסס על נתיבים במערכות קבצים בהן TensorFlow תומכת. אפשר להוסיף תמיכה במערכות קבצים נוספים TensorFlow ידי הרחבת RandomAccessFile
הפשטה ( 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()
, אשר מספקת סגירת המקור יכול להפעיל כדי לתקשר שהיא רוצה קבוצה מסוימת של גרסאות servable להיות טעון.
FileSystemStoragePathSource
משתמשת שאפו-גרסאות התקשרות בצורה פשוטה מאוד: זה מעת לעת בודק את מערכת הקבצים (עושה ls
, בעצם), ואם זה מוצא אחד או יותר נתיבים שנראים כמו גרסאות servable היא קובעת אילו מהם הוא הגירסה האחרונה, ומפעיל ההתקשרות חזרה עם רשימה בגודל 1 המכילה רק את הגרסה הזו (תחת תצורת ברירת המחדל). אז, בכול רגע נתון FileSystemStoragePathSource
בקשות לכל היותר אחד servable להיות טעון, ויישומה מנצל את אידמפוטנט של ההתקשרות לשמור עצמו נתינות (אין ניזק פניית ההתקשרות שוב ושוב עם אותן הטענות).
FileSystemStoragePathSource
יש מפעל אתחול סטטי (את Create()
השיטה), אשר לוקח הודעת פרוטוקול תצורה. הודעת התצורה כוללת פרטים כגון נתיב הבסיס לניטור ומרווח הניטור. זה כולל גם את שם הזרם הניתן להגשה שיש לפלוט. (גישות אלטרנטיביות עשויות לחלץ את שם הזרם הניתן להגשה מנתיב הבסיס, כדי לפלוט מספר זרמים שניתן להגשה בהתבסס על התבוננות בהיררכיית ספריות עמוקה יותר; גרסאות אלו הן מעבר להיקף יישום ההפניה).
עיקר המימוש מורכב משרשור שבוחן מעת לעת את מערכת הקבצים, יחד עם היגיון מסוים לזיהוי ומיון כל תת-נתיבים מספריים שהוא מגלה. החוט השיקה בתוך SetAspiredVersionsCallback()
(לא Create()
) כי הוא הנקודה שבה המקור צריך "להתחיל" ויודע לאן לשלוח בקשות שאפו-גרסה.
שימוש במקור שלך לטעינת הפעלות של TensorFlow
סביר להניח שאתה רוצה להשתמש במודול מקור החדש בשיתוף עם SavedModelBundleSourceAdapter
( servables/tensorflow/saved_model_bundle_source_adapter*
), אשר יפרשו כל נתיב פולט המקור שלך בתור יצוא TensorFlow, ולהמיר כל נתיב כדי מטעין עבור TensorFlow SavedModelBundle
servable. תוכלו לחבר את הסיכוי SavedModelBundle
מתאם לתוך AspiredVersionsManager
, אשר דואג בעצם טוען ומשרת את servables. המחשה טובה של שרשור סוגי שלושה המודולים ביחד כדי לקבל ספריית שרת עובד נמצאת 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
הוא מודול זה תופס שאפה-גרסת בקשות, כלומר מתאם או מנהל ).