Kueri & membandingkan eksperimen dan eksekusi dengan MLflow

Eksperimen dan pekerjaan (atau eksekusi) di Azure Pembelajaran Mesin dapat dikueri menggunakan MLflow. Anda tidak perlu menginstal SDK tertentu untuk mengelola apa yang terjadi di dalam pekerjaan pelatihan, membuat transisi yang lebih mulus antara eksekusi lokal dan cloud dengan menghapus dependensi khusus cloud. Dalam artikel ini, Anda akan mempelajari cara mengkueri dan membandingkan eksperimen dan eksekusi di ruang kerja Anda menggunakan Azure Pembelajaran Mesin dan MLflow SDK di Python.

MLflow memungkinkan Anda untuk:

  • Membuat, mengkueri, menghapus, dan mencari eksperimen di ruang kerja.
  • Mengkueri, menghapus, dan mencari eksekusi di ruang kerja.
  • Lacak dan ambil metrik, parameter, artefak, dan model dari eksekusi.

Untuk perbandingan terperinci antara MLflow sumber terbuka dan MLflow saat tersambung ke Azure Pembelajaran Mesin, lihat Matriks dukungan untuk mengkueri eksekusi dan eksperimen di Azure Pembelajaran Mesin.

Catatan

Azure Pembelajaran Mesin Python SDK v2 tidak menyediakan kemampuan pengelogan atau pelacakan asli. Ini tidak hanya berlaku untuk pengelogan tetapi juga untuk mengkueri metrik yang dicatat. Sebagai gantinya, gunakan MLflow untuk mengelola eksperimen dan eksekusi. Artikel ini menjelaskan cara menggunakan MLflow untuk mengelola eksperimen dan berjalan di Azure Pembelajaran Mesin.

Anda juga dapat mengkueri dan mencari eksperimen dan menjalankan dengan menggunakan MLflow REST API. Lihat Menggunakan MLflow REST dengan Azure Pembelajaran Mesin untuk contoh tentang cara menggunakannya.

Prasyarat

  • Instal paket mlflow MLflow SDK dan plug-in Azure Pembelajaran Mesin untuk MLflow azureml-mlflow.

    pip install mlflow azureml-mlflow
    

    Tip

    Anda dapat menggunakan mlflow-skinny paket, yang merupakan paket MLflow ringan tanpa penyimpanan SQL, server, UI, atau dependensi ilmu data. mlflow-skinny disarankan untuk pengguna yang terutama membutuhkan kemampuan pelacakan dan pengelogan MLflow tanpa mengimpor rangkaian fitur lengkap termasuk penyebaran.

  • Ruang kerja Azure Machine Learning. Anda dapat membuatnya dengan mengikuti tutorial Membuat sumber daya pembelajaran mesin.

  • Jika Anda melakukan pelacakan jarak jauh (yaitu, melacak eksperimen yang berjalan di luar Azure Pembelajaran Mesin), konfigurasikan MLflow untuk mengarah ke URI pelacakan ruang kerja Azure Pembelajaran Mesin Anda. Untuk informasi selengkapnya tentang cara menyambungkan MLflow ke ruang kerja Anda, lihat Mengonfigurasi MLflow untuk Azure Pembelajaran Mesin.

Kueri dan eksperimen pencarian

Gunakan MLflow untuk mencari eksperimen di dalam ruang kerja Anda. Lihat contoh berikut:

  • Dapatkan semua eksperimen aktif:

    mlflow.search_experiments()
    

    Catatan

    Dalam versi warisan MLflow (<2.0), gunakan metode mlflow.list_experiments() sebagai gantinya.

  • Dapatkan semua eksperimen, termasuk diarsipkan:

    from mlflow.entities import ViewType
    
    mlflow.search_experiments(view_type=ViewType.ALL)
    
  • Dapatkan eksperimen tertentu berdasarkan nama:

    mlflow.get_experiment_by_name(experiment_name)
    
  • Dapatkan eksperimen tertentu berdasarkan ID:

    mlflow.get_experiment('1234-5678-90AB-CDEFG')
    

Eksperimen pencarian

Metode ini search_experiments() , tersedia sejak Mlflow 2.0, memungkinkan Anda mencari eksperimen yang cocok dengan kriteria menggunakan filter_string.

  • Ambil beberapa eksperimen berdasarkan ID mereka:

    mlflow.search_experiments(filter_string="experiment_id IN ("
        "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')"
    )
    
  • Ambil semua eksperimen yang dibuat setelah waktu tertentu:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
    
  • Ambil semua eksperimen dengan tag tertentu:

    mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
    

