Если вы читаете это, значит, вы либо только начинаете путешествие, либо находитесь в отчаянии. Итак, прямо сейчас у вас есть самая удивительная обученная модель машинного обучения, и теперь вы можете предсказывать фондовый рынок. Ты скоро станешь миллионером. Но для того, чтобы это произошло, необходимо преодолеть одно последнее препятствие, развернув вашу модель, также известную как ваш денежный принтер (или 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. Если вы действительно хотите изучить более специализированные вещи, я бы посоветовал углубиться в это. Там есть удивительные вещи, например здесь.
От меня спасибо за прочтение! И наслаждайтесь вновь обретенным богатством.