谷歌云ml引擎中的Tensorflow新操作

时间:2017-12-19 11:12:26

标签: python c++ tensorflow google-cloud-ml

我已经创建了一个新的Tensorflow操作系统,我已在本地编译和测试它并且可以正常工作。

我现在想将它与Google Cloud ML引擎一起使用,这需要在云中的每台机器上编译操作。

我已设法使用setup.py在分发中包含C ++文件和编译器脚本:

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

可以使用subprocess.Popen()从python代码运行脚本,这不是问题。

问题在于我不知道目录树是如何在Google云中构建的,因此我不知道在哪里运行此脚本,或者如何在以后访问其输出以使用新的操作。

2 个答案:

答案 0 :(得分:1)

最简单的方法是在本地构建op,上传到GCS存储桶,将其复制到VM(容器),然后通过tf.load_op_library使用它。 您可以使用预安装的gsutil cli或GCS python客户端来执行复制。

回到原来的问题: 当我们启动用户作业时,我们首先以root身份安装用户代码包,因此在python 2.7的情况下,它位于 /root/.local/lib/python2.7/site-packages/YOUR_PACKAGE_NAME

答案 1 :(得分:0)

这是我的解决方案。 我在Extension中使用setup模块在​​云中部署软件包时动态构建操作:

import tensorflow as tf
from setuptools import setup, find_packages, Extension


TF_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,使用g++。 Tensorflow官方文档使用layouts。我不知道这对性能有何影响......