Mencatat metrik, parameter, dan file dengan MLflow

BERLAKU UNTUK: Python SDK azure-ai-ml v2 (saat ini)

Azure Machine Learning mendukung eksperimen pengelogan dan pelacakan menggunakan Pelacakan MLflow. Anda dapat mencatat model, metrik, parameter, dan artefak dengan MLflow, baik secara lokal di komputer Anda atau di lingkungan cloud.

Penting

Tidak seperti Azure Pembelajaran Mesin SDK v1, tidak ada fungsionalitas pengelogan di Azure Pembelajaran Mesin SDK untuk Python (v2). Jika Anda menggunakan Azure Pembelajaran Mesin SDK v1 sebelumnya, kami sarankan Anda memanfaatkan MLflow untuk melacak eksperimen. Lihat Memigrasikan pengelogan dari SDK v1 ke MLflow untuk panduan tertentu.

Log dapat membantu Anda mendiagnosis kesalahan dan peringatan, atau melacak metrik performa seperti parameter dan kinerja model. Artikel ini menjelaskan cara mengaktifkan pengelogan dalam skenario berikut:

  • Mencatat metrik, parameter, dan model saat mengirimkan pekerjaan.
  • Lacak eksekusi saat pelatihan secara interaktif.
  • Mencatat metrik secara asinkron.
  • Lihat informasi diagnostik tentang pelatihan.

Tip

Artikel ini menunjukkan cara memantau proses pelatihan model. Jika Anda tertarik untuk memantau penggunaan sumber daya dan peristiwa dari Azure Pembelajaran Mesin, seperti kuota, pekerjaan pelatihan yang selesai, atau penyebaran model yang selesai, lihat Memantau Azure Pembelajaran Mesin.

Prasyarat

  • Anda harus memiliki ruang kerja Azure Machine Learning. Jika Anda tidak memilikinya, lihat Membuat sumber daya ruang kerja.

  • Anda harus menginstal mlflow paket dan azureml-mlflow . Jika tidak, gunakan perintah berikut untuk menginstalnya di lingkungan pengembangan Anda:

    pip install mlflow azureml-mlflow
    

    Catatan

    Untuk pengelogan metrik asinkron, Anda harus memiliki MLflow versi 2.8.0+ dan azureml-mlflow versi 1.55+.

  • Jika Anda melakukan pelacakan jarak jauh (eksperimen pelacakan yang berjalan di luar Azure Pembelajaran Mesin), konfigurasikan MLflow untuk melacak eksperimen. Untuk informasi selengkapnya, lihat Mengonfigurasi MLflow untuk Azure Pembelajaran Mesin.

  • Untuk mencatat metrik, parameter, artefak, dan model dalam eksperimen Anda di Azure Pembelajaran Mesin menggunakan MLflow, cukup impor MLflow ke dalam skrip Anda:

    import mlflow
    

Mengonfigurasi eksperimen

MLflow mengatur informasi dalam eksperimen dan eksekusi (di Azure Pembelajaran Mesin, eksekusi disebut pekerjaan). Ada beberapa perbedaan dalam cara mengonfigurasinya tergantung pada cara Anda menjalankan kode:

Saat berlatih secara interaktif, seperti di Jupyter Notebook, gunakan pola berikut:

  1. Membuat atau mengatur eksperimen aktif.
  2. Memulai pekerjaan.
  3. Gunakan metode pengelogan untuk mencatat metrik dan informasi lainnya.
  4. Mengakhiri pekerjaan.

Misalnya, cuplikan kode berikut mengonfigurasi eksperimen, lalu log selama pekerjaan:

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

Tip

Secara teknis Anda tidak perlu memanggil start_run() karena eksekusi baru dibuat jika tidak ada dan Anda memanggil API pengelogan. Dalam hal ini, Anda dapat menggunakan mlflow.active_run() untuk mengambil eksekusi yang saat ini sedang digunakan. Untuk informasi selengkapnya, lihat mlflow.active_run().

Anda juga dapat menggunakan paradigma manajer konteks:

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

Saat Anda memulai eksekusi baru dengan mlflow.start_run, mungkin berguna untuk menunjukkan parameter run_name, yang kemudian diterjemahkan ke nama eksekusi di antarmuka pengguna Azure Pembelajaran Mesin dan membantu Anda mengidentifikasi eksekusi lebih cepat:

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

Untuk informasi selengkapnya tentang API pengelogan MLflow, lihat referensi MLflow.

Parameter log

MLflow mendukung parameter pengelogan yang digunakan oleh eksperimen Anda. Parameter dapat berjenis apa pun, dan dapat dicatat menggunakan sintaks berikut:

mlflow.log_param("num_epochs", 20)

