Aracılığıyla paylaş


Gelişmiş giriş betiği yazma

ŞUNUN IÇIN GEÇERLIDIR: Python SDK azureml v1

Bu makalede, özel kullanım örnekleri için giriş betiklerinin nasıl yaz olduğu açıklanmaktadır.

Önkoşullar

Bu makalede, Azure Machine Learning ile dağıtmayı planladığınız eğitilmiş bir makine öğrenmesi modeliniz olduğu varsayılır. Model dağıtımı hakkında daha fazla bilgi edinmek için bkz . Makine öğrenmesi modellerini Azure'a dağıtma.

Otomatik olarak Swagger şeması oluşturma

Web hizmetiniz için otomatik olarak bir şema oluşturmak için, tanımlanan tür nesnelerinden birinin oluşturucusunda giriş ve/veya çıktının bir örneğini sağlayın. Tür ve örnek, şemayı otomatik olarak oluşturmak için kullanılır. Ardından Azure Machine Learning, dağıtım sırasında web hizmeti için bir OpenAPI belirtimi (eski adıyla Swagger belirtimi) oluşturur.

Uyarı

Örnek giriş veya çıkış için hassas veya özel veriler kullanmamalısınız. AML tarafından barındırılan çıkarım için Swagger sayfası örnek verileri kullanıma sunar.

Bu türler şu anda desteklenmektedir:

  • pandas
  • numpy
  • pyspark
  • Standart Python nesnesi

Şema oluşturmayı kullanmak için bağımlılıklar dosyanıza açık kaynak inference-schema paket sürümü 1.1.0 veya üzerini ekleyin. Bu paket hakkında daha fazla bilgi için bkz . GitHub'da InferenceSchema. Otomatik web hizmeti tüketimi için uyumlu Swagger oluşturmak için, puanlama betiği run() işlevinin ŞU API şekline sahip olması gerekir:

  • Inputs adlı ve iç içe yerleştirilmiş türünde StandardPythonParameterTypeilk parametre
  • GlobalParameters adlı türünde StandardPythonParameterTypeisteğe bağlı ikinci bir parametre
  • Sonuçlar adlı ve iç içe yerleştirilmiş türünde StandardPythonParameterTypebir sözlük döndür

ve değişkenlerinde input_sample output_sample , web hizmeti için istek ve yanıt biçimlerini temsil eden giriş ve çıkış örnek biçimlerini tanımlayın. İşlevdeki giriş ve çıkış işlevi dekoratörlerinde run() bu örnekleri kullanın. Aşağıdaki scikit-learn örneği şema oluşturmayı kullanır.

Power BI uyumlu uç nokta

Aşağıdaki örnekte, api şeklinin önceki yönergeye göre nasıl tanımlanacağı gösterilmektedir. Bu yöntem, Dağıtılan web hizmetinin Power BI'dan kullanılması için desteklenir.

import json
import pickle
import numpy as np
import pandas as pd
import azureml.train.automl
from sklearn.externals import joblib
from sklearn.linear_model import Ridge

from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.standard_py_parameter_type import StandardPythonParameterType
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.pandas_parameter_type import PandasParameterType


def init():
    global model
    # Replace filename if needed.
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_regression_model.pkl')
    # Deserialize the model file back into a sklearn model.
    model = joblib.load(model_path)


# providing 3 sample inputs for schema generation
numpy_sample_input = NumpyParameterType(np.array([[1,2,3,4,5,6,7,8,9,10],[10,9,8,7,6,5,4,3,2,1]],dtype='float64'))
pandas_sample_input = PandasParameterType(pd.DataFrame({'name': ['Sarah', 'John'], 'age': [25, 26]}))
standard_sample_input = StandardPythonParameterType(0.0)

# This is a nested input sample, any item wrapped by `ParameterType` will be described by schema
sample_input = StandardPythonParameterType({'input1': numpy_sample_input, 
                                        'input2': pandas_sample_input, 
                                        'input3': standard_sample_input})

sample_global_parameters = StandardPythonParameterType(1.0) # this is optional
sample_output = StandardPythonParameterType([1.0, 1.0])
outputs = StandardPythonParameterType({'Results':sample_output}) # 'Results' is case sensitive

@input_schema('Inputs', sample_input) 
# 'Inputs' is case sensitive

@input_schema('GlobalParameters', sample_global_parameters) 
# this is optional, 'GlobalParameters' is case sensitive

@output_schema(outputs)

def run(Inputs, GlobalParameters): 
    # the parameters here have to match those in decorator, both 'Inputs' and 
    # 'GlobalParameters' here are case sensitive
    try:
        data = Inputs['input1']
        # data will be convert to target format
        assert isinstance(data, np.ndarray)
        result = model.predict(data)
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

İpucu

Betikten döndürülen değer, JSON'a seri hale getirilebilen herhangi bir Python nesnesi olabilir. Örneğin, modeliniz birden çok sütun içeren bir Pandas veri çerçevesi döndürürse, aşağıdaki koda benzer bir çıkış dekoratörü kullanabilirsiniz:

