Öğretici: Bir günde Azure Machine Learning
UYGULANANLAR: Python SDK'sı azure-ai-ml v2 (geçerli)
Veri bilimcisinin modeli eğitmek için Azure Machine Learning'i nasıl kullandığını ve ardından tahmin için modeli nasıl kullandığını öğrenin. Bu öğretici, Azure Machine Learning'in temel kavramlarını ve en yaygın kullanımlarını öğrenmenize yardımcı olur.
Eğitim betiğinizi belirli bir işlem kaynağında çalıştırmak için komut dosyasını çalıştırmak için gereken iş ortamıyla yapılandırılmış 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 Machine Learning ç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 Machine Learning uç noktasını çağırma
Önkoşullar
Aşağıdakiler için Hızlı Başlangıç: Azure Machine Learning'i kullanmaya başlama bölümünü tamamlayın:
- Çalışma alanı oluşturma.
- Geliştirme ortamınızda kullanmak üzere bulut tabanlı bir işlem örneği oluşturun.
Yeni bir not defteri oluşturun veya not defterimizi kopyalayın.
- Hızlı Başlangıç: Yeni bir not defteri oluşturmak için Azure Machine Learning stüdyosu adımlarda Juypter not defterini çalıştırma adımlarını izleyin.
- İsterseniz, hızlı başlangıçtaki adımları kullanarak v2 tutorials klasörünü kopyalayabilir, ardından Dosyabölümünüzdeki tutorials/azureml-in-a-day/azureml-in-a-day.ipynb klasöründen not defterini açabilirsiniz.
Not defterinizi çalıştırma
Ü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.
Sağ üst kısımda bulunan çekirdeğin olduğundan
Python 3.10 - SDK v2
emin olun. Aksi takdirde, bu çekirdeği seçmek için açılan listeyi kullanın.
Ö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. Veya üst araç çubuğundan Tümünü çalıştır'ı seçerek not defterinin tamamını çalıştırın.
Çalışma alanına bağlanma
Kodu incelemeden önce Azure Machine Learning ç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
çoğu Azure SDK kimlik doğrulama senaryolarını 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:
- Sağ üst Azure Machine Learning stüdyosu araç çubuğunda çalışma alanı adınızı seçin.
- Çalışma alanı, kaynak grubu ve abonelik kimliği değerlerini koda kopyalayın.
- Bir değeri kopyalamanız, alanı kapatıp yapıştırmanız ve ardından bir sonraki değer için geri dönmeniz gerekir.
# 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 gecikmelidir, ilk kez çağrı yapmasını bekler (aşağıdaki not defterinde işlem oluşturma sırasında gerçekleşecektir).
İş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 Machine Learning İşlemi 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",
)
print(
f"AMLCompute with name {cpu_cluster.name} will be created, with compute size {cpu_cluster.size}"
)
# Now, we pass the object to MLClient's create_or_update method
cpu_cluster = ml_client.compute.begin_create_or_update(cpu_cluster)
İş ortamı oluşturma
Azure Machine Learning işinizi işlem kaynağınızda çalıştırmak için bir ortama ihtiyacınız vardır. Ortam, eğiteceğ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.
Azure Machine Learning, yaygın 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ı dependencies 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ı olağan paketleri içerir (numpy, pip).
Bu özel ortamı çalışma alanınıza oluşturmak ve 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?
Bir modeli kredi varsayılan tahmini için eğitmek için bir Azure Machine Learning 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ırlama, eğitilmesi ve kaydedilmesini işler. Bu öğreticide bir Python eğitim betiği oluşturacaksınız.
Komut işleri CLI, Python SDK veya studio arabiriminden çalıştırılabilir. Bu öğreticide, komut işini oluşturmak ve çalıştırmak için Azure Machine Learning Python SDK v2'yi 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şleyerek 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ı çıkarsayarak 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ü göstermek için gösterimi 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 bir kapsayıcıdır. Aynı deneme adı altında gönderilen tüm işler Azure Machine Learning stüdyosu'da yan yana listelenir.
- Bu durumda 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
Azure Machine Learning'de çalıştırılacak işi gönderme zamanı geldi. Bu kez üzerinde ml_client.jobs
kullanacaksı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 Azure Machine Learning stüdyosu'de görüntüleyin.
Bu işin çıktısı Azure Machine Learning stüdyosu şö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ğitimin bir sonucu olarak çalışma alanınıza bir model kaydeder.
Ö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 sürebilir (10 dakikaya kadar).
Modeli çevrimiçi uç nokta olarak dağıtma
Şimdi makine öğrenmesi modelinizi Azure bulutunda bir web hizmeti olarak dağıtın online endpoint
.
Bir 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 betiklerinin örneklerini burada bulabilirsiniz.
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 öğretici için kullanarak UUID
benzersiz 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 bekleyebilirsiniz.
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 Machine Learning stüdyosu 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 bekleyebilirsiniz.
# 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 edin
Artık model uç noktaya dağıtıldığından, bununla çıkarım çalıştırabilirsiniz.
Puan betiğindeki çalıştırma yönteminde beklenen tasarımdan sonra bir örnek 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 dağıtımların uç nokta kullanmadığından emin olun.
Not
Bu adımın yaklaşık 6-8 dakika sürmesini bekleyebilirsiniz.
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 makaleleri için önkoşul olarak kullanılabilir.
Oluşturduğunuz kaynaklardan hiçbirini kullanmayı planlamıyorsanız, ücret ödememek için bunları silin:
Azure portalının en sol tarafındaki Kaynak gruplarını seçin.
Listeden oluşturduğunuz kaynak grubunu seçin.
Kaynak grubunu sil'i seçin.
Kaynak grubu adını girin. Ardından Sil’i seçin.
Sonraki adımlar
- Bu öğreticiyi yeniden kullanılabilir bileşenlerle üretime hazır bir işlem hattına dönüştürün.
- Azure Machine Learning için tüm dağıtım seçenekleri hakkında bilgi edinin.
- Dağıtılan modelde kimlik doğrulamayı öğrenin.