社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

如何使用PAI深度学习TensorFlow读写OSS教程?

天池大数据科研平台 • 5 年前 • 867 次点击  

怕这才是“深度学习”的正确打开方式!

今日小天带来的就是天池用户Clark Wan分享的干货——如何使用PAI深度学习TensorFlow读写OSS教程~

导语


Python不支持读取oss的数据, 故所有调用 python Open(), os.path.exist() 等文件, 文件夹操作的函数的代码都无法执行。

如Scipy.misc.imread(), numpy.load() 等。

那如何在PAI读取数据呢, 通常我们采用两种办法。



如果只是简单的读取一张图片, 或者一个文本等, 可以使用tf.gfile下的函数, 具体成员函数如下:




tf.gfile.Copy(oldpath, newpath, overwrite=False) # 拷贝文件

tf.gfile.DeleteRecursively(dirname) # 递归删除目录下所有文件tf.gfile.Exists(filename) # 文件是否存在

tf.gfile.FastGFile(name, mode='r') # 无阻塞读写文件tf.gfile.GFile(name, mode='r') # 读写文件

tf.gfile.Glob(filename) # 列出文件夹下所有文件, 支持patterntf.gfile.IsDirectory(dirname) # 返回dirname是否为一个目录

tf.gfile.ListDirectory(dirname) # 列出dirname下所有文件

tf.gfile.MakeDirs(dirname) # 在dirname下创建一个文件夹, 如果父目录不存在, 会自动创建父目录. 如果文件夹已经存在, 且文件夹可写, 会返回成功

tf.gfile.MkDir(dirname) # 在dirname处创建一个文件夹tf.gfile.Remove(filename) # 删除filename

tf.gfile.Rename(oldname, newname, overwrite=False) # 重命名

tf.gfile.Stat(dirname) # 返回目录的统计数据tf.gfile.Walk(top, inOrder=True) # 返回目录的文件树

具体的文档可以参照这里👉http://t.cn/EVuwpoc (可能需要翻墙哦~)


如果是一批一批的读取文件, 一般会采用tf.WholeFileReader() 和 tf.train.batch() 或者 tf.train.shuffer_batch();


接下来会重点介绍常用的 tf.gfile.Glob, tf.gfile.FastGFile, tf.WholeFileReader()  tf.train.shuffer_batch()


  • 读取文件一般有两步

    1. 获取文件列表

    2. 读取文件


  • 如果是批量读取, 还有第三步

    3. 创建batch


从代码上手: 在使用PAI的时候, 通常需要在右侧设置读取目录, 代码文件等参数, 这些参数都会通过--XXX的形式传入


tf.flags可以提供这个功能



接下来就分两种情况:


 1.(小规模读取时建议) tf.gfile.FastGFile()




 2.(大批量读取时建议) tf.WholeFileReader()


解释下其中重要的部分


tf.train.string_input_producer, 这个是把files转换成一个队列, 并且需要 tf.train.start_queue_runners 来启动队列;
tf.train.shuffle_batch 参数解释;
batch_size 批大小, 每次运行这个batch, 返回多少个数据;
num_threads 运行线程数, 在PAI上4个就好;
capacity 随机取文件范围, 比如你的数据集有10000个数据, 你想从5000个数据中随机取, capacity就设置成5000;
 min_after_dequeue 维持队列的最小长度, 这里只要注意不要大于capacity即可。

如果遇到不得不使用第三方库的情况:

如读取pkl、npy、tiff可以使用tf.gfile.Copy(FLAGS.buckets,'./文件名')从OSS拷贝到运行时目录 ('./') , 然后用直接用第三方库读取就可以。


文件写入


  1. 直接使用tf.gfile.FastGFile()写入

    tf.gfile.FastGFile(FLAGS.checkpointDir + 'example.txt', 'wb').write('hello world')

  2. 通过tf.gfile.Copy()拷贝

    tf.gfile.Copy('./example.txt', FLAGS.checkpointDir + 'example.txt')


通过这两种方法, 文件都会出现在 '输出目录/model/example.txt' 下


费用开支


这里只讨论读取文件所需要的费用开支


原则上来说, PAI不跨区域读取OSS是不收费的, 但是OSS的API是收费的。 PAI在使用 tf.gile.Glob 的时候会产生GET请求, 在写入tensorboard 的时候,也会产生PUT请求。 这两种请求都是按次收费的,具体价格如下:


标准型单价: 0.01元/万次

低频访问型单价: 0.1元/万次

归档型单价: 0.1元/万次

当数据集有几十万图片, 通过 tf.gile.Glob 一次就需要几毛钱, 所以减少费用开支的方法就是减少GET请求次数


这里给出几种解决思路:


  1. 最好的解决思路, 把所有会使用到的数据, 一并上传传到OSS, 然后使用tensorflow拷贝到运行时目录, 最后通过tensorflow读取, 这样是最节省开支的.

  2. 通过tfrecords, 在本地, 提前把几十上百张图片通过tfrecords存下来, 这样读取的时候可以减少GET请求

  3. 把训练使用的图片随着代码的压缩包一起传上去, 不走OSS读取


三种方法都可以显著的减少开支.。


除此之外,插播一则天池相关的PAI-DSW产品GPU资源促销,感兴趣的同学抓紧戳!👏


使用注意


事实上, 每次读取传过来的地址就是 oss://你的buckets名字/XXX, 本以为不需要在PAI界面上设置, 直接读取这个目录就好, 事实上并不如此。


PAI没有权限读取不在数据源目录和输出目录下的文件, 所以在使用路径前, 确保他们已经在控制台右侧设置过。



另外如果需要写入文件到OSS, 可以使用 tf.gfile.fastGFile('OSS路径', 'wb').write('内容')


OSS路径推荐使用:FLAGS.checkpointDir以及FLAGS.summaryDIr这样的形式传入,经过测试,好像也只有这两个目录下有写权限

FLAGS.buckets下所有文件夹有读写权限。



最后,如果你也有想分享的干货,可以登录天池实验室(notebook),包括赛题的理解、数据分析及可视化、算法模型的分析以及一些核心的思路等内容。

小天会根据你分享内容的数量以及程度,给予丰富的神秘天池大礼以及粮票奖励。分享成功后你也可以通过下方钉钉群👇主动联系我们的社区运营同学(钉钉号:doqclsn 或 yiwen1991

天池宝贝们有任何问题,可在戳“留言”评论或加入钉钉群留言,小天会认真倾听每一个你的建议!


点击下方图片即可阅读


如果你会模型融合!那么,我要和你做朋友


《流浪地球》为何从不被看好到票房榜首,数据分析给你答案!

除了奖金还送800万入驻权益,未来科技城——智能城市建设合伙人大赛正式启动啦!

     AI安全新探索,IJCAI-19阿里巴巴人工智能对抗算赛,约一波?


👇“阅读原文”至技术圈,pc端fork更嗨皮!

听说fork的人都👇


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/0NdW5WrOR8
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28989
 
867 次点击