首页 文章

在OSX El Capitan上构建和链接共享Tensorflow库,从Ruby通过Swig调用

提问于
浏览
5

我正在尝试使用Swig帮助围绕Tensorflow构建Ruby包装器 . 目前,我坚持制作共享版本, .so ,并将其C / C头部暴露给Ruby . 所以问题是:我如何构建包含完整Tensorflow库的 libtensorflow.so 共享版本,以便它可以作为OSX El Capitan上的共享库使用(注意: /usr/lib/ 在El Capitan上是只读的)?

背景

在这种ruby-tensorflow项目,我需要打包Tensorflow .bundle 文件,但每当我 irb -Ilib -rtensorflow 或尝试运行规范 rspec ,我得到和基本数值类型没有定义的错误,但他们都有明确的规定here .

我猜这是因为我的 .so -file没有正确创建或者某些东西没有按照它应该链接 . C / Swig / Bazel不是我强大的一面,我在这一点上非常坚持到达那个有趣的部分!

我做了什么:

  • git clone --recurse-submodules https://github.com/tensorflow/tensorflow

  • cd tensorflow

  • bazel build //tensorflow:libtensorflow.so (在我的机器上等待10-15分钟)

  • 将生成的 libtensorflow.so (166.6 MB)复制到/ext-folder

  • 运行 ruby extconf.rbmakemake install described in the project

  • 运行 rspec

无奈之下,我也经历了几次官方installation from source,但我不知道是否,最后 sudo pip install /tmp/tensorflow_pkg/tensorflow-0.9.0-py2-none-any.whl -step甚至创建了一个共享版本,或者只是暴露了一个Python界面 .

制作original repository并发出我所遵循的指令的阿拉法特说他的Linux机器上的 libtensorflow.so 是4.5 GB - 所以我的OSX机器上的共享版本大小超过20倍 . UPDATE1:他说 libtensorflow.so -build是 302.2 MB ,4.5GB是整个tensorflow文件夹的大小 .

非常感谢任何帮助或替代方法!

2 回答

  • 4

    经过更多的挖掘,发现 otool (感谢Kristina)并更好地理解.so文件是什么,解决方案在我的设置中不需要太多改变:

    共享构建

    # Clone source files
    git clone --recurse-submodules https://github.com/tensorflow/tensorflow
    cd tensorflow
    # Build library
    bazel build //tensorflow:libtensorflow.so
    # Copy the newly shared build/library to /usr/local/lib
    sudo cp bazel-bin/tensorflow/libtensorflow.so /usr/local/lib
    

    使用Swig从Ruby调用

    按照此处的步骤https://github.com/chrhansen/ruby-tensorflow#install-ruby-tensorflow运行Swig,创建一个Makefile并 make

    当你运行 make 时,你会看到一行说:

    $ make
    $ linking shared-object libtensorflow.bundle
    

    如果您的共享版本无法访问,您会看到以下内容:

    $ ld: library not found for -ltensorflow
    

    简单教程

    对于那些从这个冒险开始,在Ruby中使用C / C库的人来说,这篇文章对我来说是一个很好的教程:http://engineering.gusto.com/simple-ruby-c-extensions-with-swig/

  • 3

    我不认为你真的想要一个.so,我想你想要一个.dylib(见What are the differences between .so and .dylib on osx?) . 你强迫Bazel通过指定 libtensorflow.so 作为目标来构建.so,而是构建它:

    bazel build //tensorflow
    

    //tensorflow//tensorflow:tensorflow 的简写,即"build the tensorflow target."如果可能,指定要强制Bazel构建该文件的确切文件 . )

    获得.dylib后,可以使用 otool 检查其内容:

    otool -L bazel-bin/tensorflow/libtensorflow.dylib
    

    不确定这是否能解决您的所有问题,但值得一试 .

相关问题