带你读《2022技术人的百宝黑皮书》——淘宝逛逛ODL模型优化总结(3) https://developer.aliyun.com/article/1246919?groupCode=taobaotech
全连接网络优化
背景
全连接网络是深度模型中非常常见的一种结构,其基本形式就是矩阵乘法Matmul、矩阵加法BiasAdd及激活函数LeakyRelu。在TensorFlow 1.x中,全连接网络的实现使用的是keras.layers.Dense类。其中当inputs的rank大于2时,调用的是standard_ops.tensordot接口。
@tf_export('keras.layers.Dense') class Dense(Layer): …… def call(self, inputs): inputs = ops.convert_to_tensor(inputs, dtype=self.dtype) rank = common_shapes.rank(inputs) if rank > 2: # Broadcasting is required for the inputs. outputs = standard_ops.tensordot(inputs, self.kernel, [[rank - 1], [0]]) ……
通过tensordot代码可以看出,其生成的tf图是非常复杂的,而且还包含了Gather这样与Cuda Graph不兼容的算子。这不仅会增加全连接网络的调用成本,还会使得Cuda Graph对全连接网络的优化十分受限。我们使用Netron对TensorFlow的原生全连接网络进行了可视化,可以很明显地看出,全连接网络的结构十分的复杂。
带你读《2022技术人的百宝黑皮书》——淘宝逛逛ODL模型优化总结(5) https://developer.aliyun.com/article/1246917?groupCode=taobaotech