说明
很早就想继续深入这一块了,之前一方面忙一些更基础的东西,另一方面也是没有找到很合适的切入点(毕竟时间太有限了,不能改进时效比的事不能做)。
现在看下来,至少有两方面是非常贴地气的:
- 1 使用矩阵计算加速普通的数据处理过程,例如pandas的计算是以列进行异步的,和矩阵计算的效率比低了一个量级。
- 2 构成更快速的遗传算法。之前做过一个完整的物流配送优化项目,geatpy效率还可以,但是只是基于cpu计算的。(我的3060Ti都躺了快半年没用了,多可惜啊。)
内容
1 短期目标
- 1 构建基于矩阵的数据基本操作,基于CPU将效率提升到极致
- 2 构建可使用GPU加速的遗传算法
如果能做到这两个目标,我就在明年的618奖励自己一台强主机(5950x + 3080Ti)
2 热身
先把让3060Ti跑一下一亿欧几里得测试
cpu
import pandas as pd
import numpy as np
import time
a = np.random.rand(1,100000000)
b = np.random.rand(1,100000000)
%%timeit
time_start=time.time()
dist1 = np.linalg.norm(a - b)
time_end=time.time()
print(time_end-time_start)
0.2157762050628662
0.19418692588806152
0.19490408897399902
0.19572806358337402
0.19535326957702637
0.19487929344177246
0.19504618644714355
0.19464635848999023
195 ms ± 458 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
by the way, m1 pro的速度大约是110ms。m1芯片的适配真是太差了,鸿蒙笔记本出来我就考虑那个啥… 嗯,反正都是上网本。
GPU(3060Ti)
%%timeit
import torch
from torch.functional import F
e = torch.rand(1,100000000).cuda()
f = torch.rand(1,100000000).cuda()
time_start=time.time()
dist2 = F.pairwise_distance(e, f, p=5)
time_end=time.time()
print(time_end-time_start)
0.0011906623840332031
0.00017309188842773438
0.00015926361083984375
0.00015735626220703125
0.00016450881958007812
0.00016450881958007812
0.0001609325408935547
0.0001628398895263672
1.09 s ± 295 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
一方面,数据从内存搬到显存是有代价的;另一方面,如果显存已经ready,算的速度比CPU那是快了几个0.
显存不要溢出哟(之前有跑过几个任务,突发的时候占用的显存过大,然后卡住不动,直到我停掉一个任务才恢复)
!nvidia-smi
Mon Dec 13 23:35:30 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 306... Off | 00000000:01:00.0 Off | N/A |
| 0% 41C P8 14W / 200W | 3122MiB / 7979MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
|