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

Building and linking shared Tensorflow library on OSX El Capitan to call from Ruby via Swig

我正在尝试帮助围绕 Tensorflow using Swig 构建一个 Ruby 包装器。目前,我一直在进行共享构建 .so,并将其 C/C++ headers 公开给 Ruby。所以问题是:我如何构建一个包含完整 Tensorflow 库的 libtensorflow.so 共享构建,以便它可以作为共享库在 OSX El Capitan 上使用(注意:/usr/lib/ 是 read-only 在 El Capitan 上)?

背景

在此ruby-tensorflow project, I need to package a Tensorflow .bundle file, but whenever I irb -Ilib -rtensorflow or try to run the specs rspec, I get and errors that the basic numeric types are not defined, but they are clearly defined here

我猜这是因为我的 .so 文件没有正确创建或者没有按应有的方式链接。 C++/Swig/Bazel 不是我的强项,我想专注于学习 Tensorflow 并在 Ruby 中构建一个好的包装器,但我在进入那个有趣的部分时遇到了困难!

我做了什么:

  1. git clone --recurse-submodules https://github.com/tensorflow/tensorflow
  2. cd tensorflow
  3. bazel build //tensorflow:libtensorflow.so(在我的机器上等待 10-15 分钟)
  4. 已将生成的 libtensorflow.so (166.6 MB) 复制到 /ext-folder
  5. 运行 ruby extconf.rbmakemake install described in the project
  6. 运行 rspec

无奈之下,我也通过官方installation from source几次,但我不知道,最后的sudo pip install /tmp/tensorflow_pkg/tensorflow-0.9.0-py2-none-any.whl步骤是创建共享构建还是只是公开一个 Python 界面。

Arafat 制作了 original repository 并制作了我遵循的说明,他说他的 libtensorflow.so 在他的 Linux 上 4.5 GB机器 – 所以超过我 OSX 机器上共享构建大小的 20 倍。 更新 1:他说他的 libtensorflow.so-build 是 302.2 MB , 4.5GB是整个tensorflow文件夹的大小。

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

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

bazel build //tensorflow

//tensorflow 对于 //tensorflow:tensorflow 是 shorthand,即 "build the tensorflow target." 如果可能,指定您想要的确切文件会强制 Bazel 构建该文件。)

获得 .dylib 后,您可以使用 otool:

检查其内容
 otool -L bazel-bin/tensorflow/libtensorflow.dylib

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

在深入挖掘、发现 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++ 库,这个 post 对我来说是一个很好的教程:http://engineering.gusto.com/simple-ruby-c-extensions-with-swig/