大數據下基於Tensorflow框架的深度學習示例教程

2021-03-02 CSDN

近幾年,資訊時代的快速發展產生了海量數據,誕生了無數前沿的大數據技術與應用。在當今大數據時代的產業界,商業決策日益基於數據的分析作出。當數據膨脹到一定規模時,基於機器學習對海量複雜數據的分析更能產生較好的價值,而深度學習在大數據場景下更能揭示數據內部的邏輯關係。本文就以大數據作為場景,通過自底向上的教程詳述在大數據架構體系中如何應用深度學習這一技術。大數據架構中採用的是hadoop系統以及Kerberos安全認證,深度學習採用的是分布式的Tensorflow架構,hadoop解決了大數據的存儲問題,而分布式Tensorflow解決了大數據訓練的問題。本教程是我們團隊在開發基於深度學習的實時欺詐預警服務時,部署深度學習這一模塊時總結出的經驗,感興趣的歡迎深入交流。

安裝Tensorflow

我們安裝Tensorflow選擇的是Centos7,因為Tensorflow需要使用GNU發布的1.5版本的libc庫,Centos6系統並不適用該版本庫而被拋棄。對於如何聯網在線安裝Tensorflow,官網有比較詳盡的教程。本教程著重講一下網上資料較少的離線安裝方式,系統的安裝更需要在意的是各軟體版本的一致性,下面教程也是解決了很多版本不一致的問題後給出的一個方案。首先我們先將整個系統搭建起來吧。

1. 安裝程式語言Python3.5:在官網下載軟體並解壓後執行如下安裝命令:

