MLflow ile ölçümleri, parametreleri ve dosyaları günlüğe kaydetme

ŞUNLAR İÇİN GEÇERLİDİR: Python SDK azure-ai-ml v2 (geçerli)

Azure Machine Learning, MLflow Tracking kullanarak denemeleri günlüğe kaydetmeyi ve izlemeyi destekler. MLflow ile modelleri, ölçümleri, parametreleri ve nesneleri, bilgisayarınızda veya bulut ortamında yerel olarak kayıt altına alabilirsiniz.

Önemli

Azure Machine Learning SDK v1'den farklı olarak, Python için Azure Machine Learning SDK (v2) sürümünde bir güncelleme işlevi bulunmamaktadır. Daha önce Azure Machine Learning SDK v1 kullandıysanız, denemeleri izlemek için MLflow'un kullanılması önerilir. Ayrıntılı yönergeler için Günlüğü SDK v1'den MLflow'a taşımaya bakın.

Günlükler; hataları ve uyarıları tanılamanıza veya parametreler ve model performansı gibi performans ölçümlerini takip etmenize yardımcı olabilir. Bu makalede, aşağıdaki senaryolarda günlüğe kaydetmenin nasıl etkinleştirileceği açıklanmaktadır:

  • İşleri gönderirken ölçümleri, parametreleri ve modelleri günlüğe kaydedin.
  • Etkileşimli eğitim sırasında koşuları izleyin.
  • Ölçümleri zaman uyumsuz olarak günlüğe kaydet.
  • Eğitimle ilgili tanılama bilgilerini görüntüleyin.

İpucu

Bu makalede model eğitim sürecini nasıl izleyebileceğiniz gösterilmiştir. kotalar, tamamlanmış eğitim işleri veya tamamlanmış model dağıtımları gibi Azure Machine Learning kaynak kullanımını ve olaylarını izlemek istiyorsanız bkz. Monitoring Azure Machine Learning.

Önkoşullar

  • Azure Machine Learning çalışma alanınız olmalıdır. Eğer birine sahip değilseniz, Çalışma alanı kaynakları oluşturma bölümüne bakın.

  • Python 3.10 veya üzeri yüklü olmalıdır.

  • mlflow ve azureml-mlflow paketleri yüklü olmalıdır. Kullanmıyorsanız, bunları geliştirme ortamınıza yüklemek için aşağıdaki komutu kullanın:

    pip install mlflow azureml-mlflow
    

    Not

    Asenkron ölçümleri kaydetmek için MLflow sürüm 2.8.0+ ve azureml-mlflow sürüm 1.55+'e sahip olmanız gerekir.

  • Uzaktan izleme (Azure Machine Learning dışında çalışan izleme denemeleri) yapıyorsanız, denemeleri izlemek için MLflow'u yapılandırın. Daha fazla bilgi için bkz. Azure Machine Learning için MLflow yapılandırma.

  • Azure Machine Learning deneylerinizde MLflow kullanarak ölçümleri, parametreleri, artefaktları ve modelleri günlüğe kaydetmek için MLflow'ı betiğinize aktarmanız yeterlidir:

    import mlflow
    

Denemeleri yapılandırma

MLflow, denemelerdeki ve çalıştırmalardaki bilgileri düzenler (Azure Machine Learning çalıştırmalara iş adı verilir). Kodunuzu nasıl çalıştırdığınıza bağlı olarak bunları yapılandırma konusunda bazı farklılıklar vardır:

Etkileşimli eğitim yaparken ( örneğin, bir Jupyter Notebook) aşağıdaki deseni kullanın:

  1. Etkin denemeyi oluşturun veya ayarlayın.
  2. İşi başlatın.
  3. Ölçümleri ve diğer bilgileri kaydetmek için günlüğe kaydetme yöntemlerini kullanın.
  4. İşi bitir.

Örneğin, aşağıdaki kod parçacığı denemeyi yapılandırıp bir iş sırasında günlüğe kaydeder:

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()

İpucu

Teknik olarak, start_run() çağırmanız gerekmez, çünkü mevcut değilse yeni bir oturum oluşturulur ve bir günlük API'si çağırırsınız. Bu durumda, şu anda kullanılmakta olan çalıştırmayı almak için mlflow.active_run() kullanabilirsiniz. Daha fazla bilgi için bkz . mlflow.active_run().

Bağlam yöneticisi paradigması da kullanabilirsiniz:

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