output_sample = pd.DataFrame(data=[{"a1": 5, "a2": 6}])
@output_schema(PandasParameterType(output_sample))
...
result = model.predict(data)
return result

İkili (diğer bir ifadeyle görüntü) veriler

Modeliniz bir görüntü gibi ikili verileri kabul ederse, dağıtımınız için kullanılan score.py dosyasını ham HTTP isteklerini kabul etmek üzere değiştirmeniz gerekir. Ham verileri kabul etmek için giriş betiğinizdeki sınıfını kullanın AMLRequest ve dekoratörünüzü @rawhttp işleve run() ekleyin.

İkili verileri kabul eden bir score.py örnek aşağıda verilmiştir:

from azureml.contrib.services.aml_request import AMLRequest, rawhttp
from azureml.contrib.services.aml_response import AMLResponse
from PIL import Image
import json


def init():
    print("This is init()")
    

@rawhttp
def run(request):
    print("This is run()")
    
    if request.method == 'GET':
        # For this example, just return the URL for GETs.
        respBody = str.encode(request.full_path)
        return AMLResponse(respBody, 200)
    elif request.method == 'POST':
        file_bytes = request.files["image"]
        image = Image.open(file_bytes).convert('RGB')
        # For a real-world solution, you would load the data from reqBody
        # and send it to the model. Then return the response.

        # For demonstration purposes, this example just returns the size of the image as the response.
        return AMLResponse(json.dumps(image.size), 200)
    else:
        return AMLResponse("bad request", 500)

Önemli

AMLRequest sınıfı ad alanındadırazureml.contrib. Hizmeti geliştirmek için çalışırken bu ad alanı içindeki varlıklar sık sık değişir. Bu ad alanında yer alan her şey, Microsoft tarafından tam olarak desteklenmeyen bir önizleme olarak kabul edilmelidir.

Bunu yerel geliştirme ortamınızda test etmeniz gerekiyorsa, aşağıdaki komutu kullanarak bileşenleri yükleyebilirsiniz:

pip install azureml-contrib-services

Not

500, azureml-fe tarafında olduğu gibi özel durum kodu olarak önerilmez, durum kodu 502'ye yeniden yazılır.

  • Durum kodu azureml-fe üzerinden geçirilir ve ardından istemciye gönderilir.
  • azureml-fe yalnızca model tarafından döndürülen 500 değerini 502 olarak yeniden yazar, istemci 502 alır.
  • Ancak azureml-fe'nin kendisi 500 döndürürse istemci tarafı yine de 500 alır.

AMLRequest sınıfı yalnızca score.py dosyasındaki ham gönderilen verilere erişmenizi sağlar; istemci tarafı bileşeni yoktur. Bir istemciden verileri normal şekilde postalarsınız. Örneğin, aşağıdaki Python kodu bir görüntü dosyasını okur ve verileri postalar:

import requests

uri = service.scoring_uri
image_path = 'test.jpg'
files = {'image': open(image_path, 'rb').read()}
response = requests.post(uri, files=files)

print(response.json)

Çıkış noktaları arası kaynak paylaşımı (CORS)

Çıkış noktaları arası kaynak paylaşımı, bir web sayfasındaki kaynakların başka bir etki alanından istenebilmesini sağlamanın bir yoludur. CORS, istemci isteğiyle gönderilen ve hizmet yanıtıyla döndürülen HTTP üst bilgileri aracılığıyla çalışır. CORS ve geçerli üst bilgiler hakkında daha fazla bilgi için bkz . Wikipedia'da çıkış noktaları arası kaynak paylaşımı .

Model dağıtımınızı CORS'yi destekleyecek şekilde yapılandırmak için giriş betiğinizdeki sınıfını kullanın AMLResponse . Bu sınıf, yanıt nesnesinde üst bilgileri ayarlamanıza olanak tanır.

Aşağıdaki örnek, giriş betiğinden gelen yanıtın üst bilgisini ayarlar Access-Control-Allow-Origin :

from azureml.contrib.services.aml_request import AMLRequest, rawhttp
from azureml.contrib.services.aml_response import AMLResponse


def init():
    print("This is init()")

@rawhttp
def run(request):
    print("This is run()")
    print("Request: [{0}]".format(request))
    if request.method == 'GET':
        # For this example, just return the URL for GET.
        # For a real-world solution, you would load the data from URL params or headers
        # and send it to the model. Then return the response.
        respBody = str.encode(request.full_path)
        resp = AMLResponse(respBody, 200)
        resp.headers["Allow"] = "OPTIONS, GET, POST"
        resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
        resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
        resp.headers['Access-Control-Allow-Headers'] = "*"
        return resp
    elif request.method == 'POST':
        reqBody = request.get_data(False)
        # For a real-world solution, you would load the data from reqBody
        # and send it to the model. Then return the response.
        resp = AMLResponse(reqBody, 200)
        resp.headers["Allow"] = "OPTIONS, GET, POST"
        resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
        resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
        resp.headers['Access-Control-Allow-Headers'] = "*"
        return resp
    elif request.method == 'OPTIONS':
        resp = AMLResponse("", 200)
        resp.headers["Allow"] = "OPTIONS, GET, POST"
        resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
        resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
        resp.headers['Access-Control-Allow-Headers'] = "*"
        return resp
    else:
        return AMLResponse("bad request", 400)

