在 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 中构建一个好的包装器,但我在进入那个有趣的部分时遇到了困难!
我做了什么:
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.rb
、make
和 make install
described in the project
- 运行
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/
我正在尝试帮助围绕 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 中构建一个好的包装器,但我在进入那个有趣的部分时遇到了困难!
我做了什么:
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.rb
、make
和make install
described in the project - 运行
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/