Öğretici: Bir günde Azure Machine Learning

ŞUNLAR IÇIN GEÇERLIDIR: Python SDK azure-ai-ml v2 (geçerli)

Veri bilimcisinin modeli eğitmek için Azure Machine Learning'i (Azure ML) nasıl kullandığını ve ardından modeli tahmin için nasıl kullandığını öğrenin. Bu öğretici, Azure ML'nin temel kavramlarını ve bunların en yaygın kullanımını öğrenmenize yardımcı olur.

Eğitim betiğinizi, betiği çalıştırmak için gereken iş ortamıyla yapılandırılmış, belirtilen bir işlem kaynağında çalıştırmak için bir komut işi göndermeyi öğreneceksiniz.

Eğitim betiği veri hazırlamayı işler, ardından modeli eğitir ve kaydeder. Modeli aldıktan sonra uç nokta olarak dağıtacak ve ardından çıkarım için uç noktayı çağıracaksınız.

Uygulayabileceğiniz adımlar şunlardır:

  • Azure ML çalışma alanınıza bağlanma
  • İşlem kaynağınızı ve iş ortamınızı oluşturma
  • Eğitim betiğinizi oluşturma
  • Uygun iş ortamıyla yapılandırılmış işlem kaynağında eğitim betiğini çalıştırmak için komut işinizi oluşturun ve çalıştırın
  • Eğitim betiğinizin çıkışını görüntüleme
  • Yeni eğitilen modeli uç nokta olarak dağıtma
  • Çıkarım için Azure ML uç noktasını çağırma

Önkoşullar

Not defterinizi çalıştırma

  1. Üst çubukta, Hızlı Başlangıç: Not defterini çalıştırmak için kullanmak üzere Azure Machine Learning'i kullanmaya başlama sırasında oluşturduğunuz işlem örneğini seçin.

  2. Sağ üst kısımda bulunan çekirdeğin olduğundan Python 3.10 - SDK v2emin olun. Aksi takdirde, bu çekirdeği seçmek için açılan listeyi kullanın.

Ekran görüntüsü: Çekirdeği ayarlama.

Önemli

Bu öğreticinin geri kalanında öğretici not defterinin hücreleri yer alır. Bunları kopyalayıp yeni not defterinize yapıştırın veya kopyaladıysanız şimdi not defterine geçin.

Not defterinde tek bir kod hücresi çalıştırmak için kod hücresine tıklayın ve Shift+Enter tuşlarına basın. Öte yandan üst araç çubuğundan Tümünü çalıştır'ı seçerek not defterinin tamamını da çalıştırabilirsiniz.

Çalışma alanına bağlanma

Kodu incelemeden önce Azure ML çalışma alanınıza bağlanmanız gerekir. Çalışma alanı Azure Machine Learning'in en üst düzey kaynağıdır. Azure Machine Learning'i kullanırken oluşturduğunuz tüm yapıtlarla çalışmak için merkezi bir konum sağlar.

Çalışma alanına erişmek için kullanıyoruz DefaultAzureCredential . DefaultAzureCredential Azure SDK kimlik doğrulama senaryolarının çoğunu işlemek için kullanılır.

# Handle to the workspace
from azure.ai.ml import MLClient

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

Sonraki hücreye Abonelik Kimliğinizi, Kaynak Grubu adınızı ve Çalışma Alanı adınızı girin. Bu değerleri bulmak için:

  1. Sağ üst Azure Machine Learning stüdyosu araç çubuğunda çalışma alanı adınızı seçin.
  2. Çalışma alanı, kaynak grubu ve abonelik kimliği değerlerini koda kopyalayın.
  3. Bir değeri kopyalamanız, alanı kapatıp yapıştırmanız ve ardından bir sonraki değer için geri gelmeniz gerekir.

Ekran görüntüsü: Araç çubuğunun sağ üst kısmında kodunuzun kimlik bilgilerini bulma.

# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

Sonuç, diğer kaynakları ve işleri yönetmek için kullanacağınız çalışma alanının işleyicisi olur.

Önemli

MLClient oluşturma çalışma alanına bağlanmaz. İstemci başlatma yavaştır, ilk kez çağrı yapmasını bekler (aşağıdaki not defterinde işlem oluşturma sırasında gerçekleşir).

