利用TFRecord和HDFS準備TensorFlow訓練資料

來源:互聯網
上載者:User

摘要: 本文將介紹如何將資料轉化為TFRecord格式,並且將生成TFRecord檔案儲存到HDFS中, 這裡我們直接使用的是阿裡雲EMR(E-MapReduce)的HDFS服務。

本系列將利用阿裡雲容器服務的機器學習服務解決方案,說明您瞭解和掌握TensorFlow,MXNet等深度學習庫,開啟您的深度學習之旅。

tensorflow-hdfs.jpg

資料準備和預先處理是一個深度學習訓練程序中扮演著非常重要的角色,它影響著型號訓練的速度和品質。

而TensorFlow對於HDFS的支援,將巨量資料與深度學習相整合,完善了從資料準備到型號訓練的完整鏈條。在阿裡雲容器服務深度學習解決方案中,為TensoFlow提供了OSS,NAS和HDFS三種分散式隱藏後端的支援。

本文將介紹如何將資料轉化為TFRecord格式,並且將生成TFRecord檔案儲存到HDFS中, 這裡我們直接使用的是阿裡雲EMR(E-MapReduce)的HDFS服務。

建立EMR集群

阿裡雲Elastic MapReduce(E-MapReduce) 是執行在阿裡雲平臺上的一種巨量資料處理的系統解決方案。可以通過存取EMR介紹瞭解其中細節。

具體EMR集群建立程序,可以參考文件,建立程序中,請選擇VPC下的EMR,請留意EMR對應的安全性群組名。

建立容器集群,並且打通兩個集群間的網路。

同一個VPC建立GPU容器集群後,登入到EMR集群對應的安全性群組,點選管理實例將容器集群的節點新增進來。

為什麼要使用TFRecord

TFRecord是TensorFlow內定的統一標準資料格式,可以支援多執行緒資料讀取,並且可以通過batchsize和epoch參數來控制訓練時單次batch的大小和樣本檔案迭次數,同時能更好的利用記憶體和方便資料的複製和移動,所以是利用TensorFlow進行大規模深度學習訓練的首選。

TFRecord生成程式樣本

這段縮減的代碼將MNIST資料集中所有的訓練資料存放區到一個TFRecord檔案中,並且儲存到EMR的HDFS中:hdfs://192.168.100.206:9000/mnist/output.tfrecords,192.168.100.206是EMR的Master IP位址,9000是HDFSNameNode的埠。完整代碼的位址是https://github.com/cheyang/mnist-examples/blob/master/convert_to_records.py

#定義函數轉化變數類型。
def _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]))

#讀取mnist資料。
mnist = input_data.read_data_sets("./MNIST_data",dtype=tf.uint8, one_hot=True)
images = mnist.train.images
labels = mnist.train.labels
pixels = images.shape[1]
num_examples = mnist.train.num_examples

#儲存TFRecord到HDFS。
filename = "hdfs://192.168.100.206:9000/mnist/output.tfrecords"
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={
'pixels': _int64_feature(pixels),
'label': _int64_feature(np.argmax(labels[index])),
'image_raw': _bytes_feature(image_raw)
}))
writer.write(example.SerializeToString())
writer.close()

注意:TensoFlow雖然支援HDFS,但是需要額外的設定,否則直接叫用會報Environmentvariable HADOOP_HDFS_HOME not set。如果在容器服務的深度學習解決方案中,您就無需為此勞心。

生成TFRecord資料

可以利用型號訓練服務提供執行環境執行convert_to_records.py,生成TFRecord資料,儲存到HDFS中

這樣,就可以看到一個表單。首先通過下拉清單選擇剛才建立的集群名稱,點選訓練架構,這時可以看到一系列深度學習架構的清單,其中包括TensorFlow, Keras和MXNet的不同組建,還可以指定python2和python3的組建,這裡選擇tensorflow:1.0.0,並且設定其他選項,點選確定

以下為具體設定:

·訓練架構:tensorflow:1.0.0

·GPU數量: 0

·資料卷名:不使用資料卷

·Git位址:https://code.aliyun.com/deeplearning/mnist-examples.git

·執行指令:python convert_to_records.py --directoryhdfs://192.168.100.206:9000/mnist-tfrecord

執行成功後,可以查看執行的日誌,顯示TFRecord檔案已經儲存到了HDFS

登入到EMR機器上查看產生的TFRecord檔案

# hdfs dfs -ls /mnist-tfrecord
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/tez-0.8.4/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Found 3 items
-rw-r--r--3 root hadoop8910000 2017-05-23 19:34 /mnist-tfrecord/test.tfrecords
-rw-r--r--3 root hadoop49005000 2017-05-23 19:33 /mnist-tfrecord/train.tfrecords
-rw-r--r--3 root hadoop4455000 2017-05-23 19:33 /mnist-tfrecord/validation.tfrecords

總結

資料準備是深度學習中非常重要的一環,而TensorFlow通過與Hadoop/Spark生態的整合,打通了巨量資料和深度學習之間關聯。在阿裡雲的深度學習解決方案裡,你能夠很方便的使用OSS,NAS和HDFS等分散式隱藏儲存和管理資料和型號。我們將在下一篇本文中向您介紹如何利用阿裡雲容器服務的深度學習解決方案在HDFS中負載TFRecord進行型號訓練並儲存Checkpoint以及型號。

歡迎掃碼上線釘釘群一起討論:

code_1.jpg

相關產品:

  1. 容器服務(Docker)
  2. 高效能運算HPC
  3. E-MapReduce
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.