mlflow.start_run ile yeni bir çalıştırma başlattığınızda, Azure Machine Learning kullanıcı arabiriminde çalıştırmanın adına çevrilen ve çalıştırmayı daha hızlı belirlemenize yardımcı olan run_name parametresini belirtmek yararlı olabilir:

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

MLflow loglama API'leri hakkında daha fazla bilgi için MLflow referansına bakın.

Günlük parametreleri

MLflow, denemeleriniz tarafından kullanılan kayıt parametrelerini destekler. Parametreler herhangi bir türde olabilir ve aşağıdaki söz dizimi kullanılarak günlüğe kaydedilebilir:

mlflow.log_param("num_epochs", 20)

MLflow, birden çok parametreyi tümünü sözlük kullanarak belirterek günlüğe kaydetmek için kullanışlı bir yol da sunar. Çeşitli çerçeveler de sözlükleri kullanarak modellere parametre geçirebilir ve bu nedenle bu, bunları denemede günlüğe kaydetmenin kullanışlı bir yoludur.

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

mlflow.log_params(params)

Kayıt ölçümleri

Parametrelerin aksine, ölçümler her zaman sayısaldır ve senkron veya asenkron olarak kaydedilebilir. Ölçümler günlüğe kaydedildiğinde, çağrı dönüşünden sonra hemen kullanıma sunulur. Aşağıdaki tabloda belirli sayısal türlerin nasıl kaydının yapıldığı açıklanır.

Kaydedilen değer Örnek kod Notlar
Sayısal bir değeri günlüğe kaydet (int veya float) mlflow.log_metric("my_metric", 1)
Zaman içinde sayısal bir değeri (int veya float) kaydetme mlflow.log_metric("my_metric", 1, step=1) Ölçüm değerini günlüğe kaydettiğiniz adımı belirtmek için step parametresini kullanın. Herhangi bir tamsayı olabilir. Varsayılan olarak sıfır olur.
Boole değerini günlüğe kaydet mlflow.log_metric("my_metric", 0) 0 = Yanlış, 1 = Doğru

Önemli

Performansla ilgili dikkat edilmesi gerekenler: Birden çok ölçümü (veya aynı ölçüm için birden çok değeri) günlüğe mlflow.log_metric kaydetmeniz gerekiyorsa döngüler halinde çağrı yapmaktan kaçının. Zaman uyumsuz günlük kaydı kullanılarak mlflow.log_metric("metric1", 9.42, synchronous=False) veya toplu ölçümler kaydedilerek daha iyi performans elde edilebilir.

Ölçümleri zaman uyumsuz olarak kaydetmek

MLflow ayrıca metriklerin eşzamansız olarak günlüğe kaydedilmesine olanak tanır. Zaman uyumsuz metrik kaydı, onlarca bilgisayar düğümüne sahip büyük eğitim işleri çalışırken ve metrikleri aynı anda kaydetmeye çalıştıkları durumlarda özellikle faydalıdır. Az sayıda düğüm yüksek sayıda metriği kaydetmeye çalıştığında da kullanışlıdır.

Asenkron metrik günlüğü, metriklerin arka uç hizmetinde oluşmasını beklemeden bunları hemen kaydetmenizi sağlar. Bu yaklaşım, yüz binlerce ölçüm değerini günlüğe kaydeden büyük eğitim yordamlarına ölçeklendirilir ve önerilen yaklaşım budur.

MLflow ölçümleri varsayılan olarak eş zamanlı kayıt eder, ancak bu davranışı istediğiniz zaman değiştirebilirsiniz.

import mlflow

mlflow.config.enable_async_logging()

Kodunuz genelindeki ölçümlerin asenkron olarak günlüğe kaydedilmesini etkinleştirmek istediğinizde ve/veya gerçek ölçümleri günlüğe kaydetmek için mlflow sarmalayan bir sarmalayıcı kitaplık kullandığınızda, bahsedilen global bayrağı kullanmanız önerilir.

Ortam değişkeni kullanılarak aynı özellik ayarlanabilir:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Belirli ölçümleri zaman uyumsuz olarak kaydetmek için MLflow loglama API'sini her zamanki gibi kullanın, ancak synchronous=False ek parametresini ekleyin.

Zaman uyumsuz olarak synchronous=False kullanarak oturum açmak için genel bayrağı ayarlarsanız, mlflow.config.enable_async_logging() ayarlamak isteğe bağlıdır.

import mlflow

with mlflow.start_run():
    # (...)
    # when global async logging flag is not set using - mlflow.config.enable_async_logging()
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
import mlflow
# Set global async logging flag
mlflow.config.enable_async_logging()