./configure make make testsudo 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/serverexport 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 mnistSOURCE_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 tfflags = 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")flags.DEFINE_string("ps_hosts", "",                    "Comma-separated list of hostname:port pairs")flags.DEFINE_string("worker_hosts", "",                    "Comma-separated list of hostname:port pairs")flags.DEFINE_string("data_dir", None,                    "Directory where the mnist data is stored")flags.DEFINE_string("train_dir", None,                    "Directory for storing the checkpoints")flags.DEFINE_integer("hidden1", 128,                     "Number of units in the 1st hidden layer of the NN")flags.DEFINE_integer("hidden2", 128,                     "Number of units in the 2nd hidden layer of the NN")flags.DEFINE_integer("batch_size", 100, "Training batch size")flags.DEFINE_float("learning_rate", 0.01, "Learning rate")FLAGS = flags.FLAGSTRAIN_FILE = "train.tfrecords"NUM_CLASSES = 10IMAGE_SIZE = 28IMAGE_PIXELS = IMAGE_SIZE * IMAGE_SIZEdef inference(images, hidden1_units, hidden2_units):  with tf.name_scope('hidden1'):    weights = tf.Variable(        tf.truncated_normal([IMAGE_PIXELS, hidden1_units],                            stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),name='weights')    biases = tf.Variable(tf.zeros([hidden1_units]),name='biases')    hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)  with tf.name_scope('hidden2'):    weights = tf.Variable(        tf.truncated_normal([hidden1_units, hidden2_units],                            stddev=1.0 / math.sqrt(float(hidden1_units))),        name='weights')    biases = tf.Variable(tf.zeros([hidden2_units]),                         name='biases')    hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)  with tf.name_scope('softmax_linear'):    weights = tf.Variable(        tf.truncated_normal([hidden2_units, NUM_CLASSES],                            stddev=1.0 / math.sqrt(float(hidden2_units))),name='weights')    biases = tf.Variable(tf.zeros([NUM_CLASSES]),name='biases')    logits = tf.matmul(hidden2, weights) + biases  return logitsdef lossFunction(logits, labels):  labels = tf.to_int64(labels)  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(      logits, labels, name='xentropy')  loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')  return lossdef training(loss, learning_rate):  tf.summary.scalar(loss.op.name, loss)  optimizer = tf.train.GradientDescentOptimizer(learning_rate)  global_step = tf.Variable(0, name='global_step', trainable=False)  train_op = optimizer.minimize(loss, global_step=global_step)  return train_opdef read_and_decode(filename_queue):  reader = tf.TFRecordReader()  _, serialized_example = reader.read(filename_queue)  features = tf.parse_single_example(      serialized_example,            features={          'image_raw': tf.FixedLenFeature([], tf.string),          'label': tf.FixedLenFeature([], tf.int64),      })        image = tf.decode_raw(features['image_raw'], tf.uint8)  image.set_shape([IMAGE_PIXELS])  image = tf.cast(image, tf.float32) * (1. / 255) - 0.5    label = tf.cast(features['label'], tf.int32)  return image, labeldef inputs(batch_size):  """Reads input data.  Args:    batch_size: Number of examples per returned batch.  Returns:    A tuple (images, labels), where:    * images is a float tensor with shape [batch_size, mnist.IMAGE_PIXELS]      in the range [-0.5, 0.5].    * labels is an int32 tensor with shape [batch_size] with the true label,      a number in the range [0, mnist.NUM_CLASSES).  """  filename = os.path.join(FLAGS.data_dir, TRAIN_FILE)  with tf.name_scope('input'):    filename_queue = tf.train.string_input_producer([filename])            image, label = read_and_decode(filename_queue)                images, sparse_labels = tf.train.shuffle_batch(        [image, label], batch_size=batch_size, num_threads=2,        capacity=1000 + 3 * batch_size,                min_after_dequeue=1000)    return images, sparse_labelsdef device_and_target():      if FLAGS.job_name is None:    raise ValueError("Must specify an explicit `job_name`")    print("Running distributed training")  if FLAGS.task_index is None or FLAGS.task_index == "":    raise ValueError("Must specify an explicit `task_index`")  if FLAGS.ps_hosts is None or FLAGS.ps_hosts == "":    raise ValueError("Must specify an explicit `ps_hosts`")  if FLAGS.worker_hosts is None or FLAGS.worker_hosts == "":    raise ValueError("Must specify an explicit `worker_hosts`")  cluster_spec = tf.train.ClusterSpec({      "ps": FLAGS.ps_hosts.split(","),      "worker": FLAGS.worker_hosts.split(","),  })  server = tf.train.Server(      cluster_spec, job_name=FLAGS.job_name, task_index=FLAGS.task_index)  return (      cluster_spec,      server,  )def main(unused_argv):  if FLAGS.data_dir is None or FLAGS.data_dir == "":    raise ValueError("Must specify an explicit `data_dir`")  if FLAGS.train_dir is None or FLAGS.train_dir == "":    raise ValueError("Must specify an explicit `train_dir`")  cluster_spec, server = device_and_target()  if FLAGS.job_name == "ps":      server.join()  elif FLAGS.job_name == "worker":      with tf.device(tf.train.replica_device_setter(worker_device = "/job:worker/task:{}".format(FLAGS.task_index), cluster=cluster_spec)):        images, labels = inputs(FLAGS.batch_size)        logits = inference(images, FLAGS.hidden1, FLAGS.hidden2)        loss = lossFunction(logits, labels)        train_op = training(loss, FLAGS.learning_rate)      with tf.train.MonitoredTrainingSession(          master=server.target,          is_chief=(FLAGS.task_index == 0),          checkpoint_dir=FLAGS.train_dir) as sess:        while not sess.should_stop():          sess.run(train_op)if __name__ == "__main__":  tf.app.run()

四、分布式模型的啟動

首先關閉防火牆

sudo iptable –F

然後在不同的機器上面啟動服務

. -- . --... --...,... -- -- -- --. -- . --... --...,... -- -- -- --. -- .--... --...,... -- -- -- --. --

五、模型監控

我們在剛剛的41機器上面啟動了TensorBoard,可以通過地址http://10.142.78.41:6006/進行模型的監控。模型訓練過程中參數可以動態的進行觀測,示例如下:


模型的網絡結構可以詳細的參看每個細節,示例如下:


當我們利用分布式的Tensorflow對大數據進行訓練完成後,可以利用Bazel構建一個靈活高可用的服務–TensorFlow Serving,能夠很方便的將深度學習生產化,解決了模型無法提供服務的弊端。到此為止,本文就將自己項目中的一個基礎模塊的示例介紹完了,本項目更有含金量的是模型建立、工程開發、業務邏輯部分,如有機會再進行更詳細的交流。

作者:丁廷鶴,碩士期間在復旦大學計算機學院上海市智能信息重點實驗室從事數據挖掘學習,目前在上海一家央企總部工作,從事大數據領域spark全棧模塊、機器學習、深度學習方面的開發和研究。

相關焦點

  • MIT深度學習教程:一文看懂CNN、RNN等7種範例(TensorFlow教程)
    解碼器從這些表示中生成高解析度數據。生成的數據可以是新的示例,也可以是描述性知識。其餘的則是一些聰明的方法,可以幫助我們有效地處理視覺信息、語言、音頻 (第 1–6項),甚至可以在一個基於這些信息和偶爾的獎勵的世界中採取行動 (第 7 項)。下面是一個總體的圖示:
  • MIT 深度學習基礎教程:七個基本框架TensorFlow代碼實戰
    【導讀】麻省理工學院發布一系列深度學習視頻課和代碼實戰,今天給大家介紹的是研究科學家Lex Fridman整理的常用的深度學習七個基本框架實戰,
  • 7種架構範例的深度學習,每個範例都提供了TensorFlow教程
    TensorFlow 教程:請參閱我們的深度學習基礎教程的第 1 部分,其中有一個用于波士頓房價預測的 FFNNs 示例,它是一個回歸問題: TensorFlow 教程:請參閱我們的深度學習基礎教程的第 2 部分,了解用於對 MNIST 數據集中的手寫數字進行分類的一個 CNN 示例。
  • 基於TensorFlow的深度學習實戰
    毫不誇張得說,TensorFlow的流行讓深度學習門檻變得越來越低,只要你有Python和機器學習基礎,入門和使用神經網絡模型變得非常簡單。TensorFlow簡介如前所述,TensorFlow是一個深度學習庫,使用這一框架,可以用來構建和測試深度神經網絡。深度學習讓我們能夠以極高的準確性構建複雜的應用程式。
  • 一文看懂CNN、RNN等7種範例(TensorFlow教程)
    ,本文概述了7種架構範例的深度學習,每個範例都提供了TensorFlow教程的連結。TensorFlow 教程:請參閱我們的深度學習基礎教程的第 1 部分,其中有一個用于波士頓房價預測的 FFNNs 示例,它是一個回歸問題:
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    自2015年11月發布以來,谷歌旗下的機器學習開源框架TensorFlow已經在圖像識別,大數據分析,語音識別和語義理解,機器翻譯等各個領域得到了廣泛應用,同時也得到了業內人士的普遍認可,成為了目前最受關注和使用率最高的開源框架之一
  • 深度學習筆記7:Tensorflow入門
    個人公眾號:數據科學家養成記 (微信ID:louwill12)前文傳送門:深度學習筆記1:利用numpy從零搭建一個神經網絡深度學習筆記2:手寫一個單隱層的神經網絡深度學習筆記3:手動搭建深度神經網絡(DNN)深度學習筆記4:深度神經網絡的正則化深度學習筆記5:正則化與dropout
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    當時時間 3 月 30 日,谷歌 TenosrFlow 開發者峰會 2018 在美國加州石景山開幕,來自全球的機器學習用戶圍繞 TensorFlow 展開技術演講與演示。去年的 TensorFlow 開發者大會上,該框架正式升級到了 1.0 版本,逐漸成為最流行的深度學習框架。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    選自builtin作者:Vihar Kurama機器之心編譯參與:吳攀、杜偉谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。邊緣計算(Edge computing)是一種在物理上靠近數據生成的位置從而對數據進行處理和分析的方法,為解決這些問題提供了方案。
  • Python安裝TensorFlow 2、tf.keras和深度學習模型的定義
    p=15826 深度學習的預測建模是現代開發人員需要了解的一項技能。TensorFlow是Google開發和維護的首要的開源深度學習框架。儘管直接使用TensorFlow可能具有挑戰性,但現代的tf.keras API使得Keras在TensorFlow項目中的使用簡單易用。使用tf.keras,您可以設計,擬合,評估和使用深度學習模型,從而僅用幾行代碼即可做出預測。
  • 從TensorFlow到Theano:橫向對比七大深度學習框架
    最近,來自數據科學公司 Silicon Valley Data Science 的數據工程師 Matt Rubashkin(UC Berkeley 博士)為我們帶來了深度學習 7 種流行框架的深度橫向對比,希望本文能對你帶來幫助。在 SVDS,我們的研發團隊一直在研究不同的深度學習技術;從識別圖像到語音,我們也在各類框架下實現了不少應用。
  • 從框架優缺點說起,這是一份TensorFlow入門極簡教程
    隨著 TensorFLow 在研究及產品中的應用日益廣泛,很多開發者及研究者都希望能深入學習這一深度學習框架。而在昨天機器之心發起的框架投票中,2144 位參與者中有 1441 位都在使用 TensorFlow 框架,是所有框架中使用率最高的。但 TensorFLow 這種靜態計算圖有一定的學習成本,因此也阻擋了很多初學者入坑。
  • TensorTrade:基於深度強化學習的Python交易框架
    網際網路上有很多關於強化學習交易系統零零碎碎的東西,但是沒有一個是可靠和完整的。出於這個原因,我們決定創建一個開源的Python框架,使用深度強化學習,有效地將任何交易策略從想法轉化為實際應用。Tensortrade 是一個開源的 Python 框架,用於使用深度強化學習進行訓練、評估和部署穩健的交易策略。
  • 最熱門的深度學習框架TensorFlow入門必備書籍
    但進入機器學習和人工智慧領域並不是一件簡單的事情,目前市場上有許多大量的學習資源,許多開發者和想要進入的愛好者往往很難找到適合自己的發展路徑。其實,早在 2015 年底,谷歌就開源了內部使用的深度學習框架 TensorFlow 。眾多研究表明,Tensorflow 是研究深度學習的首選平臺。
  • TFLearn:為TensorFlow提供更高級別的API 的深度學習庫
    TFlearn是一個基於Tensorflow構建的模塊化透明深度學習庫。它旨在為TensorFlow提供更高級別的API,以促進和加速實驗,同時保持完全透明並與之兼容。TFLearn功能包括:通過教程和示例,易於使用和理解用於實現深度神經網絡的高級API。
  • 可能是史上最全的Tensorflow學習資源匯總
    一 、Tensorflow教程資源:1)適合初學者的Tensorflow教程和代碼示例:https://github.com/aymericdamien/TensorFlow-Examples該教程不光提供了一些經典的數據集,更是從實現最簡單的「Hello World」開始,到機器學習的經典算法,再到神經網絡的常用模型
  • 掌握深度學習,為什麼要用 PyTorch、TensorFlow 框架?
    畢竟,許多數據集可以用解析方法或簡單的統計過程進行建模。另一方面,在某些情況下,深度學習或深度遷移學習可以幫助你訓練更準確的模型。在這些情況下,你可以考慮使用PyTorch和TensorFlow,特別是如果你所需的訓練模型與其中一個框架模型庫中的模型類似。PyTorchPyTorch建立在舊版的Torch和Caffe2框架之上。
  • 基於TensorFlow2.0的中文深度學習開源書來了!GitHub趨勢日榜第一
    因為這是一本基於TensorFlow 2.0 正式版的中文深度學習開源書。還包含電子書和配套原始碼。話不多說,一起來看看這本爆款書籍吧!」和目錄排版來看,似乎有一絲致敬臺大李宏毅老師的感覺。pip install tensorflow-gpu -U測試安裝In [2]: import tensorflow as tfIn [3]: tf.
  • TensorFlow圖像分類教程
    兩年前,Google大腦團隊開發了TensorFlow,並將深度學習巧妙的應用於各個領域。現在,TensorFlow則超越了很多用於深度學習的複雜工具。利用TensorFlow,你可以獲得具有強大能力的複雜功能,其強大的基石來自於TensorFlow的易用性。在這個由兩部分組成的系列中,我將講述如何快速的創建一個應用於圖像識別的卷積神經網絡。