Развертывание модели для использования с поиском ИИ Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python для ML Azure версии 1

В этой статье описано, как использовать Машинное обучение Azure для развертывания модели для использования с поиском ИИ Azure.

Поиск ИИ Azure выполняет обработку содержимого по разнородному содержимому, чтобы сделать его запрашиваемым человеком или приложениями. Этот процесс можно оптимизировать с помощью модели, разворачиваемой из службы "Машинное обучение Azure".

Машинное обучение Azure может развернуть обученную модель в качестве веб-службы. Затем веб-служба внедряется в навык поиска ИИ Azure, который становится частью конвейера обработки.

Важно!

Сведения в этой статье относятся к развертыванию модели. Он содержит сведения о поддерживаемых конфигурациях развертывания, которые позволяют модели использоваться поиском ИИ Azure.

Сведения о настройке службы "Поиск ИИ Azure" для использования развернутой модели см. в руководстве по созданию и развертыванию пользовательского навыка с помощью Машинное обучение Azure учебника.

При развертывании модели для использования с поиском ИИ Azure развертывание должно соответствовать следующим требованиям:

  • Для размещения модели для вывода используйте службу Azure Kubernetes.
  • Включите протокол TLS для службы Azure Kubernetes. ПРОТОКОЛ TLS используется для защиты обмена данными HTTPS между поиском ИИ Azure и развернутой моделью.
  • Начальный сценарий должен с помощью пакета inference_schema создать для службы схему OpenAPI (Swagger).
  • Начальный сценарий также должен принимать на вход данные JSON и создавать данные JSON на выходе.

Необходимые компоненты

Подключение к рабочей области

Рабочая область службы "Машинное обучение Azure" позволяет централизовать работу со всеми артефактами, создаваемыми при использовании этой службы. Она также хранит историю всех обучающих заданий, включая журналы, метрики, выходные данные и моментальный снимок скриптов.

Чтобы подключиться к существующей рабочей области, используйте следующий код:

Важно!

Этот фрагмент кода ищет конфигурацию рабочей области в текущем или родительском каталоге. Дополнительные сведения см. в статье Создание рабочих областей для машинного обучения Azure и управление ими. Дополнительные сведения о сохранении конфигурации в файле см. в разделе Создание файла конфигурации рабочей области.

from azureml.core import Workspace

try:
    # Load the workspace configuration from local cached inffo
    ws = Workspace.from_config()
    print(ws.name, ws.location, ws.resource_group, ws.location, sep='\t')
    print('Library configuration succeeded')
except:
    print('Workspace not found')

Создание кластера Kubernetes

Примерное время: приблизительно 20 минут.

Кластер Kubernetes — это набор экземпляров виртуальных машин (узлов), которые используются для запуска контейнерных приложений.

При развертывании модели из службы "Машинное обучение Azure" в службу Azure Kubernetes эта модель и все ресурсы, необходимые для ее размещения в качестве веб-службы, упаковываются в контейнер Docker. Затем этот контейнер развертывается в кластере.

Во фрагменте кода ниже показано, как создать новый кластер Azure Kubernetes Service (AKS) для рабочей области.

Совет

Вы также можете подключить существующую службу Azure Kubernetes к рабочей области Машинного обучения Azure. Дополнительные сведения см. в статье Развертывание моделей в службе Azure Kubernetes.

Важно!

Обратите внимание, что в коде используется метод enable_ssl(), позволяющий включить протокол TLS для кластера. Это необходимо при планировании использования развернутой модели из службы "Поиск ИИ Azure".

from azureml.core.compute import AksCompute, ComputeTarget
# Create or attach to an AKS inferencing cluster

# Create the provisioning configuration with defaults
prov_config = AksCompute.provisioning_configuration()

# Enable TLS (sometimes called SSL) communications
# Leaf domain label generates a name using the formula
#  "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
#  where "######" is a random series of characters
prov_config.enable_ssl(leaf_domain_label = "contoso")

cluster_name = 'amlskills'
# Try to use an existing compute target by that name.
# If one doesn't exist, create one.
try:
    
    aks_target = ComputeTarget(ws, cluster_name)
    print("Attaching to existing cluster")
