在azure ml部署环境中导入自定义python模块

Emn*_*oua 5 python pickle azure-machine-learning-service

我有一个 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)
Run Code Online (Sandbox Code Playgroud)

模型保存效果很好。部署步骤与此链接中的步骤相同:

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'
Run Code Online (Sandbox Code Playgroud)

我知道 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
Run Code Online (Sandbox Code Playgroud)

Emn*_*oua 4

事实上,解决方案是将我定制的类MultiColumnLabelEncoder作为pip包导入(可以通过pip install multilllabelencoder==1.0.5找到它)。然后我将 pip 包传递到 .yml 文件或 azure ml 环境的 InferenceConfig 中。在 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)
Run Code Online (Sandbox Code Playgroud)

然后就部署成功了。更重要的一件事是我必须在训练管道中使用相同的 pip 包(multilabelencoder),如下所示:

from multilabelencoder import multilabelencoder 
pipe = Pipeline([
    ("encoder", multilabelencoder.MultiColumnLabelEncoder(columns)),
    ('k-means', kmeans),
])
#Training the pipeline
trainedModel = pipe.fit(df)
Run Code Online (Sandbox Code Playgroud)