Pytorch基础:torch.cuda.set_device函数

相关阅读

Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


torch.cuda.set_device函数用于设置当前使用的cuda设备,在当拥有多个可用的GPU且能被pytorch识别的cuda设备情况下(环境变量CUDA_VISIBLE_DEVICES可以影响GPU设备到cuda设备的映射)。

由于有些情况下,可以不显式写出cuda设备的编号,此时指的是当前使用的cuda设备,默认为cuda0设备,如下所示。

复制代码
import torch
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备

a=torch.tensor([1, 2, 3, 4, 5], device='cuda') # 在当前cuda设备上创建一个张量
print(a)

device=torch.device('cuda')                    # 创建一个当前cuda设备

b=torch.tensor([1, 2, 3, 4, 5], device=device) # 在当前cuda设备上创建一个张量
print(b)

c=torch.tensor([1, 2, 3, 4, 5]).to(device)     # 将张量移动到当前cuda设备
print(c)

d=torch.tensor([1, 2, 3, 4, 5]).to('cuda')     # 将张量移动到当前cuda设备
print(d)

e=torch.tensor([1, 2, 3, 4, 5]).cuda()         # 将张量移动到当前cuda设备
print(e)

f=torch.tensor([1, 2, 3, 4, 5]).cuda(device)   # 将张量移动到当前cuda设备
print(f)

输出:
当前cuda设备是 0
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:0')

可以看到上面几个例子的在创建和转移张量时,指定了没有编号的当前cuda字符串,创建和使用的设备也是没有编号的当前cuda设备,在使用.cuda()方法时也没有指定编号或者使用了当前cuda设备。

使用torch.cuda.set_device函数可以设置任意一个可用的cuda设备为当前cuda设备,这会影响有关当前cuda设备的命令,如下所示。

复制代码
import torch

torch.cuda.set_device(1)                            # 设置当前cuda设备编号为1
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
a=torch.tensor([1, 2, 3, 4, 5], device='cuda') # 在当前cuda设备上创建一个张量
print(a)

device=torch.device('cuda')                    # 创建一个当前cuda设备

torch.cuda.set_device(2)                       # 设置当前cuda设备编号为2
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
b=torch.tensor([1, 2, 3, 4, 5], device=device) # 在当前cuda设备上创建一个张量
print(b)

torch.cuda.set_device(0)                       # 设置当前cuda设备编号为0
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
c=torch.tensor([1, 2, 3, 4, 5]).to(device)     # 将张量移动到当前cuda设备
print(c)

torch.cuda.set_device(1)                       # 设置当前cuda设备编号为1
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
d=torch.tensor([1, 2, 3, 4, 5]).to('cuda')     # 将张量移动到当前cuda设备
print(d)

torch.cuda.set_device(2)                       # 设置当前cuda设备编号为2
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
e=torch.tensor([1, 2, 3, 4, 5]).cuda()         # 将张量移动到当前cuda设备
print(e)

torch.cuda.set_device(0)                       # 设置当前cuda设备编号为0
print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备
f=torch.tensor([1, 2, 3, 4, 5]).cuda(device)   # 将张量移动到当前cuda设备
print(f)

输出:
当前cuda设备是 1
tensor([1, 2, 3, 4, 5], device='cuda:1')
当前cuda设备是 2
tensor([1, 2, 3, 4, 5], device='cuda:2')
当前cuda设备是 0
tensor([1, 2, 3, 4, 5], device='cuda:0')
当前cuda设备是 1
tensor([1, 2, 3, 4, 5], device='cuda:1')
当前cuda设备是 2
tensor([1, 2, 3, 4, 5], device='cuda:2')
当前cuda设备是 0
tensor([1, 2, 3, 4, 5], device='cuda:0')

从上面的例子中,可以看出torch.cuda.set_device函数可以接受一个正整数参数作为编号,改变当前cuda设备。它还可以接受一个device对象作为参数,前提是这个device对象是有编号(即不能是当前cuda设备)。

复制代码
device =torch.device('cuda:1')
torch.cuda.set_device(device) # 这是可行的
device =torch.device('cuda')
torch.cuda.set_device(device) # 这是错误的,因为device是一个没有编号的当前cuda设备对象

输出:
ValueError: Expected a torch.device with a specified index or an integer, but got:cuda

pytorch官方不建议使用这个函数,而是直接显式指明有关cuda设备的编号,而不是依赖当前设备,如下所示。

复制代码
import torch

a=torch.tensor([1, 2, 3, 4, 5], device='cuda:1') # 在cuda1设备上创建一个张量
print(a)

device=torch.device('cuda:2')                  # 创建一个cuda2设备

b=torch.tensor([1, 2, 3, 4, 5], device=device) # 在cuda2设备上创建一个张量
print(b)

c=torch.tensor([1, 2, 3, 4, 5]).to(device)     # 将张量移动到cuda2设备
print(c)

d=torch.tensor([1, 2, 3, 4, 5]).to('cuda:0')   # 将张量移动到cuda0设备
print(d)

e=torch.tensor([1, 2, 3, 4, 5]).cuda(1)        # 将张量移动到cuda1设备
print(e)

f=torch.tensor([1, 2, 3, 4, 5]).cuda(device)   # 将张量移动到cuda2设备
print(f)

输出:
tensor([1, 2, 3, 4, 5], device='cuda:1')
tensor([1, 2, 3, 4, 5], device='cuda:2')
tensor([1, 2, 3, 4, 5], device='cuda:2')
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:1')
tensor([1, 2, 3, 4, 5], device='cuda:2')
相关推荐
曲幽7 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
魏祖潇7 小时前
AI 能记住了,但能自己干活吗?——看懂执行系统,你就知道它怎么完成复杂任务
人工智能·ai编程
Lkstar8 小时前
Function Calling 原理深度拆解:让 LLM 调用外部工具的机制与工具设计原则
人工智能·llm
荣码8 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
IT_陈寒8 小时前
Vue的响应式真把我坑惨了,原来问题出在这
前端·人工智能·后端
武子康8 小时前
调查研究-190 Continue.dev 被 Cursor 收购:AI 编程工具正从“插件竞争“迈入“平台整合“阶段
人工智能·ai编程·cursor
武子康8 小时前
调查研究-189 Kronos 调研:金融 K 线基础模型,是真突破,还是量化圈的新玩具?
人工智能·深度学习·openai
东坡肘子9 小时前
Swift 还让你 Excited 吗?-- 肘子的 Swift 周报 #141
人工智能·swiftui·swift
nujnewnehc9 小时前
不会 py, 用 ai 写了个游戏辅助的感受
人工智能·游戏
兵慌码乱17 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理