Skip to main content

动半,动手,加local_map的动手日志分析

1.对比local_map下的动半和非local_map的动半(左是非local_map动半(纯动半),右是local_map动半)

1.在进入loss函数计算之前,local_map下的动半和纯动半操作完全相同。

2.进入loss函数计算前,前面会多dtensor_to_local,动半是用dist_tensor在做loss计算,会自动推导进行shard,而local_map动半是使用dtensor_to_local,将其转化为dense_tensor去做

image-20250403102406181

3.做loss函数中的绝对值计算的时候,动半看起来做了allgather?从shard分布,变成了replicated分布

image-20250403103433949

4.绝对值计算后,后面的所有操作,动手用的是[32,1]的数据做的,且dims_mappings:[-1,-1]说明是全复制状态

image-20250403105931206

5.进入backward前,使用local_map的动手要多一个dtensor_from_local dygraph

image-20250403123025463

6.开始执行backward时,使用使用local_map的动手需要执行GRAD: dtensor_from_local,在此时Get 1-D launch config: numel=2,然后做了RToSReshard,再做GRAD: dtensor_from_local,紧接着再做GRAD: unsqueeze_grad,此时unsqueeze_grad的输入是GRAD: dtensor_from_local的输出;而纯粹的动手和动半是直接开始做GRAD: unsqueeze_grad,并且输出就是

image-20250403123552420

7.反向的时候,local_map包装的loss计算这部分,也动半不同,但和动手相同,这一点从逻辑上看是没问题的。动手会用自动框架的切分推导逻辑,而local_map的动手,则完全是本地视角做backward。

image-20250403125439815

8.local_map的动半 会多出一个Running AD API GRAD: dtensor_to_local;接下来的Running AD API GRAD: relu_grad其中一个输入grad_out,是GRAD: dtensor_to_local输出的结果;而纯动半和动手Running AD API GRAD: relu_grad其中一个输入grad_out,直接由slice_grad得到。

image-20250403125831981

9.后续过程local_map的动半与纯动半完全相同

2.对比动手和local_map下的动半(左是动手,右是local_map动半)

1.不知道反向时这个sum or move grad inputs for edge 是否做了梯度累加?此处多一个dtensor_from_local的梯度计算

image-20250403004458824

2..反向计算最开始:二者数据大小有差异

第一个是动手的截图

image-20250403002218617

第二个是local_map下的动半的截图

image-20250403002131579

3.进入relu_grad之前,local_map下的动半比动手多一个dtensor_to_local梯度计算

image-20250403004156401

以下都是反向的时候,loss包含的所有操作的grad计算完后的操作,动半(不用local_map)和local_map下的动半是完全相同的,因此和动半有区别我认为属于正常现象

4.做add_grad的时候输出变量维度不同(但是动半(不用local_map)和local_map下的动半操作相同)

image-20250403005116023

5.动手多一个对偏置b的操作(还有很多这种)

image-20250403005940437

6.matmul_grad 二者有差异(但是动半(不用local_map)和local_map下的动半操作相同)

image-20250403010126655

7.动手这里做了allreduce,local_map的动半没做(非local_map的动半也没做)

image-20250403010912375

8.adamw_不同

image-20250403011557136

3.结论(纯动半就是不使用local_map的动半)

在forwad过程时:加local_map的动半,进入loss计算前,和纯动半完全相同,进入loss计算时,会多一个dtensor_to_local,进入loss计算后,整个操作和动手完全相同,结束loss计算时,会多一个dtensor_from_local操作,之后又和纯动半完全相同。

在backward过程时:加local_map的动半,会多一个Grad:dtensor_from_local的操作,进入loss后,整个操作grad计算和动手完全相同,结束loss计算的反向后,会多一个Grad:dtensor_to_local操作,之后又和纯动半完全相同。