with mlflow.start_run():
    # (...)
    # You can use all fluent syntax or MlflowClient APIs and all of them will log metrics in asynchronous fashion.
    mlflow.log_metric("metric1", 9.42)
    # (...)

kullandığınızda log_metric(synchronous=False), işlem kabul edildikten sonra denetim çağırana otomatik olarak döndürülür; ancak değer hemen okunamayabilir. Ölçümlerin zaman uyumsuz günlüğe kaydedilmesi sırayı garanti etmez ve günlüğe kaydedildikleri zaman damgasıyla kalıcı olarak depolanır.

Önemli

synchronous=False ile Azure Machine Learning, ölçümlerin sıralanmasını bile garanti eder.

Arka uçta belirli bir değerin kalıcı olmasını beklemeniz gerekiyorsa, aşağıdaki örnekte gösterildiği gibi, bu değeri beklemek için döndürülen ölçüm işlemini kullanabilirsiniz:

import mlflow

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

Aşağıdaki örnekte gösterildiği gibi, bir ölçümü zaman uyumsuz olarak bir kerede günlüğe kaydedebilir veya bir grup ölçümü günlüğe kaydedebilirsiniz:

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,
        #Optional when global async logging flag is set using - mlflow.enable_async_logging()
        synchronous=False,
    )

Bu wait() operasyon, bir grup ölçüm kaydederken de kullanılabilir.

run_operation.wait()

Ölçüm değerlerine anında access ihtiyacınız yoksa rutinlerinizde wait() çağırmanız gerekmez. Azure Machine Learning, işin bitmek üzere olduğu zaman, kalıcı hale getirilmesi gereken bir ölçüm olup olmadığını görmek için otomatik olarak bekler. Azure Machine Learning'de bir iş tamamlandığında, tüm ölçümlerin kalıcı hale getirildiği garanti edilir.

Kayıt eğrileri veya değer listesi

Eğriler (veya sayısal değerler listesi), aynı ölçümü birden çok kez günlüğe kaydederek MLflow ile günlüğe kaydedilebilir. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

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])

Günlük görüntüleri

MLflow, resimleri günlüğe kaydetmenin iki yolunu destekler. Her iki yöntem de verilen görüntüyü işleme sürecinin içinde bir artifakt olarak kalıcı hale getirir.

Kaydedilen değer Örnek kod Notlar
Numpy ölçümlerini veya PIL görüntüsü nesnelerini kaydet mlflow.log_image(img, "figure.png") img bir numpy.ndarray veya PIL.Image.Image örneği olmalıdır. figure.png çalıştırmanın içinde oluşturulan yapıtın adıdır. Mevcut bir dosya olması gerekmez.
Matplotlib çizimini veya görüntü dosyasını kaydet mlflow.log_figure(fig, "figure.png") figure.png çalıştırmanın içinde oluşturulan yapıtın adıdır. Mevcut bir dosya olması gerekmez.

Günlük dosyaları

Genel olarak, MLflow'daki dosyalar artifacts olarak adlandırılır. Mlflow'da artefaktları birden fazla şekilde kaydedebilirsiniz.

Kaydedilen değer Örnek kod Notlar
Metin dosyasındaki metni günlüğe kaydetme mlflow.log_text("text string", "notes.txt") Metin, adı notes.txt olan bir metin dosyasında çalıştırmanın içinde kalıcıdır.
Sözlükleri JSON ve YAML dosyaları olarak günlüğe kaydetme mlflow.log_dict(dictionary, "file.yaml") dictionary , JSON veya YAML dosyası olarak kalıcı hale getirmek istediğiniz tüm yapıyı içeren bir sözlük nesnesidir.
Zaten var olan küçük bir dosyayı kaydet. mlflow.log_artifact("path/to/file.pkl") Dosyalar her zaman çalıştırmanın ana dizinine kaydedilir. Sağlanırsa artifact_path , dosya bu parametrede gösterildiği gibi bir klasöre kaydedilir.
Mevcut bir klasördeki tüm artefaktları günlüğe kaydet mlflow.log_artifacts("path/to/folder") Klasör yapısı çalıştırma işlemine kopyalanır, ancak belirtilen kök klasör dahil edilmez.

İpucu

log_artifact veya log_model ile büyük dosyaları günlüğe kaydettiğinizde, dosyanın karşıya yüklenmesi tamamlanmadan önce zaman aşımı hatalarıyla karşılaşabilirsiniz. ortam değişkenini AZUREML_ARTIFACTS_DEFAULT_TIMEOUTayarlayarak zaman aşımı değerini artırmayı göz önünde bulundurun. Varsayılan değeri 300'dür (saniye).