MLflow juga menawarkan cara mudah untuk mencatat beberapa parameter dengan menunjukkan semuanya menggunakan kamus. Beberapa kerangka kerja juga dapat meneruskan parameter ke model menggunakan kamus dan karenanya ini adalah cara yang mudah untuk mencatatnya dalam eksperimen.

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

Metrik log

Metrik, berlawanan dengan parameter, selalu numerik, dan dapat dicatat baik secara sinkron atau asinkron. Ketika metrik dicatat, metrik tersebut segera tersedia untuk dikonsumsi setelah pengembalian panggilan. Tabel berikut ini menjelaskan cara mencatat jenis numerik tertentu:

Nilai yang dicatat Contoh kode Catatan
Mencatat nilai numerik (int atau float) mlflow.log_metric("my_metric", 1)
Mencatat nilai numerik (int atau float) dari waktu ke waktu mlflow.log_metric("my_metric", 1, step=1) Gunakan parameter step untuk menunjukkan langkah di mana Anda mencatat nilai metrik. Ini bisa berupa angka bilangan bulat apa pun. Defaultnya adalah nol.
Log nilai boolean mlflow.log_metric("my_metric", 0) 0 = Benar, 1 = Salah

Penting

Pertimbangan performa: Jika Anda perlu mencatat beberapa metrik (atau beberapa nilai untuk metrik yang sama), hindari melakukan panggilan ke mlflow.log_metric dalam perulangan. Performa yang lebih baik dapat dicapai dengan menggunakan pengelogan asinkron dengan atau dengan mlflow.log_metric("metric1", 9.42, synchronous=False) mencatat batch metrik.

Log metrik secara asinkron

MLflow juga memungkinkan pengelogan metrik dengan cara asinkron. Pengelogan metrik asinkron sangat berguna dalam kasus dengan throughput tinggi di mana pekerjaan pelatihan besar dengan ratusan simpul komputasi mungkin berjalan dan mencoba mencatat metrik secara bersamaan.

Pengelogan metrik asinkron memungkinkan Anda mencatat metrik dan menunggunya diserap sebelum mencoba membacanya kembali. Pendekatan ini menskalakan ke rutinitas pelatihan besar yang mencatat ratusan ribu nilai metrik.

Metrik log MLflow secara sinkron secara default, namun, Anda dapat mengubah perilaku ini kapan saja:

import mlflow

mlflow.config.enable_async_logging()

Properti yang sama dapat diatur, menggunakan variabel lingkungan:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Untuk mencatat metrik tertentu secara asinkron, gunakan API pengelogan MLflow seperti yang biasanya Anda lakukan, tetapi tambahkan parameter synchronous=Falsetambahan .

import mlflow

with mlflow.start_run():
    # (...)
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)

Ketika Anda menggunakan log_metric(synchronous=False), kontrol secara otomatis dikembalikan ke pemanggil setelah operasi diterima; namun, tidak ada jaminan pada saat itu bahwa nilai metrik telah dipertahankan.

Penting

Bahkan dengan synchronous=False, Azure Pembelajaran Mesin menjamin urutan metrik.

Jika Anda perlu menunggu nilai tertentu dipertahankan di backend, maka Anda dapat menggunakan operasi metrik yang dikembalikan untuk menunggunya, seperti yang ditunjukkan dalam contoh berikut:

import mlflow

with mlflow.start_run():
    # (...)
    run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
    run_operation.wait()
    # (...)

Anda dapat mencatat satu metrik secara asinkron pada satu waktu atau mencatat batch metrik, seperti yang ditunjukkan dalam contoh berikut:

import mlflow
import time
from mlflow.entities import Metric

with mlflow.start_run() as current_run:
    mlflow_client = mlflow.tracking.MlflowClient()

    metrics = {"metric-0": 3.14, "metric-1": 6.28}
    timestamp = int(time.time() * 1000)
    metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]

    run_operation = mlflow_client.log_batch(
        run_id=current_run.info.run_id,
        metrics=metrics_arr,
        synchronous=False,
    )

wait() Operasi ini juga tersedia saat mencatat batch metrik:

run_operation.wait()

Anda tidak perlu memanggil wait() rutinitas jika Anda tidak memerlukan akses langsung ke nilai metrik. Azure Pembelajaran Mesin secara otomatis menunggu ketika pekerjaan akan selesai, untuk melihat apakah ada metrik yang tertunda untuk dipertahankan. Pada saat pekerjaan selesai di Azure Pembelajaran Mesin, semua metrik dijamin akan dipertahankan.

Kurva log atau daftar nilai

Kurva (atau daftar nilai numerik) dapat dicatat dengan MLflow dengan mencatat metrik yang sama beberapa kali. Contoh berikut menunjukkan cara melakukannya:

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

Gambar log

