TensorFlow מגיש עם Docker

אחת הדרכים הקלות ביותר להתחיל להשתמש Serving TensorFlow הוא עם דוקר .

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker 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 API curl -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] }

עבור נקודות קצה המשרתים נוספים, ראה API REST Client .

התקן את Docker

הוראות התקנה כללית באתר הדוקר , אבל אנחנו נותנים כמה קישורים מהירים כאן:

משרת עם Docker

משיכת תמונת הגשה

לאחר שתתקין את Docker, תוכל למשוך את תמונת הדוקר העדכנית ביותר של TensorFlow Serving על ידי הפעלת:

docker pull tensorflow/serving

זה יגרום למטה תמונת Docker מינימלית עם TensorFlow Serving מותקן.

עיין דוקר Hub tensorflow / 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 להגשה
  • שם לדגם שלך שהלקוח שלך יתייחס אליו

מה תעשה הוא להריץ את הדוקר מיכל, לפרסם את היציאות של המכל ליציאות של המארח שלך, ואת הרכבת דרכו של המארח שלך 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

במקרה זה, התחלנו מיכל דוקר, שפורסם הנמל API REST 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 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

זה ישאיר אותך עם תמונה דוקרת שנקראת <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 &

פעולה זו תפעיל את הקונטיינר של Docker ותפעיל את 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 הנינוחה ניתן למצוא כאן .

משרת עם Docker באמצעות ה-GPU שלך

התקן את nvidia-docker

לפני הגשה עם GPU, בנוסף התקנה דוקרת , תצטרך:

הפעלת תמונת הגשה של GPU

הפעלת תמונת הגשה של GPU זהה להפעלת תמונת CPU. לפרטים נוספים, ראו הפעלת תמונת הגשה .

דוגמה להגשת GPU

בואו נעבור על דוגמה מלאה שבה אנו טוענים מודל עם פעולות הקשורות ל-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 הנינוחה ניתן למצוא כאן .

פיתוח עם Docker

לקבלת הנחיות כיצד לבנות ולפתח Serving Tensorflow, עיין פיתוח עם מדריך דוקר .