Kayıt modelleri

MLflow, bir modelin çalışabilmesi için gereken tüm artefaktları paketlemenin bir yolu olarak "modeller" kavramını tanıtır. MLflow'daki modeller, modeli oluşturmak için kullanılan çerçeveye bağlı olarak her zaman rastgele sayıda dosya içeren bir klasördir. Günlüğe kaydetme modelleri, modelin tüm öğelerini kaydedilebilen ve sonra dağıtılabilir tek bir varlık olarak izleme avantajına sahiptir. Buna ek olarak, MLflow modelleri kodsuz dağıtım avantajından yararlanabilir ve studio'daki Sorumlu yapay zeka panosuyla kullanılabilir. Daha fazla bilgi için bkz. MLflow'da eserlerden modellere geçiş.

Modeli bir eğitim çalıştırmasından kaydetmek için üzerinde çalıştığınız çerçevenin API'sini kullanın log_model() . Örneğin, mlflow.sklearn.log_model(). Daha fazla bilgi için bkz. MLflow modellerini günlüğe kaydetme. Mevcut modelleri MLflow'a geçirmek için bkz . Özel modelleri MLflow'a dönüştürme.

İpucu

Büyük modelleri günlüğe kaydettiğinizde Failed to flush the queue within 300 seconds hatasıyla karşılaşabilirsiniz. Genellikle, modelin artifacts'larının yüklenmesi tamamlanmadan önce işlemin zaman aşımına uğradığı anlamına gelir. ortam değişkenini AZUREML_ARTIFACTS_DEFAULT_TIMEOUTayarlayarak zaman aşımı değerini artırmayı göz önünde bulundurun.

Otomatik günlük kaydı

Azure Machine Learning ve MLflow ile kullanıcılar bir modeli eğitirken ölçümleri, model parametrelerini ve model çıktıları otomatik olarak günlüğe kaydedebilir. Sizin için otomatik olarak nelerin izeceğine her çerçeve karar verir. Çeşitli popüler makine öğrenimi kütüphaneleri desteklenmektedir. MLflow ile otomatik günlük kaydı hakkında daha fazla bilgi edinin.

Otomatik günlüğü etkinleştirmek için eğitim scriptinizin önüne aşağıdaki kodu ekleyin:

mlflow.autolog()

İpucu

Otomatik oturum açma ile otomatik olarak günlüğe nelerin kaydedilebileceğini denetleyebilirsiniz. Örneğin, mlflow.autolog(log_models=False) belirtirseniz, MLflow sizin için modeller haricinde her şeyi loglar. Bu tür denetim, modelleri el ile günlüğe kaydetmek istediğiniz ancak yine de ölçümlerin ve parametrelerin otomatik olarak günlüğe kaydedilmesini istediğiniz durumlarda kullanışlıdır. Ayrıca, eğitilen model belirli sınırların ötesine geçtiğinde bazı çerçevelerin modellerin otomatik günlüğe kaydedilmesini devre dışı bırakabileceğine dikkat edin. Bu tür davranış, kullanılan sürüme bağlıdır ve bu sizin durumunuzsa belgeleri görüntülemenizi öneririz.

MLflow ile görevler veya yürütmeler hakkındaki bilgileri görüntüleyin.

MLflow kullanarak günlüğe kaydedilen bilgileri MLflow.entities.Run nesnesi aracılığıyla görüntüleyebilirsiniz:

import mlflow

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

Çalıştırmanın ölçümlerini, parametrelerini ve etiketlerini çalıştırma nesnesinin veri alanında görüntüleyebilirsiniz.

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

Not

mlflow.get_run veya mlflow.search_runs tarafından döndürülen ölçüm sözlüğü, belirli bir ölçüm adı için yalnızca en son kaydedilen değeri döndürür. Örneğin, iteration adlı bir ölçümü 1, sonra 2, sonra 3, ve 4 değerleriyle birden çok kez günlüğe kaydederseniz, çağrıldığında sadece run.data.metrics['iteration'] döndürülür.

Belirli bir ölçüm adı için günlüğe kaydedilen tüm ölçümleri almak için, bir çalıştırmadan parametreleri ve ölçümleri alma konusunda açıklandığı gibi MlFlowClient.get_metric_history() kullanabilirsiniz.

İpucu

MLflow aynı anda birden çok çalıştırmadan ölçüm ve parametre alabilir ve birden çok denemede hızlı karşılaştırmalar yapabilir. Daha fazla bilgi edinmek için MLflow ile denemeleri ve çalıştırmaları sorgulama ve karşılaştırma bölümüne bakın.

