جزء InfraValidator TFX Pipeline

InfraValidator یک جزء TFX است که به عنوان یک لایه هشدار اولیه قبل از وارد کردن یک مدل به تولید استفاده می شود. نام اعتباردهنده «infra» از این واقعیت گرفته شده است که مدل را در مدل واقعی «زیرساخت» تأیید می کند. اگر ارزیابی کننده عملکرد مدل را تضمین کند، InfraValidator باید تضمین کند که مدل از نظر مکانیکی خوب است و از فشار دادن مدل های بد جلوگیری می کند.

چگونه کار می کند؟

InfraValidator مدل را می گیرد، یک سرور مدل sand-boxed با مدل راه اندازی می کند و می بیند که آیا می توان آن را با موفقیت بارگیری کرد و به صورت اختیاری پرس و جو کرد. نتیجه اعتبارسنجی زیرین در خروجی blessing به همان روشی که Evaluator انجام می دهد تولید می شود.

InfraValidator بر سازگاری بین باینری سرور مدل (مثلاً TensorFlow Serving ) و مدلی که قرار است مستقر شود، تمرکز دارد. علیرغم نام تأیید کننده "infra"، این مسئولیت کاربر است که محیط را به درستی پیکربندی کند، و اعتبارسنجی infra فقط با سرور مدل در محیط پیکربندی شده توسط کاربر تعامل دارد تا ببیند آیا خوب کار می کند یا خیر. پیکربندی صحیح این محیط اطمینان حاصل می کند که عبور یا عدم موفقیت اعتبار سنجی زیر نشان دهنده این است که آیا مدل در محیط سرویس تولید قابل استفاده است یا خیر. این به برخی از موارد زیر اشاره دارد، اما محدود به آنها نیست:

  1. InfraValidator از همان مدل باینری سرور استفاده می کند که در تولید استفاده خواهد شد. این حداقل سطحی است که محیط اعتبارسنجی زیرساخت باید به آن همگرا شود.
  2. InfraValidator از همان منابعی استفاده می کند (مثلاً مقدار تخصیص و نوع CPU، حافظه و شتاب دهنده ها) که در تولید استفاده می شود.
  3. InfraValidator از همان پیکربندی سرور مدل استفاده می کند که در تولید استفاده می شود.

بسته به موقعیت، کاربران می توانند انتخاب کنند که InfraValidator تا چه حد باید با محیط تولید یکسان باشد. از نظر فنی، یک مدل می‌تواند در یک محیط Docker محلی تأیید شود و سپس در یک محیط کاملاً متفاوت (مثلاً خوشه Kubernetes) بدون مشکل ارائه شود. با این حال، InfraValidator این واگرایی را بررسی نخواهد کرد.

حالت عملیات

بسته به پیکربندی، اعتبار سنجی infra در یکی از حالت های زیر انجام می شود:

  • حالت LOAD_ONLY : بررسی اینکه آیا مدل با موفقیت در زیرساخت سرویس بارگذاری شده است یا خیر. یا
  • حالت LOAD_AND_QUERY : حالت LOAD_ONLY به علاوه ارسال چند نمونه درخواست برای بررسی اینکه آیا مدل قادر به ارائه استنتاج است یا خیر. InfraValidator اهمیتی نمی دهد که پیش بینی درست بود یا خیر. فقط موفقیت یا عدم موفقیت درخواست مهم است.

چگونه از آن استفاده کنم؟

معمولا InfraValidator در کنار یک جزء Evaluator تعریف می شود و خروجی آن به یک Pusher داده می شود. اگر InfraValidator خراب شود، مدل هل داده نمی شود.

evaluator = Evaluator(
    model=trainer.outputs['model'],
    examples=example_gen.outputs['examples'],
    baseline_model=model_resolver.outputs['model'],
    eval_config=tfx.proto.EvalConfig(...)
)

infra_validator = InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(...)
)

pusher = Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    infra_blessing=infra_validator.outputs['blessing'],
    push_destination=tfx.proto.PushDestination(...)
)

پیکربندی یک جزء InfraValidator.

سه نوع پروتو برای پیکربندی InfraValidator وجود دارد.

ServingSpec

ServingSpec حیاتی ترین پیکربندی برای InfraValidator است. تعریف می کند:

  • چه نوع سرور مدلی اجرا شود
  • کجا آن را اجرا کنیم

برای انواع سرور مدل (به نام سرویس دودویی) ما پشتیبانی می کنیم

در حال حاضر پلتفرم های سرویس دهی زیر پشتیبانی می شوند:

  • Local Docker (Docker باید از قبل نصب شده باشد)
  • Kubernetes (پشتیبانی محدود فقط برای KubeflowDagRunner)

