Проверка подлинности загрузки модели в задание VertexAI из облачного планировщика

# #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 так, чтобы он указывал на ключ в изображении (вероятно, не рекомендуется иметь ключ внутри изображения).