Правильная упаковка модулей для CloudML

У меня есть проект Python, структурированный следующим образом:

  • Проект / Содержит:
  • setup.py; project/ Внутренний проект / папка содержит пустой файл init.py, папки с подмодулями, папку conf /, содержащую только файлы.yaml (например, foo.yaml) и скрипт s_main.py (моя основная точка входа)

Это мой файл setup.py:

from setuptools import setup, find_packages

NAME = 'project'

package_data = {'':['conf/*.yaml','*.yaml'],'project':['conf/*.yaml']}

if __name__ == '__main__':

setup(
  name=NAME,
  version=1.0,
  description='Foo',
  author='someone',
  author_email='a@b.com',
  packages=find_packages(),
  include_package_data=True,
  package_data=package_data,
  zip_safe=False)

Когда я пытаюсь установить 'pip install project/', он отлично работает на моем ПК, и я вижу папку conf / со всеми моими *.yaml файлами в [...] / python2.7 / site-packages / project/ conf /, когда я запустить cloudML локально, это тоже работает. Я использую следующую команду:

gcloud ml-engine local train \
  --package-path=path_to_project_module \
  --module-name=project.s_main \
  --distributed \
  -- \
  conf/myConf.yaml \
  conf/myParams.yaml

Но когда я запускаю его на cloudML, он не работает. Я запускаю следующую команду:

gcloud ml-engine jobs submit training JOB_100 \
  --package-path=path_to_project_module \
  --module-name=project.s_main \
  --staging-bucket=myBucket \
  --region=europe-west1 \
  --config=mlConfig_file \
  -- \
  conf/myConf.yaml \
  conf/myParams.yaml

Журнал ясно показывает, что папка conf / никогда не была включена в составный пакет, и мой запуск не удался, потому что ожидаемые файлы *.yaml не были найдены. Любая идея?

2 ответа

Можете ли вы попробовать упаковку вручную, используя:

python setup.py sdist

А затем поместите получившийся.tar.gz в хранилище Cloud Storage.

Как только вы это сделаете, вы сможете ссылаться на ваш предварительно подготовленный пакет, используя флаг --package-uris в команде gcloud (при отправке работы в службу).

Посмотрите, поможет ли это разблокировать вас.

Другая вещь, чтобы попробовать не использовать package_data а также include_package_data, а скорее используя data_files... по крайней мере, это то, что я использовал в своих собственных сценариях, где мне нужно было иметь дополнительные файлы данных в исходном дистрибутиве.

Что-то вроде:

data_files=[('.', 'conf/*.yaml','*.yaml']),
            ('project':['conf/*.yaml'])
           ]

Может быть, это сработает?

Другие вопросы по тегам