یکی از ساده ترین راه ها برای شروع استفاده از TensorFlow Serving با Docker است.
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker 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 APIcurl -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 وجود دارد، اما ما چند لینک سریع در اینجا ارائه میدهیم:
- داکر برای macOS
- داکر برای ویندوز برای ویندوز 10 پرو یا جدیدتر
- جعبه ابزار Docker برای نسخه های بسیار قدیمی macOS یا نسخه های ویندوز قبل از Windows 10 Pro
خدمت با 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 ، به موارد زیر نیاز دارید:
- درایورهای به روز NVIDIA برای سیستم شما
-
nvidia-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، لطفاً به راهنمای توسعه با داکر مراجعه کنید.