本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
PAI-TensorFlow支持读取OSS对象存储数据和MaxCompute表数据。
公共云GPU服务器即将过保下线,您可以继续提交CPU版本的TensorFlow任务。如需使用GPU进行模型训练,请前往DLC提交任务,具体操作请参见创建训练任务。
读取OSS数据
主流程 | 描述 |
上传数据至OSS 使用深度学习处理数据时,数据需要先存储到OSS的Bucket中。 |
|
OSS授权 | 当您在PAI中读写OSS Bucket组件时,需要授予AliyunODPSPAIDefaultRole系统默认角色给数加服务账号,详情请参见PAI服务账号授权。 |
RAM授权 RAM授权可以使PAI获得OSS的访问权限 | 获取PAI访问OSS的权限,详情请参见依赖的其他云产品:OSS。 |
TensorFlow读取OSS数据 | 连接组件读OSS数据和TensorFlow。 |
默认角色AliyunODPSPAIDefaultRole包含权限信息如下。
权限名称(Action) | 权限说明 |
oss:PutObject | 上传文件或文件夹对象 |
oss:GetObject | 获取文件或文件夹对象 |
oss:ListObjects | 查询文件列表信息 |
oss:DeleteObjects | 删除对象 |
TensorFlow读取OSS数据的方法:
低效的IO方式
本地执行TensorFlow代码和分布式云端执行TensorFlow的区别:
本地读取数据:Server端直接从Client端获取Graph进行计算。
云端服务:Server获得Graph后,还需要将计算下发至各Worker处理。
注意事项
不建议使用Python本地读取文件的方式。
PAI支持Python自带IO方式,但需要将数据源和代码打包上传。这种读取方式是将数据写入内存之后再计算,效率比较低,不建议使用。示例代码如下。
import csv csv_reader=csv.reader(open('csvtest.csv')) for row in csv_reader: print(row)
不建议使用第三方库读取文件的方式。
使用第三方库(如TFLearn、Pandas)的数据IO方式读取数据。通常,第三方库是通过封装Python的读取方式实现,所以在PAI使用时也会造成效率低下的问题。
不建议使用Preload读取文件的方式。
如果您发现GPU并没有比本地的CPU速度快很多,则有可能是数据IO,导致性能浪费。Preload读取方式先将数据全部都读到内存中,然后再通过Session计算,例如Feed读取方式。这样会造成性能浪费,同时内存限制也无法计算大数据。
例如,硬盘中有图片数据集0001.jpg,0002.jpg,0003.jpg,…… 。先读取数据后再计算,假设读入用时0.1s,计算用时0.9s,这样每过1s,GPU都会有0.1s空闲,降低了运算的效率。
高效的IO方式
TensorFlow读取方式是将数据读取转换成OP,通过Session.run的方式读取数据。读取线程将文件系统中的图片读入到一个内存的队列中。计算是另一个线程,并直接从内存队列中读取进行计算。这样解决了GPU因IO空闲而浪费性能的问题。
在PAI通过OP的方式读取数据的代码如下。
import argparse import tensorflow as tf import os FLAGS=None def main(_): dirname = os.path.join(FLAGS.buckets, "csvtest.csv") reader=tf.TextLineReader() filename_queue=tf.train.string_input_producer([dirname]) key,value=reader.read(filename_queue) record_defaults=[[''],[''],[''],[''],['']] d1, d2, d3, d4, d5= tf.decode_csv(value, record_defaults, ',') init=tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess,coord=coord) for i in range(4): print(sess.run(d2)) coord.request_stop() coord.join(threads) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--buckets', type=str, default='', help='input data path') parser.add_argument('--checkpointDir', type=str, default='', help='output model path') FLAGS, _ = parser.parse_known_args() tf.app.run(main=main)
其中:
dirname:OSS文件路径,可以是数组。
reader:TensorFlow内置各种类型reader API,可以根据需求选用。
tf.train.string_input_producer:将文件生成队列。
tf.decode_csv:是一个Splite功能的OP,可以获取每一行的特定参数。
通过OP获取数据,在Session中需要tf.train.Coordinator()和tf.train.start_queue_runners(sess=sess,coord=coord)。
读取MaxCompute数据
您可以直接使用Designer的TensorFlow组件读写MaxCompute数据。
下文以iris数据集为例,为您介绍如何读取MaxCompute数据。
主流程 | 描述 |
连接组件 | 拖动组件并连接。 |
配置读数据表组件 | 在读数据表组件中,输入如下代码。
即可获取数据。 数据格式如下。 |
配置Tensorflow组件 |
如果输入MaxCompute表,输出也是MaxCompute表,则只需要接入②和⑤。 读写MaxCompute表需要配置数据源、代码文件、输出模型路径、建表等操作。
组件API命令
其中,${}类型的参数需要替换成您的真实数据。 |
读数据表 | 推荐通过TableRecordDataset读写MaxCompute表,详细的接口使用说明及示例请参见TableRecordDataset。 |
写数据表 |