İşinizi çalıştırmak için işlem kaynağı oluşturma

bir işi çalıştırmak için bir işlem kaynağına ihtiyacınız olacaktır. Linux veya Windows işletim sistemine sahip tek veya çok düğümlü makineler ya da Spark gibi belirli bir işlem dokusu olabilir.

Bir Linux işlem kümesi sağlarsınız. VM boyutları ve fiyatlarıyla ilgili tam listeye bakın.

Bu örnekte yalnızca temel bir kümeye ihtiyacınız vardır, bu nedenle 2 vCPU çekirdeği, 7 GB RAM içeren bir Standard_DS3_v2 modeli kullanır ve bir Azure ML İşlem oluşturursunuz.

from azure.ai.ml.entities import AmlCompute

# Name assigned to the compute cluster
cpu_compute_target = "cpu-cluster"

try:
    # let's see if the compute target already exists
    cpu_cluster = ml_client.compute.get(cpu_compute_target)
    print(
        f"You already have a cluster named {cpu_compute_target}, we'll reuse it as is."
    )

except Exception:
    print("Creating a new cpu compute target...")

    # Let's create the Azure ML compute object with the intended parameters
    cpu_cluster = AmlCompute(
        name=cpu_compute_target,
        # Azure ML Compute is the on-demand VM service
        type="amlcompute",
        # VM Family
        size="STANDARD_DS3_V2",
        # Minimum running nodes when there is no job running
        min_instances=0,
        # Nodes in cluster
        max_instances=4,
        # How many seconds will the node running after the job termination
        idle_time_before_scale_down=180,
        # Dedicated or LowPriority. The latter is cheaper but there is a chance of job termination
        tier="Dedicated",
    )

    # Now, we pass the object to MLClient's create_or_update method
    cpu_cluster = ml_client.compute.begin_create_or_update(cpu_cluster)

print(
    f"AMLCompute with name {cpu_cluster.name} is created, the compute size is {cpu_cluster.size}"
)

İş ortamı oluşturma

AzureML işinizi işlem kaynağınızda çalıştırmak için bir ortama ihtiyacınız vardır. Ortam, eğitim göreceğiniz işlemde yüklenmesini istediğiniz yazılım çalışma zamanını ve kitaplıkları listeler. Yerel makinenizdeki Python ortamınıza benzer.

AzureML, sık kullanılan eğitim ve çıkarım senaryoları için yararlı olan birçok seçilmiş veya hazır ortam sağlar. Docker görüntüsü veya conda yapılandırması kullanarak kendi özel ortamlarınızı da oluşturabilirsiniz.

Bu örnekte, conda yaml dosyası kullanarak işleriniz için özel bir conda ortamı oluşturacaksınız.

İlk olarak, dosyayı depolamak için bir dizin oluşturun.

import os

dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)

Şimdi dosyayı bağımlılıklar dizininde oluşturun. Aşağıdaki hücre, dosyayı yeni oluşturduğunuz dizine yazmak için IPython magic kullanır.

%%writefile {dependencies_dir}/conda.yml
name: model-env
channels:
  - conda-forge
dependencies:
  - python=3.8
  - numpy=1.21.2
  - pip=21.2.4
  - scikit-learn=0.24.2
  - scipy=1.7.1
  - pandas>=1.1,<1.2
  - pip:
    - inference-schema[numpy-support]==1.3.0
    - xlrd==2.0.1
    - mlflow== 1.26.1
    - azureml-mlflow==1.42.0
    - psutil>=5.8,<5.9
    - tqdm>=4.59,<4.60
    - ipykernel~=6.0
    - matplotlib

Belirtim, işinizde kullanacağınız bazı normal paketleri içerir (numpy, pip).

Bu özel ortamı oluşturmak ve çalışma alanınıza kaydetmek için bu yaml dosyasına başvurun:

from azure.ai.ml.entities import Environment

custom_env_name = "aml-scikit-learn"

