模块化分布式tensorflow框架
EasyFlow的Python项目详细描述
基因组学
模块化分布式TensorFlow框架
提取转换加载管道
- 提取:使用本地文件系统(hdd或ssd)或远程文件系统(gcs或hdfs)读取
- 转换:有效利用CPU核心解析并执行预处理、批处理
- 负载:在本地或跨集群的许多gpu或tpu上的计算负担过重
将数据输入图形
- 使用输入到图中的数据初始化张量:bloat graph size,用于小问题和单个gpu,在多个设备上复制图效率非常低
- 使用字典将数据输入图形:巨大的内存利用率,以及对巨大预处理数据的巨大磁盘需求
- 使用queue的输入管道:queue runner是用python实现的,效率高,但不能饱和当前一代多个gpu
- 使用TF.DATA()API的输入管道:使用C++实现,并行化I/O,使用后台线程进行转换和加载步骤,推荐
多gpu和分布式模型中的变量分布
- 参数服务器:参数被固定到参数服务器,并且它们被隐式地复制到worker,梯度在worker计算并在参数服务器聚合
- 复制变量:每个gpu或worker都有自己的变量副本,然后使用单个设备(cpu或gpu)来聚合梯度
- 分布式环境中的复制变量:每个工作进程都有变量的本地副本,然后使用聚合梯度的参数server更新本地副本
保留变量的本地副本可以加快计算速度
代码说明
- 多GPU模型,使用输入管道使用队列,变量分布使用参数服务器方法完成
- 参数固定在CPU上,GPU(如果可用)用作辅助进程
- 非常模块化和面向对象的设计,核心模块抽象出基本的例行功能,还提供实现新模型的层
- 例如,对于示例数据集,除了预处理(初始的,特定于数据的)之外,我只实现了tfbsaafilereader、tfbs-aa-cnn-u模型类
- Tensorborad中图形可视化的专有名称范围以及tf.summaries
- 数据是使用数据dict而不是命令行参数传递的,因为此dict可以自动存储和检索
如何运行:示例数据集
- 在https://github.com/rohit06nitbpl/genomics/blob/master/tfbs/source撸code/tensorflow/models/dreamc/pre撸u processing.py l222" rel="nofollow">https://github.com/rohit06nitbpl/genomics/blob/master/tfbs/source撸code/tensorflow/models/dreamc/pre撸processing.py l222中更改第222行根据磁盘上数据目录的位置
- 无参数运行python文件最新的TensorFlow环境。
- 在第19行的https://github.com/rohit06nitbpl/genomics/blob/master/tfbs/source-code/tensorflow/models/dreamc/experiments.py l19" rel="nofollow">https://github.com/rohit06nitbpl/genomics/blob/master/tfbs/source-code/tensorflow/models/dreamc/experiments.py l19
设备放置和培训日志已完成。
如何运行tensorboard:sample dataset
tensorboard--logdir=genomics/tfbs/source-code/tensorflow/dataset/dreamc/sample-dataset/attempt0/train/logs
图形和缩放器可以在TensorBoard中可视化
示例数据说明
这是一个小型的自制数据,格式与Dream-encode TF体内绑定挑战数据相似
我在这段代码中使用这个模型作为最初的实验,我还使用了氨基acitf-as的d序列 附加功能,只是为了看看它在预测tf结合方面的用处 即使对于未知的tf(即没有进行实验的tf)。我们早期的重点是预测tf结合位点 对于未知的TFS,但稍后,我只专注于提高梦想挑战的结果。
我在这段代码中阅读tsv格式的文件,而不是压缩版本。不过,最近我使用了dream-encode网站上提到的压缩版本和工具,如bedtool等。
我正在动态创建输入张量。这样,我就不会在内存或磁盘中存储一个巨大的热矩阵(基因组学中的数据集是巨大的)。
早些时候,我在许多线程中读取文件,并为ambigous(a)、bound(b)、unbound(u)样本填充三个队列。 然后我用一个随机的洗牌队列来抽取相同数量的样本,并形成最后一批(每批中的均衡类)进行训练。
但由于三个类(a、b、u)的数量不平衡,训练必须等待(b)样本在使用队列管道的文件深处找到。
因此,我对文件进行了预处理,将文件中的a、b和u样本分离为三个独立的文件。现在,在这段代码中,我为每个 等级(A、B、U)。每个线程快速查找每个类的样本并将其放入队列管道。
在tensorflow中,建议使用大文件而不是多个小文件,因为这会瓶颈系统文件处理资源。
事实上,在示例数据集中,我在这段代码中使用的,A级文件的大小非常小,这使得文件可以很快地被关闭,并在不同的时间段重新打开。 这会使A类队列的填充速度变慢。如果运行我的代码,您将看到,训练会间歇性地等待A类队列。
使用apache spark和hadoop这样的大数据技术可以使集群上的数据处理速度更快,而且它们可以更快地收集数据并进入队列。 而不是单一的系统。
待办事项
- 上传1d胶囊实现,我用于tf绑定问题
- 使用tf.data()api添加管道,并使用实际数据(如mnist)比较性能
- 使用https://github.com/tensorflow/benchmarks/tree/master/scripts/tf_cnn_benchmarks" rel="nofollow">https://github.com/tensorflow/benchmarks/tree/master/scripts/tf_cnn_benchmarks完成分布式实现