Kueri dan pencarian berjalan

MLflow memungkinkan Anda mencari eksekusi di dalam eksperimen apa pun, termasuk beberapa eksperimen secara bersamaan. Metode mlflow.search_runs() ini menerima argumen experiment_ids dan experiment_name untuk menunjukkan eksperimen mana yang ingin Anda cari. Anda juga dapat menunjukkan search_all_experiments=True apakah Anda ingin mencari di semua eksperimen di ruang kerja:

  • Berdasarkan nama eksperimen:

    mlflow.search_runs(experiment_names=[ "my_experiment" ])
    
  • Berdasarkan ID eksperimen:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
    
  • Cari di semua eksperimen di ruang kerja:

    mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
    

Perhatikan bahwa experiment_ids mendukung penyediaan array eksperimen, sehingga Anda dapat mencari berjalan di beberapa eksperimen, jika perlu. Ini mungkin berguna jika Anda ingin membandingkan eksekusi model yang sama ketika dicatat dalam eksperimen yang berbeda (misalnya, oleh orang yang berbeda atau perulangan proyek yang berbeda).

Penting

Jika experiment_ids, experiment_names, atau search_all_experiments tidak ditentukan, maka MLflow mencari secara default dalam eksperimen aktif saat ini. Anda dapat mengatur eksperimen aktif menggunakan mlflow.set_experiment().

Secara default, MLflow mengembalikan data dalam format Pandas Dataframe, yang membuatnya berguna saat melakukan pemrosesan lebih lanjut analisis eksekusi kami. Data yang dikembalikan mencakup kolom dengan:

  • Informasi dasar tentang eksekusi.
  • Parameter dengan nama kolom params.<parameter-name>.
  • Metrik (nilai terakhir masing-masing yang dicatat) dengan nama kolom metrics.<metric-name>.

Semua metrik dan parameter juga dikembalikan saat mengkueri eksekusi. Namun, untuk metrik yang berisi beberapa nilai (misalnya, kurva kerugian, atau kurva PR), hanya nilai terakhir metrik yang dikembalikan. Jika Anda ingin mengambil semua nilai metrik tertentu, gunakan metode mlflow.get_metric_history. Lihat Mendapatkan param dan metrik dari eksekusi misalnya.

Pesanan berjalan

Secara default, eksperimen berada dalam urutan turun menurut start_time, yang merupakan waktu eksperimen diantrekan di Azure Pembelajaran Mesin. Namun, Anda dapat mengubah default ini dengan menggunakan parameter order_by.

  • Pesanan berjalan menurut atribut, seperti start_time:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
                       order_by=["attributes.start_time DESC"])
    
  • Pesanan berjalan dan membatasi hasil. Contoh berikut mengembalikan eksekusi tunggal terakhir dalam eksperimen:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       max_results=1, order_by=["attributes.start_time DESC"])
    
  • Pesanan yang dijalankan oleh atribut duration:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       order_by=["attributes.duration DESC"])
    

    Tip

    attributes.durationtidak ada di MLflow OSS, tetapi disediakan di Azure Pembelajaran Mesin untuk kenyamanan.

  • Pesanan berjalan menurut nilai metrik:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
    

    Peringatan

    Menggunakan order_by dengan ekspresi yang berisi metrics.*, params.*, atau tags.* dalam parameter order_by saat ini tidak didukung. Sebagai gantinya order_values , gunakan metode dari Panda seperti yang ditunjukkan dalam contoh.

Filter eksekusi

Anda juga dapat mencari eksekusi dengan kombinasi tertentu pada hyperparameter menggunakan parameter filter_string. Gunakan params untuk mengakses parameter eksekusi, metrics untuk mengakses metrik yang dicatat dalam proses, dan attributes untuk mengakses detail informasi eksekusi. MLflow mendukung ekspresi yang digabungkan oleh kata kunci AND (sintaks tidak mendukung OR):

  • Pencarian berjalan berdasarkan nilai parameter:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="params.num_boost_round='100'")
    

    Peringatan

    Hanya operator =, , dan != yang didukung untuk pemfilteran parameterslike.

  • Pencarian berjalan berdasarkan nilai metrik:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="metrics.auc>0.8")
    
  • Pencarian berjalan dengan tag tertentu:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="tags.framework='torch'")
    
  • Pencarian berjalan yang dibuat oleh pengguna tertentu:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.user_id = 'John Smith'")
    
  • Pencarian berjalan yang gagal. Lihat Filter berjalan menurut status untuk nilai yang mungkin:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.status = 'Failed'")
    
  • Pencarian berjalan dibuat setelah waktu tertentu:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.creation_time > '{int(dt.timestamp())}'")
    

    Tip

    Untuk kunci attributes, nilai harus selalu berupa string dan karenanya dikodekan di antara tanda kutip.

  • Pencarian berjalan yang memakan waktu lebih dari satu jam:

    duration = 360 * 1000 # duration is in milliseconds
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.duration > '{duration}'")
    

    Tip

    attributes.durationtidak ada di MLflow OSS, tetapi disediakan di Azure Pembelajaran Mesin untuk kenyamanan.

  • Pencarian berjalan yang memiliki ID dalam set tertentu:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
    

