Развертывание Azure-ML НЕ видит среду AzureML (неправильный номер версии)

Я очень хорошо следил за документацией, как указано здесь.

Я настроил свою среду машинного обучения Azure следующим образом:

from azureml.core import Workspace

# Connect to the workspace
ws = Workspace.from_config()

from azureml.core import Environment
from azureml.core import ContainerRegistry

myenv = Environment(name = "myenv")

myenv.inferencing_stack_version = "latest"  # This will install the inference specific apt packages.

# Docker
myenv.docker.enabled = True
myenv.docker.base_image_registry.address = "myazureregistry.azurecr.io"
myenv.docker.base_image_registry.username = "myusername"
myenv.docker.base_image_registry.password = "mypassword"
myenv.docker.base_image = "4fb3..." 
myenv.docker.arguments = None

# Environment variable (I need python to look at folders 
myenv.environment_variables = {"PYTHONPATH":"/root"}

# python
myenv.python.user_managed_dependencies = True
myenv.python.interpreter_path = "/opt/miniconda/envs/myenv/bin/python" 

from azureml.core.conda_dependencies import CondaDependencies
conda_dep = CondaDependencies()
conda_dep.add_pip_package("azureml-defaults")
myenv.python.conda_dependencies=conda_dep

myenv.register(workspace=ws) # works!

У меня есть файл score.py, настроенный для вывода (не имеет отношения к проблеме, с которой я столкнулся) ...

Затем я настраиваю конфигурацию вывода

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

Я настраиваю свой вычислительный кластер:

from azureml.core.compute import ComputeTarget, AksCompute
from azureml.exceptions import ComputeTargetException

# Choose a name for your cluster
aks_name = "theclustername" 

# Check to see if the cluster already exists
try:
    aks_target = ComputeTarget(workspace=ws, name=aks_name)
    print('Found existing compute target')
except ComputeTargetException:
    print('Creating a new compute target...')
    prov_config = AksCompute.provisioning_configuration(vm_size="Standard_NC6_Promo")

    aks_target = ComputeTarget.create(workspace=ws, name=aks_name, provisioning_configuration=prov_config)

    aks_target.wait_for_completion(show_output=True)

from azureml.core.webservice import AksWebservice

# Example
gpu_aks_config = AksWebservice.deploy_configuration(autoscale_enabled=False,
                                                    num_replicas=3,
                                                    cpu_cores=4,
                                                    memory_gb=10)

Все удается; затем я пытаюсь развернуть модель для вывода:

from azureml.core.model import Model

model = Model(ws, name="thenameofmymodel")

# Name of the web service that is deployed
aks_service_name = 'tryingtodeply'

# Deploy the model
aks_service = Model.deploy(ws,
                           aks_service_name,
                           models=[model],
                           inference_config=inference_config,
                           deployment_config=gpu_aks_config,
                           deployment_target=aks_target,
                           overwrite=True)

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

И он не говорит, что не может найти окружающую среду. В частности, моя версия среды - версия 11, но она продолжает попытки найти среду с номером версии, который на 1 выше (т. Е. версия 12), чем текущая среда. :

FailedERROR - Service deployment polling reached non-successful terminal state, current service state: Failed
Operation ID: 0f03a025-3407-4dc1-9922-a53cc27267d4
More information can be found here: 
Error:
{
  "code": "BadRequest",
  "statusCode": 400,
  "message": "The request is invalid",
  "details": [
    {
      "code": "EnvironmentDetailsFetchFailedUserError",
      "message": "Failed to fetch details for Environment with Name: myenv Version: 12."
    }
  ]
}

Я попытался вручную отредактировать JSON среды в соответствии с версией, которую пытается получить azureml, но ничего не работает. Может ли кто-нибудь увидеть что-то не так с этим кодом?

Обновлять

Изменение имени среды (например, my_inference_env) и передача его InferenceConfig, похоже, на правильном пути. Однако теперь ошибка меняется на следующее

Running..........
Failed
ERROR - Service deployment polling reached non-successful terminal state, current service state: Failed
Operation ID: f0dfc13b-6fb6-494b-91a7-de42b9384692
More information can be found here: https://some_long_http_address_that_leads_to_nothing
Error:
{
  "code": "DeploymentFailed",
  "statusCode": 404,
  "message": "Deployment not found"
}

Решение

Ответ Андерса, приведенный ниже, действительно правильный относительно использования сред Azure ML. Однако последняя ошибка, которую я получал, была связана с тем, что я устанавливал образ контейнера, используя значение дайджеста (a sha), а НЕ имя и тег изображения (например, imagename:tag). Обратите внимание на строку кода в первом блоке:

