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

标签 ruby macos tensorflow swig bazel

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

背景

在此ruby-tensorflow项目,我需要打包一个 Tensorflow .bundle 文件,但是每当我 irb -Ilib -rtensorflow 或尝试运行规范 rspec 时,我get 和错误,基本数字类型未定义,但已明确定义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 -step 甚至创建了一个共享构建或者只是公开了一个 Python 接口(interface)。

阿拉法特,他创造了 original repository并按照我所遵循的说明进行操作,他说他的 libtensorflow.so 在他的 Linux 机器上是 4.5 GB - 所以是我 OSX 机器上共享构建大小的 20 倍以上。 更新 1:他说他的 libtensorflow.so-build 是 302.2 MB,4.5GB 是整个 tensorflow 文件夹的大小。

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

最佳答案

经过更多的挖掘,发现了 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/

关于ruby - 在 OSX El Capitan 上构建和链接共享的 Tensorflow 库以通过 Swig 从 Ruby 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218691/

相关文章:

ruby - 如何在网页上使用 Mechanize 到 'Show More' 单击(显然)无格式按钮/链接

ruby-on-rails - 无法批量分配 protected 属性 : password_confrimation

objective-c - 在 cocoa 中阅读后如何关闭文件

python - 如何使用Tensorflow进行信号处理?

ruby - `RUBY_GC_OLDMALLOC_LIMIT` 和 `RUBY_GC_MALLOC_LIMIT` 和有什么区别?

ruby-on-rails - 停止在 Rails 和浏览器中缓存图像?

c - 使用 dtrace 计算随时间变化的平均和最大磁盘读/写队列的示例

macos - 从 Ubuntu 12.04 访问 OSX 文件和文件夹

queue - 如何将张量推送到 TensorFlow 队列并从另一个进程中提取它们?

python - Keras 的基本二进制分类不起作用