Bagikan melalui


Konsep Hyperopt

Catatan

Hyperopt versi sumber terbuka tidak lagi dipertahankan .

Hyperopt akan dihapus dalam versi ML DBR utama berikutnya. Azure Databricks merekomendasikan penggunaan Optuna untuk pengoptimalan simpul tunggal atau RayTune untuk pengalaman serupa dengan fungsionalitas penyetelan hiperparameter terdistribusi Hyperopt yang tidak digunakan lagi. Pelajari selengkapnya tentang menggunakan RayTune di Azure Databricks.

Artikel ini menjelaskan beberapa konsep yang perlu Anda ketahui untuk menggunakan Hyperopt terdistribusi.

Di bagian ini:

Untuk contoh yang mengilustrasikan cara menggunakan Hyperopt di Azure Databricks, lihat Hyperopt.

fmin()

Anda menggunakan fmin() untuk menjalankan eksekusi Hyperopt. Argumen untuk fmin() diperlihatkan dalam tabel; lihat dokumentasi Hyperopt untuk informasi selengkapnya. Untuk contoh cara menggunakan setiap argumen, lihat contoh notebook.

Nama argumen Deskripsi
fn Fungsi objektif. Hyperopt memanggil fungsi ini dengan nilai yang dihasilkan dari ruang hyperparameter yang disediakan dalam argumen space. Fungsi ini dapat mengembalikan kerugian sebagai nilai skalar atau dalam kamus (lihat Dokumen Hyperopt untuk detailnya). Fungsi ini biasanya berisi kode untuk pelatihan model dan perhitungan kerugian.
space Mendefinisikan ruang hyperparameter untuk mencari. Hyperopt memberikan fleksibilitas besar dalam cara ruang ini didefinisikan. Anda dapat memilih opsi kategoris seperti algoritma, atau distribusi probabilistik untuk nilai numerik seperti seragam dan log.
algo Algoritme pencarian hyperopt digunakan untuk mencari ruang hyperparameter. Yang paling umum digunakan adalah hyperopt.rand.suggest untuk Random Search dan hyperopt.tpe.suggest untuk TPE.
max_evals Jumlah pengaturan hiperparameter untuk dicoba (jumlah model yang akan diimplementasikan).
max_queue_len Jumlah pengaturan hyperparameter yang harus dihasilkan Hyperopt terlebih dahulu. Karena algoritme generasi Hyperopt TPE dapat memakan waktu, sangat disarankan untuk menetapkan nilai lebih tinggi dari nilai default 1, tetapi umumnya tidak lebih besar dari pengaturan SparkTrialsparallelism.
trials Objek Trials atau SparkTrials. Gunakan SparkTrials saat Anda memanggil algoritme mesin tunggal seperti metode scikit-learn dalam fungsi objektif. Gunakan Trials saat Anda memanggil algoritme pelatihan terdistribusi seperti metode MLlib atau Horovod dalam fungsi objektif.
early_stop_fn Fungsi penghentian awal opsional untuk menentukan apakah fmin harus berhenti sebelum max_evals tercapai. Defaultnya adalah None. Tanda tangan input dari fungsi ini adalah Trials, *args dan tanda tangan output adalah bool, *args. Output boolean menunjukkan apakah akan berhenti atau tidak. *args adalah status apa pun, di mana output panggilan ke early_stop_fn berfungsi sebagai input ke panggilan berikutnya. Trials bisa berupa objek SparkTrials. Saat menggunakan SparkTrials, fungsi henti awal tidak dijamin berjalan setelah setiap percobaan, dan malah dipantau. Contoh fungsi henti awal

Kelas SparkTrials

SparkTrials adalah API yang dikembangkan oleh Databricks yang memungkinkan Anda mendistribusikan eksekusi Hyperopt tanpa membuat perubahan lain pada kode Hyperopt Anda. SparkTrials mempercepat penyetelan pada mesin tunggal dengan mendistribusikan uji coba kepada pekerja Spark.

Catatan

SparkTrials dirancang untuk paralelisasi perhitungan untuk model ML mesin tunggal seperti scikit-learn. Untuk model yang dibuat dengan algoritme ML terdistribusi seperti MLlib atau Horovod, jangan gunakan SparkTrials. Dalam kasus ini, proses pembuatan model secara otomatis diparalelkan pada kluster, dan Anda harus menggunakan kelas Hyperopt Trials default.

