אחת הדרכים הקלות ביותר להתחיל להשתמש ב- TensorFlow Serving היא עם Docker .
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving &
# Query the model using the predict APIcurl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
לנקודות קצה נוספות של הגשה, עיין ב- Client REST API .
הוראות התקנה כלליות נמצאות באתר Docker , אך אנו נותנים כאן כמה קישורים מהירים:
- Docker עבור macOS
- Docker עבור Windows עבור Windows 10 Pro ואילך
- Docker Toolbox עבור גרסאות ישנות הרבה יותר של macOS, או גרסאות של Windows לפני Windows 10 Pro
לאחר שתתקין את Docker, תוכל למשוך את תמונת הדוקר העדכנית ביותר של TensorFlow Serving על ידי הפעלת:
docker pull tensorflow/serving
זה יגרור תמונת Docker מינימלית עם TensorFlow Serving מותקן.
עיין ב-Docker Hub tensorflow/serving repo עבור גרסאות אחרות של תמונות שאתה יכול למשוך.
לתמונות ההגשה (הן CPU והן GPU) יש את המאפיינים הבאים:
- יציאה 8500 חשופה עבור gRPC
- יציאה 8501 נחשפה עבור REST API
- משתנה סביבה אופציונלי
MODEL_NAME
(ברירת המחדלmodel
) - משתנה סביבה אופציונלי
MODEL_BASE_PATH
(ברירת המחדל היא/models
)
כאשר תמונת ההגשה מריץ את ModelServer, היא מפעילה אותה באופן הבא:
tensorflow_model_server --port=8500 --rest_api_port=8501 \
--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}
כדי לשרת עם Docker, תצטרך:
- יציאה פתוחה על המארח שלך לשרת בו
- SavedModel להגשה
- שם לדגם שלך שהלקוח שלך יפנה אליו
מה שתעשה זה להפעיל את ה-Docker Container, לפרסם את יציאות ה-container ליציאות המארח שלך, ולהעלות את הנתיב של המארח שלך ל-SavedModel למקום שבו המכולה מצפה לדגמים.
בואו נסתכל על דוגמה:
docker run -p 8501:8501 \
--mount type=bind,source=/path/to/my_model/,target=/models/my_model \
-e MODEL_NAME=my_model -t tensorflow/serving
במקרה זה, התחלנו קונטיינר Docker, פרסמנו את יציאת REST API 8501 ליציאה 8501 של המארח שלנו, ולקחנו מודל שקראנו בשם my_model
וקשרנו אותו לנתיב בסיס המודל המוגדר כברירת מחדל ( ${MODEL_BASE_PATH}/${MODEL_NAME}
= /models/my_model
). לבסוף, מילאנו את משתנה הסביבה MODEL_NAME
עם my_model
, והשארנו MODEL_BASE_PATH
לערך ברירת המחדל שלו.
זה יפעל במיכל:
tensorflow_model_server --port=8500 --rest_api_port=8501 \
--model_name=my_model --model_base_path=/models/my_model
אם נרצה לפרסם את יציאת gRPC, היינו משתמשים -p 8500:8500
. אתה יכול לפתוח גם יציאות gRPC וגם REST API בו-זמנית, או לבחור לפתוח רק אחת או אחרת.
tensorflow_model_server
תומך בהרבה ארגומנטים נוספים שאתה יכול להעביר לקונטיינרים המשרתים של docker. לדוגמה, אם נרצה להעביר קובץ תצורה של דגם במקום לציין את שם הדגם, נוכל לבצע את הפעולות הבאות:
docker run -p 8500:8500 -p 8501:8501 \
--mount type=bind,source=/path/to/my_model/,target=/models/my_model \
--mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
-t tensorflow/serving --model_config_file=/models/models.config
גישה זו פועלת עבור כל אחד מהארגומנטים האחרים של שורת הפקודה שתומך בהם tensorflow_model_server
.
אם אתה רוצה תמונת הגשה שהדגם שלך מובנה במיכל, אתה יכול ליצור תמונה משלך.
תחילה הפעל תמונת הגשה בתור דמון:
docker run -d --name serving_base tensorflow/serving
לאחר מכן, העתק את SavedModel שלך לתיקיית הדגם של המכולה:
docker cp models/<my model> serving_base:/models/<my model>
לבסוף, הגדר את המכולה שמשרתת את הדגם שלך על ידי שינוי MODEL_NAME
כך שיתאים לשם הדגם שלך `
docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>
עכשיו אתה יכול להפסיק serving_base
docker kill serving_base
זה ישאיר אותך עם תמונת Docker בשם <my container>
שתוכל לפרוס ותטען את המודל שלך להגשה בעת ההפעלה.
בואו נעבור על דוגמה מלאה שבה אנו טוענים SavedModel וקוראים לו באמצעות REST API. תחילה משוך את תמונת ההגשה:
docker pull tensorflow/serving
זה ימשוך את תמונת TensorFlow Serving העדכנית ביותר עם ModelServer מותקן.
לאחר מכן, נשתמש במודל צעצוע בשם Half Plus Two
, אשר יוצר 0.5 * x + 2
עבור ערכי x
שאנו מספקים לחיזוי.
כדי לקבל את המודל הזה, תחילה שיבוט את המאגר של TensorFlow Serving.
mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving
לאחר מכן, הפעל את מיכל TensorFlow Serving תוך הפניית אותו לדגם זה ופתח את יציאת REST API (8501):
docker run -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
-e MODEL_NAME=half_plus_two -t tensorflow/serving &
פעולה זו תפעיל את קונטיינר הדוקר ותפעיל את TensorFlow Serving Model Server, יקשר את יציאת REST API 8501, ותמפה את המודל הרצוי שלנו מהמארח שלנו למקום שבו הדגמים צפויים במיכל. אנחנו גם מעבירים את שם המודל כמשתנה סביבה, שיהיה חשוב כשנשאל את המודל.
כדי לשאול את המודל באמצעות ה-Predict API, אתה יכול להפעיל
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict
זה אמור להחזיר קבוצה של ערכים:
{ "predictions": [2.5, 3.0, 4.5] }
מידע נוסף על השימוש בממשק API של RESTful ניתן למצוא כאן .
לפני ההגשה עם GPU, בנוסף להתקנת Docker , תצטרך:
- מנהלי התקנים מעודכנים של NVIDIA עבור המערכת שלך
-
nvidia-docker
: אתה יכול לעקוב אחר הוראות ההתקנה כאן
הפעלת תמונת הגשה של GPU זהה להפעלת תמונת CPU. לפרטים נוספים, ראה הפעלת תמונת הגשה .
בואו נעבור על דוגמה מלאה שבה אנו טוענים מודל עם פעולות הקשורות ל-GPU וקוראים לו באמצעות REST API.
ראשית התקן nvidia-docker
. לאחר מכן תוכל למשוך את תמונת העגינה האחרונה של TensorFlow Serving GPU על ידי הפעלת:
docker pull tensorflow/serving:latest-gpu
זה יביא למטה תמונת Docker מינימלית עם ModelServer שנבנה להפעלה על GPUs מותקנים.
לאחר מכן, נשתמש במודל צעצוע בשם Half Plus Two
, אשר יוצר 0.5 * x + 2
עבור ערכי x
שאנו מספקים לחיזוי. לדגם הזה יהיו פעולות הקשורות למכשיר ה-GPU, ולא יפעל על המעבד.
כדי לקבל את המודל הזה, תחילה שיבוט את המאגר של TensorFlow Serving.
mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving
לאחר מכן, הפעל את מיכל TensorFlow Serving תוך הפניית אותו לדגם זה ופתח את יציאת REST API (8501):
docker run --gpus all -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
-e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &
זה יריץ את קונטיינר Docker, יפעיל את TensorFlow Serving Model Server, יקשר את יציאת REST API 8501, ותמפה את המודל הרצוי שלנו מהמארח שלנו למקום שבו צפויים מודלים במיכל. אנחנו גם מעבירים את שם המודל כמשתנה סביבה, וזה יהיה חשוב כשנשאל את המודל.
טיפ: לפני שאילתת המודל, הקפד לחכות עד שתראה הודעה כמו הבאה, המציינת שהשרת מוכן לקבל בקשות:
2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...
כדי לשאול את המודל באמצעות ה-Predict API, אתה יכול להפעיל
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict
זה אמור להחזיר קבוצה של ערכים:
{ "predictions": [2.5, 3.0, 4.5] }
טיפ: ניסיון להפעיל את דגם ה-GPU על מכונה ללא GPU או ללא מבנה GPU עובד של TensorFlow Model Server יגרום לשגיאה שנראית כך:
Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0
מידע נוסף על השימוש בממשק API של RESTful ניתן למצוא כאן .
להוראות כיצד לבנות ולפתח את Tensorflow Serving, עיין במדריך לפתח עם Docker .