从 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 模型的主要内容,如果未能解决你的问题,请参考以下文章