在 Databricks 上注册 Azure 机器学习模型步骤

3

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

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

UserErrorException: UserErrorException: Message: 操作返回了无效的状态代码“Forbidden”。可能的原因是:

  1. 您未被授权访问此资源或目录列表被拒绝。
  2. 您可能未登录 Azure 服务,或使用其他订阅。您可以运行 Azure CLI 命令“az account list -o table”来检查默认帐户。
  3. 您已经打开了多个对象/登录会话,请关闭所有会话后重试。

InnerException None ErrorResponse { "error": { "code": "UserError", "message": "\n操作返回了无效的状态代码“Forbidden”。可能的原因是:\n1. 您未被授权访问此资源或目录列表被拒绝。\n2. 您可能未登录 Azure 服务,或使用其他订阅。您可以运行 Azure CLI 命令“az account list -o table”来检查默认帐户。\n3. 您已经打开了多个对象/登录会话,请关闭所有会话后重试。\n " } }

调用堆栈如下

/databricks/python/lib/python3.7/site-packages/azureml/_restclient/models_client.py 中的 register_model() 方法报错。 70 return self.
71 _execute_with_workspace_arguments(self._client.ml_models.register, model, ---> 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 中的 _execute_with_workspace_arguments() 方法报错。 65 66 def _execute_with_workspace_arguments(self, func, *args, **kwargs): ---> 67 return 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 中的 _execute_with_arguments() 方法报错。 536 return self._call_paginated_api(func, *args_list, **kwargs) 537 else: --> 538 return self._call_api(func, *args_list, **kwargs) 539 except ErrorResponseException as e: 540 raise ServiceException(e)

在/databricks/python/lib/python3.7/site-packages/azureml/_restclient/clientbase.py文件中,_call_api函数在执行时调用了_execute_with_base_arguments函数并返回结果。_execute_with_base_arguments函数接受func、*args和**kwargs等参数,将它们传递给_internal_execute_func方法进行处理并返回结果。如果_internal_execute_func方法出错,则_handle_retry方法会尝试重新执行该方法,直到达到重试次数限制或者成功为止。如果错误是由于登录会话等问题引起的,则需要关闭所有会话并重试。最后,six库中的raise_from方法将异常包装并抛出。
 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

请分享您正在尝试注册模型的脚本。 - Ram
2个回答

0

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

  • 将模型(joblib.dump)持久化到自定义文件夹,而非outputs。
  • 手动运行upload_file,将模型上传到AML工作区。将目标命名为与您的模型文件相同的名称。
  • 然后运行run.register_model。

或者 AML后台进程可以自动上传./outputs下的内容到AML工作区。一旦上传完成,请调用run.register_model来获取AML工作区的内容。

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


谢谢您的回答,我知道如何持久化/注册模型,通常情况下(例如在Azure ML Compute Instance上)它都能够完美运行,但是只有在DatabricksStep期间才会出现错误。此外,DatabricksStep中的所有其他代码都可以顺利执行,只有register_model()函数会抛出错误。 - Jonas
我们为此创建了一个bug,修复后会进行更新。 - Ram

0
UserErrorException: UserErrorException: Message: Operation returned an invalid status code 'Forbidden'.

这个错误可能是由于Azure Databricks Compute无法验证Azure Machine Learning Workspace的身份而引起的。

我曾经遇到过类似的错误,以下是Microsoft解决此问题的首选方法:

  1. 创建一个Azure Key Vault。
  2. 在Azure Active Directory中创建一个服务主体(应用程序注册)。
  3. 将此服务主体添加为AML和ADB的Contributor/Owner访问权限。
  4. 创建一个Azure Databricks Scope,并将其与步骤1中创建的密钥库链接。
  5. 将客户端ID、目录ID和客户端密钥保存在密钥库中。
  6. 使用ServicePrincipalAuthentication验证凭据。

在第六步中,使用Databricks Secret Scope获取值。此资源将指导您完成此步骤:Azure Databricks中的秘密管理

以下参考资料可能会有所帮助:

  1. Microsoft提供的一个实际演示示例。
  2. ServicePrincipalAuthentication的Microsoft文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接