except Exception as e:
    print("Creating new cluster")
    aks_target = ComputeTarget.create(workspace = ws, 
                                  name = cluster_name, 
                                  provisioning_configuration = prov_config)
    # Wait for the create process to complete
    aks_target.wait_for_completion(show_output = True)

Важно!

В Azure плата будет взиматься до тех пор, пока существует кластер AKS. Не забудьте удалить кластер AKS после завершения работы с ним.

Дополнительные сведения об использовании AKS с Машинным обучением Azure см. в статье Развертывание в Службе Azure Kubernetes.

Написание начального сценария

Начальный сценарий получает данные, отправленные в веб-службу, передает их в модель и возвращает результаты оценки. Следующий скрипт загружает модель при запуске, а затем использует ее для оценки данных. Иногда этот файл называется score.py.

Совет

Скрипт относится только к модели. Например, сценарий должен знать, какая платформа будет использоваться с моделью, форматами данных и т. д.

Важно!

При планировании использования развернутой модели из службы "Поиск ИИ Azure" необходимо использовать inference_schema пакет, чтобы включить создание схемы для развертывания. Этот пакет содержит декораторы, с помощью которых можно настроить формат входных и выходных данных для веб-службы, выполняющей вывод на основе модели.

from azureml.core.model import Model
from nlp_architect.models.absa.inference.inference import SentimentInference
from spacy.cli.download import download as spacy_download
import traceback
import json
# Inference schema for schema discovery
from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.standard_py_parameter_type import StandardPythonParameterType

def init():
    """
    Set up the ABSA model for Inference  
    """
    global SentInference
    spacy_download('en')
    aspect_lex = Model.get_model_path('hotel_aspect_lex')
    opinion_lex = Model.get_model_path('hotel_opinion_lex') 
    SentInference = SentimentInference(aspect_lex, opinion_lex)

# Use inference schema decorators and sample input/output to
# build the OpenAPI (Swagger) schema for the deployment
standard_sample_input = {'text': 'a sample input record containing some text' }
standard_sample_output = {"sentiment": {"sentence": "This place makes false booking prices, when you get there, they say they do not have the reservation for that day.", 
                                        "terms": [{"text": "hotels", "type": "AS", "polarity": "POS", "score": 1.0, "start": 300, "len": 6}, 
                                                  {"text": "nice", "type": "OP", "polarity": "POS", "score": 1.0, "start": 295, "len": 4}]}}
@input_schema('raw_data', StandardPythonParameterType(standard_sample_input))
@output_schema(StandardPythonParameterType(standard_sample_output))    
def run(raw_data):
    try:
        # Get the value of the 'text' field from the JSON input and perform inference
        input_txt = raw_data["text"]
        doc = SentInference.run(doc=input_txt)
        if doc is None:
            return None
        sentences = doc._sentences
        result = {"sentence": doc._doc_text}
        terms = []
        for sentence in sentences:
            for event in sentence._events:
                for x in event:
                    term = {"text": x._text, "type":x._type.value, "polarity": x._polarity.value, "score": x._score,"start": x._start,"len": x._len }
                    terms.append(term)
        result["terms"] = terms
        print("Success!")
        # Return the results to the client as a JSON document
        return {"sentiment": result}
    except Exception as e:
        result = str(e)
        # return error message back to the client
        print("Failure!")
        print(traceback.format_exc())
        return json.dumps({"error": result, "tb": traceback.format_exc()})

Дополнительные сведения о начальном сценарии см. в разделе Развертывание моделей.

Определение программной среды

Класс среды используется для определения зависимостей Python для службы. Он содержит зависимости, необходимые как для модели, так и для начального сценария. В этом примере он устанавливает пакеты из стандартного индекса pypi, а также из репозитория GitHub.

from azureml.core.conda_dependencies import CondaDependencies 
from azureml.core import Environment

conda = None
pip = ["azureml-defaults", "azureml-monitoring", 
       "git+https://github.com/NervanaSystems/nlp-architect.git@absa", 'nlp-architect', 'inference-schema',
       "spacy==2.0.18"]

conda_deps = CondaDependencies.create(conda_packages=None, pip_packages=pip)

