ti.ad.Tape(validation=True) 丢失了循环带读后写,返回了一个默默无声的错误梯度
** 描述错误**
全球数据访问规则检查器在一个循环内捕获到一个写后读
迭代,但不包括环绕形式(read f[i],write f[i+1]')。 带子
然后返回一个正向梯度~4.8x,并带有准确的前向值,没有
警告 警告他们
** 废除**
py 导入数学, 太一为ti ti.init(arch=ti.cpu,默认为 fp=ti.f64,调试为True)
E, SIG Y, N = 1000.0, 2.0, 60 th = ti.field(ti.f64,形状= (),需要 grad=True) 互联网档案馆的存檔,存档日期2013-12-22. acc = ti.field(ti.f64,形状= (),需要 grad=True). epsp = ti.field(ti.f64,形状=(N+1),需要 grad=True) 互联网档案馆的存檔,存档日期2013-12-02.
@ti.内核 def 可塑性( ): # 读取 epsp[ i], 写出 epsp[ i+ 1] ti.loop 配置( 序列化= True) i 在范围(N): trial = E * (th [none] * ti.sin (2.0 * math.pi * i / N) - epsp[一]). d = 0.0 (单位:千美元) 如果ti.abs(审判) > SIG Y: d=(ti.abs(审判)-SIG Y)/E acc[无] += d epsp [一+一] = epsp [一] + (如果试验 > 0 其他-d)
[无]=0.0045 与 ti.ad. Tape( ac, 校验=True ) 相通 : # <- 没有任何内容 可塑性( ) print ("值", acc[无], "grad", "th.grad [无], "real grad 3.895472")
这是一维的完美塑相还原图。 `3. 895472' 是一个的衍生
独立浮动64 执行同一模式,经中央
差别。
** 记录**
[太一]版本1.7.4,llvm 15.0.4,承诺b4b956fd,linux,Python 3.10.12 [田一] 从拱起=x64 数值:0.007529621915295555 格勒 18.84385969656736 真格勒 3.895472
前置值将独立执行匹配到八位数;仅
衍生物是错误的。 在`[0.0045、0.0065]的`theta ' 中,比率保持不变
4.68x到4.94x之间.
** 补充评论**
*检查员确实在这里工作 *——控制,所以这不是关于
" 验证 " 沉默地不运行:
* * * 内核 * * * `验证=True' * * *
|-|-|-.
`y[一] = y[一] *2.0 + x[无] ' ——写后读, 相同元素 * ** 抓**: “TaichiAssertion Error:打破全球数据访问规则。 Snode S6被意外地覆盖。 "
`y[一] = x[无]*(一+1]' ——干净 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
上方的内核——读作"epsp[一]",写作"epsp[一+1]" * **passes**,梯度 4.8x错误 * *.
写入文件记录的相同模式——每步一个内核,所以没有字段
在一个内核内读取和写入——给出正确的梯度. 这么说
这是一个解开规则的编码 而不是对自动操作的限制
模式; 请求只是由检查者说。
* 初步诊断。 检查器看起来是测试是否
元素被覆盖。 在此,“ epsp” 的每个元素都写一次并读取
一次,一个迭相分开, 所以每个元素的测试 没有什么可以发射,同时
规则禁止的依赖性仍然存在。 这符合所有三个
下面和2425号案例:它所捕获的一切读取和书写相同
键。 我们没有读到检查器的执行, 所以这是一个假设,
而不是一个索赔。
*会有什么帮助* 任何一种:
. . . . . . .内容来源: taichi-dev/taichi