MLflow mendukung dua cara pembuatan log gambar. Kedua cara mempertahankan gambar yang diberikan sebagai artefak di dalam eksekusi.

Nilai yang dicatat Contoh kode Catatan
Log numpy metrik atau objek gambar PIL mlflow.log_image(img, "figure.png") img harus berupa instans numpy.ndarray atau PIL.Image.Image. figure.png adalah nama artefak yang dihasilkan di dalam eksekusi. Tidak harus berupa file yang sudah ada.
Log plot matlotlib atau file gambar mlflow.log_figure(fig, "figure.png") figure.png adalah nama artefak yang dihasilkan di dalam eksekusi. Tidak harus berupa file yang sudah ada.

File log

Secara umum, file dalam MLflow disebut artefak. Anda dapat mencatat artefak dengan berbagai cara di Mlflow:

Nilai yang dicatat Contoh kode Catatan
Mencatat teks dalam file teks mlflow.log_text("text string", "notes.txt") Teks disimpan di dalam eksekusi dalam file teks dengan nama notes.txt.
Kamus log sebagai file JSON dan YAML mlflow.log_dict(dictionary, "file.yaml" dictionary adalah objek kamus yang berisi semua struktur yang ingin Anda pertahankan sebagai file JSON atau YAML.
Mencatat file kecil yang sudah ada mlflow.log_artifact("path/to/file.pkl") File selalu dicatat di akar eksekusi. Jika artifact_path disediakan, maka file dicatat dalam folder seperti yang ditunjukkan dalam parameter tersebut.
Mencatat semua artefak dalam folder yang ada mlflow.log_artifacts("path/to/folder") Struktur folder disalin ke eksekusi, tetapi folder akar yang ditunjukkan tidak disertakan.

Tip

Saat Anda mencatat file besar dengan log_artifact atau log_model, Anda mungkin mengalami kesalahan waktu habis sebelum pengunggahan file selesai. Pertimbangkan untuk meningkatkan nilai batas waktu dengan menyesuaikan variabel AZUREML_ARTIFACTS_DEFAULT_TIMEOUTlingkungan . Nilai defaultnya adalah 300 (detik).

Model log

MLflow memperkenalkan konsep model sebagai cara untuk mengemas semua artefak yang diperlukan agar model tertentu berfungsi. Model dalam MLflow selalu merupakan folder dengan jumlah file arbitrer, tergantung pada kerangka kerja yang digunakan untuk menghasilkan model. Mencatat model memiliki keuntungan melacak semua elemen model sebagai entitas tunggal yang dapat didaftarkan dan kemudian disebarkan. Selain itu, model MLflow mendapatkan manfaat penyebaran tanpa kode dan dapat digunakan dengan dasbor AI yang Bertanggung Jawab di studio. Untuk informasi selengkapnya, lihat Dari artefak ke model di MLflow.

Untuk menyimpan model dari eksekusi pelatihan, gunakan API log_model() untuk kerangka kerja yang sedang Anda kerjakan. Misalnya, mlflow.sklearn.log_model(). Untuk informasi selengkapnya, lihat Pengelogan model MLflow. Untuk memigrasikan model yang ada ke MLflow, lihat Mengonversi model kustom ke MLflow.

Tip

Saat Anda mencatat model besar, Anda mungkin mengalami kesalahan Failed to flush the queue within 300 seconds. Biasanya, itu berarti operasi kehabisan waktu sebelum pengunggahan artefak model selesai. Pertimbangkan untuk meningkatkan nilai batas waktu dengan menyesuaikan variabel AZUREML_ARTIFACTS_DEFAULT_TIMEOUTlingkungan .

Pengelogan otomatis

Dengan Azure Pembelajaran Mesin dan MLflow, pengguna dapat mencatat metrik, parameter model, dan artefak model secara otomatis saat melatih model. Setiap kerangka kerja memutuskan apa yang harus dilacak secara otomatis bagi Anda. Berbagai pustaka pembelajaran mesin populer didukung. Pelajari lebih lanjut Pengelogan otomatis dengan MLflow.

Untuk mengaktifkan pengelogan otomatis, sisipkan kode berikut sebelum kode pelatihan Anda:

mlflow.autolog()

Tip

Anda dapat mengontrol apa yang dicatat secara otomatis dengan autolog. Misalnya, jika Anda menunjukkan mlflow.autolog(log_models=False), MLflow mencatat semuanya kecuali model untuk Anda. Kontrol tersebut berguna dalam kasus di mana Anda ingin mencatat model secara manual tetapi masih menikmati pengelogan otomatis metrik dan parameter. Perhatikan juga bahwa beberapa kerangka kerja mungkin menonaktifkan pengelogan otomatis model jika model terlatih melampaui batas tertentu. Perilaku seperti itu tergantung pada rasa yang digunakan dan kami sarankan Anda melihat dokumentasi jika ini adalah kasus Anda.

Lihat informasi tentang pekerjaan atau eksekusi dengan MLflow

Anda dapat melihat informasi yang dicatat dengan MLflow melalui objek MLflow.entities.Run:

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

Anda dapat melihat metrik, parameter, dan tag untuk dijalankan di bidang data objek yang dijalankan.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

Catatan

Kamus metrik yang ditampilkan pada mlflow.get_run atau mlflow.search_runs hanya mengembalikan nilai yang paling baru dicatat untuk nama metrik tertentu. Misalnya, jika Anda mencatat metrik yang disebut iteration beberapa kali dengan nilai, 1, lalu 2, lalu 3, lalu 4, hanya 4 yang dikembalikan saat memanggil run.data.metrics['iteration'].

Untuk mendapatkan semua metrik yang dicatat untuk nama metrik tertentu, Anda dapat menggunakan MlFlowClient.get_metric_history() seperti yang dijelaskan pada contoh Mendapatkan param serta metrik dari eksekusi.

Tip

MLflow bisa mengambil metrik dan parameter dari beberapa eksekusi secara bersamaan, memungkinkan perbandingan cepat di beberapa uji coba. Untuk mempelajari selengkapnya, lihat Kueri & bandingkan eksperimen dan eksekusi dengan MLflow.

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

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

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

file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")

Untuk informasi selengkapnya, lihat Mendapatkan metrik, parameter, artefak, dan model.

Melihat informasi tentang pekerjaan atau eksekusi di studio

Anda dapat menelusuri catatan pekerjaan yang telah diselesaikan, termasuk metrik yang dicatat, di studio Azure Machine Learning.

Navigasi ke tab Pekerjaan . Untuk melihat semua pekerjaan Anda di Ruang Kerja di seluruh Eksperimen, pilih tab Semua pekerjaan . Anda dapat menelusuri paling detail pekerjaan untuk eksperimen tertentu dengan menerapkan filter Eksperimen di bilah menu atas. Pilih pekerjaan yang menarik untuk memasukkan tampilan detail, lalu pilih tab Metrik .

Pilih metrik yang dicatat untuk merender bagan di sisi kanan. Anda dapat menyesuaikan bagan dengan menerapkan penghalusan, mengubah warna, atau memplot beberapa metrik pada satu grafik. Anda juga bisa mengubah ukuran dan mengatur ulang tata letak sesuai keinginan. Setelah membuat tampilan yang diinginkan, Anda dapat menyimpannya untuk digunakan di masa mendatang dan membagikannya dengan rekan satu tim Anda menggunakan tautan langsung.

Cuplikan layar tampilan metrik.

Melihat serta mengunduh log diagnostik

File log adalah sumber daya penting untuk men-debug beban kerja Azure Pembelajaran Mesin. Setelah mengirimkan tugas pelatihan, telusuri paling detail proses tertentu untuk melihat log dan outputnya:

  1. Buka tab Pekerjaan.
  2. Pilih runID untuk proses tertentu.
  3. Pilih Output dan log di bagian atas halaman.
  4. Pilih Unduh semua untuk mengunduh semua log Anda ke folder zip.
  5. Anda juga dapat mengunduh file log individu dengan memilih file log dan memilih Unduh

Cuplikan layar bagian Output dan log eksekusi.

Folder user_logs

Folder ini berisi informasi mengenai log yang dihasilkan pengguna. Folder ini terbuka secara default, dan log std_log.txt dipilih. std_log.txt adalah tempat log kode Anda (misalnya, pernyataan cetak) muncul. File ini berisi log stdout dan log stderr dari skrip kontrol dan skrip pelatihan Anda, satu log untuk per prosesnya. Dalam kebanyakan kasus, Anda memantau log di sini.

Folder system_logs

Folder ini berisi log yang dihasilkan oleh Azure Pembelajaran Mesin dan ditutup secara default. Log yang dihasilkan oleh sistem dikelompokkan ke dalam folder yang berbeda, berdasarkan tahapan pekerjaan dalam waktu proses.

Folder lainnya

Untuk pelatihan pekerjaan pada kluster multi-komputasi, log ada untuk setiap simpul IP. Struktur untuk setiap node sama dengan pekerjaan satu node. Ada satu lagi folder log untuk log eksekusi secara keseluruhan, yaitu log stderr dan stdout.

Azure Machine Learning mencatat informasi dari berbagai sumber selama pelatihan, seperti AutoML atau kontainer Docker yang menjalankan tugas pelatihan. Banyak dari log ini tidak didokumentasikan. Jika Anda mengalami masalah dan menghubungi dukungan Microsoft, mereka mungkin dapat menggunakan log ini selama pemecahan masalah.