ارائه مدل های TensorFlow با عملیات سفارشی

TensorFlow با یک کتابخانه گسترده از عملیات ها و هسته های عملیاتی (پیاده سازی) از پیش ساخته شده است که برای انواع سخت افزارهای مختلف (CPU، GPU و غیره) تنظیم شده اند. این عملیات به طور خودکار به باینری TensorFlow Serving ModelServer و بدون نیاز به کار اضافی توسط کاربر متصل می شوند. با این حال، دو مورد استفاده وجود دارد که کاربر را ملزم می کند تا به طور صریح در عملیات به ModelServer پیوند دهد:

  • شما عملیات سفارشی خود را نوشته اید (مثلاً با استفاده از این راهنما )
  • شما از یک عملیات از قبل پیاده سازی شده استفاده می کنید که با TensorFlow ارسال نشده است

صرف نظر از اینکه op را پیاده سازی کرده اید یا خیر، برای ارائه یک مدل با عملیات سفارشی، باید به منبع op دسترسی داشته باشید. این راهنما شما را در مراحل استفاده از منبع برای در دسترس قرار دادن عملیات سفارشی برای ارائه راهنمایی می کند. برای راهنمایی در مورد اجرای عملیات سفارشی، لطفاً به مخزن tensorflow/custom-op مراجعه کنید.

پیش نیاز: با نصب Docker، مخزن TensorFlow Serving را شبیه سازی کرده اید و فهرست کاری فعلی شما ریشه مخزن است.

از طریق منبع عملیاتی در پروژه سرویس کپی کنید

به منظور ایجاد سرویس TensorFlow با عملیات سفارشی خود، ابتدا باید منبع عملیاتی را در پروژه سرویس دهی خود کپی کنید. برای این مثال، از tensorflow_zero_out از مخزن custom-op ذکر شده در بالا استفاده خواهید کرد.

در مخزن سرویس دهی، یک پوشه custom_ops ایجاد کنید که تمام عملیات سفارشی شما را در خود جای می دهد. برای این مثال، شما فقط کد tensorflow_zero_out را خواهید داشت.

mkdir tensorflow_serving/custom_ops
cp -r <custom_ops_repo_root>/tensorflow_zero_out tensorflow_serving/custom_ops

ساخت کتابخانه ایستا برای عملیات

در فایل BUILD tensorflow_zero_out، هدفی را می‌بینید که یک فایل شی اشتراک‌گذاری شده ( .so ) تولید می‌کند، که آن را برای ایجاد و آموزش مدل خود در پایتون بارگذاری می‌کنید. با این حال، سرویس TensorFlow به صورت ایستا عملیات ها را در زمان ساخت پیوند می دهد و به یک فایل .a نیاز دارد. بنابراین یک قانون ساخت که این فایل را به tensorflow_serving/custom_ops/tensorflow_zero_out/BUILD تولید می‌کند اضافه می‌کنید:

cc_library(
    name = 'zero_out_ops',
    srcs = [
        "cc/kernels/zero_out_kernels.cc",
        "cc/ops/zero_out_ops.cc",
    ],
    alwayslink = 1,
    deps = [
        "@org_tensorflow//tensorflow/core:framework",
    ]
)

با عملیاتی که در آن لینک شده است، ModelServer بسازید

برای ارائه مدلی که از یک op سفارشی استفاده می کند، باید باینری ModelServer را با آن op پیوند داده شده بسازید. به طور خاص، هدف ساخت zero_out_ops ایجاد شده در بالا را به فایل BUILD ModelServer اضافه می کنید.

tensorflow_serving/model_servers/BUILD را ویرایش کنید تا هدف ساخت عملیات سفارشی خود را به SUPPORTED_TENSORFLOW_OPS که در هدف server_lib گنجانده شده است اضافه کنید:

SUPPORTED_TENSORFLOW_OPS = [
    ...
    "//tensorflow_serving/custom_ops/tensorflow_zero_out:zero_out_ops"
]

سپس از محیط Docker برای ساخت ModelServer استفاده کنید:

tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server

مدلی را ارائه دهید که شامل عملیات سفارشی شما باشد

اکنون می توانید باینری ModelServer را اجرا کنید و مدلی را که حاوی این عملیات سفارشی است را شروع کنید:

tools/run_in_docker.sh -o "-p 8501:8501" \
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \
--rest_api_port=8501 --model_name=<model_name> --model_base_path=<model_base_path>

یک درخواست استنتاج برای تست عملیات به صورت دستی ارسال کنید

اکنون می توانید برای آزمایش عملیات سفارشی خود، یک درخواست استنتاج به سرور مدل ارسال کنید:

curl http://localhost:8501/v1/models/<model_name>:predict -X POST \
-d '{"inputs": [[1,2], [3,4]]}'

این صفحه حاوی یک API کاملتر برای ارسال درخواست های REST به سرور مدل است.