最近一直在尝试从源码编译安装shogun,第一次接触源码编译,官网教程对新手太不友好,屡屡遇坑,遇到不少问题,而shogun的中文资料几乎没有,故记录于此。
shogun介绍
Shogun machine learning toolbox 是一个基于 C++ 的最古老的机器学习开源库,它创建于 1999 年。作为一个 SWIG 库,Shogun 可以轻松地嵌入 Java、Python、C# 等主流处理语言中。它的重点在于大尺度上的内核方法,特别是“支持向量机”的学习工具箱。其中,它包括了大量的线性方法,如 LDA、LPM、HMM 等等。
目前其支持的接口包括:python,octave,java/scala,ruby,csharp,r,lua,perl,js.
支持的平台包括:GNU/Linux, MacOSX, FreeBSD, Windows
shogun安装
Ready-to-install packages
对特定的操作系统,shogun都提供了pre-built packages,可以十分方便的进行安装使用。
比如,我在windows平台下,只需要通过conda进行安装:1
conda install -c conda-forge shogun
便可以安装shogun库及其python接口。
而在其他平台下,也有对应的解决方案,详见shogun github
compiling manually
当上述方法不起作用或者需要对shogun进行修改时,还可以从源码进行编译安装。
shogun的源码主要可以分为以下几部分
- src: 源码,包括实现算法的C++源码和接口源码
- doc: 包括readme.md, licenses等文件
- example: 所有接口的示例文件
- data: 数据集 (submodule, required for examples)
- tests: 单元测试
- applications: applications of shogun
- benchmarks: speed benchmarks (并没有见到?)
- cmake: cmake 所需文件
安装要求
编译Shogun所需的最低要求:
- The standard GNU/Linux tools, python
此外编译某种语言对应的接口还需要:
- swig,简化包与接口生成器,是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。
- 语言对应的相关开发环境,详见interfaces
如果需要编译任何接口,需要大约4GB的空间。
安装过程
首先介绍一下我的安装环境:ubuntu 18.04,最开始也尝试过在windows 10环境下进行手动编译,但是坑实在太多,所以暂且放弃。
shogun通过cmake进行编译,关于cmake和make,可以参考我的上一篇博文。
首先下载源码并更新子模块
1
2
3git clone https://github.com/shogun-toolbox/shogun.git
cd shogun
git submodule update --init在shogun根目录下创建build目标,进行out-of-source-build.
1
2mkdir build
cd build接下里对源码进行编译,cmake以源码目录作为参数(在build目录下用..代替即可)。注意,在这一步中有许多选项需要选择,比如如果想要生成python接口,并生成shogun的examples,写法如下:
1
cmake -DINTERFACE_PYTHON=ON -DBUILD_META_EXAMPLES=0N ..
此外还包括一些路径参数的选择,如:1
cmake -DPYTHON_INCLUDE_DIR=/usr/include/python3.3 -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3 -DPYTHON_PACKAGES_PATH=/usr/local/lib/python3.3/dist-packages -DINTERFACE_PYTHON=ON ..
由于cmake的可选参数实在太多,在不确定的情况下这里强烈建议用cmake的GUI进行
在这一步里可能会遇到一些模块的缺失导致失败,比如我遇到的包括swig,ctags,ccache安装上就好1
2
3sudo apt-get install swig
sudo apt-get install ctags
sudo apt-get install ccache
此外还遇到了如下错误1
2
3CMake Error at src/shogun/CMakeLists.txt:49 (MESSAGE):
Shogun can only be built with GPL codes if the source files are in
/home/wjh/Desktop/shogun/src/gpl. Please download or disable.
原因参见这里,因为我并不是直接从github上clone下载源码的,而是下载的6.1.3的稳定的发行版,而目前的发行版中已经不包括gpl files,需要从github上重新下载添加进行。
- 上一步的cmake生成了makefile,接下来用make进行编译,时间较长
- make从makefile中读取指令,然后编译
1
make
我在这一步也卡住了,出现了如下错误1
2
3[ 0%] Performing download step (git clone) for 'variant'
error: RPC failed; curl 56 GnuTLS recv error (-9): Error in the pull function.
fatal: The remote end hung up unexpectedly
在这一步似乎是通过git clone某一仓库时现了错误,经查,可以通过增大git的缓存解决1
git config --global http.postBuffer 524288000
- 接下来用make install进行安装
- make install, 从makefile中读取指令,安装到指定位置
1
sudo make install
在这一步遇到如下问题1
undefined reference to curl_easy_perform@curl_openssl_4'
查找到的类似问题都说是curl或openssl的版本问题,但似乎在我这并不适用,最后是一通骚操作再新来一遍shogun的安装才解决,也不知道是哪个环节的问题。
- 设置环境变量
这一步也是比较坑的一步,因为官网上的写法似乎是错的。
所有的接口都需要shogun库对系统可见才可以正常使用,所以需要设置环境变量。
- 设置libshogun.so的路径:
export LD_LIBRARY_PATH = /usr/local/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
- 设置shogun.py的路径:
export PYTHONPATH=/usr/local/lib/python3.7/site-packages:$PYTHONPATH
PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。 … 使用import xx语法时,xx只能是模块路径(一个模块一般是指一个package或者一个以.py为后缀的文件,不一般的情况包括.pth、.dll以及其他扩展形式)。
官网上在这两步中带入了文件名libshogun.so和shogun.py,PATH应该是文件路径而不是特定的文件