Правильная упаковка модулей для 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'])
]
Может быть, это сработает?