Я использую задание конвейера для точной настройки модели текстового бизона с помощью Vertex AI на GCP. Мой API регистрируется с использованием специальной учетной записи службы. Он имеет роли: агент службы Vertex AI и пользователь учетной записи службы.
Я использую этот код Node.js:
import aiplatform from '@google-cloud/aiplatform';
class ModelTuningController {
initiateModelTuning = catchAsync(async (req, res) => {
const { modelDisplayName = 'fineTunedTest' } = req.body;
const { PipelineServiceClient } = aiplatform.v1;
const location = 'us-central1';
const project = 'projectID';
const model = 'text-bison@001';
const pipelineClient = new PipelineServiceClient({
apiEndpoint: `${location}-aiplatform.googleapis.com`,
keyFilename: config.vector_store_key_filename,
});
const parameters = {
source_model: { stringValue: model },
train_dataset: {
stringValue: 'gs://path/file.jsonl',
},
tuned_model_display_name: {
stringValue: modelDisplayName,
},
epochs: {
numberValue: 4,
},
learning_rate_multiplier: {
numberValue: 1,
},
};
const runtimeConfig = {
gcsOutputDirectory: 'gs://output-path',
parameterValues: parameters,
};
try {
const parent = `projects/${project}/locations/${location}`;
const pipelineJob = {
displayName: modelDisplayName,
runtimeConfig,
};
const request = {
parent,
pipelineJob,
};
const [response] = await pipelineClient.createPipelineJob(request);
return sendResponse(res, {
message: ModelTuningMessages.jobInitiated(response.name),
});
} catch (err) {
return sendError(
err,
new ApiError(
httpStatus.INTERNAL_SERVER_ERROR,
ModelTuningMessages.jobError
)
);
}
});
}
export default ModelTuningController;
У меня возникла следующая ошибка: у вас нет разрешения действовать от имени service_account: ${projectID}[email protected]. (или его может не быть).
Проблема в том, что ${projectID}[email protected] — это учетная запись службы проекта по умолчанию. Я предполагаю, что моя учетная запись службы должна действовать как учетная запись службы по умолчанию для проекта.
В моей сервисной учетной записи отсутствует роль для выполнения точной настройки Vertex AI?
___________
РЕДАКТИРОВАТЬ
Похоже, мне нужно было активировать API Compute Engine, чтобы иметь учетную запись службы вычислений по умолчанию, чтобы все заработало!
Однако у меня все еще есть ошибка: Error: 3 INVALID_ARGUMENT:
. Трудно понять, какой аргумент недействителен. Это запрос JSON, который я отправляю в задание конвейера:
{
"parent": "projects/${projectID}/locations/us-central1",
"pipelineJob": {
"displayName": "fineTunedTest",
"runtimeConfig": {
"gcsOutputDirectory": "gs://${output}",
"parameterValues": {
"source_model": { "stringValue": "gemini-1.0-pro-002" },
"train_dataset": { "stringValue": "gs://${input}/${file}" },
"tuned_model_display_name": { "stringValue": "fineTunedTest" },
"epochs": { "numberValue": 4 },
"learning_rate_multiplier": { "numberValue": 1 }
}
}
}
}
Проблема не в передаче правильных учетных данных сервисной учетной записи и предоставлении надлежащего разрешения IAM. Есть два решения (второе предпочтительнее):
${projectID}[email protected]
, если вы не укажете выделенную пользовательскую учетную запись службы. Для запуска конвейера Vertex учетная запись службы по умолчанию должна иметь следующие разрешения IAM:vertex AI user
учетной записи службы по умолчанию.import aiplatform from '@google-cloud/aiplatform';
import { Auth, google } from "googleapis";
class ModelTuningController {
initiateModelTuning = catchAsync(async (req, res) => {
const { modelDisplayName = 'fineTunedTest' } = req.body;
const { PipelineServiceClient } = aiplatform.v1;
# set up auth
// Path to your service account key file
const keyFilename = '/path/to/your/service-account.json';
// Create a new GoogleAuth instance with the service account key file
const auth = new Auth.GoogleAuth({
keyFile: keyFilename,
scopes: 'https://www.googleapis.com/auth/cloud-platform'
});
// Get credentials
const client = await auth.getClient();
const clientOptions = {
apiEndpoint: '${location}-aiplatform.googleapis.com',
auth: client // Pass the authenticated client object here
};
const location = 'us-central1';
const project = 'projectID';
const model = 'text-bison@001';
const pipelineClient = new PipelineServiceClient(clientOptions);
...
Имейте в виду, что предпочтительный метод аутентификации зависит от того, где и как вы запускаете код конвейера Node.js. т. е. работает локально или работает в облачной функции GCP. В идеале вы не хотите экспортировать файл ключей служебной учетной записи для повышения безопасности.
Кроме того, роль агента службы Vertex AI имеет больше прав, чем роль пользователя Vertex AI. Мне нужно разрешение для aiplatform.pipelineJobs.create, и оно есть у обоих. Значит моя служба должна иметь на это право
Вы пробовали вариант №1? Предоставить сервисный аккаунт ${projectID}[email protected]
the Vertex AI User role
?
Я этого не сделал, потому что было бы небезопасно добавлять эту роль к учетной записи службы по умолчанию. Вот почему я хотел использовать выделенную учетную запись службы.
И я не вижу учетную запись ${projectID}[email protected] (служебную учетную запись проекта по умолчанию) на странице IAM. Также с помощью командной строки: gcloud iam service-accounts add-iam-policy-binding \ ${projectID}[email protected] \ --member=serviceAccount:${serviceAccountName} \ --role=roles/iam. serviceAccountUser \ --project=${projectID} говорит, что учетная запись ${projectID}[email protected] не существует
Похоже, мне нужно было активировать API Compute Engine, чтобы иметь учетную запись службы вычислений по умолчанию, чтобы все заработало!
Я внес изменения в исходное сообщение, потому что у меня все еще есть неверный аргумент.
По первой проблеме: (У вас нет разрешения действовать от имени service_account: ${projectID}[email protected] (или оно может не существовать).) Мне нужно было активировать API Compute Engine, чтобы иметь учетную запись службы вычислений по умолчанию. Моей учетной записи службы требовались только роли агента службы Vertex AI и пользователя учетной записи службы.
Что касается второй проблемы: (Ошибка: 3 INVALID_ARGUMENT:) Мне нужно было добавить отсутствующий параметр templateUri в мой объект конвейерного задания. Его значение https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0 для текстовой модели и https://us -kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-chat-model/v3.0.0 для модели чата. См. это для получения дополнительной информации.
Мой обновленный код:
import aiplatform from '@google-cloud/aiplatform';
class ModelTuningController {
initiateModelTuning = catchAsync(async (req, res) => {
const { modelDisplayName = 'fineTunedTest' } = req.body;
const { PipelineServiceClient } = aiplatform.v1;
const location = 'us-central1';
const project = 'projectID';
const model = 'text-bison@001';
const pipelineClient = new PipelineServiceClient({
apiEndpoint: `${location}-aiplatform.googleapis.com`,
keyFilename: config.vector_store_key_filename,
});
const parameters = {
source_model: { stringValue: model },
train_dataset: {
stringValue: 'gs://path/file.jsonl',
},
tuned_model_display_name: {
stringValue: modelDisplayName,
},
epochs: {
numberValue: 4,
},
learning_rate_multiplier: {
numberValue: 1,
},
};
const runtimeConfig = {
gcsOutputDirectory: 'gs://output-path',
parameterValues: parameters,
};
try {
const parent = `projects/${project}/locations/${location}`;
const pipelineJob = {
displayName: modelDisplayName,
templateUri: 'https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0',
runtimeConfig,
};
const request = {
parent,
pipelineJob,
};
const [response] = await pipelineClient.createPipelineJob(request);
return sendResponse(res, {
message: ModelTuningMessages.jobInitiated(response.name),
});
} catch (err) {
return sendError(
err,
new ApiError(
httpStatus.INTERNAL_SERVER_ERROR,
ModelTuningMessages.jobError
)
);
}
});
}
export default ModelTuningController;
Я попробовал предложенный вами код, но тип аутентификации не соответствовал параметрам clientOptions. Поэтому я обновил его, используя GoogleAuth из google-auth-library: «const auth = new GoogleAuth({ keyFilename: config.vector_store_key_filename, области действия: ['googleapis.com/auth/cloud-platform'], });» Я передаю этот объект аутентификации в clientOptions. Однако у меня все еще есть ошибка: у вас нет разрешения действовать от имени service_account: ${projectID}[email protected]. (или его может не быть).