У пользователя нет необходимого разрешения ml.versions.predict для ресурса (Cloud ML Engine).

У меня есть учетная запись службы, которой я дал роль зрителя, загрузил файл учетных данных json и установил для него правильную переменную среды. Я пытаюсь запустить пример здесь:

def predict_json(project, model, instances, version=None):
    """Send json data to a deployed model for prediction.

    Args:
        project (str): project where the Cloud ML Engine Model is deployed.
        model (str): model name.
        instances ([Mapping[str: Any]]): Keys should be the names of Tensors
            your deployed model expects as inputs. Values should be datatypes
            convertible to Tensors, or (potentially nested) lists of datatypes
            convertible to tensors.
        version: str, version of the model to target.
    Returns:
        Mapping[str: any]: dictionary of prediction results defined by the
            model.
    """
    # Create the ML Engine service object.
    # To authenticate set the environment variable
    # GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>
    service = googleapiclient.discovery.build('ml', 'v1beta1')
    name = 'projects/{}/models/{}'.format(project, model)

    if version is not None:
        name += '/versions/{}'.format(version)

    response = service.projects().predict(
        name=name,
        body={'instances': instances}
    ).execute()

    if 'error' in response:
        raise RuntimeError(response['error'])

    return response['predictions']

Однако это дает мне 403 и ошибку The user doesn't have the required permission ml.versions.predict on the resource projects/project/models/model/versions/version. Я не уверен, что я делаю неправильно - я устанавливаю правильные переменные среды для учетных данных, и, согласно их документации, учетной записи службы требуется только роль зрителя для доступа к этой конечной точке. Что я делаю неправильно?


person Andrew    schedule 17.05.2017    source источник


Ответы (2)


tl; dr, discovery.build может не использовать ожидаемую учетную запись службы, поскольку он пытается использовать множество вариантов аутентификации.

Я бы предложил быть явным вместо того, чтобы полагаться на поведение по умолчанию, например: Использование API прогнозирования CloudML в рабочей среде без gcloud. Кроме того, возможно, настройки IAM вашего проекта не включают учетную запись службы, если вы вызываете:

gcloud --project "$PROJECT" get-iam-policy 

Видите ли вы ожидаемую учетную запись службы с ролями/зрителем или выше? Если нет, вам нужно дать ему разрешение. Его присутствие на странице учетных записей служб означает только то, что у вас есть эта учетная запись службы, а не то, что ей разрешено что-либо делать!

person JoshGC    schedule 17.05.2017
comment
Я не вижу его там. Я не вижу его в представлении IAM на консоли, только на странице учетных записей служб. - person Andrew; 17.05.2017
comment
Я собираюсь создать новую учетную запись службы, как и в другом вашем ответе, мне интересно, проблема в том, как я создал учетную запись в консоли. - person Andrew; 17.05.2017
comment
Удалось получить ответ после выполнения ваших инструкций в другом ответе. Теперь мне нужно выяснить, почему он дает Prediction failed: unknown error. Спасибо за вашу помощь! - person Andrew; 17.05.2017
comment
Обновил мой ответ. Вам по-прежнему необходимо предоставить вашей служебной учетной записи необходимую роль/просмотрщик. - person JoshGC; 18.05.2017

Решил ту же проблему следующими шагами:

  1. Создать сервисный аккаунт (роль Project Viewer)
  2. Загрузите файл json с учетными данными
  3. Назовите это, используя

    from oauth2client.service_account import ServiceAccountCredentials

    from googleapiclient import discovery

    credentials = ServiceAccountCredentials.from_json_keyfile_name('your_creds.json')

    service = discovery.build('ml', 'v1', credentials=credentials)

person Anastasiia Kornilova    schedule 31.05.2017