سرویس 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 مراجعه کنید.

اجرای یک تصویر خدمت

تصاویر ارائه شده (هم 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 را اجرا کنید ، پورت های کانتینر را در پورت های میزبان خود منتشر کنید و مسیر میزبان خود را به 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 را اجرا کنید و به این مدل اشاره کنید و پورت 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 را راه‌اندازی می‌کند، پورت 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] }

اطلاعات بیشتر در مورد استفاده از RESTful API را می توانید در اینجا بیابید.

سرویس دهی با Docker با استفاده از GPU شما

nvidia-docker را نصب کنید

قبل از خدمت با یک GPU، علاوه بر نصب Docker ، به موارد زیر نیاز دارید:

اجرای تصویر ارائه دهنده GPU

اجرای یک تصویر ارائه دهنده GPU با اجرای تصویر CPU یکسان است. برای جزئیات بیشتر، اجرای تصویر ارائه را ببینید.

نمونه سرویس GPU

بیایید یک مثال کامل را اجرا کنیم که در آن یک مدل را با عملیات های GPU-bound بارگذاری می کنیم و آن را با استفاده از REST API فراخوانی می کنیم.

ابتدا nvidia-docker را نصب کنید. در مرحله بعد، می‌توانید آخرین تصویر داکر GPU سرویس TensorFlow را با اجرای:

docker pull tensorflow/serving:latest-gpu

این یک تصویر حداقل Docker را با ModelServer که برای اجرا بر روی GPU های نصب شده ساخته شده است، پایین می آورد.

در مرحله بعد، از یک مدل اسباب بازی به نام Half Plus Two استفاده خواهیم کرد که 0.5 * x + 2 را برای مقادیر x که برای پیش بینی ارائه می کنیم، تولید می کند. این مدل دارای عملیات متصل به دستگاه GPU است و روی CPU اجرا نخواهد شد.

برای دریافت این مدل، ابتدا مخزن TensorFlow Serving را شبیه سازی کنید.

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 را راه‌اندازی می‌کند، پورت 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 منجر به خطایی می شود که به نظر می رسد:

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

اطلاعات بیشتر در مورد استفاده از RESTful API را می توانید در اینجا بیابید.

در حال توسعه با Docker

برای دستورالعمل‌های مربوط به نحوه ساخت و توسعه سرویس Tensorflow، لطفاً به راهنمای توسعه با داکر مراجعه کنید.