Azure Machine Learning'e model dağıtma

Tamamlandı

Önceki ünitede ele aldığımız gibi, yerel işlem, Azure Container Instance (ACI), Azure Kubernetes Service (AKS) kümesi veya Nesnelerin İnterneti (IoT) modülü gibi çeşitli işlem hedeflerine model dağıtabilirsiniz. Azure Machine Learning hizmeti, dağıtım mekanizması olarak kapsayıcıları kullanır ve model ile kodu paketleyerek seçilen işlem hedefindeki bir kapsayıcıya dağıtılabilecek bir görüntü olarak kullanmanızı sağlar.

Modeli çıkarım web hizmeti olarak dağıtmak için aşağıdaki görevleri gerçekleştirmeniz gerekir:

  1. Eğitilmiş bir modeli kaydetme.
  2. Çıkarım Yapılandırması tanımlayın.
  3. Dağıtım Yapılandırması tanımlama.
  4. Modeli dağıtın.

1. Eğitilmiş modeli kaydetme

Bir modeli başarıyla eğittikten sonra Azure Machine Learning çalışma alanınıza kaydetmeniz gerekir. Bu işlemin ardından gerçek zamanlı hizmetiniz, gerektiğinde modeli yükleyebilecektir.

Yerel dosyadan model kaydetmek için burada gösterildiği gibi Model nesnesinin register yöntemini kullanabilirsiniz:

from azureml.core import Model

model = Model.register(workspace=ws, 
                       model_name='nyc-taxi-fare',
                       model_path='model.pkl', # local path
                       description='Model to predict taxi fares in NYC.')

2. Çıkarım Yapılandırması Tanımlama

Model aşağıdakilerden oluşan bir hizmet olarak dağıtılır:

  • Modeli yükleyen ve gönderilen verilerle ilgili tahminleri döndüren bir betik.
  • Betiğin çalıştırılacağı ortam.

Bu nedenle hizmette kullanılacak betiği ve ortamı tanımlamanız gerekir.

Giriş betiği oluşturma

Hizmetin giriş betiğini (bazen puanlama betiği olarak da adlandırılır) Python (.py) dosyası olarak oluşturun. Bu dosya iki işlev içermelidir:

  • init(): Hizmet başlatıldığında çağrılır.
  • run(raw_data): Hizmete yeni veriler gönderildiğinde çağrılır.

Genellikle init işlevi modeli model kayıt defterinden yüklemek için, run işlevi de giriş verilerinden tahmin oluşturmak için kullanılır. Aşağıdaki örnek betikte bu yöntem göstermektedir:

import json
import joblib
import numpy as np
from azureml.core.model import Model

# Called when the service is loaded
def init():
    global model
    # Get the path to the registered model file and load it
    model_path = Model.get_model_path('nyc-taxi-fare')
    model = joblib.load(model_path)

# Called when a request is received
def run(raw_data):
    # Get the input data as a numpy array
    data = np.array(json.loads(raw_data)['data'])
    # Get a prediction from the model
    predictions = model.predict(data)
    # Return the predictions as any JSON serializable format
    return predictions.tolist()

Ortam oluşturma

Azure Machine Learning ortamları, makine öğrenmesi eğitiminizin gerçekleştiği ortamın bir kapsüllemesidir. Python paketlerini, ortam değişkenlerini, Docker ayarlarını ve diğer öznitelikleri bildirim temelli olarak tanımlar. Aşağıdaki kod parçacığı, dağıtımınız için nasıl ortam oluşturabileceğinize ilişkin bir örnek gösterir:

from azureml.core import Environment
from azureml.core.environment import CondaDependencies

my_env_name="nyc-taxi-env"
myenv = Environment.get(workspace=ws, name='AzureML-Minimal').clone(my_env_name)
conda_dep = CondaDependencies()
conda_dep.add_pip_package("numpy==1.18.1")
conda_dep.add_pip_package("pandas==1.1.5")
conda_dep.add_pip_package("joblib==0.14.1")
conda_dep.add_pip_package("scikit-learn==0.24.1")
conda_dep.add_pip_package("sklearn-pandas==2.1.0")
myenv.python.conda_dependencies=conda_dep

Betiği ve ortamı bir InferenceConfig içinde birleştirme

Giriş betiğini ve ortamını oluşturduktan sonra, bunları hizmet için aşağıdaki gibi bir InferenceConfig içinde birleştirebilirsiniz:

from azureml.core.model import InferenceConfig

from azureml.core.model import InferenceConfig
inference_config = InferenceConfig(entry_script='score.py', 
                                   source_directory='.', 
                                   environment=myenv)

3. Dağıtım Yapılandırması Tanımlama

Giriş betiğini ve ortamı oluşturduktan sonra hizmetin dağıtılacağı işlemi yapılandırmanız gerekir. Dağıtımı bir AKS kümesine yapıyorsanız dağıtım öncesinde kümeyi ve işlem hedefini oluşturmanız gerekir:

from azureml.core.compute import ComputeTarget, AksCompute

cluster_name = 'aks-cluster'
compute_config = AksCompute.provisioning_configuration(location='eastus')
production_cluster = ComputeTarget.create(ws, cluster_name, compute_config)
production_cluster.wait_for_completion(show_output=True)

İşlem hedefini oluşturduktan sonra kapsayıcılı dağıtım için hedefe özgü işlem belirtimini ayarlayan dağıtım yapılandırmasını tanımlayabilirsiniz:

from azureml.core.webservice import AksWebservice

deploy_config = AksWebservice.deploy_configuration(cpu_cores = 1,
                                                   memory_gb = 1)

ACI dağıtımını yapılandırmak için kullanılan kod benzerdir ancak farklı olarak bir ACI işlem hedefi oluşturmanız gerekmez, bunun yerine azureml.core.webservice.AciWebservice ad alanındaki deploy_configuration sınıfını kullanmanız gerekir. Benzer şekilde yerel bir Docker tabanlı hizmet yapılandırmak için de azureml.core.webservice.LocalWebservice ad alanını kullanabilirsiniz.

4. Modeli Dağıtma

Tüm yapılandırmalar hazırlandıktan sonra modeli dağıtabilirsiniz. Bunu yapmanın en kolay yolu, aşağıdaki gibi Model sınıfının deploy yöntemini çağırmaktır:

from azureml.core.model import Model

service = Model.deploy(workspace=ws,
                       name = 'nyc-taxi-service',
                       models = [model],
                       inference_config = inference_config,
                       deployment_config = deploy_config,
                       deployment_target = production_cluster)
service.wait_for_deployment(show_output = True)

ACI veya yerel hizmetler için deployment_target parametresini kaldırabilirsiniz (veya None olarak ayarlayabilirsiniz).

Dekont

Daha Fazla Bilgi: Azure Machine Learning ile model dağıtma hakkında daha fazla bilgi için belgelerdeki Azure Machine Learning ile model dağıtma bölümüne bakın.