A API Slurm Job permite gerenciar seus clusters de treinamento da Gemini Enterprise Agent Platform usando a API Agent Platform, um script, um notebook ou um pipeline de CI/CD. A API Slurm Job permite gerenciar o job do cluster do Slurm sem se conectar a ele com SSH.
Pré-requisitos
Antes de usar a API Slurm Job para gerenciar seu cluster, verifique se você atende aos seguintes requisitos:
Você tem acesso aos clusters de treinamento, geralmente pela função Usuário da Vertex AI
roles/aiplatform.userno projeto do cluster ou qualquer função que inclua a permissãoaiplatform.googleapis.com/modelDevelopmentClusters.run.A Google Cloud CLI está instalada e você configurou as Application Default Credentials (
gcloud auth application-default login). Para ferramentas automatizadas que não podem executar um login interativo, autentique-se como uma conta de serviço com a permissãoaiplatform.googleapis.com/modelDevelopmentClusters.run.Você conhece o ID do projeto, a região e o ID do cluster.
Além disso, recomendamos que você configure um alias de conveniência:
alias gcurl='curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" -H "Content-Type: application/json"'
Visão geral
Cada chamada é uma solicitação POST para o endpoint callSlurmRestApi do seu cluster. No corpo da solicitação, informe os seguintes campos:
method: o método HTTP REST do Slurm, comoHTTP_METHOD_GET,HTTP_METHOD_POSTouHTTP_METHOD_DELETE.path: o caminho REST do Slurm. Por exemplo,/slurm/v0.0.42/job/submit. Use a versão do Slurm que seu cluster está executando. Os exemplos neste guia usam a v0.0.42.
body: um objeto JSON com o payload da solicitação. O corpo é obrigatório para solicitaçõesHTTP_METHOD_POST. Omita para solicitaçõesHTTP_METHOD_GETeHTTP_METHOD_DELETE.
A resposta contém os seguintes campos:
status: o status HTTP retornado pela API Slurm Job. Por exemplo,200.structuredBody: a resposta da API Slurm Job, como um objeto JSON. Leia os campos necessários, como o ID do job ou a lista de jobs, diretamente destructuredBody.
Você executa jobs na sua própria conta do Linux nos clusters de treinamento automaticamente. Não há configuração adicional, e não é possível executar o job como outro usuário. Não é necessário usar SSH, porque tudo é feito pela API da Agent Platform.
Cada chamada retorna a resposta do Slurm diretamente, sem uma operação para sondar. Você pode acompanhar o status de um job ao longo do tempo. Para mais informações, consulte Verificar o status do job.
Chamar a API
As seções a seguir mostram como usar a API Slurm Job.
Envie um job
gcurl -X POST \
"https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{
"method": "HTTP_METHOD_POST",
"path": "/slurm/v0.0.42/job/submit",
"body": {
"job": {
"name": "my-run",
"partition": "PARTITION",
"current_working_directory": "/home/USERNAME",
"minimum_nodes": 1,
"tasks_per_node": 1,
"environment": ["PATH=/bin:/usr/bin"],
"time_limit": {"set": true, "number": 120}
},
"script": "#!/bin/bash\necho hello\nsleep 5\necho done\n"
}
}'
Substitua:
REGION: a região em que o cluster está.PROJECT_ID: o ID do projeto.CLUSTER_ID: o ID do cluster.PARTITION: a partição do Slurm a que você está se conectando.USERNAME: seu nome de usuário na partição do Slurm.
O valor time_limit é o tempo em minutos. O campo script contém o conteúdo do script, não um caminho para um arquivo.
A API Slurm Job retorna o ID do novo job em structuredBody. Use o comando jq para isolar o ID do job:
gcurl -sS -X POST "https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{ ... }' | jq -r '.structuredBody.job_id'
Verificar o status do job
Use o seguinte para monitorar um job em execução. Pesquise até que o status atinja um estado
interrompido, como COMPLETED, FAILED ou CANCELLED:
gcurl -X POST \
"https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{
"method": "HTTP_METHOD_GET",
"path": "/slurm/v0.0.42/job/JOB_ID"
}'
Substitua:
REGION: a região em que o cluster está.PROJECT_ID: o ID do projeto.CLUSTER_ID: o ID do cluster.JOB_ID: o ID do job do Slurm.
Listar jobs
Use o seguinte para listar os jobs em execução:
gcurl -X POST \
"https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{
"method": "HTTP_METHOD_GET",
"path": "/slurm/v0.0.42/jobs/"
}'
Substitua:
REGION: a região em que o cluster está.PROJECT_ID: o ID do projeto.CLUSTER_ID: o ID do cluster.
Cancelar um job
O cancelamento é aceito imediatamente, mas o job leva um tempo para ser interrompido. Confira o status para verificar se ele é CANCELLED. Você só pode cancelar seus próprios jobs. O cancelamento de um job concluído é seguro e retorna
sucesso.
Use o seguinte para cancelar um job em execução:
gcurl -X POST \
"https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{
"method": "HTTP_METHOD_DELETE",
"path": "/slurm/v0.0.42/job/JOB_ID"
}'
Substitua:
REGION: a região em que o cluster está.PROJECT_ID: o ID do projeto.CLUSTER_ID: o ID do cluster.JOB_ID: o ID do job do Slurm.
Mostrar um job concluído
A verificação de um job com o caminho /slurm só funciona enquanto ele ainda está na fila
ativa. Para jobs concluídos, use o caminho slurmdb:
gcurl -X POST \
"https://REGION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/modelDevelopmentClusters/CLUSTER_ID:callSlurmRestApi" \
-d '{
"method": "HTTP_METHOD_GET",
"path": "/slurmdb/v0.0.42/job/JOB_ID"
}'
Substitua:
REGION: a região em que o cluster está.PROJECT_ID: o ID do projeto.CLUSTER_ID: o ID do cluster.JOB_ID: o ID do job do Slurm.
Como usar a API Slurm Job com Python
Se você preferir usar Python em vez de curl, use o script auxiliar a seguir para enviar, verificar o status e cancelar jobs. O script auxiliar usa a biblioteca google-auth para Application Default Credentials.
Faça o seguinte para usar a API Slurm Job com Python:
Instale o Application Default Credentials:
pip install google-auth requestsUse o seguinte script Python para usar a API:
import google.auth import google.auth.transport.requests # Fill in your cluster's values. PROJECT_ID = "PROJECT_ID" REGION = "REGION" CLUSTER_ID = "CLUSTER_ID" PARTITION = "PARTITION" USERNAME = "USERNAME" # Application Default Credentials: gcloud auth application-default login, or a # service account for automated callers. credentials, _ = google.auth.default( scopes=["https://www.googleapis.com/auth/cloud-platform"]) session = google.auth.transport.requests.AuthorizedSession(credentials) url = ( f"https://{REGION}-aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}" f"/locations/{REGION}/modelDevelopmentClusters/{CLUSTER_ID}:callSlurmRestApi" ) def call_slurm(method, path, body=None): request = {"method": method, "path": path} if body is not None: request["body"] = body response = session.post(url, json=request) response.raise_for_status() envelope = response.json() return envelope["status"], envelope.get("structuredBody", {}) # Submit a job. status, result = call_slurm( "HTTP_METHOD_POST", "/slurm/v0.0.42/job/submit", { "job": { "name": "my-run", "partition": f"{PARTITION}", "current_working_directory": f"/home/{USERNAME}", "minimum_nodes": 1, "tasks_per_node": 1, "environment": ["PATH=/bin:/usr/bin"], "time_limit": {"set": True, "number": 120}, }, "script": "#!/bin/bash\necho hello\nsleep 5\necho done\n", }, ) job_id = result["job_id"] print("submitted job", job_id) # Check its status. _, pending_result = call_slurm("HTTP_METHOD_GET", f"/slurm/v0.0.42/job/{job_id}") print("state:", pending_result["jobs"][0]["job_state"]) # Cancel it. call_slurm("HTTP_METHOD_DELETE", f"/slurm/v0.0.42/job/{job_id}") print("cancelled job", job_id) # Confirm the job is cancelled. _, cancelled_result = call_slurm("HTTP_METHOD_GET", f"/slurm/v0.0.42/job/{job_id}") print("state", cancelled_result["jobs"][0]["job_state"])
O script auxiliar retorna o status do Slurm e do structuredBody para que você possa ler campos como job_id ou job_state diretamente. Para usar o script
em ambientes automatizados, faça a autenticação como uma conta de
serviço em vez de usar um login
interativo.
Resposta da API
Confira a seguir uma resposta típica da API Slurm Job:
{
"status": 200,
"structuredBody": {
"job_id": 1234,
"errors": [],
"warnings": []
}
}
O campo status é o status HTTP do Slurm, e structuredBody contém a resposta do Slurm como um objeto JSON. Assim, é possível ler os campos diretamente, como jq -r '.structuredBody.job_id'.
Sempre verifique structuredBody, seja qual for o valor de status, porque structuredBody inclui todos os erros ou avisos informados pelo Slurm.
Se a solicitação CallSlurmRestApi estiver malformatada, você poderá receber um resultado error, como no exemplo a seguir:
{
"error": {
"code": 400,
"message": "{ ... some error ... }",
"status": "INVALID_ARGUMENT"
}
}
Respostas comuns
| O que você vê | O que significa |
|---|---|
| Status 200 com um ID do job | O job foi enviado. |
| Status 200, sem erros | A solicitação foi concluída. |
| Status 200 com avisos | A solicitação foi concluída, mas o Slurm ignorou ou ajustou algo. Leia o aviso. |
| Status 404 para um job | O job não está na fila de transmissão ao vivo. Ele pode ter sido concluído. Tente o caminho do histórico. |
| Status 400 ou 500 |
O Slurm rejeitou a solicitação. Os motivos para a rejeição podem incluir
um corpo malformado ou um campo do tipo errado. Leia o erro em
structuredBody.
|
| Erro PERMISSION_DENIED | Você não tem acesso a este cluster. |
| Erro NOT_FOUND | O nome do cluster está errado ou o cluster não existe. |
| Erro INVALID_ARGUMENT | O caminho não é um caminho Slurm válido ou a solicitação é muito grande. |
| Erro UNAVAILABLE | O cluster está temporariamente inacessível. Tente de novo depois de esperar um pouco. |
Limites
A solicitação inteira precisa ter menos de 1 MB. Para usar scripts grandes, coloque-os no armazenamento compartilhado do cluster e chame-os de um script wrapper curto.