qiaoguan / deep-ctr-prediction

CTR prediction models based on deep learning(基于深度学习的广告推荐CTR预估模型)
https://github.com/qiaoguan/deep-ctr-prediction
907 stars 276 forks source link

关于工业级生产tfrecord的疑问,希望作者帮我解惑 #14

Open TzeSing opened 4 years ago

TzeSing commented 4 years ago

一般做法是用spark生成tfrecord再拉到本地GPU跑,但是如果CTR数据集如果小的话(2000W条以下,50个特征以下),能读进内存里,发现用tf.data.TFRecordDataset反而很慢。

本人用pandas读进内存再用tf.keras.utils.sequence构造数据生成器,大概只需要20ms/step 但用tf.data.TFRecordDataset就上升到了2s/step 总共21个step每个epoch

不知道作者是否有些建议给我,指点迷津。 例如生成tfrecord的内部格式是如何的,我现在是一个record有n个特征(key) 等等的建议,谢谢作者

qiaoguan commented 4 years ago

抱歉,刚看到,tfrecord本身存在一些缺陷,低层采用pb,解析速度较慢,而且工业界分布式hadoop/spark生成tfrecord,int型只提供int64,所以可能tfrecord样本比原始csv样本还大很多,占用存储空间, 由于推荐模型本身网络比较简单,再加上tfrecord格式解析慢,可能用GPU训练并不比cpu快多少。 你这个相差这么多,感觉应该不至于,你检查看看应该是其他什么问题导致的,另外,你可以看看tensorflow的dataset API, 有一些参数可以调调,比如sloppy参数设为true等等。

TzeSing commented 4 years ago

抱歉,刚看到,tfrecord本身存在一些缺陷,低层采用pb,解析速度较慢,而且工业界分布式hadoop/spark生成tfrecord,int型只提供int64,所以可能tfrecord样本比原始csv样本还大很多,占用存储空间, 由于推荐模型本身网络比较简单,再加上tfrecord格式解析慢,可能用GPU训练并不比cpu快多少。 你这个相差这么多,感觉应该不至于,你检查看看应该是其他什么问题导致的,另外,你可以看看tensorflow的dataset API, 有一些参数可以调调,比如sloppy参数设为true等等。

谢谢作者回复,我现在优化过后的tfrecord读取速度是200-300ms,相比也还是慢点,能接受,我再认真研读一下dataset的api

Ethan199111 commented 4 years ago

@TzeSing 要注意map的位置,放的不对会非常慢

TzeSing commented 4 years ago

@TzeSing 要注意map的位置,放的不对会非常慢

我是batch后map(tf.io.parse_example)的