星期四, 三月 12, 2015

树莓派折腾第一季:建立私人NAS

1、实验条件:

- 树莓派B+
- micro SD卡
- 读卡器
- 无线网卡
- 5V2A电源
- 移动硬盘
- USB hub
- HDMI转VGA
- 显示器
- 键盘
- 鼠标
- Mac book air

2、实验步骤:

- 烧录系统到SD上。
参考官网步骤,但注意读卡器有时会出问题,选择高质量的设备。
- 启动设置Raspbian系统(raspi-config)
设置各种参数,例如ssh enable之类的,方面后面远程登陆。
注意:把locale设置好,否则后面你还得用dpkg-reconfigure locales
- 配置以修正显示的问题
参考地址:http://www.chengxuyuans.com/Windows/61812.html
注意:多次尝试以适合自己的显示器
- 配置无线网卡
参考地址:http://rpi.linux48.com/rpi-wlan.html
http://blog.appdevp.com/archives/188
注意:要买正确的网卡,再设置一下静态网址。
- 进X看是否可以上网了,再试一下ssh, scp之类的。
- 安装samba
参考地址:http://xwlogic.github.io/2014/08/NAS/
注意:先要更新软件源;挂载移动硬盘的时候得有电;设置samba很多参数,得保证可写。
- 设置挂载方式
参考地址:http://blog.sciencenet.cn/blog-430991-692444.html
注意:如果移动硬盘的格式不是linux,而是exfat之类这种,分享出来的没有写权限,用chomd也不能修改,此时需要特别在fstab中设置挂载细节。
- 其它平台登陆服务器
这样就可以在mac book中的finder里登陆这个服务器 smb://192.168.1.10
也可以在安卓手机上使用软件来登陆这个服务器。安卓上好用的软件是ES文件浏览器
- 增加下载工具
  还需要在树莓派上安装一个下载工具,使之变成一个自动下载器。
  参考地址:http://www.linuxidc.com/Linux/2014-02/96269.htm
  注意: 安装aria2还是很方便的,配合百度网盘转aria2的chrom插件更是如虎添翼。

3、实验小结

- 一开始的设备一定要全,后面可以不需要键盘鼠标,只用ssh了。
- X窗口不是很顺滑,机器在终端玩比较好。
- Raspcherry pi cookbook这本书不错。
- 机器自带mathematica这种逆天神器,再配合linux/python。教小孩数学、计算机的确不错。

星期日, 二月 08, 2015

在ipython notebook上运行spark

周末无事,看到了这篇文章。于是照猫画虎尝试了一番,顺便把官网上的文档看了一些。记录以下以备忘。(目前只尝试了spark在单机上的运行)

安装spark
只需要去官网下载预编译好的最新版本即可,然后回来解压
tar -xzf spark-1.2.0-bin-hadoop2.4.tgz
放到自己选定的目录中,加一个软链接
ln -s /srv/spark-1.2.0 /srv/spark
然后设置环境变量,~/.bash_profile or ~/.profile
export SPARK_HOME=/srv/spark
export PATH=$SPARK_HOME/bin:$PATH

之后在终端上运行pyspark应该可以看到欢迎画面了。

设置notebook
为了在ipython notebook中运行spark需要设置一个启动文件。先设置一个profile
ipython profile create spark
在路径下加一个py文件 $HOME/.ipython/profile_spark/startup/00-pyspark-setup.py

文件中放如下内容,注意和自己的目录有关。
import os
import sys
# Configure the environment
if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = '/srv/spark'
# Create a variable for our root path
SPARK_HOME = os.environ['SPARK_HOME']
# Add the PySpark/py4j to the Python Path
sys.path.insert(0, os.path.join(SPARK_HOME, "python", "build"))
sys.path.insert(0, os.path.join(SPARK_HOME, "python"))

之后在启动notebook时要加一个profile参数
ipython notebook --profile spark

hello world
在notebook中尝试了spark的hello world任务,即word count。
from pyspark import  SparkContext
sc = SparkContext( 'local[4]')
lines = sc.textFile("some.txt")
words = lines.flatMap(lambda line: line.split())
pairs = words.map(lambda s: (s, 1))
counts = pairs.reduceByKey(lambda a, b: a + b)
result = counts.collect()
#counts.saveAsTextFile("wc")

后面有空再去研究如何用spark做数据分析和机器学习。

星期日, 二月 01, 2015

python数据挖掘模型的API部署

