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 Jika Anda membuat pengendali model kustom, daripada menggunakan
parameter |
| Anda perlu mengonfigurasi jumlah pasti model yang dimuat ke komputer Anda. |
Untuk mengontrol secara tepat berapa banyak model yang dimuat, gunakan
parameter Jika Anda membuat pengendali model kustom, ganti parameter
|
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
RunInferenceAPI lebih lanjut. - Pelajari metrik yang dapat Anda gunakan untuk memantau
RunInferencetransformasi. - Kembali ke halaman Tentang Dataflow ML untuk melihat ringkasan kemampuan ML Dataflow.