Praktik terbaik transformasi RunInference

Saat menggunakan Dataflow untuk inferensi ML, sebaiknya gunakan transformasi RunInference. Penggunaan transformasi ini memberikan sejumlah manfaat, termasuk:

  • Pengelolaan memori model cerdas yang dioptimalkan untuk pekerja Dataflow saat melakukan inferensi lokal.
  • Batch dinamis yang menggunakan karakteristik pipeline dan batasan yang ditentukan pengguna untuk mengoptimalkan performa.
  • Fitur backend Dataflow yang kompatibel dengan ML yang dapat memberikan throughput dan latensi yang lebih baik.
  • Mekanisme penundaan cerdas dan penskalaan otomatis saat menghadapi kuota inferensi jarak jauh.
  • Metrik dan fitur operasional yang siap produksi.

Saat menggunakan RunInference, ada beberapa hal yang perlu dipertimbangkan:

Pengelolaan Memori

Saat Anda memuat model ML berukuran sedang atau besar, komputer Anda mungkin kehabisan memori. Dataflow menyediakan alat untuk membantu menghindari error kehabisan memori (OOM) saat memuat model ML. Gunakan tabel berikut untuk menentukan pendekatan yang sesuai untuk skenario Anda.

Skenario Solusi
Modelnya cukup kecil untuk dimuat dalam memori. Gunakan transformasi RunInference tanpa konfigurasi tambahan. Transformasi RunInference membagikan model di seluruh thread. Jika Anda dapat menyesuaikan satu model per inti CPU di mesin Anda, maka pipeline Anda dapat menggunakan konfigurasi default.
Beberapa model yang dilatih secara berbeda melakukan tugas yang sama. Gunakan kunci per model. Untuk mengetahui informasi selengkapnya, lihat Menjalankan inferensi ML dengan beberapa model terlatih yang berbeda.
Satu model dimuat ke dalam memori, dan semua proses berbagi model ini.

Gunakan parameter large_model. Untuk mengetahui informasi selengkapnya, lihat Menjalankan inferensi ML dengan beberapa model terlatih yang berbeda.

Jika Anda membuat pengendali model kustom, daripada menggunakan parameter large_model, ganti parameter share_model_across_processes.

Anda perlu mengonfigurasi jumlah pasti model yang dimuat ke komputer Anda.

Untuk mengontrol secara tepat berapa banyak model yang dimuat, gunakan parameter model_copies.

Jika Anda membuat pengendali model kustom, ganti parameter model_copies.

Untuk mengetahui informasi selengkapnya tentang pengelolaan memori dengan Dataflow, lihat Memecahkan masalah error kehabisan memori Dataflow.

Pengelompokan

Ada banyak cara untuk melakukan batching di Beam, tetapi saat melakukan inferensi, sebaiknya Anda membiarkan transformasi RunInference menangani batching. Jika model Anda berperforma terbaik dengan ukuran batch tertentu, pertimbangkan untuk membatasi parameter ukuran batch target RunInference. Sebagian besar handler model mengekspos ukuran batch maksimum dan minimum sebagai parameter. Misalnya, untuk mengontrol ukuran batch yang dimasukkan ke pipeline HuggingFace, Anda dapat menentukan handler model berikut:

mh = HuggingFacePipelineModelHandler('text-classification', min_batch_size=4, max_batch_size=16)

Transformasi RunInference selalu mematuhi ukuran batch maksimum. Ukuran batch minimum adalah target, tetapi tidak dijamin akan dipenuhi dalam semua kasus. Misalnya, lihat Batching Berbasis Bundle di bagian berikut.

Pengelompokan Berbasis Paket

Dataflow meneruskan data ke transformasi dalam bundle. Paket ini dapat bervariasi ukurannya, bergantung pada heuristik yang ditentukan Dataflow. Biasanya, kumpulan data dalam pipeline batch cukup besar (elemen O(100)), sedangkan untuk pipeline streaming, kumpulan data dapat berukuran cukup kecil (termasuk ukuran 1).

Secara default, RunInference membuat batch dari setiap paket dan tidak membuat batch di seluruh paket. Artinya, jika Anda memiliki ukuran batch minimum 8, tetapi hanya ada 3 elemen yang tersisa dalam bundle, RunInference akan menggunakan ukuran batch 3. Sebagian besar handler model mengekspos parameter max_batch_duration_secs yang memungkinkan Anda mengganti perilaku ini. Jika max_batch_duration_secs ditetapkan, RunInference akan mengelompokkan di seluruh paket. Jika transformasi tidak dapat mencapai ukuran batch targetnya dengan satu bundle, transformasi akan menunggu paling lama max_batch_duration_secs sebelum menghasilkan batch. Misalnya, untuk mengaktifkan batching lintas-bundle saat menggunakan pipeline HuggingFace, Anda dapat menentukan handler model berikut:

mh = HuggingFacePipelineModelHandler('text-classification', min_batch_size=4, max_batch_size=16, max_batch_duration_secs=3)

