利用TFRecord和HDFS準備TensorFlow訓練數據
本係列將利用阿裏雲容器服務的機器學習解決方案,幫助您了解和掌握TensorFlow,MXNet等深度學習庫,開啟您的深度學習之旅。
- 第一篇: 打造深度學習的雲端實驗室
- 第二篇: GPU資源的監控和報警,支撐高效深度學習的利器
- 第三篇: 利用TFRecord和HDFS準備TensorFlow訓練數據
數據準備和預處理是一個深度學習訓練過程中扮演著非常重要的角色,它影響著模型訓練的速度和質量。
而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內定的統一標準數據格式,可以支持多線程數據讀取,並且可以通過batch size和epoch參數來控製訓練時單次batch的大小和樣本文件迭次數,同時能更好的利用內存和方便數據的複製和移動,所以是利用TensorFlow進行大規模深度學習訓練的首選。
TFRecord生成程序示例
這段縮減的代碼將MNIST數據集中所有的訓練數據存儲到一個TFRecord文件中,並且保存到EMR的HDFS中:hdfs://192.168.100.206:9000/mnist/output.tfrecords
, 完整代碼的地址是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,但是需要額外的配置,否則直接調用會報
Environment variable 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 --directory hdfs://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 https://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 hadoop 8910000 2017-05-23 19:34 /mnist-tfrecord/test.tfrecords
-rw-r--r-- 3 root hadoop 49005000 2017-05-23 19:33 /mnist-tfrecord/train.tfrecords
-rw-r--r-- 3 root hadoop 4455000 2017-05-23 19:33 /mnist-tfrecord/validation.tfrecords
總結
數據準備是深度學習中非常重要的一環,而TensorFlow通過與Hadoop/Spark生態的集成,打通了大數據和深度學習之間關聯。在阿裏雲的深度學習解決方案裏,你能夠很方便的使用OSS,NAS和HDFS等分布式存儲保存數據,checkpoint和模型。我們將在下一篇文章中向您介紹如何利用阿裏雲容器服務的深度學習解決方案在HDFS中加載TFRecord和保存checkpoint以及模型。
歡迎掃碼加入釘釘群一起討論:
最後更新:2017-05-24 07:01:25