خدمة TensorFlow مع عامل ميناء

إحدى أسهل الطرق للبدء في استخدام 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، يمكنك سحب أحدث صورة لوحدة الإرساء TensorFlow Serving عن طريق تشغيل:

docker pull tensorflow/serving

سيؤدي هذا إلى سحب صورة Docker صغيرة مع تثبيت TensorFlow Serving.

راجع Docker Hub Tensorflow/serving repo للحصول على إصدارات أخرى من الصور التي يمكنك سحبها.

تشغيل صورة التقديم

تتمتع صور العرض (كل من وحدة المعالجة المركزية ووحدة معالجة الرسومات) بالخصائص التالية:

  • المنفذ 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، ستحتاج إلى:

  • منفذ مفتوح على مضيفك للخدمة عليه
  • نموذج محفوظ للخدمة
  • اسم لنموذجك الذي سيشير إليه عميلك

ما ستفعله هو تشغيل حاوية Docker ، ونشر منافذ الحاوية على منافذ مضيفك، وتثبيت مسار مضيفك إلى 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 مع تثبيت 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، وتعيين النموذج المطلوب من مضيفنا إلى المكان المتوقع وجود النماذج في الحاوية. نقوم أيضًا بتمرير اسم النموذج كمتغير بيئة، وهو ما سيكون مهمًا عندما نقوم بالاستعلام عن النموذج.

للاستعلام عن النموذج باستخدام واجهة برمجة التطبيقات المتوقعة، يمكنك تشغيله

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

يمكن العثور على مزيد من المعلومات حول استخدام RESTful API هنا .

التقديم مع Docker باستخدام وحدة معالجة الرسومات (GPU) الخاصة بك

قم بتثبيت nvidia-docker

قبل الخدمة باستخدام وحدة معالجة الرسومات، بالإضافة إلى تثبيت Docker ، ستحتاج إلى:

تشغيل صورة خدمة GPU

إن تشغيل صورة عرض وحدة معالجة الرسومات (GPU) مماثل لتشغيل صورة وحدة المعالجة المركزية (CPU). لمزيد من التفاصيل، راجع تشغيل صورة العرض .

مثال على خدمة GPU

دعونا نستعرض مثالًا كاملاً حيث نقوم بتحميل نموذج بعمليات مرتبطة بوحدة معالجة الرسومات ونسميه باستخدام REST API.

قم أولاً بتثبيت nvidia-docker . بعد ذلك، يمكنك سحب أحدث صورة لرسو السفن TensorFlow Serving GPU عن طريق تشغيل:

docker pull tensorflow/serving:latest-gpu

سيؤدي هذا إلى سحب صورة Docker صغيرة مع ModelServer المصممة للتشغيل على وحدات معالجة الرسومات المثبتة.

بعد ذلك، سوف نستخدم نموذج لعبة يسمى 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 &

سيؤدي هذا إلى تشغيل حاوية الإرساء، وإطلاق 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 ...

للاستعلام عن النموذج باستخدام واجهة برمجة التطبيقات المتوقعة، يمكنك تشغيله

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

يمكن العثور على مزيد من المعلومات حول استخدام RESTful API هنا .

التطوير باستخدام Docker

للحصول على تعليمات حول كيفية إنشاء وتطوير خدمة Tensorflow، يرجى الرجوع إلى دليل التطوير باستخدام Docker .