近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用。在当今大数据时代的产业界,商业决策日益基于数据的分析作出。当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较好的价值,而深度学习在大数据场景下更能揭示数据内部的逻辑关系。本文就以大数据作为场景,通过自底向上的教程详述在大数据架构体系中如何应用深度学习这一技术。大数据架构中采用的是hadoop系统以及Kerberos安全认证,深度学习采用的是分布式的Tensorflow架构,hadoop解决了大数据的存储问题,而分布式Tensorflow解决了大数据训练的问题。本教程是我们团队在开发基于深度学习的实时欺诈预警服务时,部署深度学习这一模块时总结出的经验,感兴趣的欢迎深入交流。
安装Tensorflow
我们安装Tensorflow选择的是Centos7,因为Tensorflow需要使用GNU发布的1.5版本的libc库,Centos6系统并不适用该版本库而被抛弃。对于如何联网在线安装Tensorflow,
官网
有比较详尽的教程。本教程着重讲一下网上资料较少的离线安装方式,系统的安装更需要在意的是各软件版本的一致性,下面教程也是解决了很多版本不一致的问题后给出的一个方案。首先我们先将整个系统搭建起来吧。
1. 安装编程语言Python3.5:在
官网
下载软件并解压后执行如下安装命令:
./configure make
make test
sudo make install
2. 安装基于Python的科学计算包python-numpy:在
官网
下载软件并解压后执行如下安装命令:
python setup.py install
3. 安装Python模块管理的工具wheel:在
官网
下载软件后执行如下安装命令:
pip install wheel-0.30.0a0-py2.py3-none-any.whl
4. 安装自动下载、构建、安装和管理 python 模块的工具setuptools:在
官网
下载软件并解压后执行如下安装命令:
python setup.py install
5. 安装Python开发包python-devel:在
官网
下载软件后执行如下安装命令:
sudo rpm -i --nodeps python3-devel-3.5.2-4.fc25.x86_64.rpm
6. 安装Python包安装管理工具six:在
官网
下载软件后执行如下安装命令:
sudo pip install six-1.10.0-py2.py3-none-any.whl
7. 安装Java 开发环境JDK8:在
官网
下载软件并解压后执行如下移动命令:
mv java1.8 /usr/local/software/jdk
设置JDK的环境变量,编辑文件 .bashrc,加入下面内容
export JAVA_HOME=/usr/local/software/jdkexport JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=$CLASSPATH:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=$PATH:${JAVA_HOME}/bin
进行Java版本的切换,选择对应的版本
sudo update-alternatives --config javasudo update-alternatives --config javac
8. 安装Bazel:Bazel是一个类似于Make的工具,是Google为其内部软件开发的特点量身定制的工具,构建Tensorflow项目。在
官网
下载后执行如下安装命令:
chmod +x bazel-0.4.3-installer-linux-x86_64.sh./bazel-0.4.3-installer-linux-x86_64.sh –user
9. 安装Tensorflow:在
官网
下载软件后执行如下安装命令:
pip install --upgrade tensorflow-0.12.1-cp35-cp35m
-linux_x86_64.whl
Tensorflow访问HDFS的部署
1. 首先安装Hadoop客户端,在
官网
下载后执行下面解压移动命令:
tar zxvf hadoop-2.6.0.tar.gzmv hadoop-2.6.0.tar.gz /usr/local/software/Hadoop
进行环境变量的配置/etc/profile,加入如下内容
export PATH=$PATH:/usr/local/software/hadoop/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server
export HADOOP_HOME=/usr/local/software/hadoopexport HADOOP_HDFS_HOME=/usr/local/software/hadoop
配置完后进行配置更新source /etc/profile
2. 其次,安装完客户端后,配置自己的hadoop集群环境文件。
Tensorflow与Kerberos验证的部署
在Tesorflow0.12版本中已经支持了Kerberos验证,本机只要配置好Kerberos文件即可使用。该文中不详述Kerberos的配置内容,罗列一下相关的配置流程。
-
首先在/etc/krb5.conf文件中进行服务器跟验证策略的配置;
-
然后在Kerberos服务端生成一个用户文件传至本机;
-
最后进行Kerberos客户端的权限认证并设置定时任务。
大数据场景下基于分布式Tensorflow的深度学习示例
一、进行数据格式的转换
本文的示例是做的MNIST数据的识别模型,为了更好的读取数据更好的利用内存,我们将本地GZ文件转换成Tensorflow的内定标准格式TFRecord,然后再将转换后的文件上传到HDFS存储。在实际应用中,我们实际利用Spark做了大规模格式转换的处理程序。我们对本地数据处理的相应的转换代码为:
from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport argparseimport osimport tensorflow as tffrom tensorflow.contrib.learn.python.learn.datasets import mnist
SOURCE_URL = 'http://yann.lecun.com/exdb/mnist/'TRAIN_IMAGES = 'train-images-idx3-ubyte.gz' TRAIN_LABELS = 'train-labels-idx1-ubyte.gz'TEST_IMAGES = 't10k-images-idx3-ubyte.gz'TEST_LABELS = 't10k-labels-idx1-ubyte.gz'FLAGS = Nonedef _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))def convert_to(data_set, name):
images = data_set.images
labels = data_set.labels
num_examples = data_set.num_examples if images.shape[0] != num_examples: raise ValueError('Images size %d does not match label size %d.' %
(images.shape[0], num_examples))
rows = images.shape[1]
cols = images.shape[2]
depth = images.shape[3]
filename = os.path.join(FLAGS.directory, name + '.tfrecords')
print('Writing', filename)
writer = tf.python_io.TFRecordWriter(filename) for index in range(num_examples):
image_raw = images[index].tostring()
example = tf.train.Example(features=tf.train.Features(feature={ 'height': _int64_feature(rows), 'width': _int64_feature(cols), 'depth': _int64_feature(depth), 'label': _int64_feature(int(labels[index])), 'image_raw': _bytes_feature(image_raw)}))
writer.write(example.SerializeToString())
writer.close()def main(argv):
data_sets = mnist.read_data_sets(FLAGS.directory,
dtype=tf.uint8,
reshape=False,
validation_size=FLAGS.validation_size)
convert_to(data_sets.train, 'train')
convert_to(data_sets.validation, 'validation')
convert_to(data_sets.test, 'test')if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument( '--directory',
type=str,
default='/tmp/data',
help='Directory to download data files and write the converted result'
)
parser.add_argument( '--validation_size',
type=int,
default=5000,
help="""\
Number of examples to separate from the training data for the validation
set.\
"""
)
FLAGS = parser.parse_args()
tf.app.run()
二、Tensorflow读取HDFS数据的设置
文中前面内容介绍了HDFS的配置以及将数据转换后存储到HDFS,Tensorflow读取HDFS时只需要简单的两步,首先执行项目时需要加入环境前缀:
CLASSPATH=$($HADOOP_HDFS_HOME/bin/hadoop classpath --glob) python example.py
其次读取数据时,需要在数据的路径前面加入HDFS前缀,比如:
hdfs://default/user/data/example.txt
三、分布式模型的示例代码
该示例代码是读取HDFS上的MNIST数据,建立相应的server与work集群构建出一个三层的深度网络,包含两层卷积层以及一层SoftMax层。代码如下:
from __future__ import print_functionimport mathimport osimport tensorflow as tf
flags = tf.app.flagsflags.DEFINE_string("job_name", None, "job name: worker or ps")
flags.DEFINE_integer("task_index", 0, "Worker task index, should be >= 0. task_index=0 is "
"the chief worker task the performs the variable "
"initialization"