我正在尝试使用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不是我强大的一面,我在这一点上非常坚持到达那个有趣的部分!
我做了什么:
-
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
-step甚至创建了一个共享版本,或者只是暴露了一个Python界面 .
制作original repository并发出我所遵循的指令的阿拉法特说他的Linux机器上的 libtensorflow.so
是4.5 GB - 所以我的OSX机器上的共享版本大小超过20倍 . UPDATE1:他说 libtensorflow.so
-build是 302.2 MB ,4.5GB是整个tensorflow文件夹的大小 .
非常感谢任何帮助或替代方法!
2 回答
经过更多的挖掘,发现
otool
(感谢Kristina)并更好地理解.so文件是什么,解决方案在我的设置中不需要太多改变:共享构建
使用Swig从Ruby调用
按照此处的步骤https://github.com/chrhansen/ruby-tensorflow#install-ruby-tensorflow运行Swig,创建一个Makefile并
make
当你运行
make
时,你会看到一行说:如果您的共享版本无法访问,您会看到以下内容:
简单教程
对于那些从这个冒险开始,在Ruby中使用C / C库的人来说,这篇文章对我来说是一个很好的教程:http://engineering.gusto.com/simple-ruby-c-extensions-with-swig/
我不认为你真的想要一个.so,我想你想要一个.dylib(见What are the differences between .so and .dylib on osx?) . 你强迫Bazel通过指定
libtensorflow.so
作为目标来构建.so,而是构建它:(
//tensorflow
是//tensorflow:tensorflow
的简写,即"build the tensorflow target."如果可能,指定要强制Bazel构建该文件的确切文件 . )获得.dylib后,可以使用
otool
检查其内容:不确定这是否能解决您的所有问题,但值得一试 .