ฉันต้องการทราบว่าpytorchใช้ GPU ของฉันหรือไม่ เป็นไปได้ที่จะตรวจสอบด้วยnvidia-smiหากมีกิจกรรมใด ๆ จาก GPU ในระหว่างกระบวนการ แต่ฉันต้องการสิ่งที่เขียนในpythonสคริปต์
มีวิธีทำเช่นนั้นหรือไม่?
ฉันต้องการทราบว่าpytorchใช้ GPU ของฉันหรือไม่ เป็นไปได้ที่จะตรวจสอบด้วยnvidia-smiหากมีกิจกรรมใด ๆ จาก GPU ในระหว่างกระบวนการ แต่ฉันต้องการสิ่งที่เขียนในpythonสคริปต์
มีวิธีทำเช่นนั้นหรือไม่?
คำตอบ:
มันจะไปทำงาน:
In [1]: import torch
In [2]: torch.cuda.current_device()
Out[2]: 0
In [3]: torch.cuda.device(0)
Out[3]: <torch.cuda.device at 0x7efce0b03be0>
In [4]: torch.cuda.device_count()
Out[4]: 1
In [5]: torch.cuda.get_device_name(0)
Out[5]: 'GeForce GTX 950M'
In [6]: torch.cuda.is_available()
Out[6]: True
นี้จะบอกฉันที่ GPU จะถูกใช้โดยGeForce GTX 950MPyTorch
torch.cuda.current_device()มีประโยชน์สำหรับฉัน มันแสดงให้เห็นว่าน่าเสียดายที่ GPU ของฉันเก่าเกินไป: "พบ GPU0 GeForce GTX 760 ซึ่งเป็นความสามารถของ cuda 3.0 PyTorch ไม่รองรับ GPU นี้อีกต่อไปเพราะมันเก่าเกินไป"
torch.cuda.is_available()
$ watch -n 2 nvidia-smiทำงานได้ สำหรับรายละเอียดเพิ่มเติมโปรดดูคำตอบของฉันด้านล่าง
ในขณะที่มันยังไม่ได้รับการเสนอชื่อที่นี่ฉันเพิ่มวิธีการใช้เช่นนี้จะมีประโยชน์มากเมื่อเริ่มต้นเทนเซอร์ในที่ถูกต้องtorch.devicedevice
# setting device on GPU if available, else CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
print()
#Additional Info when using cuda
if device.type == 'cuda':
print(torch.cuda.get_device_name(0))
print('Memory Usage:')
print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')
print('Cached: ', round(torch.cuda.memory_cached(0)/1024**3,1), 'GB')
เอาท์พุท:
Using device: cuda
Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached: 0.6 GB
ดังกล่าวข้างต้นการใช้deviceมันเป็นไปได้ที่ :
ในการย้ายเทนเซอร์ไปที่device:
torch.rand(10).to(device)หากต้องการสร้างเมตริกซ์โดยตรงบนdevice:
torch.rand(10, device=device)ซึ่งทำให้การสลับระหว่างCPUและGPUสบายโดยไม่ต้องเปลี่ยนรหัสจริง
เนื่องจากมีคำถามและความสับสนเกี่ยวกับหน่วยความจำแคชและการจัดสรรฉันจึงเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับมัน:
torch.cuda.max_memory_cached(device=None)
ส่งคืนหน่วยความจำ GPU สูงสุดที่จัดการโดยตัวจัดสรรแคชเป็นไบต์สำหรับอุปกรณ์ที่กำหนด
torch.cuda.memory_allocated(device=None)
ส่งคืนการใช้หน่วยความจำ GPU ปัจจุบันด้วยตัวนับหน่วยเป็นไบต์สำหรับอุปกรณ์ที่กำหนด
คุณสามารถมอบโดยตรงมากกว่าdeviceตามที่ระบุไว้ข้างต้นต่อไปในการโพสต์หรือคุณสามารถปล่อยให้มันไม่มีcurrent_device()และมันจะใช้
## neural network in pytorchแล้วฉันจะเพิ่มรหัสของคุณในตอนท้าย มันยังคงแสดงให้เห็นถึงการใช้อุปกรณ์: cuda; และ 0Gb สำหรับการจัดสรรและแคช ลองใส่ในตอนท้ายของ for loop for i in range(epoch):หลังจาก back-propagation, ทั้งหมด
my_tensor_on_gpu * my_tensor_on_cpuจะล้มเหลว
Found GPU0 GeForce GT 750M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability that we support is 3.5.
หลังจากที่คุณเริ่มใช้ลูปการฝึกอบรมหากคุณต้องการดูด้วยตนเองจากเทอร์มินัลว่าโปรแกรมของคุณใช้ทรัพยากร GPU และในระดับใดคุณสามารถใช้watchดังต่อไปนี้
$ watch -n 2 nvidia-smi
นี่จะอัปเดตสถิติการใช้งานอย่างต่อเนื่องทุก 2 วินาทีจนกว่าคุณจะกดctrl+c
หากคุณต้องการการควบคุมเพิ่มเติมเกี่ยวกับสถิติ GPU มากกว่าที่คุณอาจจำเป็นต้องคุณสามารถใช้รุ่นที่มีความซับซ้อนมากขึ้นของการnvidia-smi--query-gpu=...มี ด้านล่างเป็นตัวอย่างง่ายๆของสิ่งนี้:
$ watch -n 3 nvidia-smi --query-gpu=index,gpu_name,memory.total,memory.used,memory.free,temperature.gpu,pstate,utilization.gpu,utilization.memory --format=csv
ซึ่งจะแสดงสถิติเช่น:
หมายเหตุ : ไม่ควรมีพื้นที่ใด ๆ --query-gpu=...ระหว่างคั่นด้วยเครื่องหมายจุลภาคชื่อแบบสอบถามใน มิฉะนั้นค่าเหล่านั้นจะถูกละเว้นและจะไม่มีการส่งคืนสถิติ
นอกจากนี้คุณสามารถตรวจสอบว่าการติดตั้ง PyTorch ของคุณตรวจพบการติดตั้ง CUDA ของคุณอย่างถูกต้องหรือไม่โดยทำดังนี้
In [13]: import torch
In [14]: torch.cuda.is_available()
Out[14]: True
Trueสถานะหมายความว่า PyTorch มีการกำหนดค่าได้อย่างถูกต้องและมีการใช้ GPU แม้ว่าคุณจะต้องย้าย / วางเทนเซอร์ที่มีคำสั่งที่จำเป็นในรหัสของคุณ
หากคุณต้องการทำสิ่งนี้ภายในรหัส Python ให้ดูที่โมดูลนี้:
https://github.com/jonsafari/nvidia-ml-pyหรือใน pypi ที่นี่: https://pypi.python.org/pypi/nvidia-ml-py/
watchจะเป็นประโยชน์
บนไซต์สำนักงานและหน้าเริ่มต้นให้ตรวจสอบ GPU สำหรับ PyTorch ดังนี้:
import torch
torch.cuda.is_available()
การอ้างอิง: PyTorch | เริ่มต้นใช้งาน
จากมุมมองเชิงปฏิบัติเพียงหนึ่งพูดนอกเรื่องเล็กน้อย:
import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
นี้devตอนนี้รู้ว่า CUDA หรือซีพียู
และมีความแตกต่างวิธีที่คุณจัดการกับโมเดลและเทนเซอร์เมื่อย้ายไปยัง cuda มันค่อนข้างแปลกในตอนแรก
import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
t1 = torch.randn(1,2)
t2 = torch.randn(1,2).to(dev)
print(t1) # tensor([[-0.2678, 1.9252]])
print(t2) # tensor([[ 0.5117, -3.6247]], device='cuda:0')
t1.to(dev)
print(t1) # tensor([[-0.2678, 1.9252]])
print(t1.is_cuda) # False
t1=t1.to(dev)
print(t1) # tensor([[-0.2678, 1.9252]], device='cuda:0')
print(t1.is_cuda) # True
class M(nn.Module):
def __init__(self):
super().__init__()
self.l1 = nn.Linear(1,2)
def forward(self, x):
x = self.l1(x)
return x
model = M() # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True
ทั้งหมดนี้มีความซับซ้อนและเข้าใจเพียงครั้งเดียวช่วยให้คุณสามารถจัดการกับการดีบั๊กได้รวดเร็วขึ้น
M()อะไร อยู่ที่ไหนMกำหนด?
วิธีตรวจสอบว่ามี GPU หรือไม่:
torch.cuda.is_available()
หากผลตอบแทนที่ฟังก์ชั่นดังกล่าวข้างต้นFalse,
CUDA_VISIBLE_DEVICESจะถูกซ่อนไว้โดยตัวแปรสิ่งแวดล้อม เมื่อค่าเท่ากับCUDA_VISIBLE_DEVICES-1 อุปกรณ์ทั้งหมดของคุณจะถูกซ่อนอยู่ คุณสามารถตรวจสอบค่าในรหัสด้วยบรรทัดนี้:os.environ['CUDA_VISIBLE_DEVICES']หากฟังก์ชั่นด้านบนส่งคืนTrueซึ่งไม่จำเป็นต้องหมายความว่าคุณกำลังใช้ GPU อยู่ ใน Pytorch คุณสามารถจัดสรรเทนเซอร์กับอุปกรณ์เมื่อคุณสร้างพวกมัน cpuโดยค่าเริ่มต้นเทนเซอร์ได้รับการจัดสรรให้กับ ในการตรวจสอบว่าการจัดสรรเมตริกซ์ของคุณอยู่ที่ใด:
# assuming that 'a' is a tensor created somewhere else
a.device # returns the device where the tensor is allocated
โปรดทราบว่าคุณไม่สามารถใช้งานกับเทนเซอร์ที่จัดสรรในอุปกรณ์ต่าง ๆ ได้ หากต้องการดูวิธีการจัดสรรเมตริกซ์ให้กับ GPU ดูที่นี่: https://pytorch.org/docs/stable/notes/cuda.html
torch.cuda.is_available()เกือบทุกคำตอบที่นี่อ้างอิง อย่างไรก็ตามนั่นเป็นเพียงส่วนหนึ่งของเหรียญ มันบอกคุณว่า GPU (จริง ๆ แล้ว CUDA) พร้อมใช้งานหรือไม่ไม่ว่าจะใช้จริงหรือไม่ ในการตั้งค่าทั่วไปคุณจะต้องตั้งค่าอุปกรณ์ของคุณเป็นดังนี้:
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
แต่ในสภาพแวดล้อมที่มีขนาดใหญ่ขึ้น (เช่นการวิจัย) มันเป็นเรื่องธรรมดาที่จะให้ผู้ใช้มีตัวเลือกมากขึ้นดังนั้นจากอินพุตพวกเขาสามารถปิดใช้งาน CUDA ระบุ CUDA ID และอื่น ๆ ในกรณีเช่นนี้ไม่ว่าจะใช้ GPU หรือไม่ก็ตามขึ้นอยู่กับว่ามีให้หรือไม่ หลังจากตั้งค่าอุปกรณ์เป็นอุปกรณ์คบเพลิงคุณสามารถรับtypeคุณสมบัติของอุปกรณ์เพื่อตรวจสอบว่าเป็น CUDA หรือไม่
if device.type == 'cuda':
# do something
เพียงแค่จาก command prompt หรือสภาวะแวดล้อม Linux ให้รันคำสั่งต่อไปนี้
python -c 'import torch; print(torch.cuda.is_available())'
ควรพิมพ์ด้านบน True
python -c 'import torch; print(torch.rand(2,3).cuda())'
อันนี้ควรพิมพ์สิ่งต่อไปนี้:
tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
ถ้าคุณอยู่ที่นี่เพราะ pytorch ของคุณมักจะให้Falseสำหรับtorch.cuda.is_available()ว่าอาจเป็นเพราะคุณติดตั้งรุ่น pytorch ของคุณโดยการสนับสนุน GPU (เช่นคุณเขียนโค้ดไว้ในแล็ปท็อปแล้วทดสอบบนเซิร์ฟเวอร์)
ทางออกคือการถอนการติดตั้งและติดตั้ง pytorch อีกครั้งด้วยคำสั่งที่ถูกต้องจากหน้าดาวน์โหลด pytorch ยังหมายนี้ปัญหา pytorch
สร้างเมตริกซ์บน GPU ดังนี้:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
อย่าออกจากการเปิดเทอร์มินัลอื่นและตรวจสอบว่ากระบวนการไพ ธ อนกำลังใช้ GPU โดยใช้:
$ nvidia-smi
nvidia-smiจากบรรทัดคำสั่ง
nvidia-smiรวมทั้ง