Azure Machine Learning ile PyTorch modellerini uygun ölçekte eğitme
UYGULANANLAR: Python SDK'sı azure-ai-ml v2 (geçerli)
Bu makalede, Azure Machine Learning Python SDK v2 kullanarak bir PyTorch modelini eğitmeyi, hiper parametre ayarlamayı ve dağıtmayı öğreneceksiniz.
Bu makaledeki örnek betikleri, PyTorch'un transfer öğrenme öğreticisini temel alan bir derin öğrenme sinir ağı (DNN) oluşturmak üzere tavuk ve hindi görüntülerini sınıflandırmak için kullanacaksınız. Öğrenme aktarımı, bir sorunun çözümünden elde edilen bilgileri farklı ama ilgili bir soruna uygulayan bir tekniktir. Öğrenme aktarımı sıfırdan eğitime kıyasla daha az veri, zaman ve işlem kaynağı gerektirerek eğitim sürecini kısaltır. Öğrenme aktarımı hakkında daha fazla bilgi edinmek için derin öğrenme ve makine öğrenmesi makalesine bakın.
İster sıfırdan bir derin öğrenme PyTorch modeli eğitin ister mevcut bir modeli buluta taşıyın, Azure Machine Learning'i kullanarak esnek bulut işlem kaynaklarını kullanarak açık kaynak eğitim işlerinin ölçeğini genişletebilirsiniz. Azure Machine Learning ile üretim sınıfı modeller oluşturabilir, dağıtabilir, sürüm oluşturabilir ve izleyebilirsiniz.
Önkoşullar
Bu makaleden yararlanmak için şunları yapmanız gerekir:
- Azure aboneliğine erişme. Henüz bir hesabınız yoksa ücretsiz bir hesap oluşturun.
- Azure Machine Learning işlem örneğini veya kendi Jupyter not defterinizi kullanarak bu makaledeki kodu çalıştırın.
- Azure Machine Learning işlem örneği— indirme veya yükleme gerekmez
- Hızlı Başlangıcı tamamlayın: SDK ve örnek depo ile önceden yüklenmiş ayrılmış bir not defteri sunucusu oluşturmak için Azure Machine Learning'i kullanmaya başlayın .
- Not defteri sunucusundaki örnekler derin öğrenme klasöründe şu dizine giderek tamamlanmış ve genişletilmiş bir not defteri bulun: v2 > sdk > python > işleri > tek adımlı > pytorch > train-hyperparameter-tune-deploy-with-pytorch.
- Jupyter not defteri sunucunuz
- Azure Machine Learning SDK'sını (v2) yükleyin.
- pytorch_train.py eğitim betiği dosyasını indirin.
- Azure Machine Learning işlem örneği— indirme veya yükleme gerekmez
Bu kılavuzun tamamlanmış Jupyter Notebook sürümünü GitHub örnekleri sayfasında da bulabilirsiniz.
Gpu kümesi oluşturmak için bu makaledeki kodu çalıştırabilmeniz için önce çalışma alanınız için kota artışı istemeniz gerekir.
İşi ayarlama
Bu bölüm, gerekli Python paketlerini yükleyerek, bir çalışma alanına bağlanarak, komut işini çalıştırmak için bir işlem kaynağı oluşturarak ve işi çalıştıracak bir ortam oluşturarak işi eğitim için ayarlar.
Çalışma alanına bağlanma
İlk olarak Azure Machine Learning çalışma alanınıza bağlanmanız gerekir. Azure Machine Learning çalışma alanı, hizmetin 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 yer sağlar.
Çalışma alanına erişmek için kullanıyoruz DefaultAzureCredential
. Bu kimlik bilgisi, Azure SDK kimlik doğrulama senaryolarının çoğunu işleyememelidir.
Sizin için işe yaramazsa DefaultAzureCredential
, bkz azure-identity reference documentation
. veya Set up authentication
daha fazla kullanılabilir kimlik bilgisi için.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Oturum açmak ve kimlik doğrulaması yapmak için bir tarayıcı kullanmayı tercih ediyorsanız, aşağıdaki kodun açıklamasını kaldırıp bunu kullanmanız gerekir.
# Handle to the workspace
# from azure.ai.ml import MLClient
# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()
Ardından, Abonelik Kimliğinizi, Kaynak Grubu adınızı ve çalışma alanı adınızı sağlayarak çalışma alanına bir tanıtıcı alın. Bu parametreleri bulmak için:
- Azure Machine Learning stüdyosu araç çubuğunun sağ üst köşesinde çalışma alanı adınızı arayın.
- Kaynak Grubunuzu ve Abonelik Kimliğinizi göstermek için çalışma alanı adınızı seçin.
- Kaynak Grubu ve Abonelik Kimliği değerlerini koda kopyalayın.
# 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>",
)
Bu betiği çalıştırmanın sonucu, diğer kaynakları ve işleri yönetmek için kullanacağınız bir çalışma alanı tanıtıcısıdır.
Not
- Oluşturma
MLClient
, istemciyi çalışma alanına bağlamaz. İstemci başlatma gecikmelidir ve ilk kez çağrı yapmasını bekler. Bu makalede, işlem oluşturma sırasında bu durum oluşur.
İşi çalıştırmak için işlem kaynağı oluşturma
Azure Machine Learning'in bir işi çalıştırmak için bir işlem kaynağına ihtiyacı vardır. Bu kaynak, Linux veya Windows işletim sistemine sahip tek veya çok düğümlü makineler ya da Spark gibi belirli bir işlem dokusu olabilir.
Aşağıdaki örnek betikte bir Linux compute cluster
sağlıyoruz. VM boyutlarının Azure Machine Learning pricing
ve fiyatlarının tam listesi için sayfayı görebilirsiniz. Bu örnek için bir GPU kümesine ihtiyacımız olduğundan, bir STANDARD_NC6 modeli seçelim ve bir Azure Machine Learning işlem oluşturalım.
from azure.ai.ml.entities import AmlCompute
gpu_compute_taget = "gpu-cluster"
try:
# let's see if the compute target already exists
gpu_cluster = ml_client.compute.get(gpu_compute_taget)
print(
f"You already have a cluster named {gpu_compute_taget}, we'll reuse it as is."
)
except Exception:
print("Creating a new gpu compute target...")
# Let's create the Azure ML compute object with the intended parameters
gpu_cluster = AmlCompute(
# Name assigned to the compute cluster
name="gpu-cluster",
# Azure ML Compute is the on-demand VM service
type="amlcompute",
# VM Family
size="STANDARD_NC6s_v3",
# 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
gpu_cluster = ml_client.begin_create_or_update(gpu_cluster).result()
print(
f"AMLCompute with name {gpu_cluster.name} is created, the compute size is {gpu_cluster.size}"
)
İş ortamı oluşturma
Azure Machine Learning işini çalıştırmak için bir ortama ihtiyacınız vardır. Azure Machine Learning ortamı , işlem kaynağınızda makine öğrenmesi eğitim betiğinizi çalıştırmak için gereken bağımlılıkları (yazılım çalışma zamanı ve kitaplıklar gibi) kapsüller. Bu ortam, yerel makinenizdeki python ortamına benzer.
Azure Machine Learning, seçilmiş (veya hazır) bir ortam kullanmanıza ya da Docker görüntüsü veya Conda yapılandırması kullanarak özel bir ortam oluşturmanıza olanak tanır. Bu makalede, seçilen Azure Machine Learning ortamını AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu
yeniden kullanacaksınız. yönergesini kullanarak @latest
bu ortamın en son sürümünü kullanacaksınız.
curated_env_name = "AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu@latest"
Eğitim işinizi yapılandırma ve gönderme
Bu bölümde, eğitime yönelik verileri tanıtarak başlayacağız. Daha sonra sağladığımız bir eğitim betiğini kullanarak bir eğitim işinin nasıl çalıştırıldığını ele alacağız. Eğitim betiğini çalıştırmak için komutunu yapılandırarak eğitim işini oluşturmayı öğreneceksiniz. Ardından, Azure Machine Learning'de çalıştırılacak eğitim işini göndereceksiniz.
Eğitim verilerini alma
Ortak blobda depolanan verileri zip dosyası olarak kullanacaksınız. Bu veri kümesi iki sınıf (hindi ve tavuk) için yaklaşık 120 eğitim görüntüsünden ve her sınıf için 100 doğrulama görüntüsünden oluşur. Görüntüler, Açık Görüntüler v5 Veri Kümesinin bir alt kümesidir. Eğitim betiğimizin pytorch_train.py
bir parçası olarak veri kümesini indirip ayıklayacağız.
Eğitim betiğini hazırlama
Bu makalede pytorch_train.py eğitim betiğini sağladık. Uygulamada, herhangi bir özel eğitim betiğini olduğu gibi alabilmeniz ve kodunuzu değiştirmek zorunda kalmadan Azure Machine Learning ile çalıştırabilmeniz gerekir.
Sağlanan eğitim betiği verileri indirir, bir modeli eğiter ve modeli kaydeder.
Eğitim işini oluşturma
İşinizi çalıştırmak için gereken tüm varlıklara sahip olduğunuz için artık Azure Machine Learning Python SDK v2'yi kullanarak oluşturmanın zamanı geldi. Bu örnekte bir command
oluşturacağız.
Azure Machine Learning command
, eğitim kodunuzu bulutta yürütmek için gereken tüm ayrıntıları belirten bir kaynaktır. Bu ayrıntılar giriş ve çıkışları, kullanılacak donanım türünü, yüklenecek yazılımları ve kodunuzu çalıştırmayı içerir. , command
tek bir komut yürütmeye ilişkin bilgiler içerir.
Komutu yapılandırma
Eğitim betiğini çalıştırmak ve istediğiniz görevleri gerçekleştirmek için genel amacı command
kullanacaksınız. Eğitim işinizin yapılandırma ayrıntılarını belirtmek için bir Command
nesne oluşturun.
from azure.ai.ml import command
from azure.ai.ml import Input
job = command(
inputs=dict(
num_epochs=30, learning_rate=0.001, momentum=0.9, output_dir="./outputs"
),
compute=gpu_compute_taget,
environment=curated_env_name,
code="./src/", # location of source code
command="python pytorch_train.py --num_epochs ${{inputs.num_epochs}} --output_dir ${{inputs.output_dir}}",
experiment_name="pytorch-birds",
display_name="pytorch-birds-image",
)
- Bu komutun girişleri dönem sayısını, öğrenme hızını, momentum'u ve çıkış dizinini içerir.
- Parametre değerleri için:
- bu komutu çalıştırmak için oluşturduğunuz işlem kümesini
gpu_compute_target = "gpu-cluster"
sağlayın; - daha önce başlatmış olduğunuz seçilmiş ortamı
AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu
sağlayın; - komut satırı eylemini yapılandırın; bu örnekte komut şeklindedir
python pytorch_train.py
. Komuttaki giriş ve çıkışlara gösterimi aracılığıyla${{ ... }}
erişebilirsiniz; ve - görünen ad ve deneme adı gibi meta verileri yapılandırın; burada bir deneme, belirli bir projede yapılan 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 komutu çalıştırmak için oluşturduğunuz işlem kümesini
İşi gönderme
Azure Machine Learning'de çalıştırılacak işi gönderme zamanı geldi. Bu kez üzerinde kullanacaksınız create_or_update
ml_client.jobs
.
ml_client.jobs.create_or_update(job)
İşlem tamamlandıktan sonra iş çalışma alanınıza bir model kaydeder (eğitimin bir sonucu olarak) ve işi Azure Machine Learning stüdyosu görüntülemek için bir bağlantı oluşturur.
Uyarı
Azure Machine Learning, tüm kaynak dizini kopyalayarak eğitim betiklerini çalıştırır. Karşıya yüklemek istemediğiniz hassas verileriniz varsa bir .ignore dosyası kullanın veya dosyayı kaynak dizine eklemeyin.
İş yürütme sırasında ne olur?
İş yürütülürken aşağıdaki aşamalardan geçer:
Hazırlanıyor: Tanımlanan ortama göre bir docker görüntüsü oluşturulur. Görüntü çalışma alanının kapsayıcı kayıt defterine yüklenir ve sonraki çalıştırmalar için önbelleğe alınır. Günlükler iş geçmişine de akışla aktarılır ve ilerleme durumunu izlemek için görüntülenebilir. Seçilen bir ortam belirtilirse, seçilen ortamı destekleyen önbelleğe alınmış görüntü kullanılır.
Ölçeklendirme: Küme, çalıştırmayı yürütmek için şu anda kullanılabilir olandan daha fazla düğüm gerektiriyorsa ölçeği artırmaya çalışır.
Çalışıyor: src betik klasöründeki tüm betikler işlem hedefine yüklenir, veri depoları bağlanır veya kopyalanır ve betik yürütülür. stdout ve ./logs klasöründen alınan çıkışlar iş geçmişine akışla aktarılır ve işi izlemek için kullanılabilir.
Model hiper parametrelerini ayarlama
Modeli tek bir parametre kümesiyle eğitdiniz. Şimdi modelinizin doğruluğunu daha da geliştirip geliştirebileceğinize bakalım. Azure Machine Learning'in sweep
özelliklerini kullanarak modelinizin hiper parametrelerini ayarlayabilir ve iyileştirebilirsiniz.
Modelin hiper parametrelerini ayarlamak için eğitim sırasında aranacak parametre alanını tanımlayın. Bunu yapmak için eğitim işine geçirilen parametrelerin bazılarını paketten azure.ml.sweep
özel girişlerle değiştireceksiniz.
Eğitim betiği, çeşitli dönemlerde öğrenme oranını bozan bir öğrenme hızı zamanlaması kullandığından, ilk öğrenme hızını ve momentum parametrelerini ayarlayabilirsiniz.
from azure.ai.ml.sweep import Uniform
# we will reuse the command_job created before. we call it as a function so that we can apply inputs
job_for_sweep = job(
learning_rate=Uniform(min_value=0.0005, max_value=0.005),
momentum=Uniform(min_value=0.9, max_value=0.99),
)
Ardından, watch birincil ölçüm ve kullanılacak örnekleme algoritması gibi süpürmeye özgü bazı parametreleri kullanarak komut işinde süpürme yapılandıracaksınız.
Aşağıdaki kodda, birincil ölçümümüzü best_val_acc
en üst düzeye çıkarmak amacıyla farklı hiper parametre yapılandırma kümelerini denemek için rastgele örnekleme kullanırız.
Ayrıca, kötü performans gösteren çalıştırmaları erken sonlandırmak için erken sonlandırma ilkesi BanditPolicy
de tanımlarız.
, BanditPolicy
birincil değerlendirme ölçümümüzün slack faktöründe yer almayan tüm çalıştırmaları sonlandıracaktır. Bu ilkeyi her dönem uygulayacaksınız (ölçümümüzü best_val_acc
her dönem ve evaluation_interval
=1 bildirdiğimiz için). İlk ilke değerlendirmesini ilk 10 dönem (delay_evaluation
=10) sonraya kadar geciktirdiğimize dikkat edin.
from azure.ai.ml.sweep import BanditPolicy
sweep_job = job_for_sweep.sweep(
compute="gpu-cluster",
sampling_algorithm="random",
primary_metric="best_val_acc",
goal="Maximize",
max_total_trials=8,
max_concurrent_trials=4,
early_termination_policy=BanditPolicy(
slack_factor=0.15, evaluation_interval=1, delay_evaluation=10
),
)
Şimdi bu işi daha önce olduğu gibi gönderebilirsiniz. Bu sefer, tren işinin üzerinden süpüren bir süpürme işi çalıştıracaksın.
returned_sweep_job = ml_client.create_or_update(sweep_job)
# stream the output and wait until the job is finished
ml_client.jobs.stream(returned_sweep_job.name)
# refresh the latest status of the job after streaming
returned_sweep_job = ml_client.jobs.get(name=returned_sweep_job.name)
İş çalıştırması sırasında sunulan studio kullanıcı arabirimi bağlantısını kullanarak işi izleyebilirsiniz.
En iyi modeli bulma
Tüm çalıştırmalar tamamlandıktan sonra, modeli en yüksek doğrulukla üreten çalıştırmayı bulabilirsiniz.
from azure.ai.ml.entities import Model
if returned_sweep_job.status == "Completed":
# First let us get the run which gave us the best result
best_run = returned_sweep_job.properties["best_child_run_id"]
# lets get the model from this run
model = Model(
# the script stores the model as "outputs"
path="azureml://jobs/{}/outputs/artifacts/paths/outputs/".format(best_run),
name="run-model-example",
description="Model created from run.",
type="custom_model",
)
else:
print(
"Sweep job status: {}. Please wait until it completes".format(
returned_sweep_job.status
)
)
Modeli çevrimiçi uç nokta olarak dağıtma
Artık modelinizi çevrimiçi uç nokta olarak, yani Azure bulutunda bir web hizmeti olarak dağıtabilirsiniz.
Bir makine öğrenmesi hizmetini dağıtmak için genellikle şunları yapmanız gerekir:
- Dağıtmak istediğiniz model varlıkları. Bu varlıklar, modelin eğitim işinize önceden kaydettiğiniz dosyasını ve meta verilerini içerir.
- Hizmet olarak çalıştırılacak bazı kodlar. Kod, modeli belirli bir giriş isteğinde (giriş betiği) yürütür. Bu giriş betiği dağıtılan bir web hizmetine gönderilen verileri alır ve modele geçirir. Model verileri işledikten sonra betik, modelin istemciye yanıtını döndürür. Betik modelinize özgüdür ve modelin beklediği ve döndürdüğü verileri anlaması gerekir. MLFlow modeli kullandığınızda Azure Machine Learning bu betiği sizin için otomatik olarak oluşturur.
Dağıtım hakkında daha fazla bilgi için bkz. Python SDK v2 kullanarak yönetilen çevrimiçi uç nokta ile makine öğrenmesi modelini dağıtma ve puanlandırma.
Yeni bir çevrimiçi uç nokta oluşturma
Modelinizi dağıtmanın ilk adımı olarak çevrimiçi uç noktanızı oluşturmanız gerekir. Uç nokta adı tüm Azure bölgesinde benzersiz olmalıdır. Bu makalede, evrensel olarak benzersiz bir tanımlayıcı (UUID) kullanarak benzersiz bir ad oluşturacaksınız.
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "aci-birds-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import ManagedOnlineEndpoint
# create an online endpoint
endpoint = ManagedOnlineEndpoint(
name=online_endpoint_name,
description="Classify turkey/chickens using transfer learning with PyTorch",
auth_mode="key",
tags={"data": "birds", "method": "transfer learning", "framework": "pytorch"},
)
endpoint = ml_client.begin_create_or_update(endpoint).result()
print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")
Uç noktayı oluşturduktan sonra aşağıdaki gibi alabilirsiniz:
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
print(
f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)
Modeli uç noktaya dağıtma
Uç noktayı oluşturduktan sonra modeli giriş betiğiyle dağıtabilirsiniz. Uç noktanın birden çok dağıtımı olabilir. Uç nokta, kuralları kullanarak trafiği bu dağıtımlara yönlendirebilir.
Aşağıdaki kodda, gelen trafiğin %100'ünün işlenmesini sağlayan tek bir dağıtım oluşturacaksınız. Dağıtım için rastgele bir renk adı (aci-mavi) belirttik. Dağıtım için aci-green veya aci-red gibi başka bir ad da kullanabilirsiniz. Modeli uç noktaya dağıtma kodu aşağıdakileri yapar:
- daha önce kaydettiğiniz modelin en iyi sürümünü dağıtır;
- dosyayı kullanarak modeli puanlar
score.py
; ve - çıkarım yapmak için seçilmiş ortamı (daha önce belirttiğiniz) kullanır.
from azure.ai.ml.entities import (
ManagedOnlineDeployment,
Model,
Environment,
CodeConfiguration,
)
online_deployment_name = "aci-blue"
# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
name=online_deployment_name,
endpoint_name=online_endpoint_name,
model=model,
environment=curated_env_name,
code_configuration=CodeConfiguration(code="./score/", scoring_script="score.py"),
instance_type="Standard_NC6s_v3",
instance_count=1,
)
blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()
Not
Bu dağıtımın tamamlanmasının biraz zaman almasını bekleyebilirsiniz.
Dağıtılan modeli test etme
Artık modeli uç noktaya dağıttığınız için uç nokta üzerindeki yöntemini kullanarak dağıtılan modelin çıkışını invoke
tahmin edebilirsiniz.
Uç noktayı test etmek için tahmin için örnek bir görüntü kullanalım. İlk olarak görüntüyü görüntüleyelim.
# install pillow if PIL cannot imported
%pip install pillow
import json
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(Image.open("test_img.jpg"))
Resmi biçimlendirmek ve yeniden boyutlandırmak için bir işlev oluşturun.
# install torch and torchvision if needed
%pip install torch
%pip install torchvision
import torch
from torchvision import transforms
def preprocess(image_file):
"""Preprocess the input image."""
data_transforms = transforms.Compose(
[
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
]
)
image = Image.open(image_file)
image = data_transforms(image).float()
image = torch.tensor(image)
image = image.unsqueeze(0)
return image.numpy()
Görüntüyü biçimlendirin ve bir JSON dosyasına dönüştürün.
image_data = preprocess("test_img.jpg")
input_data = json.dumps({"data": image_data.tolist()})
with open("request.json", "w") as outfile:
outfile.write(input_data)
Ardından bu JSON ile uç noktayı çağırabilir ve sonucu yazdırabilirsiniz.
# test the blue deployment
result = ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
request_file="request.json",
deployment_name=online_deployment_name,
)
print(result)
Kaynakları temizleme
Uç noktayı kullanmayacaksanız, kaynağı kullanmayı durdurmak için silin. Silmeden önce uç noktayı başka hiçbir dağıtımın kullanmadığından emin olun.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Not
Bu temizleme işleminin tamamlanması biraz zaman alabilir.
Sonraki adımlar
Bu makalede, Azure Machine Learning'de PyTorch kullanarak bir derin öğrenme sinir ağı eğitip kaydettiniz. Modeli çevrimiçi bir uç noktaya da dağıttınız. Azure Machine Learning hakkında daha fazla bilgi edinmek için bu diğer makalelere bakın.