11## 训练数据的存储和分发
22
3+ ### 概念解释
4+
35### 流程介绍
46生产环境中的训练数据集通常体积很大,并被存储在诸如Hadoop HDFS,Ceph,AWS S3之类的分布式存储之上。这些分布式存储服务通常会把数据切割成多个分片分布式的存储在多个节点之上。这样就可以在云端执行多种数据类计算任务,包括:
57
68* 数据预处理任务
79* Paddle训练任务
810* 在线模型预测服务
11+ <div style =" align : center " >
12+ <img src =" src/paddle-cloud-in-data-center.png " width =" 800 " />
13+ </div >
914
10- <img src =" src/paddle-cloud-in-data-center.png " width =" 500 " />
11-
12- 在上图中显示了在一个实际生产环境中的应用(人脸识别)的数据流图。生产环境的日志数据会通过实时流的方式(Kafka)和离线数据的方式(HDFS)存储,并在集群中运行多个分布式数据处理任务,比如流式数据处理(online data process),离线批处理(offline data process)完成数据的预处理,提供给paddle作为训练数据。用于也可以上传labeled data到分布式存储补充训练数据。在paddle之上运行的深度学习训练输出的模型会提供给在线人脸识别的应用使用。
13-
14- ### 训练数据的存储
15+ 在上图中显示了在一个实际生产环境中的应用(人脸识别)的数据流图。生产环境的日志数据会通过实时流的方式(Kafka)和离线数据的方式(HDFS)存储,并在集群中运行多个分布式数据处理任务,比如流式数据处理(online data process),离线批处理(offline data process)完成数据的预处理,提供给paddle作为训练数据。用户也可以上传labeled data到分布式存储补充训练数据。在paddle之上运行的深度学习训练输出的模型会提供给在线人脸识别的应用使用。
1516
16- 选择CephFS作为训练数据的存储服务。
17+ ### 训练数据存储
18+ 我们选择[ CephFS] ( http://docs.ceph.com/docs/master/cephfs/ ) 作为存储系统。
1719
18- 在Kubernetes上运行的不同的计算框架,可以通过Volume或PersistentVolume挂载存储空间到每个容器中。
20+ - 无论是从[ PFSClient] ( ../file_manager/README.md ) 的角度,还是从[ Pod] ( https://kubernetes.io/docs/concepts/workloads/pods/pod/ ) 中运行任务的角度,统一用` /pfs/$DATACENTER/home/$USER ` 来访问用户自己的数据。
21+ - ` /pfs/$DATACENTER/common ` 下存放公共数据集合
22+ - 做只读挂载
1923
20- 在CephFS存储系统中的公开目录,需要保存一些预置的公开数据集(比如MNIST, BOW, ImageNet数据集等),并且可以被提交的job直接使用。
24+ <div style =" align : center " >
25+ <img src =" src/file_storage.png " width =" 700 " align =center/ >
26+ </div >
2127
2228### 文件预处理
2329
24- 在数据集可以被训练之前,文件需要预先被转换成PaddlePaddle集群内部的存储格式(RecordIO)。我们提供两个转换方式:
30+
31+ 在开始训练之前, 数据集需要预先被转换成PaddlePaddle分布式训练使用的存储格[ RecordIO] ( https://github.com/PaddlePaddle/Paddle/issues/1947 ) 。我们提供两个转换方式:
2532
26331 . 用户在本地转换好再上传
27341 . 用户上传数据后,在机群上运行转换程序
@@ -92,11 +99,12 @@ random_images-00099-of-00099
9299
93100#### 进行训练
94101
95- PaddlePaddle提供专用的[ data reader creator] ( https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/reader/README.md#python-data-reader-design-doc ) ,生成给定RecordIO文件对应的data reader。** 无论在本地还是在云端,reader的使用方式都是一致的** :
102+
103+ PaddlePaddle提供专用的[ data reader creator] ( https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/reader/README.md#python-data-reader-design-doc ) ,生成给定` RecordIO ` 文件对应的data reader。** 无论在本地还是在云端,reader的使用方式都是一致的** :
96104
97105``` python
98106# ...
99- reader = paddle.reader.creator.RecordIO(" /home/random_images-*-of-*" )
107+ reader = paddle.reader.creator.RecordIO(" /pfs/datacenter_name/ home/user_name /random_images-*-of-*" )
100108batch_reader = paddle.batch(paddle.dataset.mnist.train(), 128 )
101109trainer.train(batch_reader, ... )
102110```
@@ -107,14 +115,46 @@ trainer.train(batch_reader, ...)
107115
108116使用下面命令,可以把本地的数据上传到存储集群中。
109117
110- ``` bash
111- paddle cp filenames pfs:/ /home/folder/
118+ ``` bash
119+ paddle pfs cp filename / pfs/ $DATACENTER /home/ $USER /folder/
112120```
113121
114122比如,把之前示例中转换完毕的random_images数据集上传到云端的` /home/ ` 可以用以下指令:
115- ``` bash
116- paddle cp random_images-* -of-* pfs://home/
123+
124+ ``` bash
125+ paddle pfs cp random_images-* -of-* /pfs/$DATACENTER /home/$USER /folder/
126+ ```
127+
128+ 需要` $DATACENTER ` 的配置写到配置文件中,例如
129+
130+ ```
131+ # config file
132+ [datacenter_1]
133+ username=user
134+ usercert=user.pem
135+ userkey=user-key.pem
136+ endpoint=datacenter1.paddlepaddle.org
137+
138+ [datacenter_2]
139+ username=user
140+ usercert=user.pem
141+ userkey=user-key.pem
142+ endpoint=datacenter2.paddlepaddle.org
117143```
118144## TODO
145+ ### 文件访问的权限
146+ 控制用户权限
147+
148+ - 用户可以把自己的数据分享给别人
149+
150+ ### 文件访问方式
151+ 不用mount的方式来访问数据,而是直接用API的接口远程访问
152+
153+ 例如:
154+
155+ ```
156+ f = open('/pfs/datacenter_name/home/user_name/test1.dat')
157+ ```
158+
119159
120160### 支持用户自定义的数据预处理job
0 commit comments