5

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

背景

在这个ruby​​-tensorflow项目中,我需要打包一个 Tensorflow.bundle文件,但是每当我irb -Ilib -rtensorflow或尝试运行规范rspec时,我都会收到错误,即基本数字类型未定义,但它们在这里明确定义。

我猜这是因为我的.so-file 没有正确创建,或者某些东西没有按应有的方式链接。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文件夹
  5. 运行项目中描述ruby extconf.rb的, make, 和make install
  6. rspec

无奈之下,我也多次从源头进行官方安装,但我不知道最后sudo pip install /tmp/tensorflow_pkg/tensorflow-0.9.0-py2-none-any.whl一步是否创建了共享构建或只是公开了一个 Python 接口。

制作原始存储库并按照我遵循的说明进行操作的人 Arafat说,他在他的 Linux 机器上libtensorflow.so4.5 GB - 所以超过我的 OSX 机器上共享构建的大小的 20 倍。UPDATE1:他说他的libtensorflow.so-build 是302.2 MB, 4.5GB 是整个 tensorflow 文件夹的大小。

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

4

2 回答 2

4

经过更多的挖掘,发现otool(感谢 Kristina)并更好地理解.so-file 是什么之后,该解决方案不需要对我的设置进行太大更改:

共享构建

# 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/

于 2016-07-07T05:50:40.787 回答
3

我认为您实际上并不想要一个 .so,我认为您想要一个 .dylib(请参阅osx 上的 .so 和 .dylib 之间的区别是什么?)。您通过指定libtensorflow.so为目标来强制 Bazel 构建一个 .so ,而是构建它:

bazel build //tensorflow

//tensorflow是 的简写//tensorflow:tensorflow,即“构建 tensorflow 目标。”如果可能,指定您想要的确切文件会强制 Bazel 构建该文件。)

拥有 .dylib 后,您可以使用以下命令检查其内容otool

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

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

于 2016-07-06T22:33:35.480 回答