Идентификатор местоположения ошибки Google Automl 400 и поле: недопустимое имя - PullRequest
0 голосов
/ 25 мая 2020

В настоящее время я пишу функцию, которая будет прослушивать GCP pubsub для сообщения, которое запустит функцию обучения. Само сообщение содержит идентификатор операции импорта набора данных, функция получит этот идентификатор операции и будет продолжать цикл до тех пор, пока импорт не будет завершен, после этого она будет обучать модель и l oop до тех пор, пока это полностью не связано с тем, что мне нужно отметить время начала и время окончания в базе данных. Мой вопрос в моем коде, я уже указал идентификатор местоположения и идентификатор проекта, и он дает мне эту ошибку 400, имя поля и имя недействительно. Я пробую те же настройки модели поезда с образцом кода, который предоставляется с веб-сайта GCP. https://cloud.google.com/vision/automl/docs/train?hl=zh-TW, и он отлично работает. Вот мой код. Спасибо всем за помощь.

Backend-функция

from datetime import datetime
import time
from google.cloud import pubsub_v1, automl, datastore
from app import celeryConfig
from config import Config
import requests


def train_model():
    project_id = 'XXXX'
    topic_name = "XXXX"
    timeout = 20
    subscription_name = "XXXX"
    subscriber = pubsub_v1.SubscriberClient.from_service_account_json("./gerald-automl-test-ccf53bf513b7.json")
    subscription_path = subscriber.subscription_path(project_id, subscription_name)

    def callback(message):
        client = automl.AutoMlClient.from_service_account_json("XXXX.json")
        project_location = client.location_path('XXXXX', "us-central1")
        flow_control = pubsub_v1.types.FlowControl(max_messages=5)
        print("Received message: {}".format(message))
        pub_sub_message = str(message.data, encoding="utf-8")  # containing model_id,opreation_id & dataset_id
        message.ack()
        extract_from_data = [e.strip().replace("'", "") for e in pub_sub_message.strip("[]").split(",")]
        dataset_id = extract_from_data[0]
        model_name = extract_from_data[1]
        opreation_id = extract_from_data[2]
        print(opreation_id)


        while True:
            response = client.transport._operations_client.get_operation(
                operation_full_id
            )

            data_of_response = str(response)

            if response.done != True:
                print("not complete importing data")
                response = client.transport._operations_client.get_operation(
                    operation_full_id
                )
                print(str(response))
                time.sleep(10)

            elif response.done == True:
                print("start train model")
                dataset_id = dataset_id
                display_name = model_name
                location = 'XXXX'
                project_id='XXXX'

                client = automl.AutoMlClient.from_service_account_json("XXXXXX")

                # A resource that represents Google Cloud Platform location.
                parent = client.location_path('XXXX', 'XXXXX')

                metadata = automl.types.ImageClassificationModelMetadata(
                    train_budget_milli_node_hours=1000,
                    model_type='mobile-high-accuracy-1'
                )
                # Leave model unset to use the default base model provided by Google
                model = automl.types.Model(
                    display_name=display_name,
                    dataset_id=dataset_id,
                    image_classification_model_metadata=metadata,
                )

                datastore_client = datastore.Client.from_service_account_json(
                    "./XXXX.json")

                response = client.create_model(parent, model)

                opreation_full = str(response.operation.name).split('/')
                opreation_id_train_model = opreation_full[5]

                kind = 'job'
                data_key = datastore_client.key(kind)
                new_post = datastore.Entity(key=data_key)
                new_post['action_date'] = datetime.today().strftime('%Y-%m-%d %H:%M:%S')
                new_post['job_type'] = "train_model"
                new_post['status'] = 'training'
                datastore_client.put(new_post)
                create_model_opreation = client.transport._operations_client.get_operation(
                    opreation_id_train_model)

                if create_model_opreation.done == True:
                    print('complete training model')
                    kind = 'job'
                    data_key = datastore_client.key(kind)
                    new_post = datastore.Entity(key=data_key)
                    new_post['job_type'] = "train_model"
                    new_post['status'] = ['complete_training']
                    new_post['finish_date'] = datetime.today().strftime('%Y-%m-%d %H:%M')
                    new_post['description'] = 'from train model ' + dataset_id
                    datastore_client.put(new_post)
                    break
                else:
                    print("not complete traning mode")
                    response = client.transport._operations_client.get_operation(
                        opreation_id
                    )
                    print(str(response))
                    time.sleep(10)



    streaming_pull_future = subscriber.subscribe(
        subscription_path, callback=callback
    )
    print("Listening for messages on {}..\n".format(subscription_path))

    # Wrap subscriber in a 'with' block to automatically call close() when done.
    with subscriber:
        try:
            # When `timeout` is not set, result() will block indefinitely,
            # unless an exception is encountered first.
            streaming_pull_future.result(timeout=timeout)
        except:  # noqa
            streaming_pull_future.cancel()

1 Ответ

0 голосов
/ 28 мая 2020

Не могли бы вы добавить трассировку стека полученной ошибки? Это поможет сузить возможности. Насколько я понимаю, ошибка возникает в одной из этих строк:

response = client.create_model(parent, model)
opreation_full = str(response.operation.name).split('/')

Я также понял, что в документации Google библиотеки еще не обновлены, в python Клиентская библиотека Automl имя модуля теперь automl_v1. Вы можете сначала попробовать использовать это и посмотреть, не проблема ли это версии:

from google.cloud import automl_v1
...