pipeline_job_env = Environment(
    name=custom_env_name,
    description="Custom environment for Credit Card Defaults pipeline",
    tags={"scikit-learn": "0.24.2"},
    conda_file=os.path.join(dependencies_dir, "conda.yml"),
    image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest",
)
pipeline_job_env = ml_client.environments.create_or_update(pipeline_job_env)

print(
    f"Environment with name {pipeline_job_env.name} is registered to workspace, the environment version is {pipeline_job_env.version}"
)

Komut işi nedir?

Modeli kredi varsayılan tahmini için eğitmek için bir Azure ML komut işi oluşturacaksınız. Komut işi, belirtilen bir işlem kaynağında belirtilen bir ortamda eğitim betiğini çalıştırmak için kullanılır. Ortamı ve işlem kaynağını zaten oluşturdunuz. Ardından eğitim betiğini oluşturacaksınız.

Eğitim betiği, eğitilen modelin veri hazırlığı, eğitimi ve kaydedilmesini işler. Bu öğreticide bir Python eğitim betiği oluşturacaksınız.

Komut işleri CLI, Python SDK veya stüdyo arabiriminden çalıştırılabilir. Bu öğreticide, komut işini oluşturmak ve çalıştırmak için Azure ML Python SDK v2 kullanacaksınız.

Eğitim işini çalıştırdıktan sonra modeli dağıtacak ve ardından tahmin oluşturmak için kullanacaksınız.

Eğitim betiği oluşturma

Başlangıç olarak main.py Python dosyası olan eğitim betiğini oluşturalım.

İlk olarak betik için bir kaynak klasör oluşturun:

import os

train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)

Bu betik, verilerin önceden işlenmesini işler ve verileri test etme ve eğitme işlemine böler. Daha sonra ağaç tabanlı bir modeli eğitmek ve çıkış modelini döndürmek için bu verileri kullanır.

MLFlow , işlem hattı çalıştırmamız sırasında parametreleri ve ölçümleri günlüğe kaydetmek için kullanılacaktır.

Aşağıdaki hücre, yeni oluşturduğunuz dizine eğitim betiğini yazmak için IPython magic kullanır.

%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

def main():
    """Main function of the script."""

    # input and output arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, help="path to input data")
    parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
    parser.add_argument("--n_estimators", required=False, default=100, type=int)
    parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
    parser.add_argument("--registered_model_name", type=str, help="model name")
    args = parser.parse_args()
   
    # Start Logging
    mlflow.start_run()

    # enable autologging
    mlflow.sklearn.autolog()

    ###################
    #<prepare the data>
    ###################
    print(" ".join(f"{k}={v}" for k, v in vars(args).items()))

    print("input data:", args.data)
    
    credit_df = pd.read_excel(args.data, header=1, index_col=0)

    mlflow.log_metric("num_samples", credit_df.shape[0])
    mlflow.log_metric("num_features", credit_df.shape[1] - 1)

    train_df, test_df = train_test_split(
        credit_df,
        test_size=args.test_train_ratio,
    )
    ####################
    #</prepare the data>
    ####################

    ##################
    #<train the model>
    ##################
    # Extracting the label column
    y_train = train_df.pop("default payment next month")

    # convert the dataframe values to array
    X_train = train_df.values

    # Extracting the label column
    y_test = test_df.pop("default payment next month")

    # convert the dataframe values to array
    X_test = test_df.values

    print(f"Training with data of shape {X_train.shape}")

    clf = GradientBoostingClassifier(
        n_estimators=args.n_estimators, learning_rate=args.learning_rate
    )
    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    print(classification_report(y_test, y_pred))
    ###################
    #</train the model>
    ###################

    ##########################
    #<save and register model>
    ##########################
    # Registering the model to the workspace
    print("Registering the model via MLFlow")
    mlflow.sklearn.log_model(
        sk_model=clf,
        registered_model_name=args.registered_model_name,
        artifact_path=args.registered_model_name,
    )

    # Saving the model to a file
    mlflow.sklearn.save_model(
        sk_model=clf,
        path=os.path.join(args.registered_model_name, "trained_model"),
    )
    ###########################
    #</save and register model>
    ###########################
    
    # Stop Logging
    mlflow.end_run()

if __name__ == "__main__":
    main()

