Невозможно использовать configparser в настраиваемом прогнозе AI-платформы - PullRequest
0 голосов
/ 05 мая 2020

Я ищу способ использовать configparser в моем коде предиктора для настраиваемой процедуры прогнозирования. Я пробовал следующий фрагмент кода

common.cfg

[MODEL]
VERSION=config-true

setup.py

from setuptools import setup

REQUIRED_PACKAGES = [
    'joblib==0.13.0'
]

setup(
    name='test',
    description='Custom prediction routine',
    version=0.1,
    install_requires=REQUIRED_PACKAGES,
    scripts=['src/predictor.py', 'config/common.cfg']
)

predictor.py

import os
import joblib
import subprocess
import configparser

class CustomPredictor(object):
    def __init__(self, model, config):
        self._model = model
        self._config = config

    def predict(self, instances, **kwargs):
        version_value = self._config.get('MODEL', 'VERSION', fallback='config-false')
        print(f'version value = {version_value}', flush=True) # printing config-false

        preprocessed_input = self._preprocess(instances)

        score = self._model.predict(preprocessed_input)

        print(f'predicted score {score}', flush=True)
        return score.to_list()

    @classmethod
    def from_path(cls, model_dir):
        config = configparser.RawConfigParser()
        result = config.read('config/common.cfg')
        print(f'read config result: {result}', flush=True) # empty
        print(f'config sections: {config.sections()}', flush=True) # empty

        subprocess.run(["ls", "-l"]) # don't see the config file or folder

        model_path = os.path.join(model_dir, "model.joblib")
        model = joblib.load(model_path)

        return cls(model, config)

Есть какие-нибудь предложения о том, что я делаю неправильно или упускаю?

Ответы [ 3 ]

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

У вас есть 2 варианта:

  1. Настроить setup.py и добавить туда configparser.
REQUIRED_PACKAGES = [
    'joblib==0.13.0',
    'configparser'
]
Передайте парсер конфигурации как пакет, используя package-uris, при создании Model. Из pypi Я уже нашел файл tar.gz. Взгляните на этот пример, когда мы передаем пакет PyTorch, в вашем случае загрузите файл из pypi и поместите его в GCS Bucket, оттуда просто определите его при создании своей модели:
gcloud beta ai-platform versions create {MODEL_VERSION} --model {MODEL_NAME} \
 --origin=gs://{BUCKET_NAME}/{MODEL_DIR}/ \
 --python-version=3.7 \
 --runtime-version={RUNTIME_VERSION} \
 --package-uris=gs://{BUCKET_NAME}/{PACKAGES_DIR}/text_classification-0.1.tar.gz,
gs://{BUCKET_NAME}/configparser-5.0.0.tar.gz  \
 --machine-type=mls1-c4-m4 \
 --prediction-class=model.CustomModelPrediction
0 голосов
/ 14 мая 2020

Я обнаружил ошибку, которую делал, во время развертывания пользовательской процедуры прогнозирования, AI-платформа хранит файлы в /tmp/custom_lib/bin/ и сохраняет путь выполнения как каталог root. Итак, в моем коде я обновил путь к конфигурации примерно так:

config_file = pathlib.Path(__file__).parent.absolute() / 'common.cfg'
config.read(config_file)

Это устраняет проблему!

Примечание: я также считаю, что нам нужно хранить файлы конфигурации под scripts , потому что, когда журнал развертывания c устанавливает пакет, setuptools скопирует сценарий в PATH, определенный ai-платформой, и сделает его доступным.

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

Я запустил этот код, он напечатал ожидаемый результат:

config = configparser.RawConfigParser()
result = config.read('common.cfg')
print(f'read config result: {result}', flush=True) # empty
print(f'config sections: {config.sections()}', flush=True) # empty

вывод:

read config result: ['common.cfg']
config sections: ['MODEL']

Таким образом, вероятной ошибкой может быть путь к вашему файлу common.cfg.

когда я копировал ваш код и запускал его, он показывал пустой список в качестве вывода, потому что файл находился в том же каталоге, а не внутри каталога конфигурации, но как только я исправил путь, он напечатал ожидаемый результат.

...