myenv = Environment(name='myenv')
myenv.python.conda_dependencies = conda_deps

Дополнительные сведения о настройке среды см. в статье Создание среды для обучения и развертывания и управление ей.

Определите конфигурацию развертывания

Конфигурация развертывания определяет среду размещения Службы Azure Kubernetes, используемую для запуска веб-службы:

Совет

Если вы не уверены, сколько памяти, ресурсов ЦП или GPU потребуется вашему развертыванию, попробуйте определить это с помощью профилирования. Подробнее см. в статье Где и как развертывать модели.

from azureml.core.model import Model
from azureml.core.webservice import Webservice
from azureml.core.image import ContainerImage
from azureml.core.webservice import AksWebservice, Webservice

# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and Azure Machine Learning components.

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                       autoscale_min_replicas=1, 
                                                       autoscale_max_replicas=3, 
                                                       autoscale_refresh_seconds=10, 
                                                       autoscale_target_utilization=70,
                                                       auth_enabled=True, 
                                                       cpu_cores=1, memory_gb=2, 
                                                       scoring_timeout_ms=5000, 
                                                       replica_max_concurrent_requests=2, 
                                                       max_request_wait_time=5000)

Дополнительные сведения см. в справочной документации по AksService.deploy_configuration.

Определение конфигурации выводов

Конфигурация вывода указывает на начальный сценарий и объект среды:

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

Дополнительные сведения см. в справочной документации по InferenceConfig.

Развертывание модели

Разверните модель в кластере AKS и подождите, пока она создаст службу. В этом примере две зарегистрированные модели загружаются из реестра и развертываются в AKS. После развертывания файл score.py в нем загружает эти модели и использует их для выполнения вывода.

from azureml.core.webservice import AksWebservice, Webservice

c_aspect_lex = Model(ws, 'hotel_aspect_lex')
c_opinion_lex = Model(ws, 'hotel_opinion_lex') 
service_name = "hotel-absa-v2"

aks_service = Model.deploy(workspace=ws,
                           name=service_name,
                           models=[c_aspect_lex, c_opinion_lex],
                           inference_config=inf_config,
                           deployment_config=aks_config,
                           deployment_target=aks_target,
                           overwrite=True)

aks_service.wait_for_deployment(show_output = True)
print(aks_service.state)

Дополнительные сведения см. в справочной документации модели.

Выдача примера запроса в службу

В примере ниже используются сведения о развертывании, сохраненные в переменной aks_service в предыдущем разделе кода. Эта переменная позволяет получить URL-адрес оценки и маркер проверки подлинности, необходимые для взаимодействия со службой:

import requests
import json

primary, secondary = aks_service.get_keys()

# Test data
input_data = '{"raw_data": {"text": "This is a nice place for a relaxing evening out with friends. The owners seem pretty nice, too. I have been there a few times including last night. Recommend."}}'

# Since authentication was enabled for the deployment, set the authorization header.
headers = {'Content-Type':'application/json',  'Authorization':('Bearer '+ primary)} 

# Send the request and display the results
resp = requests.post(aks_service.scoring_uri, input_data, headers=headers)
print(resp.text)

Результат, возвращаемый службой, имеет вид следующего кода JSON:

{"sentiment": {"sentence": "This is a nice place for a relaxing evening out with friends. The owners seem pretty nice, too. I have been there a few times including last night. Recommend.", "terms": [{"text": "place", "type": "AS", "polarity": "POS", "score": 1.0, "start": 15, "len": 5}, {"text": "nice", "type": "OP", "polarity": "POS", "score": 1.0, "start": 10, "len": 4}]}}

Сведения об использовании этой модели из службы "Поиск ИИ Azure" см. в руководстве по созданию и развертыванию пользовательского навыка с помощью Машинное обучение Azure учебника.

Очистка ресурсов

Если вы создали кластер AKS специально для этого примера, удалите ресурсы после завершения тестирования с помощью поиска ИИ Azure.

Важно!

Плата за использование Azure начисляется в зависимости от того, как давно развернут кластер AKS. Не забудьте очистить его после завершения.

aks_service.delete()
aks_target.delete()

Следующие шаги