Введение:

В этой части 2 статьи показано, как развернуть нашу предварительно обученную модель COVID-19 (в Часть 1) в рабочей области Azure ML. Как уже было сказано, в Части-1 мод тренировался в локальной среде, и мы сохранили нашу модель в файл формата .h5.

В Azure ML мы зарегистрируем нашу пользовательскую предварительно обученную модель и развернем ее в службе ACI (Azure Container Instances); чтобы он мог получить доступ из любого другого приложения или любых служб Azure.

Пожалуйста, прочитайте мою статью Часть 1 о наборе данных COVID-19, предварительной обработке изображений и построении модели глубокого обучения.

Я надеюсь, что конец этой статьи поможет читателю понять, как построить модель глубокого обучения для любого набора данных классификации изображений или распознавания объектов и как развернуть любую пользовательскую модель в Azure ML Workspace.

Предварительный запрос:

  1. У пользователя должна быть подписка Azure, и должна быть создана рабочая область Azure ML.
  2. Azure ML SDK (версия: ›= 1.4.0) должен быть установлен на локальном компьютере.
  3. Python (версия: ›= 3.7.3) должен быть установлен на локальном компьютере вместе с Anaconda.

Пошаговая инструкция по развертыванию нашей окончательной модели в Azure ML:

  1. Импорт всей необходимой библиотеки:

Во-первых, вам нужно импортировать приведенную ниже библиотеку, связанную с Azure ML, в свой блокнот.

from azureml.core import Workspace, Experiment, Run
from azureml.core.model import Model
from azureml.core.authentication import InteractiveLoginAuthentication
from azureml.core.model import InferenceConfig
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.webservice import AciWebservice,Webservice
import requests
import json
import base64

2. Получить информацию о рабочей области Azure ML:

Используйте приведенный ниже код, чтобы получить информацию о рабочей области Azure ML в объекте «ws». Здесь пользователю необходимо ввести идентификатор клиента Azure для интерактивной аутентификации при входе, а также ввести идентификатор подписки, имя рабочей области и группу ресурсов. Эту информацию вы можете получить на своем лазурном портале.

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

interactive_auth = InteractiveLoginAuthentication(tenant_id="<Your Azure tenant Id>")

ws = Workspace(subscription_id="<Your Azure Sub scription Id>",
               resource_group="<Resource Group>",
               workspace_name="<Your Workspace Name>",
               auth=interactive_auth)

2. Зарегистрируйте модель :

Используйте метод Model.register, чтобы зарегистрировать нашу обученную модель в рабочей области машинного обучения Azure. В соответствии с Частью 1 мы сохранили нашу обученную модель в файле .h5, и на нее следует ссылаться здесь вместе с объектом рабочей области.

model = Model.register(model_path = "Covid_Final_Best_model.h5",
                       model_name = "Covid19Prediction",
                       description = "COVID19 Prediction using xception model",
                       workspace = ws)

После успешной регистрации модели вы можете увидеть информацию о зарегистрированной модели на портале Azure, как показано ниже.

3. Определить конфигурацию логического вывода:

Конфигурация вывода определяет среду, используемую для запуска развернутой модели. Конфигурация вывода ссылается на следующие объекты, которые используются для запуска модели при ее развертывании:

  • Сценарий входа: этот файл (с именем modelscor.py) загружает модель при запуске развернутой службы. Он также отвечает за получение данных, передачу их в модель и последующий возврат ответа.
  • Среда: Среда определяет программные зависимости, необходимые для запуска модели и сценария входа. Здесь мы должны добавить необходимые пакеты зависимостей Conda для нашей модели.
# Create the environment
myenv = Environment(name="myenv")
conda_dep = CondaDependencies()

# Define the packages needed by the model and scripts
conda_dep.add_conda_package("pandas")
conda_dep.add_conda_package("numpy")
conda_dep.add_conda_package("scikit-learn")
conda_dep.add_conda_package("tensorflow")
conda_dep.add_conda_package("keras")
conda_dep.add_conda_package("opencv")
# You must list azureml-defaults as a pip dependency
conda_dep.add_pip_package("azureml-defaults")


# Adds dependencies to PythonSection of myenv
myenv.python.conda_dependencies=conda_dep

inference_config = InferenceConfig(entry_script="modelscore.py",
                                   environment=myenv)

Сценарий входа:

Сценарий входа имеет только две обязательные функции: init() и run(data). Эти функции используются для инициализации службы при запуске и запуска модели с использованием данных запроса, переданных клиентом.