Bu betikte görebileceğiniz gibi model eğitildikten sonra model dosyası kaydedilir ve çalışma alanına kaydedilir. Artık uç noktaları çıkarsamada kayıtlı modeli kullanabilirsiniz.

Komutu yapılandırma

artık istediğiniz görevleri gerçekleştirebilen bir betiğiniz olduğuna göre, komut satırı eylemlerini çalıştırabilen genel amaçlı komutu kullanacaksınız. Bu komut satırı eylemi doğrudan sistem komutlarını çağırabilir veya bir betik çalıştırabilir.

Burada giriş verilerini, bölme oranını, öğrenme oranını ve kayıtlı model adını belirtmek için giriş değişkenleri oluşturacaksınız. Komut betiği:

  • Bu komutu çalıştırmak için daha önce oluşturulan işlemi kullanın.
  • Daha önce oluşturulan ortamı kullanın; komut çalıştırıldığında ortamın @latest en son sürümünü belirtmek için gösterimini kullanabilirsiniz.
  • Görünen ad, deneme adı vb. gibi bazı meta verileri yapılandırın. Deneme , belirli bir projede yaptığınız tüm yinelemeler için kapsayıcıdır. Aynı deneme adı altında gönderilen tüm işler Azure ML Studio'da yan yana listelenir.
  • Bu örnekte komut satırı eyleminin kendisini python main.py yapılandırın. Girişlere/çıkışlara komutta gösterimi aracılığıyla ${{ ... }} erişilebilir.
from azure.ai.ml import command
from azure.ai.ml import Input

registered_model_name = "credit_defaults_model"

job = command(
    inputs=dict(
        data=Input(
            type="uri_file",
            path="https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls",
        ),
        test_train_ratio=0.2,
        learning_rate=0.25,
        registered_model_name=registered_model_name,
    ),
    code="./src/",  # location of source code
    command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
    environment="aml-scikit-learn@latest",
    compute="cpu-cluster",
    experiment_name="train_model_credit_default_prediction",
    display_name="credit_default_prediction",
)

İşi gönderme

AzureML'de çalıştırılacak işi gönderme zamanı geldi. Bu kez üzerinde ml_client.jobskullanacaksınızcreate_or_update.

ml_client.create_or_update(job)

İş çıktısını görüntüleme ve işin tamamlanmasını bekleme

Önceki hücrenin çıkışındaki bağlantıyı seçerek Işi AzureML Studio'da görüntüleyin.

Bu işin çıktısı AzureML studio'da şöyle görünür. Ölçümler, çıkışlar vb. gibi çeşitli ayrıntılar için sekmeleri keşfedin. İşlem tamamlandıktan sonra iş, eğitim sonucunda çalışma alanınıza bir model kaydeder.

İşe genel bakışı gösteren ekran görüntüsü

Önemli

Devam etmek için bu not defterine dönmeden önce işin durumunun tamamlanmasını bekleyin. İşin çalıştırılması 2-3 dakika sürer. İşlem kümesinin ölçeği sıfır düğüme düşürüldüyse ve özel ortam hala derleniyorsa daha uzun (10 dakikaya kadar) sürebilir.

Modeli çevrimiçi uç nokta olarak dağıtma

Şimdi makine öğrenmesi modelinizi Azure bulutunda bir web hizmeti olarak dağıtın online endpoint.

Makine öğrenmesi hizmetini dağıtmak için genellikle şunları yapmanız gerekir:

  • Dağıtmak istediğiniz model varlıkları (dosya, meta veriler). Bu varlıkları eğitim işinize zaten kaydettiniz.
  • Hizmet olarak çalıştırılacak bazı kodlar. Kod, modeli belirli bir giriş isteğinde yürütür. Bu giriş betiği dağıtılan bir web hizmetine gönderilen verileri alır ve modele geçirir, ardından modelin istemciye yanıtını döndürür. Betik modelinize özeldir. Giriş betiği, modelin beklediği ve döndürdüğü verileri anlamalıdır. MlFlow modeliyle, bu öğreticide olduğu gibi bu betik sizin için otomatik olarak oluşturulur. Puanlama betikleri örneklerine buradan ulaşabilirsiniz.

Yeni bir çevrimiçi uç nokta oluşturma

