绕过SparseApply*的基于gpu梯度的稀疏更新的变通方法——tensorflow中有吗?

绕过SparseApply*的基于gpu梯度的稀疏更新的变通方法——tensorflow中有吗?,tensorflow,gradient-descent,Tensorflow,Gradient Descent,从一些上下文开始: SparseApply*GPU未实现运算符(从0.11开始) 这些操作需要使用动量和ADAM以及其他各种基于梯度的优化器 CPU版本会导致CPU和GPU之间的数据传输和延迟 我希望Momentum/ADAM在一个模型上使用tf.gather在许多地方广泛使用,并且不影响GPU的利用率。我的变量的密集版本不是特别大,特别是与计算图中激活和其他张量使用的内存相比 除了为GPU实施这些SparseApply*ops之外,我想到了一个解决方案,我想听听它是否可行、其他建议或只是一

从一些上下文开始:

  • SparseApply*
    GPU未实现运算符(从0.11开始)
  • 这些操作需要使用动量和ADAM以及其他各种基于梯度的优化器
  • CPU版本会导致CPU和GPU之间的数据传输和延迟
我希望Momentum/ADAM在一个模型上使用
tf.gather
在许多地方广泛使用,并且不影响GPU的利用率。我的变量的密集版本不是特别大,特别是与计算图中激活和其他张量使用的内存相比

除了为GPU实施这些
SparseApply*
ops之外,我想到了一个解决方案,我想听听它是否可行、其他建议或只是一般性的批评:

  • 在dict
    D
    中跟踪我的模型中的所有模型参数变量
  • 使用
    tf收集
    D
    中参数的梯度。梯度
  • 在子图H(整个tensorflow/会话默认计算图的子图)中使用密集GPU操作(及其潜在变量)手动编程adam/动量更新
  • 计算/应用H
  • 一些背景信息:我有选择地从的StephenEnroller的第一条评论中选择了一个子字符串

    目前,似乎只有GradientDescentOptimizer支持 当有SparsetSensor更新时在GPU上运行

    通过允许它们被使用,可以大大提高速度 存储在GPU上。首先,不需要转移向量 嵌入到GPU或从GPU嵌入,而只需将 嵌入索引,然后梯度也不需要 向后转移。在一个测试中,我实现了一个 在GPU上,一个时代的差异约为1100s与 300秒


    编辑:重命名我的问题/标题,以便关键字显示在标题的前面。

    另一个选项是使用普通tensorflow ops实现这些优化器,并使用District_add进行最终添加,这应该可以工作,因为District_add已在GPU中注册