Python — новая операция Tensorflow в движке Google Cloud ML

Я создал новую опцию Tensorflow, я скомпилировал и протестировал ее локально, и она работает.

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

Мне удалось включить файлы C ++ и скрипт компилятора в дистрибутив, используя setup.py:

from setuptools import setup, find_package

setup(
name='trainer',
version='0.1',
packages=find_packages(),
package_data={'CPP': ['*.cc', '*.h', 'compile.sh']},
description = 'Package discription'
)

Теперь я должен бежать compile.sh который содержит:

TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')

g++ -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -shared target.cc dependency_1.cc -o taget.so -fPIC -I$TF_INC -I$TF_INC/external/nsync/public -O2

Скрипт может быть запущен из кода Python, используя subprocess.Popen() так что это не проблема.

Проблема в том, что я не знаю, как дерево каталогов структурировано в облаке Google, и поэтому я не знаю, где запустить этот скрипт или как получить доступ к его выводу позже, чтобы использовать новую опцию.

2

Решение

Самый простой способ — это создать опцию локально, загрузить ее в корзину GCS, скопировать ее в виртуальную машину (контейнер) и использовать ее через tf.load_op_library.
Вы можете использовать предварительно установленный клиент gsutil cli или GCS python для выполнения копирования.

Вернуться к исходному вопросу:
Когда мы запускаем пользовательскую работу, мы сначала устанавливаем пакет пользовательского кода от имени пользователя root, поэтому в случае Python 2.7 он находится по адресу
/root/.local/lib/python2.7/site-packages/YOUR_PACKAGE_NAME

1

Другие решения

Вот мое решение.
Я использовал Extension модуль из setup для динамического построения операции при развертывании пакета в облаке:

import tensorflow as tf
from setuptools import setup, find_packages, ExtensionTF_INC = tf.sysconfig.get_include()
TF_LIB = tf.sysconfig.get_lib()

module1 = Extension('op_name',
define_macros=[('_GLIBCXX_USE_CXX11_ABI', 0)],
include_dirs=[TF_INC, TF_INC + '/external/nsync/public', 'Op/cpp'],
sources=['Op/cpp/op_name.cc',
'Op/cpp/source_2.cc'],
extra_compile_args=['-O2', '-std=c++11', '-fPIC', '-shared'],
library_dirs=[TF_LIB],
libraries=['tensorflow_framework'],
extra_link_args=[],
language='c++')

setup(
name='trainer',
version='0.1',
packages=find_packages(),
package_data={'Op': ['cpp/*.cc', 'cpp/*.h']},
ext_modules=[module1],
)

Некоторые заметки:

  • Если у вас есть заголовочные файлы, вы должны включить каталог для этих файлов в include_dirs, В этом случае у меня есть файлы заголовков в том же каталоге, что и исходные файлы (Op/cpp).
  • Однако это не означает, что .h файлы упакованы. За что ты
    должен использовать package_data={'Op': ['cpp/*.cc', 'cpp/*.h']},таким образом
    .h файлы включены в манифест. .cc файлы должны быть включены в любом случае, так как они являются источниками, я просто их здесь, потому что.
  • Компилятор, используемый в облаке gcc который использует c1plus, Официальная документация Tensorflow использует g++, Я не знаю, как это повлияет на производительность …
0

По вопросам рекламы [email protected]