课题组23-11-15周报

实验关于fp16参数转换速度的问题

本周进行了一个实验,主要用于观察pytorch中对张量转移的各种方法的性能差异。

实验思路

几种不同的传输方向

  • cpu -> cpu
  • cpu -> gpu
  • gpu -> cpu
  • gpu -> gpu

    几种不同的数据

  • fp32 -> fp32
  • fp32 -> fp16
    调用half()函数,将fp32数据转换为fp16数据
  • fp16 -> fp16
  • fp16 -> fp32
    调用float()函数,将fp16数据转换为fp32数据

目前第三、四种暂未测试

几种不同的传输方式

  • copy_()
  • to()

实验过程

准备一个目的地矩阵,一个源矩阵组(100个)。分别用随机数初始化。
循环100次,每次都遍历整个矩阵组,传输至对应的目的地矩阵。
测量总时长,对不同情况进行比较
代码模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import torch
import time
tensor_cpu_1 = torch.rand(1000, 1000)
tensor_gpu_1 = torch.rand(1000,1000).cuda()
tensor_cpu_2 = torch.rand(1000, 1000,1000)
tensor_gpu_2 = torch.rand(1000,1000,1000).cuda()
time_sum = 0
for j in range(100):
start = time.time()
for i in range(100):
tensor_cpu_1.copy_(tensor_cpu_2[i])
end = time.time()
time_sum += end - start


print("time for copy from cpu to cpu via _copy():", time_sum)

如上代码展示了从cpu到cpu传输fp32的过程。最终展示了传输十万个1000*1000的矩阵所耗费的总时间。
经过实验,结果如下表所示:
记录数据如下:

传输方向 传输方式 数据类型 时间
cpu -> cpu copy_() fp32 -> fp32 2.187
cpu -> cpu to() fp32 -> fp32 0.025
cpu -> cpu copy_() fp32 -> fp16 5.855
cpu -> cpu to() fp32 -> fp16 5.634
cpu -> gpu copy_() fp32 -> fp32 9.663
cpu -> gpu to() fp32 -> fp32 9.555
cpu -> gpu copy_() fp32 -> fp16 9.876
cpu -> gpu to() fp32 -> fp16 10.264
gpu -> cpu copy_() fp32 -> fp32 8.895
gpu -> cpu to() fp32 -> fp32 13.649
gpu -> cpu copy_() fp32 -> fp16 10.051
gpu -> cpu to() fp32 -> fp16 7.320
gpu -> gpu copy_() fp32 -> fp32 0.605
gpu -> gpu to() fp32 -> fp32 0.029
gpu -> gpu copy_() fp32 -> fp16 0.484
gpu -> gpu to() fp32 -> fp16 0.591
  • 注意,测试时间可能会有波动,尤其是在时间较短时,考虑到这种传输主要出现在gpu->gpu中,不是主要考虑内容