ارائه یک مدل TensorFlow

این آموزش به شما نشان می دهد که چگونه از اجزای 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 تصویر آزمایشی اول دریافت می کنیم. این تایید می کند که سرور مدل آموزش دیده را با موفقیت بارگیری و اجرا می کند!