این آموزش به شما نشان می دهد که چگونه از اجزای TensorFlow Serving برای صادرات یک مدل TensorFlow آموزش دیده و استفاده از استاندارد tensorflow_model_server برای ارائه آن استفاده کنید. اگر قبلاً با TensorFlow Serving آشنا هستید و میخواهید در مورد نحوه عملکرد داخلی سرور بیشتر بدانید، آموزش پیشرفته TensorFlow Serving را ببینید.
این آموزش از یک مدل رگرسیون سافت مکس ساده استفاده می کند که ارقام دست نویس را طبقه بندی می کند. بسیار شبیه به آنچه در آموزش TensorFlow در مورد طبقه بندی تصاویر با استفاده از مجموعه داده Fashion MNIST معرفی شده است.
کد این آموزش شامل دو بخش است:
یک فایل پایتون، mnist_saved_model.py که مدل را آموزش و صادر می کند.
یک باینری ModelServer که می تواند با استفاده از Apt نصب شود یا از یک فایل C++ ( main.cc ) کامپایل شود. TensorFlow Serving ModelServer مدل های جدید صادر شده را کشف می کند و یک سرویس gRPC را برای ارائه آنها اجرا می کند.
قبل از شروع، ابتدا Docker را نصب کنید .
آموزش و صادرات مدل TensorFlow
برای مرحله آموزش، نمودار TensorFlow در sess
Sess TensorFlow با تانسور ورودی (تصویر) به عنوان x
و تانسور خروجی (نمره Softmax) به عنوان y
راهاندازی میشود.
سپس از ماژول SavedModelBuilder TensorFlow برای صادرات مدل استفاده می کنیم. SavedModelBuilder
یک "عکس فوری" از مدل آموزش دیده را در فضای ذخیره سازی قابل اعتماد ذخیره می کند تا بعداً برای استنباط بارگذاری شود.
برای جزئیات بیشتر در مورد قالب SavedModel، لطفاً به مستندات در SavedModel README.md مراجعه کنید.
از mnist_saved_model.py ، کد زیر یک قطعه کد کوتاه برای نشان دادن روند کلی ذخیره یک مدل در دیسک است.
export_path_base = sys.argv[-1]
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images':
prediction_signature,
tf.compat.v1.saved_model.signature_constants
.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
classification_signature,
},
main_op=tf.compat.v1.tables_initializer(),
strip_default_attrs=True)
builder.save()
SavedModelBuilder.__init__
آرگومان زیر را می گیرد:
-
export_path
مسیر دایرکتوری صادرات است.
SavedModelBuilder
اگر دایرکتوری وجود نداشته باشد، آن را ایجاد می کند. در مثال، ما آرگومان خط فرمان و FLAGS.model_version
را برای به دست آوردن دایرکتوری صادرات به هم متصل می کنیم. FLAGS.model_version
نسخه مدل را مشخص می کند. هنگام صادرات یک نسخه جدیدتر از همان مدل، باید یک مقدار صحیح بزرگتر را مشخص کنید. هر نسخه در مسیر داده شده به یک زیر شاخه متفاوت صادر می شود.
میتوانید متا گراف و متغیرها را با استفاده از SavedModelBuilder.add_meta_graph_and_variables()
با آرگومانهای زیر به سازنده اضافه کنید:
sess
جلسه TensorFlow است که مدل آموزش دیده ای را که صادر می کنید نگه می دارد.tags
مجموعه ای از برچسب ها هستند که با آن متا گراف ذخیره می شود. در این مورد، از آنجایی که ما قصد داریم از نمودار در ارائه استفاده کنیم، از تگserve
از ثابت های تگ SavedModel از پیش تعریف شده استفاده می کنیم. برای جزئیات بیشتر، tag_constants.py و اسناد مربوط به API TensorFlow را ببینید.signature_def_map
نقشه کلید ارائه شده توسط کاربر را برای امضای یک tensorflow::SignatureDef برای افزودن به متا گراف مشخص می کند. امضا مشخص می کند که چه نوع مدلی صادر می شود و تانسورهای ورودی/خروجی که هنگام اجرای استنتاج به آن متصل شوند.کلید امضای ویژه
serving_default
امضای پیشفرض سرویس را مشخص میکند. کلید دف امضای سرویس پیشفرض، همراه با سایر ثابتهای مربوط به امضاها، به عنوان بخشی از ثابتهای امضای SavedModel تعریف میشوند. برای جزئیات بیشتر، signature_constants.py و اسناد مربوط به API TensorFlow را ببینید.علاوه بر این، برای کمک به ساخت آسان defs امضا، SavedModel API ابزارهای def امضا را ارائه میکند. به طور خاص، در فایل mnist_saved_model.py اصلی، ما از
signature_def_utils.build_signature_def()
برای ساختpredict_signature
وclassification_signature
استفاده میکنیم.به عنوان مثالی برای نحوه تعریف
predict_signature
، util آرگومان های زیر را می گیرد:inputs={'images': tensor_info_x}
اطلاعات تانسور ورودی را مشخص میکند.outputs={'scores': tensor_info_y}
اطلاعات تانسور امتیازها را مشخص میکند.method_name
روشی است که برای استنتاج استفاده می شود. برای درخواستهای Prediction، باید رویtensorflow/serving/predict
تنظیم شود. برای نام روشهای دیگر، signature_constants.py و اسناد مربوط به TensorFlow API را ببینید.
توجه داشته باشید که tensor_info_x
و tensor_info_y
ساختار tensorflow::TensorInfo
بافر پروتکل تعریف شده در اینجا دارند. برای ساخت آسان اطلاعات تانسور، API TensorFlow SavedModel همچنین utils.py را همراه با اسناد مربوط به API TensorFlow ارائه میکند.
همچنین توجه داشته باشید که images
و scores
نام مستعار تانسور هستند. آنها می توانند هر رشته منحصر به فردی باشند که می خواهید، و به نام های منطقی تانسور x
و y
تبدیل می شوند که برای اتصال تانسور هنگام ارسال درخواست های پیش بینی بعداً به آنها مراجعه می کنید.
به عنوان مثال، اگر x
به تانسور با نام "long_tensor_name_foo" و y
به تانسور با نام "generated_tensor_name_bar" اشاره کند، builder
نام منطقی تانسور را در نگاشت نام واقعی ('images' -> 'long_tensor_name_foo') و ('scores" ذخیره می کند. ' -> 'generated_tensor_name_bar'). این به کاربر اجازه می دهد تا هنگام اجرای استنتاج به این تانسورها با نام منطقی آنها اشاره کند.
بیایید آن را اجرا کنیم!
ابتدا، اگر هنوز این کار را نکرده اید، این مخزن را در ماشین محلی خود شبیه سازی کنید:
git clone https://github.com/tensorflow/serving.git
cd serving
اگر دایرکتوری صادرات از قبل وجود دارد پاک کنید:
rm -rf /tmp/mnist
حالا بیایید مدل را آموزش دهیم:
tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
/tmp/mnist
این باید در خروجی به شکل زیر باشد:
Training model...
...
Done training!
Exporting trained model to models/mnist
Done exporting!
حالا بیایید نگاهی به فهرست صادرات بیندازیم.
$ ls /tmp/mnist
1
همانطور که در بالا ذکر شد، یک زیر شاخه برای صادرات هر نسخه از مدل ایجاد می شود. FLAGS.model_version
دارای مقدار پیش فرض 1 است، بنابراین زیر شاخه 1
مربوطه ایجاد می شود.
$ ls /tmp/mnist/1
saved_model.pb variables
هر زیر شاخه نسخه شامل فایل های زیر است:
saved_model.pb
سریال tensorflow::SavedModel است. این شامل یک یا چند تعریف نمودار از مدل، و همچنین ابرداده مدل مانند امضا است.variables
فایل هایی هستند که متغیرهای سریال گراف ها را در خود نگه می دارند.
با آن، مدل TensorFlow شما صادر شده و آماده بارگیری می شود!
مدل صادر شده را با استاندارد TensorFlow ModelServer بارگیری کنید
برای بارگذاری آسان مدل برای ارائه، از یک تصویر سرویس Docker استفاده کنید:
docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &
سرور را تست کنید
ما می توانیم از ابزار mnist_client ارائه شده برای آزمایش سرور استفاده کنیم. مشتری داده های تست MNIST را دانلود می کند، آنها را به عنوان درخواست به سرور ارسال می کند و میزان خطای استنتاج را محاسبه می کند.
tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
--num_tests=1000 --server=127.0.0.1:8500
این باید چیزی شبیه به خروجی داشته باشد
...
Inference error rate: 11.13%
ما انتظار داریم حدود 90٪ دقت برای مدل آموزش دیده Softmax و ما 11٪ نرخ خطای استنتاج برای 1000 تصویر آزمایشی اول دریافت می کنیم. این تایید می کند که سرور مدل آموزش دیده را با موفقیت بارگیری و اجرا می کند!