我上传了一个带有的模型
gcloud beta ai models upload --artifact-uri
在docker中,我访问AIP_STORAGE_URI
。我看到AIP_STORAGE_URI
是另一个谷歌存储位置,所以我尝试使用storage.Client()
下载文件,但它说我没有访问权限:
google.api_core.exceptions.Forbidden: 403 GET https://storage.googleapis.com/storage/v1/b/caip-tenant-***-***-*-*-***?projection=noAcl&prettyPrint=false: custom-online-prediction@**.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket
我正在使用默认服务帐户运行此终结点。
https://cloud.google.com/vertex-ai/docs/predictions/custom-container-requirements#artifacts
根据以上链接:The service account that your container uses by default has permission to read from this URI.
我做错了什么?
错误背后的原因是,Vertex AI使用的默认服务帐户具有"存储对象查看器"角色,不包括storage.buckets.get
权限。同时,代码的storage.Client()
部分向默认服务帐户无权访问的Vertex AI管理的bucket发出storage.buckets.get
请求。
为了解决这个问题,我建议您遵循以下步骤-
-
更改自定义代码以访问具有项目中模型工件的bucket,而不是使用指向Vertex AI管理bucket中模型位置的环境变量
AIP_STORAGE_URI
。 -
创建您自己的服务帐户,并授予该服务帐户自定义代码所需的所有权限。对于此特定错误,必须向服务帐户授予具有
storage.buckets.get
权限的角色,例如Storage Admin("roles/Storage.Admin"(。 -
在";服务帐户";字段。
如果你查看谷歌文档,它说模型的容器默认可以访问Vertex AI存储模型工件的不同存储桶。在您的python脚本中,或者在任何地方,您都可以使用gcloud命令来安装模型工件,而无需运行gcloud init
或进行任何授权。
以下是如何使用AIP_STORAGE_URI:在python脚本中下载模型工件的示例
# Loading the model from the pickle file
AIP_STORAGE_URI = os.environ.get('AIP_STORAGE_URI')
command = f"gcloud storage cp '{AIP_STORAGE_URI}/model.pkl' model.pkl"
subprocess.run(command, shell=True, stdout=subprocess.PIPE)
with open('model.pkl', 'rb') as file:
model = pickle.load(file)
请确保在Docker映像中安装了gcloud CLI。