安装Cuda驱动就好了,网上有很多这样的教程
代码当中如何实现”最好是为GPU内部的日志分配内存,并且只移动较大的日志。” 一般都使用logging的模块,这个可以控制是否记录到GPU?
torch.cuda.device 一般用于with 环境管理器; e.g with torch.cuda.device(0)
100个500x500矩阵的矩阵乘法所需的时间,并记录输出矩阵的Frobenius范数的时间对比:
import time
import torch
def try_gpu(i=0): #@save
"""如果存在,则返回gpu(i),否则返回cpu()"""
if torch.cuda.device_count() >= i + 1:
return torch.device(f'cuda:{i}')
return torch.device('cpu')
startTime1=time.time()
for i in range(100):
A = torch.ones(500,500)
B = torch.ones(500,500)
C = torch.matmul(A,B)
endTime1=time.time()
startTime2=time.time()
for i in range(100):
A = torch.ones(500,500,device=try_gpu())
B = torch.ones(500,500,device=try_gpu())
C = torch.matmul(A,B)
endTime2=time.time()
print('cpu计算总时长:', round((endTime1 - startTime1)*1000, 2),'ms')
print('gpu计算总时长:', round((endTime2 - startTime2)*1000, 2),'ms')
运行结果:
cpu运行总时长: 275.99 ms
gpu运行总时长: 22.0 ms
为什么我用pycharm跑出来显示GPU用的时间有2430.96 ms比CPU慢好多,但是用jupyter跑出来时间就很短
你好,这个问题,我很好奇,我尝试了一下,
pycharm上
cpu计算总时长: 1484.38 ms
gpu计算总时长: 1985.22 ms
jupyter上
cpu计算总时长: 1479.2 ms
gpu计算总时长: 8.0 ms
我在python IDE上也试了一下,发现gpu计算时长还是比cpu长好多.
你有找到答案吗?
还没找到答案,但我看有说是因为数据从cpu到gpu上也需要时间的,所以gpu优势不太明显
Q1: 尝试一个计算量更大的任务,比如大矩阵的乘法,看看CPU和GPU之间的速度差异。再试一个计算量很小的任务呢?
A1: 当计算量较大时,GPU明显要比CPU快;当计算量很小时,两者差距不明显。
# 计算量较大的任务
X = torch.rand((10000, 10000))
Y = X.cuda(0)
time_start = time.time()
Z = torch.mm(X, X)
time_end = time.time()
print(f'cpu time cost: {round((time_end - time_start) * 1000, 2)}ms')
time_start = time.time()
Z = torch.mm(Y, Y)
time_end = time.time()
print(f'gpu time cost: {round((time_end - time_start) * 1000, 2)}ms')
# 计算量很小的任务
X = torch.rand((100, 100))
Y = X.cuda(0)
time_start = time.time()
Z = torch.mm(X, X)
time_end = time.time()
print(f'cpu time cost: {round((time_end - time_start) * 1000)}ms')
time_start = time.time()
Z = torch.mm(Y, Y)
time_end = time.time()
print(f'gpu time cost: {round((time_end - time_start) * 1000)}ms')
Q2: 我们应该如何在GPU上读写模型参数?
A2: 使用net.to(device=torch.device(‘cuda’))将模型迁移到gpu上,然后再按照之前的方法读写参数。
Q3: 测量计算1000个 100*100 的矩阵乘法所需的时间。记录输出矩阵的Frobenius范数,一次记录一个结果 vs 在GPU上保存并仅传输最终结果。
(中文版翻译有点问题,英文原版这句话是log the Frobenius norm of the output matrix one result at a time vs. keeping a log on the GPU and transferring only the final result,所以实质是要我们作对比)
# 一次记录一个结果
time_start = time.time()
for i in range(1000):
Y = torch.mm(Y, Y)
Z = torch.norm(Y)
time_end = time.time()
print(f'gpu time cost: {round((time_end - time_start) * 1000)}ms')
Y = X.cuda(0)
# 在GPU上保存并仅传输最终结果
time_start = time.time()
for i in range(1000):
Y = torch.mm(Y, Y)
Z = torch.norm(Y)
time_end = time.time()
print(f'gpu time cost: {round((time_end - time_start) * 1000)}ms')
Q4: 测量同时在两个GPU上执行两个矩阵乘法与在一个GPU上按顺序执行两个矩阵乘法所需的时间。提示:你应该看到近乎线性的缩放。
A4: 由于只有一个GPU,所以没法实验验证,但个人推测后者的时间应该是前者的两倍。
最后一问,在2个GPU计算矩阵乘法为什么比在1个GPU计算需要花费更多的时间呢?希望大佬帮忙解答下
代码如下:
X=torch.rand((10000,10000))
Y=torch.rand((10000,10000))
#在2个GPU上执行两个矩阵乘法
time_start=time.time()
X=X.cuda(0)
Y=Y.cuda(1)
Z1=torch.mm(X,X);Z2=torch.mm(Y,Y)
time_end = time.time()
print(f’use 2 gpu time cost: {round((time_end - time_start) * 1000)}ms’)
#在1个GPU上按顺序执行上面两个矩阵乘法
time_start=time.time()
Y=Y.cuda(0)
Z11=torch.mm(X,X)
Z22=torch.mm(Y,Y)
time_end = time.time()
print(f’use 1 gpu time cost: {round((time_end - time_start) * 1000)}ms’)
在kaggle执行结果:
use 2 gpu time cost: 218ms
use 1 gpu time cost: 2ms
M1的话不能用哦,还是建议用有nvidia显卡的电脑
首先上,你在第一次测试的时候已经把x放入gpu所以第二次直接计算会很快。建议为x重新分配内存后再进行测试。
你可以在设变量设置两个变量,就不要复制了,就像我这样,对比还是挺明显的
每次我使用GPU的时候就会蓝屏,但具体原因我不清楚,经过一段摸索后,我发现只要我的副屏开着就会导致蓝屏。我是1050ti的显卡,有人知道怎么解决吗
破案了,nvidia的531.18的驱动的问题,可以选择回退或者再更新
同问,我在pycharm上跑也很慢,不知道哪里出了问题
ROCm有人用过么?家里有台A卡,想利用起来,
我觉得你这个第三题有点问题,题目的意思应该是每次在GPU上计算就输出一次log和在GPU上计算完成后再输出log。
X = torch.rand((1000, 1000))
X_gpu = X.cuda(2)
X_gpu2 = X.cuda(2)
X_gpu2 is X_gpu
time_start = time.time()
for i in range(10000):
X_gpu = torch.mm(X_gpu,X_gpu)
print(torch.norm(X_gpu))
time_end = time.time()
print(f’gpu time cost: {round((time_end-time_start)*1000)}ms’)
time_start = time.time()
for i in range(10000):
X_gpu2 = torch.mm(X_gpu2,X_gpu2)
print(torch.norm(X_gpu2))
time_end = time.time()
print(f’gpu time cost: {round((time_end-time_start)*1000)}ms’)
为什么我的笔记本电脑输入 torch.cuda.device_count() 结果输出:0 ?我的电脑是有独立显卡的啊
你的是n卡还是a卡啊,cuda只有n卡才支持
mac可以使用mps代替cuda,不过index只可以取0
# 下面两行等价
device = torch.device(‘mps’)
device = torch.device(‘mps:0’)
# 可以使用如下代码检测mps是否可用
torch.has_mps
# 一般可以这么写
device = torch.device(‘mps’ if device.has_mps else ‘cpu’)