Здесь метод init () — это метод запуска, в нем нам нужно инициализировать объект «модель» и использовать функцию keras.models.load_model для загрузки из нашего зарегистрированного файла модели, как показано ниже.

# Called when the deployed service starts
def init():
 global model
print("init method has been invoked")
# The AZUREML_MODEL_DIR environment variable indicates
# a directory containing the model file you registered.
model_filename = 'Covid_Final_Best_model.h5'
model_path = os.path.join(os.environ['AZUREML_MODEL_DIR'], model_filename)
# load models
model = load_model(model_path)
print("init method has been completed")

В методе run(data) данные входного параметра должны быть сериализуемым объектом JSON. Этот объект данных изображения отправляется в метод imageDataPreProcessing, где он преобразуется в массив байтов, изменяет размер изображения до 150x150 и возвращает нормализованные данные изображения в виде массива numpy. Этот же шаг мы выполнили в Части 1 для предварительной обработки данных изображения. И, наконец, нормализованные входные данные изображения будут отправлены в метод прогнозирования, где он использует нашу загруженную модель и прогнозирует, что входные данные COVID-19 ПОЛОЖИТЕЛЬНЫ или НЕГАТИВНЫ. Здесь наша модель будет возвращать значение вероятности 0–1, и мы установили предел порогового значения как 0,5, если прогнозируемое значение больше 0,5, то это ПОЛОЖИТЕЛЬНОЕ, иначе оно возвращает ОТРИЦАТЕЛЬНОЕ.

# Handle requests to the service
def run(data):
    try:
        print("run method has been invoked")
       
        imgInputData = imageDataPreProcess(data)
        prediction = predict(imgInputData)
        #Return prediction
        return prediction
    except Exception as e:
        error = str(e)
        print("ERROR :: ",error)
        return error
def imageDataPreProcess(inputData):
    #Convert inputdata to Json object
    jsonData=json.loads(inputData)
    #Get image bytes
    imageByte=jsonData["data"].encode("utf-8")
    #Get base64 bytes
    imgByteArray=base64.b64decode(imageByte)
    #Convert to byte Array
    imgByteArray = bytearray(imgByteArray)
    image = np.asarray(imgByteArray, dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    #Resize image to 150X150
    resized_arr = cv2.resize(image, (150, 150))
    #Normalize the image to 0-1 from 0-255
    X=resized_arr/255
    #Expand image dimension to (1,150,150,3)
    X = np.expand_dims(X, axis=0)
    return X
# Predict input image data is COVID-19 POSITIVE or NEGATIVE using #the model
def predict(imgData):
    start_at = time.time()
    # Prediction
    prediction=model.predict(imgData)
    print("Predicted Value :",prediction[0][0])
    predictedValue=prediction[0][0]
    #Threshold limit value is 0.5
    if(predictedValue > 0.5):
        label="POSITIVE"
    else:
        label="NEGATIVE"
print("Predicted Label :",label)
    print("Process status :Completed") 
    return {"label": label, "prediction": str(predictedValue),
                "elapsed_time": time.time()-start_at}

4. Разверните модель в ACI:

Теперь модель готова к развертыванию в ACI, здесь мы выбрали 1 CPU_cores и 4 ГБ памяти для этой модели в веб-службе ACI. Развертывание в Azure займет несколько минут. После успешного развертывания состояние службы ACI является работоспособным, и URL-адрес оценки должен быть доступен. Вы также можете проверить состояние службы ACI развернутой модели на портале Azure, как показано ниже. Теперь этот URL-адрес оценки может быть доступен для любых клиентских компонентов.

deployment_config = AciWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 4)
model = Model(ws, name='Covid19Prediction')
service = Model.deploy(ws, 'covid19webservice', [model], inference_config, deployment_config)

service.wait_for_deployment(True)
print(service.state)
print("scoring URI: " + service.scoring_uri)

5. Тестовая модель с использованием службы ACI:

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

Вывод:

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

2. Наконец, мы можем зарегистрировать нашу предварительно обученную модель в рабочей области Azure ML и развернуть ее в ACI (Azure Container Instances).

Репозиторий исходного кода:

Пожалуйста, найдите исходный код этого решения в репозитории my github.



Ссылка:

https://docs.microsoft.com/en-us/azure/machine-learning/how-to-deploy-existing-model

https://docs.microsoft.com/en-us/azure/machine-learning/how-to-consume-web-service