خدمة TensorFlow مع Docker

واحدة من أسهل الطرق للبدء باستخدام 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 .

تثبيت Docker

إرشادات التثبيت العام هي في موقع عامل الميناء ، ولكن نعطي بعض روابط سريعة هنا:

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

سحب صورة التقديم

بمجرد تثبيت Docker ، يمكنك سحب أحدث صورة لـ TensorFlow Serving docker عن طريق تشغيل:

docker pull tensorflow/serving

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

رؤية عامل الميناء محور tensorflow / خدمة الريبو لإصدارات أخرى من الصور التي يمكن سحب.

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

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

  • المنفذ 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 run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

في هذه الحالة، فإننا قد بدأت حاوية عامل الميناء، نشرت ميناء 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

هذا وسوف أترككم مع صورة عامل الميناء يسمى <my container> التي يمكنك نشر وسيتم تحميل النموذج الخاص بك لخدمة عند بدء التشغيل.

خدمة المثال

دعنا نمر بمثال كامل حيث نقوم بتحميل SavedModel وندعوه باستخدام REST API. أولاً اسحب صورة التقديم:

docker pull tensorflow/serving

سيؤدي هذا إلى سحب أحدث صورة لخدمة TensorFlow مع تثبيت ModelServer.

بعد ذلك، سوف نستخدم نموذج لعبة تسمى Half Plus Two ، والذي يولد 0.5 * x + 2 لقيم x التي نقدمها للتنبؤ.

للحصول على هذا النموذج ، قم أولاً باستنساخ مستودع خدمة TensorFlow.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

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

للاستعلام عن النموذج باستخدام التنبؤ 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 مماثل لتشغيل صورة وحدة المعالجة المركزية. لمزيد من المعلومات، راجع تشغيل صورة خدمة .

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

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

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

docker pull tensorflow/serving:latest-gpu

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

بعد ذلك، سوف نستخدم نموذج لعبة تسمى Half Plus Two ، والذي يولد 0.5 * x + 2 لقيم x التي نقدمها للتنبؤ. سيكون لهذا النموذج عمليات مرتبطة بجهاز GPU ، ولن يتم تشغيله على وحدة المعالجة المركزية.

للحصول على هذا النموذج ، قم أولاً باستنساخ مستودع خدمة TensorFlow.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

بعد ذلك ، قم بتشغيل حاوية خدمة TensorFlow مع توجيهها إلى هذا النموذج وفتح منفذ 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 ...

للاستعلام عن النموذج باستخدام التنبؤ 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

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