# #google-cloud-platform #google-cloud-iam #google-cloud-scheduler #google-cloud-vertex-ai
Вопрос:
Я пытаюсь запустить индивидуальное учебное задание на VertexAI. Цель состоит в том, чтобы обучить модель, сохранить модель в облачном хранилище, а затем загрузить ее в VertexAI в качестве объекта модели VertexAI. Когда я запускаю задание с локальной рабочей станции, оно выполняется, но когда я запускаю задание из облачного планировщика, оно завершается неудачей. Подробности ниже.
Код на Python для работы:
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
import os
import pickle
from google.cloud import storage
from google.cloud import aiplatform
print("FITTING THE MODEL")
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=3)
# define the model
model = RandomForestClassifier(n_estimators=100, n_jobs=-1)
# fit the model
model.fit(X, y)
print("SAVING THE MODEL TO CLOUD STORAGE")
if 'AIP_MODEL_DIR' not in os.environ:
raise KeyError(
'The `AIP_MODEL_DIR` environment variable has not been'
'set. See https://cloud.google.com/ai-platform-unified/docs/tutorials/image-recognition-custom/training'
)
artifact_filename = 'model' '.pkl'
# Save model artifact to local filesystem (doesn't persist)
local_path = artifact_filename
with open(local_path, 'wb') as model_file:
pickle.dump(model, model_file)
# Upload model artifact to Cloud Storage
model_directory = os.environ['AIP_MODEL_DIR']
storage_path = os.path.join(model_directory, artifact_filename)
blob = storage.blob.Blob.from_string(storage_path, client=storage.Client())
blob.upload_from_filename(local_path)
print ("UPLOADING MODEL TO VertexAI")
# Upload the model to vertex ai
project="..."
location="..."
display_name="custom_mdoel"
artifact_uri=model_directory
serving_container_image_uri="us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-4:latest"
description="test model"
sync=True
aiplatform.init(project=project, location=location)
model = aiplatform.Model.upload(
display_name=display_name,
artifact_uri=artifact_uri,
serving_container_image_uri=serving_container_image_uri,
description=description,
sync=sync,
)
model.wait()
print("DONE")
Запуск с локальной рабочей станции:
Я установил переменную среды GOOGLE_APPLICATION_CREDENTIALS так, чтобы она указывала на расположение ключей учетной записи службы Compute Engine по умолчанию, которые я загрузил на своей локальной рабочей станции. Я также установил переменную среды AIP_MODEL_DIR, указывающую на корзину облачного хранилища. После запуска скрипта я вижу файл model.pkl, создаваемый в ведре облачного хранилища, и объект модели, создаваемый в VertexAI.
Запуск задания обучения из облачного планировщика: Это то, чего я в конечном счете хочу достичь — периодически запускать пользовательское задание обучения из облачного планировщика. Я преобразовал приведенный выше скрипт python в изображение docker и загрузил его в реестр артефактов Google. Спецификация задания для облачного планировщика приведена ниже, при необходимости я могу предоставить дополнительные сведения. Адрес электронной почты учетной записи службы в том oauth_token
же, ключи которого я использую для установки переменной среды GOOGLE_APPLICATION_CREDENTIALS. Когда я запускаю это (либо с локальной рабочей станции, либо непосредственно в ноутбуке VertexAI), я вижу, что создается задание облачного планировщика, которое продолжает запускать пользовательское задание. Пользовательское задание способно обучить модель и сохранить ее в облачном хранилище. Однако он не может загрузить его в VertexAI, и я получаю сообщения об ошибках status = StatusCode.PERMISSION_DENIED
и {..."grpc_message":"Request had insufficient authentication scopes.","grpc_status":7
}. Не могу понять, в чем проблема с аутентификацией, потому что в обоих случаях я использую одну и ту же учетную запись службы.
job = {
"name": f'projects/{project_id}/locations/{location}/jobs/test_job',
"description": "Test scheduler job",
"http_target": {
"uri": f'https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/customJobs',
"http_method": "POST",
"headers": {
"User-Agent": "Google-Cloud-Scheduler",
"Content-Type": "application/json; charset=utf-8"
},
"body": "..." // the custom training job body,
"oauth_token": {
"service_account_email": "...",
"scope": "https://www.googleapis.com/auth/cloud-platform"
}
},
"schedule": "* * * * *",
"time_zone": "Africa/Abidjan"
}
Комментарии:
1. Можете ли вы попробовать явно определить
credentials
вinit()
? Просто чтобы убедиться, что он использует правильные учетные данные для аутентификации запроса.2. Попробую это сделать. До сих пор я мог заставить это работать, добавив ключ к изображению docker и установив GOOGLE_APLICATION_CREDENTIALS так, чтобы он указывал на ключ в изображении (вероятно, не рекомендуется иметь ключ внутри изображения).