импорт настраиваемого модуля python в среду развертывания azure ml

У меня есть модель sklearn k-means. Я обучаю модель и сохраняю ее в файле pickle, чтобы потом развернуть ее с помощью библиотеки azure ml. Модель, которую я обучаю, использует настраиваемый кодировщик функций под названием MultiColumnLabelEncoder. Модель трубопровода определяется следующим образом:

# Pipeline
kmeans = KMeans(n_clusters=3, random_state=0)
pipe = Pipeline([
("encoder", MultiColumnLabelEncoder()),
('k-means', kmeans),
])
#Training the pipeline
model = pipe.fit(visitors_df)
prediction = model.predict(visitors_df)
#save the model in pickle/joblib format
filename = 'k_means_model.pkl'
joblib.dump(model, filename)

Сохранение модели работает нормально. Шаги по развертыванию такие же, как и по этой ссылке:

https://notebooks.azure.com/azureml/projects/azureml-getting-started/html/how-to-use-azureml/deploy-to-cloud/model-register-and-deploy.ipynb

Однако при развертывании всегда возникает эта ошибка:

  File "/var/azureml-server/create_app.py", line 3, in <module>
    from app import main
  File "/var/azureml-server/app.py", line 27, in <module>
    import main as user_main
  File "/var/azureml-app/main.py", line 19, in <module>
    driver_module_spec.loader.exec_module(driver_module)
  File "/structure/azureml-app/score.py", line 22, in <module>
    importlib.import_module("multilabelencoder")
  File "/azureml-envs/azureml_b707e8c15a41fd316cf6c660941cf3d5/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named 'multilabelencoder'

Я понимаю, что у pickle / joblib есть некоторые проблемы с распаковкой пользовательской функции MultiLabelEncoder. Вот почему я определил этот класс в отдельном скрипте Python (который я тоже выполнил). Я вызвал эту настраиваемую функцию в обучающем скрипте Python, в скрипте развертывания и в файле Python оценки (score.py). Импорт в файл score.py завершился неудачно. Итак, мой вопрос: как я могу импортировать настраиваемый модуль python в среду развертывания azure ml?

Заранее спасибо.

РЕДАКТИРОВАТЬ: это мой файл .yml

name: project_environment
dependencies:
  # The python interpreter version.
  # Currently Azure ML only supports 3.5.2 and later.
- python=3.6.2

- pip:
  - multilabelencoder==1.0.4
  - scikit-learn
  - azureml-defaults==1.0.74.*
  - pandas
channels:
- conda-forge

person Emna Jaoua    schedule 04.12.2019    source источник
comment
Не могли бы вы поделиться файлом окружения (.yml) для проверки.   -  person Ram-msft    schedule 06.12.2019


Ответы (2)


Фактически, решение заключалось в том, чтобы импортировать мой настроенный класс MultiColumnLabelEncoder как пакет pip (вы можете найти его через pip install multilllabelencoder == 1.0.5). Затем я передал пакет pip в файл .yml или в InferenceConfig среды azure ml. В файл score.py я импортировал класс следующим образом:

from multilabelencoder import multilabelencoder
def init():
    global model

    # Call the custom encoder to be used dfor unpickling the model
    encoder = multilabelencoder.MultiColumnLabelEncoder() 
    # Get the path where the deployed model can be found.
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'k_means_model_45.pkl')
    model = joblib.load(model_path)

Затем развертывание прошло успешно. Еще одна важная вещь: мне пришлось использовать тот же пакет pip (Multilabelencoder) в конвейере обучения, как здесь:

from multilabelencoder import multilabelencoder 
pipe = Pipeline([
    ("encoder", multilabelencoder.MultiColumnLabelEncoder(columns)),
    ('k-means', kmeans),
])
#Training the pipeline
trainedModel = pipe.fit(df)
person Emna Jaoua    schedule 06.12.2019

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

 ModuleNotFoundError: No module named 'my-own-module-name'

Нашел это решение для частных файлов колеса в документация MS, и это работает. Отличие от решения выше в том, что теперь мне не нужно публиковать свои скрипты в pip. Я думаю, многие люди могут столкнуться с такой же ситуацией, когда вы по какой-то причине не можете или не хотите публиковать свои скрипты. Вместо этого ваш собственный файл колеса сохраняется в вашем собственном хранилище BLOB-объектов.

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

  1. Упакуйте свои собственные скрипты, от которых зависит модель, в файл колеса, и файл колеса будет сохранен локально.

    ваш_путь / ваше-колесо-имя-файла.whl

  2. Следуйте инструкциям в решении для частных файлов колеса в Документация MS. Ниже приведен код, который у меня сработал.


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

whl_url = Environment.add_private_pip_wheel(workspace=ws,file_path = "your_pathpath/your-wheel-file-name.whl")

myenv = CondaDependencies()
myenv.add_pip_package("scikit-learn==0.22.1")
myenv.add_pip_package("azureml-defaults")
myenv.add_pip_package(whl_url)

with open("myenv.yml","w") as f:
    f.write(myenv.serialize_to_string())

Теперь мой файл среды выглядит так:

name: project_environment
dependencies:
  # The python interpreter version.

  # Currently Azure ML only supports 3.5.2 and later.

- python=3.6.2

- pip:
  - scikit-learn==0.22.1
  - azureml-defaults
  - https://myworkspaceid.blob.core/azureml/Environment/azureml-private-packages/my-wheel-file-name.whl
channels:
- conda-forge

Я новичок в Azure ml. Обучение на практике и общение с сообществом. Это решение отлично работает для меня, надеюсь, что оно поможет.

person Xxx Lll    schedule 27.02.2020