MLflow, bir çalıştırma tarafından günlüğe kaydedilen tüm yapıtları sorgulayabilir. Artifacts çalıştırma nesnesinin kendisi kullanılarak erişilemiyor ve bunun yerine MLflow istemcisi kullanılmalıdır:

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

Bu yöntem, çalıştırma sırasında günlüğe kaydedilen tüm artifacts'ları listeler, ancak bunlar Azure Machine Learning depolama alanındaki artifacts deposunda saklanır. Bunlardan herhangi birini indirmek için yöntemini download_artifacts kullanın:

file_path = mlflow.artifacts.download_artifacts(run_id="<RUN_ID>", artifact_path="feature_importance_weight.png")

Daha fazla bilgi için bkz. Ölçüm, parametre, artefakt ve model elde etme.

Stüdyodaki görevler veya çalışmalar hakkındaki bilgileri görüntüleme

Azure Machine Learning Stüdyosu üzerinden, günlüğe kaydedilen ölçümler de dahil olmak üzere, tamamlanmış iş kayıtlarına göz atabilirsiniz.

İşler sekmesine gidin. Denemeler genelinde Çalışma Alanınızdaki tüm işlerinizi görüntülemek için Tüm işler sekmesini seçin. Üst menü çubuğundaki Deneme filtresini uygulayarak belirli denemeler için işlerde detaya gidebilirsiniz. Ayrıntılar görünümünü girmek için ilgilendiğim işi seçin ve ardından Ölçümler sekmesini seçin.

Günlüğe kaydedilen ölçümleri seçin ve sağ tarafta grafikleri görüntüleyin. Tek bir grafikte düzeltme uygulayarak, rengi değiştirerek veya birden çok ölçüm çizerek grafikleri özelleştirebilirsiniz. Ayrıca düzeni istediğiniz gibi yeniden boyutlandırabilir ve yeniden düzenleyebilirsiniz. İstediğiniz görünümü oluşturduktan sonra, daha sonra kullanmak üzere kaydedebilir ve doğrudan bağlantı kullanarak ekip arkadaşlarınızla paylaşabilirsiniz.

Ölçümler görünümünün ekran görüntüsü.

Tanılama günlüklerini görüntüleme ve indirme

Günlük dosyaları, Azure Machine Learning iş yüklerinde hata ayıklamak için temel bir kaynaktır. Eğitim işini gönderdikten sonra, logları ve çıktıları görüntülemek için belirli bir çalıştırmanın detayına inin.

  1. İşler sekmesine gidin.
  2. Belirli bir çalıştırma için runID'yi seçin.
  3. Sayfanın üst kısmındaki Çıkışlar ve günlükler'i seçin.
  4. Tüm günlüklerinizi bir zip klasörüne indirmek için Tümünü indir'i seçin.
  5. Günlük dosyasını seçip İndir'i seçerek tek tek günlük dosyalarını da indirebilirsiniz

Çalıştırmanın Çıkış ve günlükler bölümünün ekran görüntüsü.

user_logs klasörü

Bu klasör, kullanıcı tarafından oluşturulan günlükler hakkında bilgi içerir. Bu klasör varsayılan olarak açıktır ve std_log.txt günlüğü seçilidir. std_log.txt, kodunuzun günlüklerinin göründüğü yerdir (örneğin, print ifadeleri). Bu dosya, denetim betiğinizden stdout logları ve eğitim betiğinizden stderr logları, her işlem için birer tane içerir. Çoğu durumda günlükleri burada izlersiniz.

system_logs klasörü

Bu klasör, Azure Machine Learning tarafından oluşturulan günlükleri içerir ve varsayılan olarak kapattır. Sistem tarafından oluşturulan günlükler, çalışma zamanındaki işin aşamasına göre farklı klasörler halinde gruplandırılır.

Diğer klasörler

Çoklu işlem kümeleri üzerinde iş eğitimi için her IP düğümü için günlükler bulunur. Her düğümün yapısı tek düğümlü işler ile aynıdır. Genel yürütme, stderr ve stdout günlükleri için bir günlük klasörü daha vardır.

Azure Machine Learning, eğitim sırasında AutoML veya eğitim işini çalıştıran Docker kapsayıcısı gibi çeşitli kaynaklardan gelen bilgileri günlüğe kaydeder. Bu günlüklerin çoğu belgelenmemiştir. Sorunlarla karşılaşır ve Microsoft support ile iletişim kurarsanız, sorun giderme sırasında bu günlükleri kullanabilirler.