使用AI Studio或者其他LLM平台时,很多用户习惯使用api key授权。但在Vertex需要通过服务账号(Service Account)key的方式授权。这个过程并不复杂,但是没有使用过服务账号的用户,可能对服务账号、key、IAM、Role的概念及操作流程有些疑惑。下边就通过简单demo进行说明。
关于授权的基本概念
在GCP平台,使用IAM对相关账户权限进行管理,涉及的相关概念如下:
- 权限(Permission):权限定义了对资源可执行的操作(资源即GCP的组织、文件夹、项目、服务等用户需要操作管理的设施)
- 角色(Role):权限并不能直接使用(赋予用户),而是通过将一个或者多个权限组成集合(角色),再赋予用户;GCP平台内置若干预定义角色,可直接使用,用户也可以根据需要将若干权限组合创建自定义角色
- 账号:使用GCP的用户,通常用邮箱(user@example.com)形式表示
- 服务账号:服务账号是一种特殊的账号,一般不由真人使用,而是提供给服务获得调用api的权限
IAM的基本逻辑如下:
在Vertex使用服务账号授权
创建服务账号并授权
服务账号的创建很简单,在console点击‘IAM和管理’-‘服务账号’进入服务账号的管理界面:
点击‘创建服务账号’开始创建:
第一步为服务账号命名及确定ID,ID是服务账号的唯一属性,确定后不可修改:
然后向服务账号授权(绑定角色),可以在这里授权也可以以后授权,或者以后也可以修改。这里因为要使用Vertex AI,所以绑定Vertex AI User角色:
下一步可以先忽略,直接完成即可。
现在到IAM里,可以看到创建的服务账号和绑定的角色:
此处点击后边🖊️可以对该账号的角色进行增删改操作。
获取服务账号的key
新建的服务账号已具备所需权限,在开发环境里我们需要通过该服务账号的key在开发环境赋权。
回到服务账号界面,点击已建好的服务账号,进入其管理界面:
点击密钥并创建新密钥(也可以上传现有密钥授权):
保持JSON格式:
创建后会自动将私钥保存到本地,这就是下一步说需要的key:
使用服务账号key授权Vertex
在客户端运行如下sample code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import base64 import vertexai from vertexai.generative_models import GenerativeModel, Part, SafetySetting
def generate(): vertexai.init(project="hy-20240914-001", location="us-central1") model = GenerativeModel( "gemini-1.5-flash-001", ) responses = model.generate_content( ["""请描述一个宠物"""], generation_config=generation_config, safety_settings=safety_settings, stream=True, )
for response in responses: print(response.text, end="")
generation_config = { "max_output_tokens": 8192, "temperature": 1, "top_p": 0.95, }
safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), ]
generate()
|
输出没有授权的错误:
修改code如下,加入通过key认证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| from google.oauth2 import service_account #导入服务账号认证所需的库 import base64 import vertexai from vertexai.generative_models import GenerativeModel, Part, SafetySetting
#通过服务账号key文件创建凭据 cred = service_account.Credentials.from_service_account_file('/home/aubreyhan/hy-20240914-001-3d2739517190.json')
def generate(): vertexai.init(project="hy-20240914-001", location="us-central1", credentials=cred) #在Vertex环境配置中引入凭据 model = GenerativeModel( "gemini-1.5-flash-001", ) responses = model.generate_content( ["""请描述一个宠物"""], generation_config=generation_config, safety_settings=safety_settings, stream=True, )
for response in responses: print(response.text, end="")
generation_config = { "max_output_tokens": 8192, "temperature": 1, "top_p": 0.95, }
safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE ), ]
generate()
|
参见code中注释有三处需要修改:
- 导入GCP认证库中服务账号的库
- 通过服务账号key创建凭据
- 在Vertex AI初始化时添加凭据
运行修改后code,可正常运行:
总结
以上Demo简单演示了如何通过服务账户key在代码中授权Vertex AI。操作过程比较简单,但需要注意以下几点:
- 同一个服务账号可以授权多个角色,所以如果客户端还需使用其他服务(例如GCS),可使用一个服务账号
- 遵循最小权限原则,不要给服务账号不必要的权限
- 一个服务账号可以创建多个key,并且设置过期时间,必要时通过轮换key实现安全性
- 一定不要把key上传到公网!一定不要把key上传到公网!一定不要把key上传到公网!(重要事情说三遍)
- 服务账号虽然归宿一个项目,但可以跨项目赋予权限,例如A项目的服务给B项目的服务账号授权;大型复杂项目里,可以有一个项目里专门创建多个服务账号,然后其他项目授权,便于服务账号的统一管理。
以上就是服务账号key在Vertex AI中的授权使用,希望对大家有帮助。