Komponen Pipa TFX InfraValidator

InfraValidator adalah komponen TFX yang digunakan sebagai lapisan peringatan dini sebelum memasukkan model ke produksi. Nama validator "infra" berasal dari fakta bahwa validator tersebut memvalidasi model dalam model sebenarnya yang melayani "infrastruktur". Jika Evaluator menjamin performa model, InfraValidator menjamin model baik-baik saja secara mekanis dan mencegah didorongnya model yang buruk.

Bagaimana cara kerjanya?

InfraValidator mengambil model tersebut, meluncurkan server model sandbox dengan model tersebut, dan melihat apakah model tersebut berhasil dimuat dan ditanyakan secara opsional. Hasil validasi infra akan dihasilkan dalam output blessing dengan cara yang sama seperti yang dilakukan Evaluator .

InfraValidator berfokus pada kompatibilitas antara biner server model (misalnya TensorFlow Serving ) dan model yang akan diterapkan. Terlepas dari nama validator "infra", pengguna bertanggung jawab untuk mengonfigurasi lingkungan dengan benar, dan validator infra hanya berinteraksi dengan server model di lingkungan yang dikonfigurasi pengguna untuk melihat apakah itu berfungsi dengan baik. Mengonfigurasi lingkungan ini dengan benar akan memastikan bahwa validasi infra berhasil atau gagal akan menjadi indikasi apakah model dapat diservis di lingkungan layanan produksi. Hal ini menyiratkan beberapa, namun tidak terbatas pada, hal-hal berikut:

  1. InfraValidator menggunakan biner server model yang sama seperti yang akan digunakan dalam produksi. Ini adalah tingkat minimal dimana lingkungan validasi infra harus menyatu.
  2. InfraValidator menggunakan sumber daya yang sama (misalnya jumlah alokasi dan jenis CPU, memori, dan akselerator) seperti yang akan digunakan dalam produksi.
  3. InfraValidator menggunakan konfigurasi server model yang sama seperti yang akan digunakan dalam produksi.

Bergantung pada situasinya, pengguna dapat memilih sejauh mana InfraValidator harus identik dengan lingkungan produksi. Secara teknis, suatu model dapat divalidasi infra di lingkungan Docker lokal dan kemudian disajikan di lingkungan yang benar-benar berbeda (misalnya cluster Kubernetes) tanpa masalah. Namun, InfraValidator tidak akan memeriksa perbedaan ini.

Modus operasi

Tergantung pada konfigurasinya, validasi infra dilakukan dalam salah satu mode berikut:

  • Mode LOAD_ONLY : memeriksa apakah model berhasil dimuat di infrastruktur penyajian atau tidak. ATAU
  • Mode LOAD_AND_QUERY : Mode LOAD_ONLY ditambah mengirimkan beberapa permintaan sampel untuk memeriksa apakah model mampu menyajikan kesimpulan. InfraValidator tidak peduli apakah prediksinya benar atau tidak. Yang penting hanyalah apakah permintaan itu berhasil atau tidak.

Bagaimana cara menggunakannya?

Biasanya InfraValidator didefinisikan di sebelah komponen Evaluator, dan outputnya diumpankan ke Pusher. Jika InfraValidator gagal, model tidak akan dikirim.

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(...)
)

Mengonfigurasi komponen InfraValidator.

Ada tiga jenis proto untuk mengkonfigurasi InfraValidator.

ServingSpec

ServingSpec adalah konfigurasi paling penting untuk InfraValidator. Ini mendefinisikan:

  • jenis server model apa yang akan dijalankan
  • di mana menjalankannya

Untuk tipe server model (disebut biner penyajian) kami mendukung

Platform penayangan berikut saat ini didukung:

  • Docker Lokal (Docker harus diinstal terlebih dahulu)
  • Kubernetes (dukungan terbatas hanya untuk KubeflowDagRunner)

Pilihan untuk menyajikan biner dan platform penyajian dibuat dengan menentukan oneof blok dari ServingSpec . Misalnya untuk menggunakan biner TensorFlow Serving yang berjalan di cluster Kubernetes, kolom tensorflow_serving dan kubernetes harus disetel.

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

Untuk mengonfigurasi ServingSpec lebih lanjut, silakan periksa definisi protobuf .

ValidationSpec

Konfigurasi opsional untuk menyesuaikan kriteria validasi infra atau alur kerja.

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
    )
)

Semua bidang ValidationSpec memiliki nilai default yang baik. Periksa lebih detail dari definisi protobuf .

RequestSpec

Konfigurasi opsional untuk menentukan cara membuat permintaan sampel saat menjalankan validasi infra dalam mode LOAD_AND_QUERY . Untuk menggunakan mode LOAD_AND_QUERY , diperlukan untuk menentukan properti eksekusi request_spec serta examples saluran input dalam definisi komponen.

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.
    )
)

Memproduksi SavedModel dengan pemanasan

(Dari versi 0.30.0)

Karena InfraValidator memvalidasi model dengan permintaan nyata, ia dapat dengan mudah menggunakan kembali permintaan validasi ini sebagai permintaan pemanasan dari SavedModel. InfraValidator menyediakan opsi ( RequestSpec.make_warmup ) untuk mengekspor SavedModel dengan pemanasan.

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

Kemudian artefak InfraBlessing keluaran akan berisi SavedModel dengan pemanasan, dan juga dapat didorong oleh Pusher , seperti artefak Model .

Keterbatasan

InfraValidator saat ini belum lengkap dan memiliki beberapa keterbatasan.

  • Hanya format model TensorFlow SavedModel yang dapat divalidasi.
  • Saat menjalankan TFX di Kubernetes, pipeline harus dijalankan oleh KubeflowDagRunner di dalam Kubeflow Pipelines. Server model akan diluncurkan di cluster Kubernetes yang sama dan namespace yang digunakan Kubeflow.
  • InfraValidator terutama berfokus pada penerapan ke TensorFlow Serving , dan meskipun masih berguna, namun kurang akurat untuk penerapan ke TensorFlow Lite dan TensorFlow.js , atau framework inferensi lainnya.
  • Ada dukungan terbatas pada mode LOAD_AND_QUERY untuk tanda tangan metode Predict (yang merupakan satu-satunya metode yang dapat diekspor di TensorFlow 2). InfraValidator memerlukan tanda tangan Predict untuk menggunakan tf.Example berseri sebagai satu-satunya masukan.

    @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'))
    })
    
    • Lihat contoh kode Penguin untuk melihat bagaimana tanda tangan ini berinteraksi dengan komponen lain di TFX.