【问题标题】:Import data and python scripts in azure ml entry script when deploying models部署模型时在 azure ml 入口脚本中导入数据和 python 脚本
【发布时间】:2020-10-08 07:15:48
【问题描述】:

我的本​​地系统上保存了一个现有的机器学习模型。我想将此模型部署为 Web 服务,以便可以将此模型用作请求-响应,即向模型发送 HTTP 请求并返回预测的响应。

尝试在 AzureML 上部署此模型时遇到了一些问题

模型需要在 init() 函数中的入口脚本中初始化,但是为了初始化我的模型,我有一个自定义类并且需要加载几个 txt 文件。

下面是初始化模型对象的代码

from model_file import MyModelClass  # this is the file which contains the model class

def init():
  global robert_model

  my_model = MyModelClass(vocab_path='<path-to-text-files>',
                          model_paths=['<path-to-model-file>'],
                          iterations=5,
                          min_error_probability=0.0,
                          min_probability=0.0,
                          weigths=None)
def run(json_data):
  try:
    data = json.loads(json_data)
    preds, cnt = my_model.handle_batch([sentence.split()])
    return {'output': pred, 'count': cnt}
  except Exception as e:
    error = str(e)
    return error

不知道如何在入口脚本中导入那些类文件和文本文件

我对 azure 了解不多,而且我很难弄清楚这一点。请帮忙。

【问题讨论】:

    标签: python azure machine-learning web-deployment azureml


    【解决方案1】:

    我找到了解决办法:

    解决方案就在那里,我只需要在官方文档中阅读更多内容。下面我已经解释了我的问题的解决方案。

    在 Azure 机器学习工作室上部署模型时,我们必须准备 3 件事:

    1. Entry Script 是进行预测的实际 Python 脚本。

    2. Deployment Configuration 可以被认为是运行模型的计算机。

    3. Inference Configuration 定义模型的软件依赖关系。在这里,我们还可以提供文本/静态文件。

    inferece_config 接受一个名为 source_directory 的参数。我们可以为 source_directory 参数提供文件夹路径,如下所示

    inference_config = InferenceConfig(
        entry_script="<entry-script.py>",
        environment=myenv, 
        source_directory="<path-to-your-folder>",
    )
    

    我们可以将我们所有的需求放在这个文件夹中,包括文本、静态、CSV、python 脚本等文件。 入口脚本也必须放在这个文件夹中。 此文件夹将由 azure 直接复制到创建的部署映像中。这样我们就可以在入口脚本中使用常规的python语法访问这些文件。

    对于我的解决方案:

    如果我有这样的inference_config

    inference_config = InferenceConfig(
        entry_script="score.py", 
        environment=myenv, 
        source_directory='./assets',
    )
    

    在./assets 文件夹中有这个

    assets
    ├── my_model_class.py
    ├── score.py
    └── data
        └── vocaublary.txt
    
    1 directory, 3 files
    

    然后我的输入脚本 (score.py) 将如下所示:

    from assets.my_model_class import MyModelClass
        
    def init():
      global my_model
      model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 
                                'my_model.pkl',)
    
      my_model = MyModelClass(vocab_path='assets/data/vocaublary.txt', 
                              model_path=model_path,)
    
    def run(json_data):
      try:
        data = json.loads(json_data)
        prediction = my_model.predict(data)
        return {'data': prediction}
      except Exception as e:
        // do error handling
        return error
    
    

    注意:即使score.py 存在于assets 文件夹中,我们也必须从assets.my_model_class 导入,因为部署后CWD(当前工作目录)更改为assets文件夹

    【讨论】:

      【解决方案2】:

      与模型相关的附加文件可以直接上传到源目录中的 Azure ML Workspace(带有 GUI),即 HOME > Notebooks。 (参考图片)。

      使用添加文件按钮

      将文件添加到此(源目录)

      上传的文件可以通过os.getEnv()方法访问。

      from azureml.core import Workspace
      from azureml.core import Environment
      import os
      
      # Connect to WS
      ws = Workspace(subscription_id="sid",
                     resource_group="rg",
                     workspace_name="wsname")
      
      # Creating inference Config for demo
      env = Environment(name='environment_name')
      inf_config = InferenceConfig(environment=env, source_directory=os.getenv('ENV_NAME'), entry_script='./score.py')
      

      【讨论】:

      • 这看起来不错。只要有机会,我一定会尝试这个。感谢您的回答。
      【解决方案3】:

      对于 txt/静态文件 - 您可以上传到 Azure Blob 并即时使用它们。 对于类,您可以将类封装在模块中。

      您可以在此处执行 2 个选项

      选项 1:

      您可以将模块发布到 pip 然后使用它。

      选项 2:

      this article 中描述的“私人轮子文件”解决方案。 以下是示例环境,请仔细查看pip部分。

      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
      

      在thread 中看到了参考代码和类似的讨论。

      【讨论】:

      • 感谢您的回复。但是我找到了一种更简单的方法,在部署模型时我们可以在inference_config中指定一个包含静态文件和包文件的文件夹。该文件夹在部署时被复制,可以在入口脚本中使用。感谢您的帮助
      • 阅读更多关于inference_confighere
      • 请考虑发布您的实施/建议作为答案。它将帮助社区
      • 是的,当然。我已添加我的解决方案作为此问题的答案。
      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2021-12-30
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多