Невозможно получить доступ к пакетам Python, установленным в Azure ML

Я пытаюсь развернуть предварительно обученную модель машинного обучения (сохраненную как файл .h5) в Azure ML. Я создал кластер AKS и пытаюсь развернуть модель, как показано ниже:

from azureml.core import Workspace
from azureml.core.model import Model

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.model import InferenceConfig

from azureml.core.webservice import AksWebservice, LocalWebservice
from azureml.core.compute import ComputeTarget

workspace = Workspace.from_config(path="config.json")

env = Environment.get(workspace, name='AzureML-TensorFlow-1.13-GPU')

# Installing packages present in my requirements file
with open('requirements.txt') as f:
    dependencies = f.readlines()
dependencies = [x.strip() for x in dependencies if '# ' not in x]
dependencies.append("azureml-defaults>=1.0.45")

env.python.conda_dependencies = CondaDependencies.create(conda_packages=dependencies)

# Including the source folder so that all helper scripts are included in my deployment
inference_config = InferenceConfig(entry_script='app.py', environment=env, source_directory='./ProcessImage')

aks_target = ComputeTarget(workspace=workspace, name='sketch-ppt-vm')

# Deployment with suitable config
deployment_config = AksWebservice.deploy_configuration(cpu_cores=4, memory_gb=32)
model = Model(workspace, 'sketch-inference')
service = Model.deploy(workspace, "process-sketch-dev", [model], inference_config, deployment_config, deployment_target=aks_target, overwrite=True)
service.wait_for_deployment(show_output = True)
print(service.state)

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

Я ожидал, что добавляемые мной вспомогательные сценарии должны иметь доступ к пакетам, установленным при настройке среды во время развертывания, но я получил ModuleNotFoundError.

Вот результат ошибки и пара переменных среды, которые я напечатал при выполнении входного скрипта:

    AZUREML_MODEL_DIR ----  azureml-models/sketch-inference/1
    PYTHONPATH ----  /azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages:/var/azureml-server:
    PATH ----  /azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/bin:/opt/miniconda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/intel/compilers_and_libraries/linux/mpi/bin64
    Exception in worker process
    Traceback (most recent call last):
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
        worker.init_process()
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
        self.load_wsgi()
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
        self.wsgi = self.app.wsgi()
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
        self.callable = self.load()
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
        return self.load_wsgiapp()
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
        return util.import_app(self.app_uri)
    File "/azureml-envs/azureml_6dc005c11e151f8d9427c0c6091a1bb9/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
        __import__(module)
    File "/var/azureml-server/wsgi.py", line 1, in <module>
        import create_app
    File "/var/azureml-server/create_app.py", line 3, in <module>
        from app import main
    File "/var/azureml-server/app.py", line 32, in <module>
        from aml_blueprint import AMLBlueprint
    File "/var/azureml-server/aml_blueprint.py", line 25, in <module>
        import main
    File "/var/azureml-app/main.py", line 12, in <module>
        driver_module_spec.loader.exec_module(driver_module)
    File "/structure/azureml-app/ProcessImage/app.py", line 16, in <module>
        from ProcessImage.samples.coco.inference import run as infer
    File "/var/azureml-app/ProcessImage/samples/coco/inference.py", line 1, in <module>
        import skimage.io
    ModuleNotFoundError: No module named 'skimage'

Существующие ответы, связанные с этим, не очень помогают. Я считаю, что должен быть более простой способ исправить это, поскольку AzureML специально предоставляет функцию для настройки среды с пакетами pip / conda, установленными либо путем предоставления файла requirements.txt, либо индивидуально.

Что мне здесь не хватает? Пожалуйста, помогите.


person Furqan Rahamath    schedule 24.11.2020    source источник


Ответы (1)


Итак, после некоторых проб и ошибок, создание новой среды и последующее добавление пакетов решили для меня проблему. Я до сих пор не понимаю, почему это не сработало, когда я попытался использовать Environment.from_pip_requirements (). Было бы интересно прочитать развернутый ответ на этот счет.

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

1. Стандартные пакеты python (устанавливаются через pip)
Это было решено путем создания зависимостей conda и их добавления в объект env (шаг 2)

2. Методы / переменные из вспомогательных скриптов (если у вас есть предварительная / пост-обработка, которая должна выполняться во время вывода модели):
Это было сделано путем упоминания source_directory в InferenceConfig (шаг 3)

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

from azureml.core import Workspace
from azureml.core.model import Model
from azureml.core.environment import Environment, DEFAULT_GPU_IMAGE
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.model import InferenceConfig
from azureml.core.webservice import AksWebservice, LocalWebservice
from azureml.core.compute import ComputeTarget


# 1. Instantiate the workspace
workspace = Workspace.from_config(path="config.json")

# 2. Setup the environment
env = Environment('sketchenv')
with open('requirements.txt') as f: # Fetch all dependencies as a list
    dependencies = f.readlines()
dependencies = [x.strip() for x in dependencies if '# ' not in x]
env.docker.base_image = DEFAULT_GPU_IMAGE
env.python.conda_dependencies = CondaDependencies.create(conda_packages=['numpy==1.17.4', 'Cython'], pip_packages=dependencies)

# 3. Inference Config
inference_config = InferenceConfig(entry_script='app.py', environment=env, source_directory='./ProcessImage')

# 4. Compute target (using existing cluster from the workspacke)
aks_target = ComputeTarget(workspace=workspace, name='sketch-ppt-vm')

# 5. Deployment config
deployment_config = AksWebservice.deploy_configuration(cpu_cores=6, memory_gb=100)

# 6. Model deployment
model = Model(workspace, 'sketch-inference') # Registered model (which contains model files/folders)
service = Model.deploy(workspace, "process-sketch-dev", [model], inference_config, deployment_config, deployment_target=aks_target, overwrite=True)
service.wait_for_deployment(show_output = True)
print(service.state)

person Furqan Rahamath    schedule 24.11.2020