Artık kayıtlı bir modeliniz ve çıkarım betiğiniz olduğuna göre çevrimiçi uç noktanızı oluşturmanın zamanı geldi. Uç nokta adının tüm Azure bölgesinde benzersiz olması gerekir. Bu öğreticide kullanarak UUIDbenzersiz bir ad oluşturacaksınız.

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]

Not

Uç nokta oluşturma işleminin yaklaşık 6-8 dakika sürmesini bekleyin.

from azure.ai.ml.entities import (
    ManagedOnlineEndpoint,
    ManagedOnlineDeployment,
    Model,
    Environment,
)

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="this is an online endpoint",
    auth_mode="key",
    tags={
        "training_dataset": "credit_defaults",
        "model_type": "sklearn.GradientBoostingClassifier",
    },
)

endpoint = ml_client.online_endpoints.begin_create_or_update(endpoint).result()

print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

Bir uç nokta oluşturduktan sonra aşağıdaki gibi alabilirsiniz:

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpoint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

Modeli uç noktaya dağıtma

Uç nokta oluşturulduktan sonra modeli giriş betiğiyle dağıtın. Her uç noktanın birden çok dağıtımı olabilir. Kurallar kullanılarak bu dağıtımlara doğrudan trafik belirtilebilir. Burada gelen trafiğin %100'ünün işlendiğini gösteren tek bir dağıtım oluşturacaksınız. Dağıtım için mavi, yeşil, kırmızı dağıtımlar gibi rastgele bir renk adı seçtik.

Kayıtlı modelinizin en son sürümünü belirlemek için Azure ML studio'da Modeller sayfasını kontrol edebilirsiniz. Alternatif olarak, aşağıdaki kod kullanabileceğiniz en son sürüm numarasını alır.

# Let's pick the latest version of the model
latest_model_version = max(
    [int(m.version) for m in ml_client.models.list(name=registered_model_name)]
)

Modelin en son sürümünü dağıtın.

Not

Bu dağıtımın yaklaşık 6-8 dakika sürmesini bekleyin.

# picking the model to deploy. Here we use the latest version of our registered model
model = ml_client.models.get(name=registered_model_name, version=latest_model_version)


# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name=online_endpoint_name,
    model=model,
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

Örnek sorguyla test etme

Artık model uç noktaya dağıtıldığından, çıkarımını onunla çalıştırabilirsiniz.

Puan betiğindeki çalıştırma yönteminde beklenen tasarımı izleyerek örnek bir istek dosyası oluşturun.

deploy_dir = "./deploy"
os.makedirs(deploy_dir, exist_ok=True)
%%writefile {deploy_dir}/sample-request.json
{
  "input_data": {
    "columns": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
    "index": [0, 1],
    "data": [
            [20000,2,2,1,24,2,2,-1,-1,-2,-2,3913,3102,689,0,0,0,0,689,0,0,0,0],
            [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8]
        ]
  }
}
# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="./deploy/sample-request.json",
    deployment_name="blue",
)

Kaynakları temizleme

Uç noktayı kullanmayacaksanız, kaynağı kullanmayı durdurmak için silin. Silmeden önce başka hiçbir dağıtımın uç nokta kullanmadığından emin olun.

Not

Bu adımın yaklaşık 6-8 dakika sürmesini bekleyin.

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Her şeyi sil

Azure Machine Learning çalışma alanınızı ve tüm işlem kaynaklarını silmek için bu adımları kullanın.

Önemli

Oluşturduğunuz kaynaklar, diğer Azure Machine Learning öğreticileri ve nasıl yapılır makalelerinin önkoşulları olarak kullanılabilir.

Oluşturduğunuz kaynaklardan hiçbirini kullanmayı planlamıyorsanız, ücret ödememek için bunları silin:

  1. Azure portalının en sol tarafındaki Kaynak gruplarını seçin.

  2. Listeden oluşturduğunuz kaynak grubunu seçin.

  3. Kaynak grubunu sil'i seçin.

    Azure portalda kaynak grubu silmek için yapılan seçimlerin ekran görüntüsü.

  4. Kaynak grubu adını girin. Ardından Sil’i seçin.

Sonraki adımlar