Bagian ini menjelaskan cara mengonfigurasi argumen yang Anda sampaikan ke SparkTrials dan aspek implementasi SparkTrials.

Argumen

SparkTrials mengambil dua argumen opsional:

  • parallelism: Jumlah maksimum uji coba untuk dievaluasi secara bersamaan. Angka yang lebih tinggi memungkinkan Anda menskalakan pengujian lebih banyak pengaturan hyperparameter. Karena Hyperopt mengusulkan uji coba baru berdasarkan hasil masa lalu, ada pertukaran antara paralelisme dan adaptivitas. Untuk paralelisme max_evals tetap, paralelisme yang lebih besar mempercepat perhitungan, tetapi paralelisme yang lebih rendah dapat mengarah pada hasil yang lebih baik karena setiap iterasi memiliki akses ke lebih banyak hasil masa lalu.

    Default: Jumlah eksekutor Spark yang tersedia. Maksimum: 128. Jika nilainya lebih besar dari jumlah tugas bersamaan yang diizinkan oleh konfigurasi kluster, SparkTrials mengurangi paralelisme dengan nilai ini.

  • timeout: Jumlah maksimum detik saat panggilan fmin() dapat dilakukan. Saat jumlah ini terlampaui, semua eksekusi dihentikan dan fmin() menutup. Informasi mengenai pengoperasian yang telah selesai sudah disimpan.

implementasi

Saat menentukan fungsi objektif fn diteruskan ke fmin(), dan saat memilih pengaturan kluster, akan sangat membantu untuk memahami cara SparkTrials mendistribusikan tugas penyetelan.

Dalam Hyperopt, percobaan umumnya sesuai dengan menyesuaikan satu model pada satu set hyperparameter. Hyperopt secara berulang menghasilkan uji coba, mengevaluasinya, dan mengulangi.

Dengan SparkTrials, node driver kluster Anda menghasilkan uji coba baru, dan node pekerja mengevaluasi uji coba tersebut. Setiap percobaan dihasilkan dengan pekerjaan Spark yang memiliki satu tugas, dan dievaluasi dalam tugas pada mesin pekerja. Jika kluster Anda disiapkan untuk menjalankan beberapa tugas per pekerja, maka beberapa uji coba dapat dievaluasi sekaligus pada pekerja tersebut.

SparkTrials dan MLflow

ML Databricks Runtime mendukung pencatatan ke MLflow dari pekerja. Anda dapat menambahkan kode pencatatan log kustom dalam fungsi tujuan yang Anda teruskan ke Hyperopt.

SparkTrials mencatat hasil penyetelan sebagai eksekusi bertingkat MLflow sebagai berikut:

  • Eksekusi utama: Panggilan ke fmin() dicatat sebagai eksekusi utama. Jika ada eksekusi aktif, SparkTrials mencatat pada eksekusi aktif ini dan tidak mengakhiri eksekusi saat fmin() dikembalikan. Jika tidak ada eksekusi aktif, SparkTrials membuat eksekusi baru, mencatat di dalamnya, dan mengakhiri eksekusi sebelum fmin() kembali.
  • Eksekusi turunan: Setiap pengaturan hyperparameter yang diuji ("uji coba") dicatat sebagai eksekusi turunan di bawah eksekusi utama. Catatan log MLflow dari pekerja juga disimpan di dalam sesi eksekusi turunan yang sesuai.

Saat memanggil fmin(), Databricks merekomendasikan pengelolaan run MLflow aktif; yakni, membungkus pemanggilan ke fmin() dalam pernyataan with mlflow.start_run():. Ini memastikan bahwa setiap panggilan fmin() dicatat dalam setiap run utama MLflow yang terpisah, dan memudahkan pencatatan tag, parameter, atau metrik tambahan ke run tersebut.

Catatan

Saat Anda memanggil fmin() beberapa kali dalam eksekusi MLflow aktif yang sama, MLflow mencatat panggilan tersebut ke eksekusi utama yang sama. Untuk mengatasi konflik nama untuk parameter dan tag yang dicatat, MLflow menambahkan UUID ke nama dengan konflik.

Ketika mencatat dari pekerja, Anda tidak perlu secara eksplisit mengelola run dalam fungsi objektif. Panggil mlflow.log_param("param_from_worker", x) dalam fungsi objektif untuk mencatat parameter ke eksekusi turunan. Anda dapat mencatat parameter, metrik, tag, dan artefak dalam fungsi tujuan.