从 DatabricksStep 注册 Azure ML 模型

Posted

技术标签:

【中文标题】从 DatabricksStep 注册 Azure ML 模型【英文标题】:Register Azure ML Model from DatabricksStep 【发布时间】:2020-11-13 10:58:44 【问题描述】:

我在 Azure ML Pipeline 中执行 DatabricksStep 时计算模型,将其作为 .pkl 文件保存在我的 Blob 存储中,然后使用 Run.upload_file () 将其上传到当前的 Azure ML Run。所有这些都没有任何问题。

但一旦我尝试使用 Run.register_model () 将模型注册到 Azure ML 工作区,脚本就会抛出以下错误:

用户错误异常:用户错误异常: 信息: 操作返回了无效的状态代码“禁止”。可能的原因可能是:

    您无权访问此资源,或目录列表被拒绝。 您可能没有登录您的 azure 服务,或使用其他订阅,您可以查看您的 通过运行 azure cli 推荐默认帐户: 'az 帐户列表 -o 表'。 您打开了多个对象/登录会话,请关闭所有会话并重试。

InnerException 无 错误响应 “错误”: “代码”:“用户错误”, "message": "\nOperation 返回了一个无效的状态码 'Forbidden'。可能的原因是:\n1. 您无权访问此资源,或者目录列表被拒绝。\n2. 您可能没有登录您的 azure 服务,或使用其他订阅,您可以通过运行 azure cli 命令检查您的\n默认帐户:\n'az account list -o table'。\n3. 您打开了多个对象/登录会话,请关闭所有会话并重试。\ n"

使用以下调用堆栈

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/models_client.py in register_model(self, name, tags, properties, description, url, mime_type, framework, framework_version, unpack, Experiment_name, run_id、数据集、sample_input_data、sample_output_data、resource_requirements) 70回归自我。 71 _execute_with_workspace_arguments(self._client.ml_models.register,模型, ---> 72 custom_headers=ModelsClient.get_modelmanagement_custom_headers()) 73 74 @error_with_model_id_handling

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/workspace_client.py in _execute_with_workspace_arguments(self, func, *args, **kwargs) 65 66 def _execute_with_workspace_arguments(self, func, *args, **kwargs): ---> 67 返回 self._execute_with_arguments(func, copy.deepcopy(self._workspace_arguments), *args, **kwargs) 68 69 def get_or_create_experiment(self,experiment_name,is_async=False):

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py in _execute_with_arguments(self, func, args_list, *args, **kwargs) 第536章 537 其他: --> 538 返回 self._call_api(func, *args_list, **kwargs) 539 除了 ErrorResponseException 作为 e: 540 引发服务异常(e)

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py in _call_api(self, func, *args, **kwargs) 234 返回异步任务(未来,_ident=ident,_parent_logger=self._logger) 235 其他: --> 236 返回 self._execute_with_base_arguments(func, *args, **kwargs) 237 238 def _call_paginated_api(self, func, *args, **kwargs):

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py in _execute_with_base_arguments(self, func, *args, **kwargs) 323 total_retry = 0 if self.retries 325 back_off,total_retry,self._logger,func,_noop_reset,*args,**kwargs) 326 第327章

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py 在 _execute_func_internal(cls​​, back_off, total_retry, logger, func, reset_func, *args, **kwargs) 第343章 344 例外为错误: --> 345 left_retry = cls._handle_retry(back_off,left_retry,total_retry,错误,记录器,函数) 346 347 reset_func(*args, **kwargs) # reset_func 预计会撤消失败的 func 调用的任何副作用。

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py in _handle_retry(cls, back_off, left_retry, total_retry, error, logger, func) 384 3. 您打开了多个对象/登录会话,请关闭所有会话并重试。 第385章 --> 386 raise_from(UserErrorException(error_msg), 错误) 387 388 elif error.response.status_code == 429:

/databricks/python/lib/python3.7/site-packages/six.py in raise_from(value, from_value)

有没有人遇到过同样的错误并且知道是什么原因以及如何解决?

最好, 乔纳斯

更新:

 model = sklearn.linear_model.LinearRegression ( )
 model_path = "<path to 'model.pkl' in my blob storage>"
 joblib.dump(model, model_path)
 aml_run = azureml.core.get_context ( )
 aml_run.upload_file (name = "model.pkl", path_or_stream = model_path)
 # Until this point, everything works fine
    
 aml_run.register_model (model_name = "model.pkl")
 # This throws the posted "Forbidden"-Error

【问题讨论】:

请分享您正在尝试注册模型的脚本。 【参考方案1】:

要配置工作区以对订阅进行身份验证,请按照笔记本中的steps 操作。

将模型 (joblib.dump) 保存到输出以外的自定义文件夹。 手动运行 upload_file 以上传模型 AML 工作区。将目标命名为与您的模型文件相同的名称。 然后运行 ​​run.register_model。

或 AML 后台进程自动将 ./outputs 下的内容上传到 AML 工作区。上传完成后调用 run.register_model 从 AML 工作区获取内容。

文档 DatabricksStep class 和示例笔记本 https://aka.ms/pl-databricks 应该都有帮助。

【讨论】:

感谢您的回答,我知道如何持久化/注册模型,通常(例如在 Azure ML 计算实例上)它就像一个魅力,错误只发生在 DatabricksStep 期间。此外,DatabricksStep 中的所有其他代码都可以顺利执行,只有 register_model () 函数会引发错误。 我们为此创建了一个错误,一旦修复就会更新。【参考方案2】:
UserErrorException: UserErrorException: Message: Operation returned an invalid status code 'Forbidden'.

此错误可能是由于 Azure Databricks Compute 无法对 Azure 机器学习工作区进行身份验证。

我遇到过类似的错误,这是 Microsoft 解决此问题的首选方式:

    创建 Azure Key Vault。 在 Azure Active Directory 中创建服务主体(应用注册)。 在 AML 和 ADB 中添加具有贡献者/所有者访问权限的服务主体。 创建 Azure Databricks 范围并将其与在步骤 1 中创建的密钥保管库链接。 将客户端 ID、目录 ID 和客户端密码保存在 Key Vault 中。 使用 ServicePrincipalAuthentication 验证凭据。

对于第六步,使用 Databricks Secret Scope 获取值。此资源将引导您完成此步骤:Secret Management in Azure Databricks

一些有用的参考资料:

    A worked-out example provided by Microsoft. Microsoft Documentation on ServicePrincipalAuthentication

【讨论】:

以上是关于从 DatabricksStep 注册 Azure ML 模型的主要内容,如果未能解决你的问题,请参考以下文章

将通知模板从应用后端注册到 Azure 通知中心

从 Azure 函数 NET 5 迁移到 NET 6 - 现在如何注册中间件

从 Azure 机器学习运行注册模型,无需下载到本地文件

如何从 Azure ML 管道脚本步骤注册模型

Azure B2C:从单独的登录步骤访问时,注册页面出错

Microsoft bot 框架 - Bot 频道注册。无法将录制的视频从 Skype 保存到 Azure 存储帐户