【问题标题】:Building and linking shared Tensorflow library on OSX El Capitan to call from Ruby via Swig在 OSX El Capitan 上构建和链接共享 Tensorflow 库以通过 Swig 从 Ruby 调用
【发布时间】:2016-11-08 04:35:32
【问题描述】:

我正在尝试使用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 不是我的强项,我想专注于学习 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 installdescribed in the project
  6. 运行rspec

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

创建 original repository 并按照我遵循的说明进行操作的人 Arafat 说,他的 libtensorflow.so 在他的 Linux 机器上是 4.5 GB,因此是共享构建大小的 20 倍以上我的 OSX 机器。 UPDATE1:他说他的libtensorflow.so-build 302.2 MB,4.5GB 是整个 tensorflow 文件夹的大小。

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

【问题讨论】:

    标签: ruby macos tensorflow swig bazel


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为您实际上并不想要一个 .so,我认为您想要一个 .dylib(请参阅 What are the differences between .so and .dylib on osx?)。您通过将 libtensorflow.so 指定为目标来强制 Bazel 构建一个 .so,而是构建它:

      bazel build //tensorflow
      

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

      一旦你有了 .dylib,你就可以用otool检查它的内容:

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

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

      【讨论】:

      • 嗨,克里斯蒂娜,谢谢!好吧bazel build //tensorflow 导致ERROR: no such target '//tensorflow:tensorflow': target 'tensorflow' defined by ...。所以我实际上需要libtensorflow.so。但是,您的otool-comment 引导我朝着正确的方向前进。 otool -hv libtensorflow.so 告诉我 bazel 输出是 DYLIB-filetype(所以我想我可以将扩展名更改为 .dylib),并暗示我的构建实际上还可以。
      • 酷!抱歉,张量流实际上将目标定义为.so!我以为他们把它建造成图书馆。很高兴它成功了!
      • 不用担心,它迫使我实际查看 BUILD 文件并看到 tensorflow.so 是唯一的目标。由于我阅读了 .so 与 .dylib 的帖子,并且知道 Tensorflow 团队已经为 Mac 提供了 Tensorflow,因此我得出结论,我走在正确的道路上。
      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多