Если вы читаете это, значит, вы либо только начинаете путешествие, либо находитесь в отчаянии. Итак, прямо сейчас у вас есть самая удивительная обученная модель машинного обучения, и теперь вы можете предсказывать фондовый рынок. Ты скоро станешь миллионером. Но для того, чтобы это произошло, необходимо преодолеть одно последнее препятствие, развернув вашу модель, также известную как ваш денежный принтер (или MP для краткости).

На данный момент вы также решили использовать облачную платформу, так как хотите, чтобы она работала постоянно, потому что, как вы знаете… деньги не спят. Итак, разумный выбор. Назовем это облако Microsoft Azure. Вы немного почитаете и найдете именно то, что ищете, Azure Machine Learning Workspace (или сокращенно AMLW — произносится Am-low). Хорошо, теперь мы приближаемся к вашим миллионам, и теперь мы действительно близки. Как близко? Около 5 шагов близко. Так что давайте получить эти деньги.

ШАГ 0: Включите свои библиотеки

Как программист, мы всегда начинаем с 0.

#included libraries
import azureml.core
from azureml.core import Workspace, Dataset, Model, Webservice, Environment
from azureml.core.conda_dependencies import CondaDependencies
import json
import pandas as pd
#check the azureml core being used
azureml.core.VERSION

ШАГ 1: Инициализируйте рабочее пространство

Когда вы используете команду Workspace.from_config(), она подключается к рабочей области, в которой размещена записная книжка. Если записная книжка не находится в той же рабочей области, укажите рабочую область вручную. Я включил оба варианта здесь.

Вариант 1: из конфига

#inititalise workspace from config
ws = Workspace.from_config()
print(ws.name, ws.resource_group, ws.location, ws.subscription_id, sep=’\n’)

Вариант 2: Ручная инициализация

#initialise workspace manually
subscription_id = ‘<enter user subscription Id>’
resource_group = ‘<name of resource group>’
workspace_name = ‘<name of azure machine learning resource name>’
ws = Workspace(subscription_id, resource_group, workspace_name)
print(ws.name, ws.resource_group, ws.location, ws.subscription_id, sep=’\n’)

ШАГ 2: Подключитесь к зарегистрированной модели

Этот шаг предполагает, что модель была зарегистрирована в хранилище моделей. Если это предположение неверно, мне нужно было уложиться в 5 шагов, так что вы можете найти подробности здесь

#Connect to model
modelname = ‘<name of model>’
model = Model(ws,modelname)
print(‘model name: ‘, model)

ШАГ 3: Инициализируйте среду

Это контейнер, в котором будет запускаться модель. Таким образом, это может быть либо Kubernetes, либо экземпляр контейнера Azure (ACI). Для моделей, работающих с небольшими объемами данных, я рекомендую использовать ACI. В противном случае используйте вариант Kubernetes. Опять же, более подробную информацию о различных средах можно найти здесь.

На этом шаге объявляются все зависимости, которые могут понадобиться вашей модели. Думайте об этом как об установке pip для вашей модели.

#Initialise the environment (pip packages to be installed, example shown below)
environment = Environment(‘<User chosen name>’)
environment.python.conda_dependencies = CondaDependencies.create(pip_packages=[
 ‘azureml-defaults’,
 ‘inference-schema[numpy-support]’,
 ‘joblib’,
 ‘scikit-learn’,
 ‘numpy==1.16.4’,
 ‘tensorflow==1.14’
])

Пожалуйста, ребята, очень важно, убедитесь, что версии библиотеки точно совпадают с версией библиотеки, используемой для обучения модели. Если нет, вы можете получить ошибку 502, которая может ввести в заблуждение и может стоить вам нескольких часов жизни… Полагаю, вы понимаете, я прошел через огонь.

ШАГ 4: Создайте/импортируйте файл score.py

Файл оценки — это, по сути, файл, который запускает модель внутри контейнера. Таким образом, когда данные отправляются в развернутую модель, в этом файле можно выполнять любые шаги предварительной или последующей обработки.

Я создал файл score.py с помощью Spyder, однако вы можете использовать то, что предпочитаете, но он должен быть в формате .py.

#create a score file variable as this is referenced in the deployment in step 5
score_file = ‘<name of score file>’

Вы можете подумать, а где этот файл? Без дальнейших церемоний…

