Я создал новую опцию 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, и поэтому я не знаю, где запустить этот скрипт или как получить доступ к его выводу позже, чтобы использовать новую опцию.
Самый простой способ — это создать опцию локально, загрузить ее в корзину GCS, скопировать ее в виртуальную машину (контейнер) и использовать ее через tf.load_op_library.
Вы можете использовать предварительно установленный клиент gsutil cli или GCS python для выполнения копирования.
Вернуться к исходному вопросу:
Когда мы запускаем пользовательскую работу, мы сначала устанавливаем пакет пользовательского кода от имени пользователя root, поэтому в случае Python 2.7 он находится по адресу
/root/.local/lib/python2.7/site-packages/YOUR_PACKAGE_NAME
Вот мое решение.
Я использовал 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++
, Я не знаю, как это повлияет на производительность …