Fitur ini membantu jika Anda mengalami ukuran batch yang sangat rendah di pipeline. Jika tidak, biaya sinkronisasi untuk membuat batch di seluruh paket biasanya tidak layak digunakan, karena dapat menyebabkan pengacakan yang mahal.

Menangani Kegagalan

Penanganan error adalah bagian penting dari pipeline produksi apa pun. Dataflow memproses elemen dalam paket arbitrer dan mencoba lagi paket lengkap jika terjadi error untuk elemen apa pun dalam paket tersebut. Jika Anda tidak menerapkan penanganan error tambahan, Dataflow akan mencoba ulang paket yang menyertakan item yang gagal sebanyak empat kali saat berjalan dalam mode batch. Pipeline akan gagal sepenuhnya jika satu paket gagal empat kali. Saat berjalan dalam mode streaming, Dataflow mencoba lagi bundle yang menyertakan item yang gagal tanpa batas waktu, yang dapat menyebabkan pipeline Anda terhenti secara permanen.

RunInference menyediakan mekanisme penanganan error bawaan dengan fungsi with_exception_handling-nya. Saat Anda menerapkan fungsi ini, semua kegagalan akan diarahkan ke PCollection kegagalan terpisah beserta pesan errornya. Hal ini memungkinkan Anda memproses ulang data tersebut. Jika Anda mengaitkan operasi pra-pemrosesan atau pasca-pemrosesan dengan handler model, RunInference juga akan merutekan operasi tersebut ke pengumpulan kegagalan. Misalnya, untuk mengumpulkan semua kegagalan dari handler model dengan operasi pra-pemrosesan dan pasca-pemrosesan, gunakan logika berikut:

main, other = pcoll | RunInference(model_handler.with_preprocess_fn(f1).with_postprocess_fn(f2)).with_exception_handling()

# handles failed preprocess operations, indexed in the order in which they were applied
other.failed_preprocessing[0] | beam.Map(logging.info)

# handles failed inferences
other.failed_inferences | beam.Map(logging.info)

# handles failed postprocess operations, indexed in the order in which they were applied
other.failed_postprocessing[0] | beam.Map(logging.info)

Waktu tunggu

Saat menggunakan fitur with_exception_handling dari RunInference, Anda juga dapat menetapkan waktu tunggu untuk setiap operasi, yang dihitung per batch. Hal ini memungkinkan Anda menghindari satu inferensi yang macet sehingga membuat seluruh pipeline tidak responsif. Jika waktu tunggu habis, rekaman yang waktu tunggunya habis akan dirutekan ke PCollection kegagalan, semua status model akan dibersihkan dan dibuat ulang, dan eksekusi normal akan dilanjutkan.

# Timeout execution after 60 seconds
main, other = pcoll | RunInference(model_handler).with_exception_handling(timeout=60)

Mulai Beam 2.68.0, Anda juga dapat menentukan waktu tunggu menggunakan opsi pipeline --element_processing_timeout_minutes. Dalam kasus ini, waktu tunggu habis menyebabkan item kerja yang gagal dicoba ulang hingga berhasil, bukan merutekan inferensi yang gagal ke antrean pesan yang tidak terkirim.

Bekerja dengan Akselerator

Saat menggunakan akselerator, banyak pengendali model memiliki konfigurasi khusus akselerator yang dapat Anda aktifkan. Misalnya, saat menggunakan GPU dan pipeline Hugging Face, sebaiknya tetapkan parameter device ke GPU:

mh = HuggingFacePipelineModelHandler('text-classification', device='GPU')

Sebaiknya Anda memulai dengan satu instance VM dan menjalankan pipeline secara lokal di sana. Untuk melakukannya, ikuti langkah-langkah yang dijelaskan dalam panduan pemecahan masalah GPU. Hal ini dapat mengurangi waktu yang diperlukan untuk menjalankan pipeline secara signifikan. Pendekatan ini juga dapat membantu Anda lebih memahami performa tugas Anda.

Untuk mengetahui informasi selengkapnya tentang penggunaan akselerator di Dataflow, lihat dokumentasi Dataflow tentang GPU dan TPU.

Pengelolaan Dependensi

Pipeline ML sering kali menyertakan dependensi yang besar dan penting, seperti PyTorch atau TensorFlow. Untuk mengelola dependensi ini, sebaiknya gunakan penampung kustom saat Anda men-deploy tugas ke produksi. Hal ini memastikan bahwa tugas Anda dieksekusi di lingkungan yang stabil di beberapa proses dan menyederhanakan proses pen-debug-an.

Untuk mengetahui informasi selengkapnya tentang pengelolaan dependensi, lihat halaman Pengelolaan Dependensi Python Beam.

Langkah berikutnya

  • Pelajari notebook Dataflow ML untuk mengetahui contoh praktis.
  • Dapatkan informasi mendalam tentang penggunaan ML dengan Apache Beam dalam dokumentasi pipeline AI/ML.
  • Pelajari RunInference API lebih lanjut.
  • Pelajari metrik yang dapat Anda gunakan untuk memantau RunInference transformasi.
  • Kembali ke halaman Tentang Dataflow ML untuk melihat ringkasan kemampuan ML Dataflow.