myenv.docker.base_image = "4fb3..." 

Я ссылаюсь на значение дайджеста, но его следует изменить на

myenv.docker.base_image = "imagename:tag"

Как только я внес это изменение, развертывание прошло успешно! :)


person Brian Goodwin    schedule 17.08.2020    source источник
comment
Спасибо за весь контекст!   -  person Anders Swanson    schedule 18.08.2020
comment
Все ли четыре фрагмента кода, которыми вы поделились выше, выполняются в одном .py или .ipynb? Или куски разбиты на несколько файлов?   -  person Anders Swanson    schedule 18.08.2020
comment
Они выполнены в одном блокноте! :) спасибо за ответ - попробую как можно скорее!   -  person Brian Goodwin    schedule 18.08.2020
comment
@BrianGoodwin Мне любопытно, почему вы устанавливаете это значение true: myenv.python.user_managed_dependencies = True? Я спрашиваю, потому что вы определяете пакеты conda, так почему бы Azure ML не управлять средой и зависимостями?   -  person Aravind Yarram    schedule 08.09.2020
comment
Поскольку образ докера уже содержит (более сложные) зависимости, включая пользовательские пакеты, которые недоступны через pip, Conda и т. Д. Поэтому я устанавливаю переменную среды, которая заставляет интерпретатор python быть тем, что я хочу. Зависимости Conda существуют только для единственной, необходимой для azureml. Надеюсь, это поможет!   -  person Brian Goodwin    schedule 10.09.2020


Ответы (1)


Одна концепция, на разработку которой у меня ушло время, заключалась в раздвоении регистрации и использования Azure ML Environment. Если вы уже зарегистрировали свой env, myenv, и ни одна из деталей вашей среды не изменилась, нет необходимости повторно регистрировать его с помощью myenv.register(). Вы можете просто получить уже зарегистрированный env, используя _ 4_ вот так:

myenv = Environment.get(ws, name='myenv', version=11)

Я бы порекомендовал назвать вашу среду чем-нибудь новым: например, "model_scoring_env". Зарегистрируйте его один раз, затем передайте InferenceConfig.

person Anders Swanson    schedule 17.08.2020
comment
Спасибо! Кажется, ваш подход на правильном пути ... моя ошибка теперь меняется (см. Опубликованное мною обновление). Как ты думаешь, мне следует просто отказаться от всего и начать с нуля? Может быть, у моего azureml какая-то странная конфигурация, которую я неправильно настроил? без понятия. озадаченный здесь. - person Brian Goodwin; 18.08.2020
comment
вам действительно нужен собственный образ докера? и работает ли у вас пример сквозной записной книжки без проблем? - person Anders Swanson; 18.08.2020
comment
да - у меня есть некоторые зависимости, которые я не могу обернуть и отправить через классы CondaDependencies. За исключением последнего шага развертывания, все работает отлично. Даже в этом случае вы могли бы подумать, что azureml должен иметь возможность размещать пользовательские изображения, учитывая, что у них есть средства для его настройки. Позвольте мне попробовать настроить общедоступное репозиторий GitHub с кодом. - person Brian Goodwin; 18.08.2020
comment
Я действительно задаюсь вопросом, не связана ли ошибка с некоторыми скрытыми проверками, которые выполняет лазурь ... Я должен попытаться обойти это без образа докера. Я попробую. - person Brian Goodwin; 18.08.2020
comment
Я думаю, 50-50 шансов на ошибку серверной части против одной крошечной ошибки, которую мы не знаем, что делаем. - person Anders Swanson; 18.08.2020
comment
Мой проверенный и верный подход состоит в том, чтобы клонировать пример записной книжки и начинать настраивать / повторять настройки, пока не обнаружите ошибку. - person Anders Swanson; 18.08.2020
comment
Твердый совет @AndersSwanson - еще раз спасибо. Я попробую! - person Brian Goodwin; 18.08.2020
comment
нп. Я поделюсь этим вопросом с некоторыми людьми, которые знают больше о развертывании в AM. - person Anders Swanson; 18.08.2020
comment
В очередной раз благодарим за помощь! Я отредактировал свой пост с помощью решения, которое позволило успешному развертыванию ... оказалось, что это простая одна строка кода, как вы сказали, LOL. Но ваш ответ определенно решил более крупную (исходную) проблему, с которой я столкнулся, когда Azure ML выполнял управление версиями среды. - person Brian Goodwin; 20.08.2020