作者jimmycool (北七)
看板DataScience
标题[徵文] Halide
时间Mon Aug 20 02:44:28 2018
http://gradient.halide.ai
Title: Differentiable Programming for Image Processing and Deep Learning in Ha
lide
Disclaimer: 这是我自己的paper
Deep learning 的一个很重要的核心元素是计算gradients
板上的大家应该都对市面上常见的deep learning frameworks (TensorFlow, PyTorch)
很熟悉,这些框架通常会给你很多operators (TensorFlow 有14个不同的convolution op
erators) 让你去兜成自己想实作的演算法,这些operators的gradients都是一群google
和
Facebook 工程师辛苦手写的。
这种做法的问题在如果有天我们想写个不太一样的operator,很可能我们也要跟着手写gr
adients (但只领10%的薪水)。事实上我朋友Michael两年就碰到这个问题:他
想在TensorFlow 里写一个叫做bilateral grid的图片filter,但两年前TensorFlow还没
有general gather,所以他只好自己在cuda 实作bilateral grid跟gradients。糟糕的是
,他後来发现他得要修改bilateral grid,所以gradients要重算,code要重写,bug要重
de。现在TensorFlow (和PyTorch)有gather能用了,但你还是得丢给gather function
一堆numpy indices,所以这非常慢,而且当我们丢一张大图给他memory就爆了(12GB的p
ascal)。
我们觉得解决这个问题的方法是写个compiler可以算general code的gradient,但是又不
用像CUDA那麽low level。所以我们盯上一个叫Halide的语言,他是我们另外三个co auth
ors开发的高效能影像处理语言。因爲他们专注在影像处理上,所以能把high level algo
rithm和low level optimization (parallelism, memory)乾净的分开来,让使用者可以
专心写high level code。我们替Halide加上了算gradients的功能,所以你可以写high l
evel code但维持高效能。上面的bilateral grid我们的code只有pytorch 60%长,但是有
20倍快而且不会吃光memory。算gradients的方法就是标准的automatic differentiation
和一些parallelism加速,有兴趣可以看paper和slides。
一个这篇paper想要讨论的哲学问题是传统影像处理和deep learning的界线。以前大家在
开发影像处理演算法的时候其实也是有一堆参数 (像SIFT)然後大家会准备几张benchma
rk images想办法找到最好的参数。gradient descent其实就是在自动化这个过程,而且
他让你可以加很多参数也不用担心。我们试着用这套方法改良几个传统image processing
algorithms,结果都不错,而且都没花我们几天工夫。我觉得大家应该多看看CNN和ReLU
以外的nonlinearities,不要把deep learning跟传统方法划清界线。
Gradients另外一个用处是拿来解inverse problems,这个情况就不需要training data。
Paper跟slides有更多details。
我们已经把compiler open source (看上面的project page),里面也有个PyTorch inter
face,所以当你碰到PyTorch写不出来的code的时候可以试试Halide。我会慢慢放上更多t
utorials,有问题也可以写信给我或开个GitHub issue。
边吃早餐边打的所以不知道有没有一千字,没有我晚上再补。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 107.77.205.122
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1534704270.A.BA1.html
※ 编辑: jimmycool (107.77.205.122), 08/20/2018 02:56:13
1F:推 yoyololicon: 看起来hen屌 08/20 07:52
2F:推 yiefaung: 钓到大神啦 跪了 08/20 10:21
3F:推 tsoahans: MIT跪了 08/20 10:41
4F:推 kokolotl: 推~ 08/20 10:56
5F:推 MXNet: 那麽你们有没有研究过 Julia 在 AD + CUDA code gen 这块? 08/20 14:48
Julia是相对general purpose的语言,所以也比较难让自动微分有效率
自动微分有分在runtime微分和在compile-time微分两种,在runtime微分比较
好实作但是通常会有10x左右的overhead
Julia现有的compile-time autodiff libraries都没有支援整个语言,
比如说写个for loop就会造成很多问题
(要backprop for loop,要把loop倒过来跑,确认没有goto跟break跟continue,
然後记住中间所有的temp variables)
他们应该也没有像我们一样支援奇怪的array indexing
不过我同意在metaprogramming比较强的general purpose语言里面支援autodiff
是个很有趣的方向
最有名的就是Siskind和Pearlmutter的Stalingrad,他们可以微分一个类似Scheme的
functional language
https://github.com/Functional-AutoDiff/STALINGRAD
不过Scheme对正常人类有点太hardcore了 (可以看看他们的source code,我是看不懂)
另外一个有关的paper
https://arxiv.org/abs/1806.02136
我们也在想办法让Halide变得更general purpose,希望有天我们可以真的随便微分
所有code
6F:推 Activation: 大神 08/20 22:44
7F:推 gbllggi: 跪着推 08/21 03:06
8F:推 carl0536: 推 08/21 16:10
※ 编辑: jimmycool (71.231.190.72), 08/21/2018 22:05:16
9F:推 goldflower: 太猛啦 08/22 08:25
10F:推 MXNet: Julia 这边有发现 metaprogramming 的不足, 08/22 22:49
11F:→ MXNet: core developer 在发展 Cassette.jl 08/22 22:49
12F:→ MXNet: 让你可以在 compile-time 做更多奇奇怪怪的 patching 08/22 22:49
13F:→ MXNet: 另外有基於 Cassette.jl 发展的 AD 套件 08/22 22:50
15F:→ MXNet: 虽然我也不确定完成度 08/22 22:50
16F:→ jimmycool: cool 我知道Julia community很多人想做autodiff但不知 08/23 05:50
17F:→ jimmycool: 道这个,如果真的做完这也会很有用 08/23 05:51
18F:推 MXNet: Julia 的 slack 上面有 autodiff 的 channel 也许你可以 08/23 09:36
19F:→ MXNet: 上去问问 08/23 09:36
20F:推 j6309355065: 推 08/27 12:05