انتخاب برای سرویس دهی باینری و پلت فرم سرویس دهی با مشخص کردن یک oneof از ServingSpec انجام می شود. به عنوان مثال برای استفاده از اجرای باینری TensorFlow Serving در خوشه Kubernetes، باید فیلد tensorflow_serving و kubernetes تنظیم شود.

infra_validator=InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(
        tensorflow_serving=tfx.proto.TensorFlowServing(
            tags=['latest']
        ),
        kubernetes=tfx.proto.KubernetesConfig()
    )
)

برای پیکربندی بیشتر ServingSpec ، لطفاً تعریف protobuf را بررسی کنید.

ValidationSpec

پیکربندی اختیاری برای تنظیم معیارهای اعتبارسنجی زیرساخت یا گردش کار.

infra_validator=InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(...),
    validation_spec=tfx.proto.ValidationSpec(
        # How much time to wait for model to load before automatically making
        # validation fail.
        max_loading_time_seconds=60,
        # How many times to retry if infra validation fails.
        num_tries=3
    )
)

تمام فیلدهای ValidationSpec دارای یک مقدار پیش فرض صدا هستند. جزئیات بیشتر را از تعریف protobuf بررسی کنید.

RequestSpec

پیکربندی اختیاری برای تعیین نحوه ایجاد درخواست‌های نمونه هنگام اجرای اعتبارسنجی زیرین در حالت LOAD_AND_QUERY . برای استفاده از حالت LOAD_AND_QUERY ، لازم است هر دو ویژگی اجرای request_spec و همچنین examples از کانال ورودی را در تعریف جزء مشخص کنید.

infra_validator = InfraValidator(
    model=trainer.outputs['model'],
    # This is the source for the data that will be used to build a request.
    examples=example_gen.outputs['examples'],
    serving_spec=tfx.proto.ServingSpec(
        # Depending on what kind of model server you're using, RequestSpec
        # should specify the compatible one.
        tensorflow_serving=tfx.proto.TensorFlowServing(tags=['latest']),
        local_docker=tfx.proto.LocalDockerConfig(),
    ),
    request_spec=tfx.proto.RequestSpec(
        # InfraValidator will look at how "classification" signature is defined
        # in the model, and automatically convert some samples from `examples`
        # artifact to prediction RPC requests.
        tensorflow_serving=tfx.proto.TensorFlowServingRequestSpec(
            signature_names=['classification']
        ),
        num_examples=10  # How many requests to make.
    )
)

تولید SavedModel با گرم کردن

(از نسخه 0.30.0)

از آنجایی که InfraValidator مدل را با درخواست‌های واقعی تأیید می‌کند، می‌تواند به راحتی از این درخواست‌های اعتبارسنجی به عنوان درخواست‌های گرم‌کننده یک SavedModel استفاده مجدد کند. InfraValidator یک گزینه ( RequestSpec.make_warmup ) برای صادرات SavedModel با گرم کردن ارائه می دهد.

infra_validator = InfraValidator(
    ...,
    request_spec=tfx.proto.RequestSpec(..., make_warmup=True)
)

سپس آرتیفکت InfraBlessing خروجی حاوی SavedModel با گرم کردن خواهد بود و همچنین می‌تواند توسط Pusher فشار داده شود، درست مانند مصنوع Model .

محدودیت ها

InfraValidator فعلی هنوز کامل نشده است و محدودیت هایی دارد.

  • فقط قالب مدل TensorFlow SavedModel قابل تایید است.
  • هنگام اجرای TFX در Kubernetes، خط لوله باید توسط KubeflowDagRunner در داخل Kubeflow Pipelines اجرا شود. سرور مدل در همان خوشه Kubernetes و فضای نامی که Kubeflow استفاده می کند راه اندازی می شود.
  • InfraValidator در درجه اول بر روی استقرار در سرویس TensorFlow متمرکز است، و اگرچه هنوز مفید است، دقت کمتری برای استقرار در TensorFlow Lite و TensorFlow.js یا سایر چارچوب‌های استنتاج دارد.
  • پشتیبانی محدودی در حالت LOAD_AND_QUERY برای امضای روش Predict (که تنها روش قابل صادرات در TensorFlow 2 است) وجود دارد. InfraValidator به امضای Predict نیاز دارد تا یک tf.Example سریالی را به عنوان تنها ورودی مصرف کند.

    @tf.function
    def parse_and_run(serialized_example):
      features = tf.io.parse_example(serialized_example, FEATURES)
      return model(features)
    
    model.save('path/to/save', signatures={
      # This exports "Predict" method signature under name "serving_default".
      'serving_default': parse_and_run.get_concrete_function(
          tf.TensorSpec(shape=[None], dtype=tf.string, name='examples'))
    })
    
    • نمونه کد پنگوئن را بررسی کنید تا ببینید چگونه این امضا با سایر اجزا در TFX تعامل دارد.