TensorFlow הגשה עם Docker

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

# 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] }

לנקודות קצה נוספות של הגשה, עיין ב- Client REST API .

התקן את Docker

הוראות התקנה כלליות נמצאות באתר Docker , אך אנו נותנים כאן כמה קישורים מהירים:

מגישים עם Docker

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

לאחר שתתקין את 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 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 ניתן למצוא כאן .

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

התקן את nvidia-docker

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

הפעלת תמונת הגשה של 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 של RESTful ניתן למצוא כאן .

פיתוח עם Docker

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