import joblib
import os
import json
#model specific libraries
import numpy as np 
import pandas as pd
def init():
 ‘’’This function initialises the model. The model file is retrieved used
 within the script.
 ‘’’
 global model 
 
 model_filename = ‘<name of model file (.sav or .pkl)>’
 model_path = os.path.join(os.environ[‘AZUREML_MODEL_DIR’], model_filename)
 
 model = joblib.load(model_path)
 
#===================================================================
#Function definitions
#===================================================================
 
# Convert Series Data into Supervised Data
def functions(parameter):
 ‘’’
 Define functions neeeded in your model. If not needed, remove this part
 ‘’’
#Run function
def run(data):
 ‘’’
 Input the data as json and returns the predictions in json. All preprocessing 
 steps are specific to this model and usecase
 ‘’’
 #input data
 raw = pd.read_json(data) 
 
 #preprocessing steps 
 
 #prediction steps 
 pred = model.predict(data)
 
 #postprocessing steps
 
 #packaging steps
 
 result = pred.to_json()
 
 # You can return any JSON-serializable object.
 return result

Проверьте файл партитуры с приведенным ниже кодом, чтобы убедиться, что используется правильный. Лучше перестраховаться, чем сожалеть, я полагаю.

#inspect the score script to ensure the correct script is being referenced
with open(score_file) as f:
    print(f.read())

ШАГ 5. Разверните модель в среде (соберите все вместе)

Этот шаг требует некоторого времени для выполнения каждый раз. Так что найдите время, чтобы приготовить кофе, пока ждете. Однако способ ускорить это — развернуть док-контейнер на локальном компьютере, а затем отладить его перед отправкой в ​​ACI.

#deploy model to ACI
from azureml.core import Webservice
from azureml.core.model import InferenceConfig
from azureml.exceptions import WebserviceException
#name given here will be the name of the deployed service
service_name = ‘<name of the deployed service>’
# Remove any existing service under the same name.
try:
 Webservice(ws, service_name).delete()
except WebserviceException:
 pass
inference_config = InferenceConfig(entry_script= score_file,
 source_directory=’.’,
 environment=environment)
service = Model.deploy(ws, service_name, [model], inference_config)
service.wait_for_deployment(show_output=True)

И это все! Ваш контейнер должен быть развернут в вашей группе ресурсов, а конечная точка REST должна быть создана в вашем хранилище моделей AMLW.

А в остальном… ДЕНЬГИ!

НЕ ШАГ 0: Тестирование

Теперь я знаю, что сказал 5 шагов, но на самом деле это просто проверка, чтобы убедиться, что все работает нормально.

Для этого мы подключимся к хранилищу данных в AMLW. Интересный факт: эти наборы данных можно либо загрузить вручную в рабочую область, либо можно сослаться на хранилище данных, а данные можно подключить к источнику, что мне показалось довольно крутым! Аааааааааааааааааааа… давай продолжим

#connect to dataset
dataset = Dataset.get_by_name(ws, name=’<Name of dataset in AMLW>’)
dataset = dataset.to_pandas_dataframe()

Используя вашу развернутую модель, входные данные должны быть в формате JSON, а затем вводиться в вашу модель. Вы можете использовать приведенный ниже код для упаковки и запуска вашей модели.

#package and run input data to model
#input data
input_data = dataset.to_json()
#run model
pred = service.run(input_data)
#Convert returned json back to a pandas dataframe
pred = pd.read_json(pred)

НЕ ШАГ 1: Использование конечной точки

После развертывания модели создается конечная точка REST, которую можно использовать на других ваших платформах. приведенный ниже код можно использовать в Databricks или других средах Python.

import requests
import json
# URL for the web service
scoring_uri = ‘<Your deployment enpoint>’
# If the service is authenticated, set the key or token
key = ‘<your key or token>’
# Convert to JSON string
input_data = dataset.to_json()
# Set the content type
headers = {‘Content-Type’: ‘application/json’}
# If authentication is enabled, set the authorization header
headers[‘Authorization’] = f’Bearer {key}’
# Make the request and display the response
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
#load the returned prediction and read it into a pandas dataframe
pred = json.loads(resp.text)
pred = pd.read_json(pred)

Это история, эй. Я предполагаю, что это немного длинно, но, честно говоря, большая часть этого была кодом, так что на самом деле это не считается, если подумать. Я должен упомянуть, что многое из этого можно найти на страницах AMLW GitHub и docs. Если вы действительно хотите изучить более специализированные вещи, я бы посоветовал углубиться в это. Там есть удивительные вещи, например здесь.

От меня спасибо за прочтение! И наслаждайтесь вновь обретенным богатством.