前文谈到了如何把一个R语言的挖掘模型进行在线部署,也就是生成一个API。本文则是同样的思路,只不过是来尝试将python的数据挖掘模型部署成一个API。由于python是通用型的编程语言,部署起来方便一些。下面的例子仍是一个简单的模型,用来预测iris种类。在mac系统中完成,使用了python的几个包:

flask 一个轻量级的web框架
flask.ext.restful 快速生成restful api
numpy 数值计算包
pickle 用来保存模型
sklearn 用来建模

只需要四个步骤:

步骤1:建立模型
步骤2:模型写入pickle文件
步骤3:构建一个基于flask的API
步骤4:通过API调用模型

第一步是用sklearn建模。

from sklearn.tree import DecisionTreeClassifier
import pandas as pd
from pickle import dump
df = pd.read_csv('iris.csv')
X = df.ix[:,:4].values
y = df.ix[:,4].values
model = DecisionTreeClassifier()
model.fit(X,y)

第二步是将模型写入到pickle文件中

dump(model, open('model.pickle','wb'))

第三步是构建一个API,写一个server.py文件

from flask import Flask, request
from flask.ext.restful import Resource, Api
import numpy as np
from pickle import load
from sklearn.tree import DecisionTreeClassifier

app = Flask(__name__)
api = Api(app)
model = load(open('model.pickle','rb'))

class TodoSimple(Resource):
    def put(self, todo_id):
        newx = eval(request.form['data'])
        newx = np.array(newx)
        res = model.predict(newx)
        return res.tolist()

api.add_resource(TodoSimple, '/')

if __name__ == '__main__':
    app.run(debug=True)

保存好py文件后启用它。
python server.py

API会在如下地址监听
Running on http://127.0.0.1:5000/

第四步是调用这个API。另开一个终端,输入
curl http://localhost:5000/todo1 -d "data=[4.9,3.,1.4,0.2]" -X PUT

成功返回
[
    "setosa"
]
也可以在python中实验。
from request import put
put('http://localhost:5000/m1', data={'data': '[ 4.9, 3. , 1.4, 0.2]'}).json()

星期六, 一月 31, 2015

基于opencpu构建R语言的RESTful API

一个R语言模型的落地应用有几种方式:可能是一个简单的分析报告,可能是将预测结果输出到数据库,即离线模型,也可能需要实时读入数据进行实时预测输出。第三种情况是最有用,也最难处理的情况。因为要把R和其它通用型语言进行整合并不容易。例如使用Rserve在java中整合R代码就需要开发人员即懂java也懂R,开发量会比较高。一种比较好的思路是将R计算部分作为一个API,其它语言时通过API来调用R的部分。

下面的例子就是一个很简单的预测iris种类。在mac系统中,基于opencpu框架完成,opencpu能将R语言的对象转为http的资源,极大的方便了R语言模型的部署。一共只需要四个步骤。

步骤1:建立模型
步骤2:模型写入R包
步骤3:将R包安装到opencpu服务器上
步骤4:通过API远程调用模型

第一步是R语言建模。
library(rpart)
m = rpart(Species~., data = iris)
save(m, file='model.rda')
模型保存为一个rda文件在硬盘上。

第二步是写一个R包,如今用rstudio写一个R包是非常简单的事了,建立好一个新项目test之后,在R代码中写入预测函数如下。
library(rpart)
predfunc = function(input){
  input = as.data.frame(input)
  result = predict.rpart(m,newdata = input,type='class')
  as.character(result)
}
可以在R里面验证一下函数是否正常。
newx = data.frame(Sepal.Length=5.1,
                  Sepal.Width=3.5,
                  Petal.Length=1.4,
                  Petal.Width=0.2)
predfunc(newx)
然后新建一个data目录,将rda文件放入目录中,build&reload去建立这个名为test的R包。

第三步是安装R包到opencpu服务器上,我事先在本机上安装了opencpu,只需要像安装普通R包一样安装即可。
install.packages(opencpu)
这样在第二步reload时就直接安装好了test的R包。

第四步是实验API调用是否成功。在终端里进R,调用opencpu,即library(opencpu)会自动启动服务,并显示
[httpuv] http://localhost:4678/ocpu
OpenCPU single-user server ready.

调用模型时,用curl实验即可。另开一个终端,输入
curl http://localhost:4678/ocpu/library/test/R/predfunc/json -H "Content-Type: application/json" -d '{"input" :[ {"Sepal.Length":1.1, "Sepal.Width" : 2.5, "Petal.Length":0.4, "Petal.Width":0.9}]}'

成功返回
[
    "setosa"
]

如果需要把这个模型提供给远程调用,需要安装服务器版本的opencpu。具体参见https://www.opencpu.org/posts/scoring-engine/