因为需要用到LDA在一些大型预料上做一些实验和业务,根据一些资料显示lightLDA是目前来看性能最好的开源工具,于是我就尝试在公司服务器上安装配置lightLDA,过程没有想象中那么容易,在这里把过程记录下来,希望后来人尽量少踩些坑。
Why lightLDA
大致看了一下sparkLDA和JGibbsLDA,前者不支持Gibbs采样,还是用的EM和差分推理。后者是一个需要用命令行运行的工程,应该可以整合到spark,但是基于对lightLDA高性能口碑的好奇和兴趣,以及假如要使用lda模型,大型语料上的运行性能还是很重要的,所以还是选择配置一个lightLDA试试
gcc升级到4.8.5
lightLDA需要gcc版本在4.8.5,否则会报std-c++ 11等错误,所以在安装之前先对gcc进行升级。
安装过程主要参考了下面的文档,下载包和安装过程敲命令的时候注意下版本号就行了。
http://blog.techbeta.me/2015/10/linux-centos6-5-upgrade-gcc/
https://itbilu.com/linux/management/V1vdnt9ll.html
http://blog.csdn.net/zcc_0015/article/details/51506947
安装gcc/c++编译器以及内核文件
yum -y install gcc gcc-c++ kernel-devel
安装C和C++的静态库
yum install -y glibc-static libstdc++-static
安装旧版本的gcc、c++编译器
yum install gcc gcc-c++
下载安装文件
wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
解压安装文件
tar zxf gcc-4.8.5.tar.gz
转到源程序根目录
cd gcc-4.8.5
下载一些必备的依赖程序(自动完成)
./contrib/download_prerequisites
建立一个输出目录,编译时所有生成的中间文件都放到该目录下
mkdir build
cd build
执行configure配置安装文件
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
编译
make
安装
make install
完成后会在/usr/local/bin/中有unknown xxx gcc-xxx的包(下面用新gcc指代),需要改变系统默认的gcc,可以第三个参考资料中创建软链接或者第二个参考资料里的方式,注意备份
which gcc 如果显示的是/usr/bin/gcc,也有可能是usr/local/gcc,看你是不是管理员用户了,下面先进行备份,再建立软链接
mv /usr/bin/gcc /usr/bin/gcc4.4.7
ln -s /usr/local/bin/gcc(新gcc) /usr/bin/gcc
另外,g++, cc, c++这几个命令也要改
mv /usr/bin/g++ /usr/bin/g++4.4.7
ln -s /usr/local/bin/g++(新) /usr/bin/g++
mv /usr/bin/cc /usr/bin/cc4.4.7
ln -s /usr/local/bin/cc(新) /usr/bin/cc
mv /usr/bin/c++ /usr/bin/c++4.4.7
ln -s /usr/local/bin/c++(新) /usr/bin/c++
全部完成重新登入就会看到改变
gcc --version
g++ --version
都会显示4.8.5
因为我在第一次安装失败的时候找错误做实验把管理员的gcc版本也改了,后面安装成功不知道有没有这个操作的影响,下次安装的时候再测试做更新,不放心的可以把管理员的gcc版本也升级了,操作和上面的一样,把/usr/bin中的gcc和g++备份后做新的软链接。
lightLDA安装
我按照官方给出的安装教程会失败,后面检查发现是因为无法正常下载一个依赖包,也许只是我网络的原因。下面进入正题。
- 下载代码到本地
$ git clone https://github.com/Microsoft/lightlda
cd lightlda
- 运行官方给出的build.sh
sh ./build.sh
如果没有报错,那么恭喜,一次成功了,可以跳过安装这一节了。如果报错了可能就是下面要说的错误。
- 我碰到的问题和解决方法
cannot find -lmultiverso
仔细查看了下运行时的提示信息,发现有一个依赖包下载失败,然后继续执行后面的命令了。
于是看一下build.sh的代码
git clone -b multiverso-initial git@github.com:Microsoft/multiverso.git #下载DMTK到multiverso文件夹下
cd multiverso
cd third_party
sh install.sh #先安装DMTK的第三方包
cd ..
make -j4 all #编译安装DMTK
cd ..
make -j4 #编译安装LightLDA
从代码里可以看到安装lightLDA之前就把依赖的DMTK平台安装了,如果这一步有问题,比如
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
Permission denied (publickey).
可以换一个下载源,语句换为:
git clone -b multiverso-initial https://github.com/Microsoft/multiverso.git
multverso/third_party下的install.sh代码
# /bin/bash
# install third party library: 1. ZeroMQ, 2. MPICH2
THIRD_PARTY_DIR=$PWD
echo $TARGET_DIR
ZMQ_DIR=zeromq-4.1.3
MPI_DIR=mpich-3.0.4
# 1. Get ZeroMQ
wget http://download.zeromq.org/zeromq-4.1.3.tar.gz
tar -zxf zeromq-4.1.3.tar.gz
# Build ZeroMQ
# Make sure that libtool, pkg-config, build-essential, autoconf and automake
# are installed.
cd $ZMQ_DIR
./configure --prefix=$THIRD_PARTY_DIR --without-libsodium
make -j4
make install -j4
cd ..
rm -rf $ZMQ_DIR
# Get the C++ Wrapper zmq.hpp
wget https://raw.githubusercontent.com/zeromq/cppzmq/master/zmq.hpp
mv zmq.hpp $THIRD_PARTY_DIR/include
# Get MPICH2
wget http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz
tar -zxf mpich-3.0.4.tar.gz
# Build MPICH2
cd $MPI_DIR
./configure --prefix=$THIRD_PARTY_DIR --disable-fc --disable-f77
make -j4
make install -j4
cd ..
rm -rf $MPI_DIR
rm *.tar.gz*
一条一条执行,发现是在下载zeromq时失败了,在网上找了另外一个下载源
https://github.com/zeromq/zeromq4-1/releases/download/v4.1.3/zeromq-4.1.3.tar.gz
可以用这个地址替换掉代码中的地址,或者本地下载完之后上传到/multiverso/third_party
下然后删掉(注释掉)代码中的下载语句。
再执行还会报bin/lightlda: error while loading shared libraries: libzmq.so.5: cannot open shared object file: No such file or directory
的错误
需要在/etc下的ld.so.conf里添加libzmq.so.5
的位置
查找文件位置
sudo find / libzmq.so.5
输出在lightlda/multiverso/third_party/lib
目录下
把这个目录加入到/etc/ld.so.conf
文件中后执行sudo ldconfig
命令即可
再执行应该就没有问题了。
测试
代码中给了一个测试方法,但是不能直接使用,依然观察一下代码
#!/bin/bash
root=`pwd`
echo $root
bin=$root/../bin
dir=$root/data/nytimes
mkdir -p $dir
cd $dir
# 1. Download the data
wget https://archive.ics.uci.edu/ml/machine-learning-databases/bag-of-words/docword.nytimes.txt.gz
gunzip $dir/docword.nytimes.txt.gz
wget https://archive.ics.uci.edu/ml/machine-learning-databases/bag-of-words/vocab.nytimes.txt
# 2. UCI format to libsvm format
python $root/text2libsvm.py $dir/docword.nytimes.txt $dir/vocab.nytimes.txt $dir/nytimes.libsvm $dir/nytimes.word_id.dict
# 3. libsvm format to binary format
$bin/dump_binary $dir/nytimes.libsvm $dir/nytimes.word_id.dict $dir 0
# 4. Run LightLDA
$bin/lightlda -num_vocabs 111400 -num_topics 1000 -num_iterations 100 -alpha 0.1 -beta 0.01 -mh_steps 2 -num_local_workers 1 -num_blocks 1 -max_num_document 300000 -input_dir $dir -data_capacity 800
是想先下载一个数据集,然后进行格式转换,然后设定一些参数运行lightlda。
这里可能会碰到几个问题:
- 数据集下载太慢,换数据源,https://bigartm.readthedocs.io/en/v0.8.2/download.html网站上有相同的数据,同样可以替换代码中的链接或
第一个链接https://s3-eu-west-1.amazonaws.com/artm/docword.nytimes.txt.gz
第二个链接https://s3-eu-west-1.amazonaws.com/artm/vocab.nytimes.txt
第二步的text2libsvm.py并不在该目录下,而是在其下的example目录下。可能还有其他的路径问题,自己设置路径,然后手动一步一步的执行。
第三步dump_binary会报错,后面应该还会用到这个命令,修复可以参考http://blog.csdn.net/officercat/article/details/39519265
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found
至此就可以进行测试了,测试可以发现,随着迭代次数增加,每轮迭代需要的时间是越来越少的