ارائه یک مدل TensorFlow

این آموزش به شما نشان می دهد که چگونه از اجزای TensorFlow Serving برای صادرات یک مدل TensorFlow آموزش دیده و استفاده از استاندارد tensorflow_model_server برای ارائه آن استفاده کنید. اگر شما در حال حاضر با TensorFlow خدمت آشنا، و شما می خواهید به دانستن بیشتر در مورد چگونه داخلی سرور کار می کنند، را ببینید TensorFlow خدمت آموزش پیشرفته .

این آموزش از یک مدل رگرسیون سافت مکس ساده استفاده می کند که ارقام دست نویس را طبقه بندی می کند. این بسیار شبیه به یک معرفی در است آموزش TensorFlow در طبقه بندی تصویر با استفاده از مجموعه داده مد MNIST .

کد این آموزش شامل دو بخش است:

  • یک فایل پایتون، mnist_saved_model.py ، که قطار و صادرات مدل.

  • دودویی یک ModelServer که می تواند یا با استفاده از apt نصب شده است، و یا وارد شده از فایل یک C ++ ( main.cc ). TensorFlow خدمت کشف ModelServer مدل های جدید صادر و اجرا می شود یک gRPC خدمات برای خدمت به آنها.

قبل از شروع، اول کارگر بارانداز نصب .

آموزش و صادرات مدل TensorFlow

برای مرحله آموزش، نمودار TensorFlow است در TensorFlow جلسه راه اندازی sess با تانسور ورودی (تصویر) را به عنوان، x و تانسور خروجی (نمره Softmax) به عنوان y .

سپس با استفاده TensorFlow است ماژول SavedModelBuilder به صادرات مدل. 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 و TensorFlow مرتبط مستندات API .

  • signature_def_map مشخص نقشه کلید به کاربر عرضه شده برای یک امضا به یک tensorflow :: SignatureDef برای اضافه کردن به نمودار متا. امضا مشخص می کند که چه نوع مدلی صادر می شود و تانسورهای ورودی/خروجی که هنگام اجرای استنتاج باید به آن متصل شوند.

    کلید امضای ویژه serving_default مشخص به طور پیش فرض در خدمت امضا. کلید دف امضای سرویس پیش‌فرض، همراه با سایر ثابت‌های مربوط به امضاها، به عنوان بخشی از ثابت‌های امضای SavedModel تعریف می‌شوند. برای جزئیات بیشتر، نگاه کنید signature_constants.py و TensorFlow مرتبط مستندات API .

    علاوه بر این، به کمک defs امضای ساخت به راحتی، API SavedModel فراهم می کند امضای زدن دف .. به طور خاص، در اصل mnist_saved_model.py فایل، ما با استفاده از signature_def_utils.build_signature_def() به ساخت predict_signature و classification_signature .

    به عنوان مثال برای predict_signature تعریف شده است، برنامه زمانی استدلال زیر طول می کشد:

    • inputs={'images': tensor_info_x} اطلاعات تانسور ورودی مشخص می کند.

    • outputs={'scores': tensor_info_y} نمرات تانسور اطلاعات مشخص می کند.

    • method_name روش مورد استفاده برای استنتاج است. برای درخواست پیش بینی، باید آن را به مجموعه ای tensorflow/serving/predict . سایر نامهای روش، و signature_constants.py و TensorFlow مرتبط مستندات API .

توجه داشته باشید که tensor_info_x و tensor_info_y دارای ساختار از tensorflow::TensorInfo پروتکل بافر تعریف اینجا . به راحتی ساخت تانسور ساعات، از API TensorFlow SavedModel نیز فراهم می کند utils.py ، با اسناد و مدارک TensorFlow API مرتبط .

همچنین، توجه داشته باشید که images و scores نام مستعار تانسور است. آنها می توانند هر رشته منحصر به فرد شما می خواهید، و آنها را تبدیل به نام منطقی تانسور x و y که شما برای تانسور اتصال هنگام ارسال درخواست پیش بینی بعد مراجعه کنید.

برای مثال، اگر x اشاره به تانسور با نام «long_tensor_name_foo و y به تانسور با نام« generated_tensor_name_bar اشاره، builder خواهد تانسور نام منطقی به نام واقعی ذخیره نقشه برداری ( 'تصاویر' -> 'long_tensor_name_foo') و ( 'نمرات ' -> '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 تصویر آزمایشی اول دریافت می کنیم. این تایید می کند که سرور مدل آموزش دیده را با موفقیت بارگیری و اجرا می کند!