Filter eksekusi berdasarkan status

Saat Anda memfilter berjalan menurut status, MLflow menggunakan konvensi yang berbeda untuk memberi nama berbagai kemungkinan status eksekusi dibandingkan dengan Azure Pembelajaran Mesin. Tabel berikut ini memperlihatkan nilai yang mungkin terjadi:

Status pekerjaan Azure Pembelajaran Mesin attributes.status MLFlow Makna
Belum dimulai Scheduled Pekerjaan/eksekusi diterima oleh Azure Pembelajaran Mesin.
Antrean Scheduled Pekerjaan/eksekusi dijadwalkan untuk berjalan, tetapi hal itu belum dimulai.
Mempersiapkan Scheduled Pekerjaan/eksekusi belum dimulai, tetapi komputasi dialokasikan untuk eksekusinya dan sedang menyiapkan lingkungan dan inputnya.
Sedang berjalan Running Pekerjaan/eksekusi saat ini sedang dalam kinerja yang aktif.
Selesai Finished Pekerjaan/eksekusi selesai tanpa kesalahan.
Gagal Failed Pekerjaan/eksekusi selesai dengan kesalahan.
Canceled Killed Pekerjaan/eksekusi dibatalkan oleh pengguna atau dihentikan oleh sistem.

Contoh:

mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                   filter_string="attributes.status = 'Failed'")

Mendapatkan metrik, parameter, artefak, dan model

Metode search_runs mengembalikan Panda yang Dataframe berisi sejumlah informasi terbatas secara default. Anda bisa mendapatkan objek Python jika diperlukan, yang mungkin berguna untuk mendapatkan detail tentang objek tersebut. Gunakan parameter output_format untuk mengontrol cara output dikembalikan:

runs = mlflow.search_runs(
    experiment_ids=[ "1234-5678-90AB-CDEFG" ],
    filter_string="params.num_boost_round='100'",
    output_format="list",
)

Detail kemudian dapat diakses dari info anggota. Contoh berikut menunjukkan cara mendapatkan run_id:

last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)

Mendapatkan param dan metrik dari eksekusi

Ketika eksekusi dikembalikan menggunakan output_format="list", Anda dapat dengan mudah mengakses parameter menggunakan kunci data:

last_run.data.params

Dengan cara yang sama, Anda dapat mengkueri metrik:

last_run.data.metrics

Untuk metrik yang berisi beragam nilai (misalnya, kurva kerugian, atau kurva PR), hanya nilai terakhir yang dicatat dari metrik yang dikembalikan. Jika Anda ingin mengambil semua nilai metrik tertentu, gunakan metode mlflow.get_metric_history. Metode ini mengharuskan Anda untuk menggunakan MlflowClient:

client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")

Mendapatkan artefak dari eksekusi

MLflow dapat mengkueri artefak apa pun yang dicatat oleh eksekusi. Artefak tidak dapat diakses menggunakan objek eksekusi itu sendiri, dan klien MLflow harus digunakan sebagai gantinya:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("1234-5678-90AB-CDEFG")

Metode sebelumnya mencantumkan semua artefak yang dicatat dalam proses, tetapi tetap disimpan di penyimpanan artefak (penyimpanan Azure Pembelajaran Mesin). Untuk mengunduh salah satunya, gunakan metode download_artifact:

file_path = mlflow.artifacts.download_artifacts(
    run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)

Catatan

Dalam versi warisan MLflow (<2.0), gunakan metode MlflowClient.download_artifacts() sebagai gantinya.

Mendapatkan model dari eksekusi

Model juga dapat dicatat dalam eksekusi dan kemudian diambil langsung darinya. Untuk mengambil model, Anda perlu mengetahui jalur ke artefak tempat model disimpan. Metode list_artifacts ini dapat digunakan untuk menemukan artefak yang mewakili model karena model MLflow selalu merupakan folder. Anda dapat mengunduh model dengan menentukan jalur tempat model disimpan, menggunakan download_artifact metode :

artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
  run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)

Anda kemudian dapat memuat kembali model dari artefak yang diunduh menggunakan fungsi load_model umum di namespace khusus rasa. Contoh berikut menggunakan xgboost:

model = mlflow.xgboost.load_model(model_local_path)

MLflow juga memungkinkan Anda untuk melakukan kedua operasi sekaligus, dan mengunduh dan memuat model dalam satu instruksi. MLflow mengunduh model ke folder sementara dan memuatnya dari sana. Metode load_model ini menggunakan format URI untuk menunjukkan dari mana model harus diambil. Dalam kasus pemuatan model dari eksekusi, struktur URI adalah sebagai berikut:

model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")

Tip

Untuk mengkueri dan memuat model yang terdaftar di registri model, lihat Mengelola registri model di Azure Pembelajaran Mesin dengan MLflow.

Mendapatkan eksekusi anak (berlapis)

MLflow mendukung konsep eksekusi turunan (berlapis). Eksekusi ini berguna ketika Anda perlu memutar rutinitas pelatihan yang harus dilacak secara independen dari proses pelatihan utama. Proses pengoptimalan penyetelan hyper-parameter atau alur Azure Pembelajaran Mesin adalah contoh umum pekerjaan yang menghasilkan beberapa eksekusi anak. Anda dapat mengkueri semua eksekusi turunan dari eksekusi tertentu menggunakan properti tag mlflow.parentRunId, yang berisi ID eksekusi dari eksekusi induk.

hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
    filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)

Membandingkan pekerjaan dan model di studio Azure Pembelajaran Mesin (pratinjau)

Untuk membandingkan dan mengevaluasi kualitas pekerjaan dan model Anda di studio Azure Pembelajaran Mesin, gunakan panel pratinjau untuk mengaktifkan fitur tersebut. Setelah diaktifkan, Anda dapat membandingkan parameter, metrik, dan tag antara pekerjaan dan/atau model yang Anda pilih.

Penting

Item yang ditandai (pratinjau) dalam artikel ini sedang dalam pratinjau publik. Versi pratinjau disediakan tanpa perjanjian tingkat layanan, dan tidak disarankan untuk beban kerja produksi. Fitur tertentu mungkin tidak didukung atau mungkin memiliki kemampuan terbatas. Untuk mengetahui informasi selengkapnya, lihat Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure.

Cuplikan layar panel pratinjau memperlihatkan cara membandingkan pekerjaan dan model di studio Azure Pembelajaran Mesin.

MLflow dengan notebook Azure Machine Learning menunjukkan dan memperluas konsep yang disajikan dalam artikel ini.

Matriks dukungan untuk mengkueri eksekusi dan eksperimen

Klien MLflow SDK memaparkan beberapa metode untuk mengambil eksekusi, termasuk opsi untuk mengontrol apa yang dikembalikan dan bagaimana caranya. Gunakan tabel berikut untuk mempelajari metode mana yang saat ini didukung di MLflow saat tersambung ke Azure Machine Learning:

Fitur Didukung oleh MLflow Didukung oleh Azure Pembelajaran Mesin
Pengurutan eksekusi berdasarkan atribut
Pengurutan eksekusi berdasarkan metrik 1
Pengurutan eksekusi berdasarkan parameter 1
Pengurutan eksekusi berdasarkan tag 1
Pemfilteran eksekusi berdasarkan atribut
Pemfilteran eksekusi berdasarkan metrik
Pemfilteran eksekusi berdasarkan metrik dengan karakter khusus (lolos)
Pemfilteran berjalan menurut parameter
Pemfilteran berjalan menurut tag
Pemfilteran ekekusi dengan komparator numerik (metrik) termasuk =, !=, >, >=, <, dan <=
Pemfilteran eksekusi dengan komparator string (parameter, tag, dan atribut): = dan != 2
Pemfilteran eksekusi dengan komparator string (parameter, tag, dan atribut): LIKE/ILIKE
Pemfilteran eksekusi dengan komparator AND
Pemfilteran eksekusi dengan komparator OR
Mengganti nama eksperimen

Catatan

  • 1 Periksa bagian Pemesanan berjalan untuk instruksi dan contoh tentang cara mencapai fungsionalitas yang sama di Azure Pembelajaran Mesin.
  • 2!= untuk tag yang tidak didukung.