您正在查看: 机器学习 分类下的文章

在Ubuntu 16.04的R语言环境中通过安装KerasR包使用Keras深度学习框架

Overview

因为想尝试一些深度学习模型,就用Keras开始建模(为什么使用Keras?)。而且由于之前使用的极其模型都是基于R语言的,所以我们依然尝试使用R语言版本的Keras来训练深度学习模型。

KerasR语言接口

Keras本身就是一个基于TensorflowTheano以及CNTK编写的纯Python框架,因为方便易用,所以使用广泛,为了让R语言开发者也能在R中使用KerasTaylor Arnold写了kerasR包,而RStudio公司开发了keras包,关于这两个包的区别,参见keras: Deep Learning in R

这里我使用kerasR包为例,在Ubuntu 16.04的R中安装Keras,并提供一些链接进一步学习使用kerasRKeras

安装过程

安装pip

pip是一个很方面易用的Python包管理工具,使用pip``可以很方便地安装TensorflowKeras`。
使用下面的命令安装:

sudo apt-get install python-pip

默认你已经安装了Python,如果没装Python,使用下面的命令一起装了:

sudo apt-get install python-pip python-dev build-essential 

安装之后查看pip的版本信息:

pip -V

想要升级pip

sudo pip install --upgrade pip 

注意:装了最新版本的pip(或者是升级到最新版本的pip),可能会报错,参考Python包管理软件pip更新后报错

安装Tensorflow

因为Keras本身是Tensorflow运行的机器学习框架,所以安装Keras之前先安装Tensorflow

sudo pip install tensorflow

这里我是用了系统权限sudo,如果没有系统权限,也可以不用。
如果想安装指定版本的Tensorflow,可以用下面的命令安装:

sudo pip install tensorflow==1.2.1

如果想安装GPU版本的Tensorflow,可以用下面的命令安装:

sudo pip install tensorflow-gpu

在安装Tensorflow的过程中可能会报类似于下面的错误:

Cannot uninstall 'enum34'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

这是因为安装Tensorflow需要安装enum34,在安装enum34时需要删除旧的enum34。而在删除旧的enum34时,版本依赖多,不能系统清晰的删除。所以需要手动安装enum34并忽略已经安装的版本:

sudo pip install nibabel --ignore-installed nibabel

然后重新安装Tensorflow就可以了。

安装Keras

sudo pip install keras

安装成功后,打开python命令行,导入一下Tensorflow

>>> import keras as kr
Using TensorFlow backend.

说明Keras已经装好。

安装kerasR

先打开R语言命令行(最后使用sudo,这样可以将R包安装到系统目录):

sudo R

安装kerasR

install.packages("kerasR")

安装成功后,导入kerasR,并检查状态:

library("kerasR")
keras_init()

如果不报错,就说明安装成功。

如果报了类似于下面的错误:

>> keras not available
>> See reticulate::use_python() to set python path, 
>> then use kerasR::keras_init() to retry

就说明要么是KerasTensorflow没装好,要么是R找不到Python的路径。一般来说Python装在系统路径中,不会找不到。以防万一,可以查看下自己的Python路径,手动使用reticulate::use_python()函数加进去。比如在Ubuntu下面,一般是在/usr/bin/python,那就可以用下面的命令安装:

reticulate::use_python("/usr/bin/python")

使用kerasR

安装好之后,可以参考下面的链接来在真实数据集上运行几个例子:

因为kerasR只是Keras的一个R语言接口,所以使用kerasR之前还是要对Keras有一些了解。可以查看下面的链接快速了解Keras

如果想快速上手一些Keras模型,可以查看下面的链接:

参考文献

R语言版本LightGBM在ubuntu16.04上的安装

Overview

首先非常感谢谢若鹏同学给的LightGBM安装教程和调优等脚本。下午在自己的6G内存ubuntu16.04系统上安装,在make -j这一步编译c++boosting库时总是退出,提示虚拟内存不足,看来是电脑配置太低了。只能在Bastion3服务器上面测试了。

1.LightGBM的安装

首先安装git

sudo apt-get install git

github上面clone``LightGBM的源码:

git clone --recursive https://github.com/Microsoft/LightGBM

然后执行以下几步:

cd LightGBM  
mkdir build  
cd build

下面先安装一下两个依赖包:

sudo apt-get install cmake
sudo apt-get install make

继续执行:

cmake ..
make -j

安装完成即可。

这一步对电脑内存要求比较高,我6G的内存都不够,坑。

2.R包的安装

大约需要以下几步安装:

install.packages("readr")
install.packages("GA")
install.packages("dplyr")
install.packages("parallelMap")
install.packages("jsonlite")
install.packages("mlr")

提示一下:在安装mlr包之前必须用以下命令安装好两个系统依赖包:

sudo apt-get install libxml2
sudo apt-get install libxml2-dev

否则会提示:

ERROR: dependency ‘XML’ is not available for package ‘mlr’

继续安装LightGBM需要的R包:

cd LightGBM/R-package
Rscript build_package.R
sudo R CMD INSTALL lightgbm_2.1.0.tar.gz --no-multiarch

至此,R语言版本的LightGBM算是安装好了。

本文参考了以下文章,感谢!
案例 | lightgbm算法优化-不平衡二分类问题(附代码)
Ubuntu 14.04下libxml2的安装和使用

机器学习项目服务器上线部署全流程记录

Overview

我们团队完整的机器学习项目已经做了两个了,分别是Bastion4Bastion6。之前两个项目上线部署的记录过于片段化,针对现在马上要做完的Bastion3项目,我们在此完整记录搭建服务器各种环境的全部流程,以备不时之需。
完整的项目基本分为三大部分:Java处理业务逻辑;Perl后台消息队列;R机器学习模型预测。每个大部分还有很多细节,我们会在每部分都详细记录。
新申请的云服务器预装的仍然是Ubuntu16.04LTS发行版的Linux系统。

1.Java

Java端负责将用户提交的任务信息提交至后台Perl服务器并记录在MySQL数据库中。因此这部分会安装JDK1.8Tomcat7MySQL5.7

1.1 安装JDK1.8

安装JDK1.8,用apt命令很方便,不用单独下载解压。命令如下:

sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default -y

安装完成之后,JDK1.8会被安装在/usr/lib/jvm/java-8-oracle中,在/etc/profile或者~/.bashrc中配置JAVA_HOME变量 (我用的是~/.bashrc文件):

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

安装好之后,需要以下命令使配置生效:

source ~/.bashrc

1.2 安装Tomcat7

使用以下的命令安装Tomcat7:

sudo apt-get install tomcat7

安装过程中,可能会报如下的错误(即使你已经配置好了JAVA_HOME):

Jul 09 16:52:16 bastiondb systemd[1]: Starting LSB: Start Tomcat....
Jul 09 16:52:16 bastiondb tomcat7[6413]:  * no JDK or JRE found - please...E
Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Control process e...1
Jul 09 16:52:16 bastiondb systemd[1]: Failed to start LSB: Start Tomcat..
Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Unit entered fail....
Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Failed with resul....
Hint: Some lines were ellipsized, use -l to show in full.
dpkg: error processing package tomcat7 (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 tomcat7
E: Sub-process /usr/bin/dpkg returned an error code (1)

出现这个错误,说明tomcat7已经装好了,但是由于tomcat在启动时找不到JAVA_HOME的路径,所以报错。查看/etc/default/tomcat7,会发现下面这行:

#JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk

去掉注释,并改为我们自己的JAVA_HOME路径:

JAVA_HOME=/usr/lib/jvm/java-8-oracle

重新运行安装命令:

sudo apt-get install tomcat7

安装成功...

安装好之后,tomcat7已经在运行了,使用下面命令查看:

ps aux | grep tomcat

用下面的命令启动/停止/重启Tomcat7了:

sudo service tomcat7 start/stop/restart

但是现在还有一个问题,Tomcat7的端口是8080,访问的时候必须在地址后面加上:8080,这样看起来不太和谐。由于Apache已经占用了80端口,所以我们采用Apache反向代理转发Tomcat请求的方式来解决这个问题。

1.2.1 配置Tomcat7启动内存

Tomcat启动内存不大,在网站数据量增多的情况下,就会在网页访问时报错,很难根据错误信息推测到这里。我们提前增大Tomcat的启动内存。
修改/usr/share/tomcat7/bin/catalina.sh文件

sudo vim /usr/share/tomcat7/bin/catalina.sh

可以看到:

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;

在这段前面添加:

JAVA_OPTS="-Xmx4096m"

就可以将tomcat启动内存增加为4G,保存并重启tomcat,就可以了。

下面的内容选择性安装,如果没有特殊需求,最好不要修改

默认的tomcat工作主目录为/var/lib/tomcat6/,网站目录为/var/lib/tomcat6/webapps,如果你的文章会产生大量文件,并且需要存放在网站的目录下,那这个目录就不太合适,因为这个目录通常占用的是系统盘空间。
假设你有一个新的扩展盘,目录为/my_extended_disk,在上面创建一个目录为tomcatWebapps,并想把这个目录,当做你的tomcat网站目录,修改/etc/tomcat7/server.xml

sudo vim /etc/tomcat7/server.xml

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

修改为

<Host name="localhost"  appBase="/my_extended_disk/tomcatWebapps"
            unpackWARs="true" autoDeploy="true">

然后重启服务器,就可以了。

1.3 检查安装phpApache2

一般来说,装好的Ubuntu 16.04系统都会默认装好phpApache2,但配置使用之前最好还是检查一下。

使用下面命令检查php

php -v

如果已经安装,大概会显示下面的内容:

PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

说明安装了php 7.0。如果没装的话,用下面的命令安装:

sudo apt-get install php7.0

Ubuntu 16.04中,直接用

sudo apt-get install php

默认安装的也是php7.0版本。

使用下面命令检查Apache2

apache2 -v

如果已经安装,大概会显示下面的内容:

Server version: Apache/2.4.18 (Ubuntu)
Server built:   2018-04-18T14:53:04

说明没装的话,用下面的命令安装:

sudo apt-get install apache2

注意:如果phpApache2都没有安装的情况下,安装顺序一定要先装php,在装Apache2,如果顺序反了,可能会导致Apache2服务器不能识别php页面,在你访问这些页面的时候,直接显示页面的代码,而不是页面本身。 参见 php页面不能被解析成网页,而是直接显示了页面代码

1.4 设置Apache2反向代理

Apache2默认是随系统安装的,但有时候为了快速安装,去掉了也有可能。由于Apache2是随系统自动启动的,如果Apache2已经安装了并且没有人主动关闭的话,使用:

ps aux | grep apache2

就应该看到进程信息,如果没看到,用下面的命令安装:

sudo apt-get install apache2

安装成功之后,使用服务器的地址(比如bastion3.erc.monash.edu)访问,就应该看到Apache2的欢迎界面。 如果安装成功,但是网址却无法访问,说明80端口没开,联系管理员,打开这个端口。

修改Apache2配置文件:

sudo vim /etc/apache2/apache2.conf

在文件末尾添加以下内容:

ProxyPass / http://bastion3.erc.monash.edu:8080/
ProxyPassReverse / http://bastion3.erc.monash.edu:8080/

可以让Apache2http://bastion3.erc.monash.edu请求转发到http://bastion3.erc.monash.edu:8080/tomcat7处理。如果你在Apache2中有一个网站cgi-bin,你访问http://bastion3.erc.monash.edu/cgi-bin时,就想访问Apache2下的cgi-bin,而不是转成http://bastion3.erc.monash.edu:8080/cgi-bintomcat7处理,那么改成这样就可以了:

ProxyPass /phpmyadmin !
ProxyPass /cgi-bin !
ProxyPass / http://bastion3.erc.monash.edu:8080/
ProxyPassReverse / http://bastion3.erc.monash.edu:8080/

注意:这里同时写了一个phpmyadmin的配置,是因为我们会使用phpmyadmin管理和访问数据库。参考1.6小节的内容。

重启Apache2服务:

sudo service apache2 restart

如果报错:

Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.

根据提示,使用

systemctl status apache2.service

查看错误信息:

Jul 09 17:15:56 bastiondb apache2[7914]:  * The apache2 configtest failed.
Jul 09 17:15:56 bastiondb apache2[7914]: Output of config test was:
Jul 09 17:15:56 bastiondb apache2[7914]: AH00526: Syntax error on line 223 o
Jul 09 17:15:56 bastiondb apache2[7914]: Invalid command 'ProxyPass', perhap
Jul 09 17:15:56 bastiondb apache2[7914]: Action 'configtest' failed.
Jul 09 17:15:56 bastiondb apache2[7914]: The Apache error log may have more
Jul 09 17:15:56 bastiondb systemd[1]: apache2.service: Control process exite
Jul 09 17:15:56 bastiondb systemd[1]: Failed to start LSB: Apache2 web serve
Jul 09 17:15:56 bastiondb systemd[1]: apache2.service: Unit entered failed s
Jul 09 17:15:56 bastiondb systemd[1]: apache2.service: Failed with result 'e

发现Apache2不能识别新添加的ProxyPass,导致重启失败。这是因为Apache2的代理模块proxy_http未启用,使用下面命令:

sudo a2enmod proxy_http

重新启动Apache2

sudo service apache2 restart

成功...这时候再输入服务器的地址,即可访问到tomcat的默认项目了,后面不用加:8080

1.5 安装MySQL5.7

先更新一下系统,再用apt-get命令直接安装:

sudo apt-get update
sudo apt-get install mysql-server

安装过程会让选择yes/no,选yes;还有就是设置root用户密码。
安装完成可以查看是不是安装好了,即查看MySQL的状态:

sudo service mysql status

显示如下即可:

?.mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-03-19 14:35:03 UTC; 27s ago
 Main PID: 17432 (mysqld)
   CGroup: /system.slice/mysql.service
           ?..17432 /usr/sbin/mysqld

Mar 19 14:35:02 bastion3 systemd[1]: Starting MySQL Community Server...
Mar 19 14:35:03 bastion3 systemd[1]: Started MySQL Community Server.

安装好之后,可以用以下命令启动/停止/重启:

sudo service mysql stop/stop/restart

本项目的数据的形式和之前项目的很相似,所以可以将之前的Bastion6项目数据库文件导出,然后再导入本项目。
导出命令:

mysqldump -uroot -p bastion6 > bastion6.sql

回车之后输入数据库密码即可。
bastion6.sql内容修改为自己需要的:

CREATE DATABASE IF NOT EXISTS bastion3;
USE bastion3;
DROP TABLE IF EXISTS `job`;

CREATE TABLE `job` (
  `jobID` int(100)  NOT NULL AUTO_INCREMENT,
  `jobName` varchar(256) NOT NULL,
  `orgnization` varchar(1000) ,
  `email` varchar(100) NOT NULL,
  `status`int(1) NOT NULL,
  `createTime` datetime NOT NULL,
  `startTime` datetime ,
  `endTime` datetime ,
  `sequence` longtext NOT NULL,
  `sequenceNumber` int(10) NOT NULL,
  PRIMARY KEY (`jobID`)
) DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `predictresult`;

CREATE TABLE `predictresult` (
  `jobID` int(100)  NOT NULL AUTO_INCREMENT,
  `jobName` varchar(256) NOT NULL,
  `predictionResult` longtext,
  PRIMARY KEY (`jobID`)
) DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `pssm`;

CREATE TABLE `pssm` (
  `id` int(100)  NOT NULL AUTO_INCREMENT,
  `seq` varchar(10000),
  `output` varchar(500) ,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `downloadInfo`;

CREATE TABLE `downloadInfo` (
  `id` int(100)  NOT NULL AUTO_INCREMENT,
  `type` varchar(10000),
  `count` varchar(500) ,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `downloadInfo` VALUES (1,'originalData','0'),(2,'independentData','0'),(3,'predictData','0');

然后登录数据库:

mysql -u root -p

回车之后输入密码。
将上面的SQL命令输入,回车即可创建完整的数据库表。

至此,Java部分安装配置就算完成了。

1.6 安装配置phpmyadmin

命令行查看和管理MySQL还是有点不方便,所以我们这里安装一个phpmyadmin,就可以使用web界面查看和操作数据库。

这时候直接使用网址+phpmyadmin,浏览器会显示找不到phpmyadmin。那是因为apache2默认的网站路径是/var/www/html,而不是/var/www,编辑/etc/apache2/sites-enabled/000-default.conf

sudo vim /etc/apache2/sites-enabled/000-default.conf

DocumentRoot /var/www/html修改为DocumentRoot /var/www
重启apache2,重新访问,就可以了。

安装phpmyadmin

sudo apt-get install phpmyadmin

安装过程中,会弹出一个Configuring phpmyadmin框,让你选择要运行phpmyadmin的服务器,默认是apache2,还可以选择lighttpd,因为我们之前安装的web服务器是apache2,所以直接敲回车就行了。

然后安装一阵子继续弹出一个Configuring phpmyadmin框,提示你是否需要配置数据库,毕竟phpmyadmin本身就是管理数据库的,不配置好数据库,也就没有安装的意义了,默认选择的是Yes,回车,会转到新的界面让你输入密码,也就是刚才安装MySQL时设置的密码,输入之后敲回车确认,再重复确认密码,完成安装。

安装完成之后,发现在apache2的网站目录/var/www下,并没有多出来一个phpmyadmin,这是因为Ubuntu系统在安装phpmyadmin时,默认安装在了/usr/share/下:

ls /usr/share/

就可以看到里面有phpmyadmin

我们直接创建一个软连接:

sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin

这样就可以在/var/www下访问到phpmyadmin

如果发现虽然能访问phpmyadmin了,但是浏览器直接显示了代码,而不是网页,说明apache2没有自动安装解析php的包。

先用下面的命令看看你装的php版本:

php --version

如果是php7.0,那么安装下面的包:

sudo apt-get install libapache2-mod-php7.0

然后重启apache2,现在应该可以访问到正常的网页了。具体原因,参见php页面不能被解析成网页,而是直接显示了页面代码

用户名是root,密码是MySQL设置的密码。

2.Perl后台

Perl的主要作用是它的消息队列以及和Java通讯的CGI模块。因此需要配置Apache2 CGI以及安装相应的Perl模块。

2.1 设置Apache2 CGI

在安装CGI模块之前,最好先将make安装好:

sudo apt-get install make

然后安装PerlCGI模块,推荐使用cpan命令安装 (一定要用sudo权限打开):
先打开cpan

sudo cpan

然后输入下面的命令:

install CGI

下面修改CGI程序的根目录:

sudo vim /etc/apache2/apache2.conf

将配置文件中对应的地方改为如下:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

/var/www/cgi-bin目录中新建一个cgi_test.pl文件,以创建一个Perl CGI网站,文件内容为:

#!/usr/bin/perl -w
use warnings;
use CGI qw(:standard);
#! must use 'my' to define a variable
print header;
my $now_string = localtime();
print "<b>Hello, CGI using Perl!</b><br/>It's $now_string NOW!<br />";

为此文件添加执行权限:

sudo chmod +x /var/www/cgi-bin/cgi_test.pl

在命令行中执行此文件:

sudo perl /var/www/cgi-bin/cgi_test.pl

如果之前的设置正确,则会显示以下内容:

Content-Type: text/html; charset=ISO-8859-1

<b>Hello, CGI using Perl!</b><br/>It's Tue Mar 20 14:17:15 2018 NOW!<br />

至此,虽然可以在命令行中运行此程序,但是还不能作为服务器远程访问。我们需要做以下配置,让Apache2Perl支持:

sudo vim /etc/apache2/sites-enabled/000-default.conf

将下面的内容:

<VirtualHost *:80>
    ...
 
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
     
    ...
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
     
</VirtualHost>

修改为:

<VirtualHost *:80>
    ...
 
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
 
    ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    <Directory "/var/www/cgi-bin">
         AllowOverride all
         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
         Order allow,deny
         Allow from all
         AddHandler cgi-script .cgi .pl
    </Directory>
    ...
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
</VirtualHost>

Apache中启用CGI模块。注意 VirtualHost *:80这里的端口号尽量不要改动,因为使用网址或者ip地址访问,不加端口号的话,默认就是访问80端口号,如果改了端口号,就得显示加上。
默认情况下,这个模块是没有开启的,这点可以用以下命令确认:

ls -l /etc/apache2/mods-enabled/ | grep cgi

显示为空表示当前启用的与CGI相关的模块为空。用下面的命令查看有哪些模块可以被启用:

ls -l /etc/apache2/mods-available/ | grep cgi

显示如下:

-rw-r--r-- 1 root root   74 Mar 19  2016 authnz_fcgi.load
-rw-r--r-- 1 root root  115 Mar 19  2016 cgid.conf
-rw-r--r-- 1 root root   60 Mar 19  2016 cgid.load
-rw-r--r-- 1 root root   58 Mar 19  2016 cgi.load
-rw-r--r-- 1 root root   89 Mar 19  2016 proxy_fcgi.load
-rw-r--r-- 1 root root   89 Mar 19  2016 proxy_scgi.load

这样,我们在mods-enabled中创建软连接,指向mods-available中的cgid.*文件:

sudo ln -s /etc/apache2/mods-available/cgid.load /etc/apache2/mods-enabled/
sudo ln -s /etc/apache2/mods-available/cgid.conf /etc/apache2/mods-enabled/

重启Apache服务器:

sudo service apache2 restart

此时,如果在浏览器中访问:http://bastion3.erc.monash.edu/cgi-bin/cgi_test.pl应该会显示:

Hello, CGI using Perl!
It's Tue Mar 20 14:17:15 2018 NOW!

这样就算成功了。

2.2 Perl相关模块安装

在安装这部分模块之前,最好保证gccg++两个程序已经安装好了,如果没有安装好,那么按照以下命令安装:

sudo apt-get install gcc
sudo apt-get install g++

Perl模块仍然要使用sudo cpan命令安装,然后依次输入以下命令:

install Storable
install DBI
install IO::All
install Bio::SeqIO
install Bio::Seq
install Capture::Tiny
install SOAP::Transport::HTTP
install MIME::Lite
install Mail::Sendmail

2.3 gearman消息队列安装

当前最新版的gearmangearmand-1.1.12。我们执行下面几步,先将其下载到本地主文件夹,并解压缩。

cd ~
sudo apt-get update
wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
tar zxvf gearmand-1.1.12.tar.gz
cd gearmand-1.1.12/

进入gearmand-1.1.12文件夹后,如果直接运行

./configure

就会报缺少如下几个依赖包错误:

configure: error: could not find boost
configure: error: Could not find a version of the library
configure: error: could not find gperf
configure: error: Unable to find libevent
configure: error: Unable to find libuuid

所以,我们先将这些依赖都安装好:

sudo apt-get install libboost-dev
sudo apt-get install libboost-all-dev
sudo apt-get install gperf
sudo apt-get install libevent-dev
sudo apt-get install uuid-dev

安装好之后,如果没有错误,则运行:

./configure

然后仍在gearmand-1.1.12文件夹下运行下面两条命令,编译时间比较长:

sudo make
sudo make install

这个过程中如果出现了错误,就运行下面的命令清除一下之前编译产生的可执行文件以及object文件(即扩展名为o的文件):

sudo make clean

继续重新安装编译:

./configure
sudo make
sudo make install

没有错误的话,就安装gearmanjob server

sudo apt-get install gearman-job-server

安装好以后,运行一下gearman:

gearman -d

会提示错误:

gearman: error while loading shared libraries: libgearman.so.8: cannot open shared object file: No such file or directory

这表示找不到libgearman.so.8所在的目录。这时我们打开/etc/ld.so.conf文件:

sudo vim /etc/ld.so.conf

添加一句话:

include /usr/local/lib

保存退出,并执行下面这句:

sudo /sbin/ldconfig

这样就不会出错了。

启动一下job server

gearmand -d

报错如下:

gearmand: Could not open log file "/usr/local/var/log/gearmand.log", from "/home/ubuntu/gearmand-1.1.12", switching to stderr. (No such file or directory)

我们这样解决:在/usr/local/下面新建var子目录,进去,新建log子目录,再进去,新建文件gearmand.log。这样就没有问题了。

sudo权限运行下面的命令:

sudo gearmand -d -L 127.0.0.1 -p 4730

-d表示daemon,在后台运行;
-L表示监听的ip,默认是localhost
-p表示监听的端口号port,默认是4730

此时,使用下面的命令,即可查看gearman当前状态:

sudo lsof -i:4730

如果显示如下,就表示成功安装:

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gearmand 27831 gearman   10u  IPv4 320614      0t0  TCP localhost:4730 (LISTEN)

这样gearmanubuntu16.04上面就安装成功了。

至此,我们还需要安装三个Perl模块:

Gearman::Server
Gearman::Client
Gearman::Worker

在安装Gearman::Server的时候,需要依赖Net::SSLeay,IO::Socket::SSLGearman::Util,而安装Net::SSLeay的时候,如果没有libssl-dev这个系统包,是安装不上Net::SSLeay的。所以我们必须要先安装好libssl-dev

sudo apt-get install libssl-dev

然后必须按顺序依次安装Net::SSLeay,顺序不能乱:
继续打开cpan

sudo cpan

然后

install Net::SSLeay
install IO::Socket::SSL
install Gearman::Util

依次安装:

install Gearman::Server
install Gearman::Client
install Gearman::Worker

都安装后之后,可以重启一下机器。
启动之后,用如下命令观察4730端口,查看gearmanjob server是否已经启动(gearmand -d这条命令是否生效):

sudo lsof -i:4730

显示如下:

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gearmand 907 gearman   10u  IPv4  21414      0t0  TCP localhost:4730 (LISTEN)

可以知道,这个server是开机自启动的。
至此,gearman消息队列的安装就算完成了。

每次重启服务器,都需要重启worker脚本。workerclient脚本都会放在/var/www/cgi-bin/目录下面,因此启动worker和命令如下(比如我们要开16worker):

sudo nohup perl /var/www/cgi-bin/worker_bastion3.pl >~/worker_bastion3_log_1.txt &
sudo nohup perl /var/www/cgi-bin/worker_bastion3.pl >~/worker_bastion3_log_2.txt &
sudo nohup perl /var/www/cgi-bin/worker_bastion3.pl >~/worker_bastion3_log_3.txt &
sudo nohup perl /var/www/cgi-bin/worker_bastion3.pl >~/worker_bastion3_log_4.txt &
...
sudo nohup perl /var/www/cgi-bin/worker_bastion3.pl >~/worker_bastion3_log_16.txt &

client会在提交任务的时候,由Java调用,因此不需要我们手动启动。

现在不再需要手动重启了。 运行sudo crontab -ee代表edit),可以编辑创建一个cron任务,可能需要先选择编辑器,熟悉哪个选哪个就行了,我选的3. vim

@reboot cd /var/www/cgi-bin && sudo perl /var/www/cgi-bin/worker_Bastion3.pl > /var/log/worker_Bastion3_log_1.txt 2>&1
@reboot cd /var/www/cgi-bin && sudo perl /var/www/cgi-bin/worker_Bastion3.pl > /var/log/worker_Bastion3_log_2.txt 2>&1
@reboot cd /var/www/cgi-bin && sudo perl /var/www/cgi-bin/worker_Bastion3.pl > /var/log/worker_Bastion3_log_3.txt 2>&1
@reboot cd /var/www/cgi-bin && sudo perl /var/www/cgi-bin/worker_Bastion3.pl > /var/log/worker_Bastion3_log_4.txt 2>&1
...
@reboot cd /var/www/cgi-bin && sudo perl /var/www/cgi-bin/worker_Bastion3.pl > /var/log/worker_Bastion3_log_16.txt 2>&1

这样之后服务器重启,就不必再手动开这些进程了。

使用sudo crontab -l(l代表list)可以查看所有你创建的cron任务。注意:用sudo创建的任务用sudo查看,才能看得到,同样sudo crontab -l查看不到crontab -e 创建的任务。

相对于手动执行脚本,这里的配置有三个变化:

    1. log日志重定向到了/var/log/目录下,可以直接在这里查看错误信息。
    1. 不再需要用nohup命令了,nohup是因为我们用ssh登录,需要在ssh退出后脚本依然运行才这么做的,现在重启时系统系统这个脚本,这个脚本会一直留在系统中,不必再用nohup
    1. cron启动脚本时,当前工作目录可能跟想象中不一样,我们执行sudo perl /var/www/cgi-bin/worker_bastion3.pl(不管用不用nohup)时,脚本的工作目录在/var/www/cgi-bin,而由cron执行时,当前工作目录却是sudo perl /var/www/cgi-bin/worker_bastion3.pl,导致脚本中使用相对目录的地方会报错,比如这里:

      $seqs > io("sequence/$jobName.fasta");
      …
      
    当然,好的习惯是尽量不要用相对路径,因为你不知道这个脚本会在哪里或者哪种环境下执行,执行时的当前工作目录也可能无法预测。

3. Python相关安装

Python在此系列项目当中,主要是用来提取特征,因此需要依次安装以下几个工具包:

sudo apt-get install python-scipy
sudo apt-get install python-dev
sudo apt-get install python-numpy
sudo apt-get install python-matplotlib
sudo apt-get install python-pandas
sudo apt-get install python-sklearn

4. R语言及相关包安装

R语言在此系列项目当中,既要提取部分特征,又要负责训练模型,还要使用ggplot2画图,所以有很多相关的包是要安装的。
首先安装R语言:

sudo apt-get install r-base

然后安装以下几个包 (其实这个服务器在机器学习部分主要作用就是预测,因为训练部分的工作都会在线下进行,不过仍然将所有机器学习部分必须的包都记录在此,以备查阅)。
sudo权限启动R语言:

sudo R

这里必须用sudo启动R安装,这样R包一般会安装在/usr/local/lib/R/site-library中,不用sudo权限,会把R包装在当前用户的个人空间,比如~/R/x86_64-pc-linux-gnu-library/3.2。在普通状态下这两个位置并无不同,但是如果当前用户进入root模式(比如用sudo -i命令),再使用R就不能正确找到R包了。很不幸,因为我们用了crontab设置了worker开机自启动,导致在sudo模式调用了worker的程序,并由worker进一步调用了R程序,就没能找到普通权限下安装的R包,导致报错了。

然后在启动的R语言对话框中输入以下命令:

install.packages("protr")
install.packages("caret")
install.packages("e1071")
install.packages("plyr")
install.packages("RSNNS")
install.packages("ROCR")
install.packages("ggplot2")
install.packages("randomForest")

至此一个完整的机器学习项目的服务器就已经算是搭建好了。

需要格外注意的是,因为我们的缓存文件都在外接硬盘上,所以每次都重启服务器之后都需要手动加载此硬盘:

sudo mount /dev/vdb /bastion3_cache/

现在不用这么做了,通过配置/etc/fstab可以直接再重启服务器时自动挂载,在/etc/fstab文件中添加下面的行(需要用sudo编辑):

/dev/vdb        /bastion3_cache auto    defaults,nofail,x-systemd.requires=cloud-init.service,comment=cloudconfig       0       2

其中,/dev/vdb是要挂在的物理硬盘盘符,/bastion3_cache是挂载盘目录。

如果你不清楚哪个盘需要挂载,用df -h查看:

ubuntu@bastion3:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             32G     0   32G   0% /dev
tmpfs           6.3G  180M  6.2G   3% /run
/dev/vda1       9.9G  4.2G  5.2G  45% /
tmpfs            32G     0   32G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            32G     0   32G   0% /sys/fs/cgroup
/dev/vdb        473G  9.0G  440G   3% /bastion3_cache
tmpfs           6.3G     0  6.3G   0% /run/user/1000

如果有硬盘为未挂载,那Mounted on这列应该是空的,或者是/mnt(默认挂载在/mnt目录)。挂载前需要自己创建一个目录,比如sudo mkdir /bastion3_cache

R语言输出表格到Word

Overview

由于投稿论文,需要将大量csv格式的表格输出到Word当中。故将csv格式的表格读入到R中,然后再从R中输出至Word。这需要一个软件和几个R包的支持,故将安装过程记录下来。

1.下载安装statconnDCOM

Windows系统下,到 http://rcom.univie.ac.at 下载statconnDCOM3.6-0B3_Noncommercial,这是非商业版本。下载后安装即可。

2.安装最新版的R语言

Windows系统下,推荐使用R语言的图形界面版RStudio。安装过程不再赘述。

3.安装依赖包

打开R图形界面,安装以下几个包:

install.packages("R2wd")
install.packages("rcom")
install.packages("rscproxy")
install.packages("RDCOMClient")

rcom可能不可用,不要在意,安装好其他3个也可以使用。

4.开始使用

执行以下命令导入R2wd包并打开Word

require("R2wd")
wdGet()

读入csv表格中的数据:

svmData=read.csv("E:/material/SVM/T6_multiple_test_singleSVMs_cv5_performance_sd_9_features.csv",header=T,sep="\t")
rfData=read.csv("E:/material/RF/T6_multiple_test_singleRFs_cv5_performance_sd_9_features.csv",header=T,sep="\t")
knnData=read.csv("E:/material/KNN/T6_multiple_test_singleKNN_cv5_performance_sd_9_features.csv",header=T,sep="\t")
nbData=read.csv("E:/material/NB/T6_multiple_test_singleNB_cv5_performance_sd_9_features.csv",header=T,sep="\t")
mlpData=read.csv("E:/material/MLP/T6_multiple_test_singleRSNNS_cv5_performance_sd.csv",header=T,sep="\t")

选取我们需要的那几列数据,并格式化为DataFrame

data1=svmData[,c(2:4,6:10)]
data1=data.frame(data1)
data2=rfData[,c(2:3,5:9)]
data2=data.frame(data2)
data3=knnData[,c(2:3,5:9)]
data3=data.frame(data3)
data4=nbData[,c(2,4:8)]
data4=data.frame(data4)
data5=mlpData[,c(2,4:8)]
data5=data.frame(data5)

最后,把选择后的数据写入Word

wdTable(data1)
wdTable(data2)
wdTable(data3)
wdTable(data4)
wdTable(data5)

写入成功。

需要注意的一点是,Linux下面产生的csv文件,在Windows系统中导入的时候,会有一些乱码出现,一半都是一些符号。例如我们的数据,导入的时候,±符号变成了字。只需用Word本身的查找替换就可以了。

这篇文章参考了以下链接:
将R语言中的统计结果或数据框以表格的形式直接输出到WORD

训练集归一化和测试集归一化

Overview

T4这个项目时,训练集采用了1502条正负样本数据,生成了大量的特征,由于各特征数据变化范围差异很大,于是我们按照重新缩放法做了数据的归一化,使得各特征的取值范围均控制在(0,1)内。然而在预测独立测试集3371条正负样本时,遇到一些疑问:独立测试集怎么办?如果独立测试集归一化,该怎么归一化,以谁为基准归一化,即它的最大值和最小值从何而来?
首先,毋庸置疑,独立测试集必须经过归一化。假如不归一化,某些特征值将会远大于1,或者远小于,这样样本会被全部判断为正或者全部为负,这点根据SVM和决策树的原理很容易理解。所以,我们查阅了很多资料,发现提到独立测试集归一化的,几乎没有。最终只在stackoverflow上找到一种思路:保存训练集每种特征原始的极值,应用于独立测试集。这样虽然仍会有部分数据“越界”,但是绝大多数数据将会趋于正常。下面将给出python代码,以记录这次工作。编码部分参考了这篇博客

1.归一化代码


#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#Copyright Chris & Young

def usage():
    print "normalize_test.py usage:"
    print "python normalize_test.py <options> <source files> "
    print "-i,--input: input an independent test dataset feature file."
    print "-t,--train: input training dataset feature file."
    print "-o,--ouput: output a normalized independent test dataset feature file."  
    print "-H,--header: input 'T' if the input_file contains header row, else input 'F'."
    print "-c,--class: input 'T' if the input_file contains class label column, else input 'F'."
    print "-h,--help: show the help information."

import re
import pandas as pd
import numpy as np
import fileinput
import sys, getopt
from os import listdir
from os.path import isfile, join
from sklearn import preprocessing

opts, args = getopt.getopt(sys.argv[1:], 'i:o:t:H:c:h',['input=','output=','train=','header=','class=','help'])
input_file=""
output_file=""
header_input=""
class_input=""
train_file=""

#col_start这个变量,是归一化开始列的index。根据是否有class列而变化。
col_start=0
for opt, arg in opts:
    if opt in ('-i','--input'):
        input_file = arg
    elif opt in ('-o','--output'):
        output_file = arg
    elif opt in ('-t','--train'):
        train_file=arg
    elif opt in('-H','--header'):
        header_input = arg
        if header_input == "T":
            header_input='infer'
        elif header_input == "F":
            header_input=None
    elif opt in ('-c','--class'):
        class_input = arg
        if class_input=="T":
            col_start+=1
    elif opt in ('-h', '--help'):
        usage()
            sys.exit(2)
        else:
            usage()
            sys.exit(2)
#读取数据到dataframe中
df_test = pd.read_csv(input_file,header=None)
df_train = pd.read_csv(train_file,header=header_input)
#将数据框分成两部分:class列单独拿出来,其余部分归一化处理
dataframe_train2 = df_train.ix[:,col_start:]
#数据框需要转化为float类型
dataframe_train2 = np.float64(dataframe_train2)
dataframe_test = np.float64(df_test)
#数据框需要转化为矩阵
matrix_train2=np.array(dataframe_train2)
matrix_test=np.array(dataframe_test)
#如果两个矩阵列数不同,程序终止退出
[row_train,col_train]=np.shape(matrix_train2)
[row_test,col_test]=np.shape(matrix_test)
if col_train!=col_test:
    print "Training or test dataset error!"
    sys.exit(2)
#下面代码是核心归一化代码
min_max_scaler=preprocessing.MinMaxScaler()

minmax_train=min_max_scaler.fit_transform(matrix_train2)
minmax_test=min_max_scaler.transform(matrix_test)
'''
此注释中代码为测试代码,按列观察训练集和测试集的最大最小值,从而确定是否正确将测试集归一化
train_max=minmax_train.max(axis=0)
train_min=minmax_train.min(axis=0)
test_max=minmax_test.max(axis=0)
test_min=minmax_test.min(axis=0)
print train_max,train_min,test_max,test_min
'''
#矩阵重新变为数据框
df_final=pd.DataFrame(minmax_test)
#将数据框存储为csv格式的文件    
df_final.to_csv(output_file,header=None,index=False)

2.解释说明

训练集输入时,程序会按列保存最大值与最小值,只需要sklearn.preprocessing.MinMaxScaler()这个方法,生成一个对象,把它命名为min_max_scaler,这个对象可以提供fit_transform()方法,传入参数为训练集矩阵matrix_train2,这样,这个min_max_scaler对象就可以保存训练集的最大值和最小值,继续使用min_max_scalertransform()方法,传入matrix_test测试集矩阵,这里要求测试集是裸矩阵,不含header的。这样就可以不用自己保存最大值和最小值矩阵,不用自定义归一化方法了。
这步以后,得到的归一化后的测试集矩阵,即使会有大于1或者小于的元素,但是绝大部分都会在(0,1)内,这样就不会再出现全部的正样本或者负样本的预测结果了。