Önemli

AMLResponse sınıfı ad alanındadırazureml.contrib. Hizmeti geliştirmek için çalışırken bu ad alanı içindeki varlıklar sık sık değişir. Bu ad alanında yer alan her şey, Microsoft tarafından tam olarak desteklenmeyen bir önizleme olarak kabul edilmelidir.

Bunu yerel geliştirme ortamınızda test etmeniz gerekiyorsa, aşağıdaki komutu kullanarak bileşenleri yükleyebilirsiniz:

pip install azureml-contrib-services

Uyarı

Azure Machine Learning yalnızca POST ve GET isteklerini puanlama hizmetini çalıştıran kapsayıcılara yönlendirir. Bu, CORS isteklerinin ön dağıtımı için SEÇENEKLER isteklerini kullanan tarayıcılardan kaynaklanan hatalara neden olabilir.

Kayıtlı modelleri yükleme

Giriş betiğinizde modelleri bulmanın iki yolu vardır:

  • AZUREML_MODEL_DIR: Model konumunun yolunu içeren bir ortam değişkeni
  • Model.get_model_path: Kayıtlı model adını kullanarak model dosyasının yolunu döndüren bir API

AZUREML_MODEL_DIR

AZUREML_MODEL_DIR , hizmet dağıtımı sırasında oluşturulan bir ortam değişkenidir. Dağıtılan modellerin yerini bulmak için bu ortam değişkenini kullanabilirsiniz.

Aşağıdaki tabloda, dağıtılan model sayısına bağlı olarak değeri AZUREML_MODEL_DIR açıklanmaktadır:

Dağıtım Ortam değişkeni değeri
Tek model Modeli içeren klasörün yolu.
Birden çok model Tüm modelleri içeren klasörün yolu. Modeller bu klasörde ada ve sürüme göre bulunur ($MODEL_NAME/$VERSION)

Model kaydı ve dağıtımı sırasında Modeller AZUREML_MODEL_DIR yoluna yerleştirilir ve özgün dosya adları korunur.

Giriş betiğinizdeki bir model dosyasının yolunu almak için ortam değişkenini aradığınız dosya yolu ile birleştirin.

Tek model örneği

# Example when the model is a file
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_regression_model.pkl')

# Example when the model is a folder containing a file
file_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'my_model_folder', 'sklearn_regression_model.pkl')

Birden çok model örneği

Bu senaryoda çalışma alanına iki model kaydedilir:

  • my_first_model: Tek bir dosya (my_first_model.pkl) içerir ve yalnızca bir sürümü vardır, 1
  • my_second_model: Bir dosya (my_second_model.pkl) içerir ve iki sürümü 1 vardır ve 2

Hizmet dağıtıldığında her iki model de dağıtım işleminde sağlanır:

first_model = Model(ws, name="my_first_model", version=1)
second_model = Model(ws, name="my_second_model", version=2)
service = Model.deploy(ws, "myservice", [first_model, second_model], inference_config, deployment_config)

Hizmeti barındıran Docker görüntüsünde AZUREML_MODEL_DIR ortam değişkeni modellerin bulunduğu dizini içerir. Bu dizinde, modellerin her biri bir dizin yolunda MODEL_NAME/VERSIONbulunur. Burada MODEL_NAME kayıtlı modelin adı ve VERSION modelin sürümüdür. Kayıtlı modeli oluşturan dosyalar bu dizinlerde depolanır.

Bu örnekte yollar ve $AZUREML_MODEL_DIR/my_second_model/2/my_second_model.pklolacaktır$AZUREML_MODEL_DIR/my_first_model/1/my_first_model.pkl.

# Example when the model is a file, and the deployment contains multiple models
first_model_name = 'my_first_model'
first_model_version = '1'
first_model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), first_model_name, first_model_version, 'my_first_model.pkl')
second_model_name = 'my_second_model'
second_model_version = '2'
second_model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), second_model_name, second_model_version, 'my_second_model.pkl')

get_model_path

Modeli kaydettiğinizde, modelin kayıt defterinde yönetilmesi için kullanılan bir model adı sağlarsınız. Bu adı, yerel dosya sisteminde model dosyasının veya dosyalarının yolunu almak için Model.get_model_path() yöntemiyle birlikte kullanırsınız. Bir klasör veya dosya koleksiyonu kaydederseniz, bu API bu dosyaları içeren dizinin yolunu döndürür.

Bir modeli kaydettiğinizde, modelin adını verirsiniz. Ad, modelin yerel olarak veya hizmet dağıtımı sırasında yerleştirildiği yere karşılık gelir.

Çerçeveye özgü örnekler

Belirli makine öğrenmesi kullanım örnekleri için daha fazla giriş betiği örneği için aşağıdaki makalelere bakın: