จะตรวจสอบว่า pytorch ใช้ GPU ได้อย่างไร?


160

ฉันต้องการทราบว่าpytorchใช้ GPU ของฉันหรือไม่ เป็นไปได้ที่จะตรวจสอบด้วยnvidia-smiหากมีกิจกรรมใด ๆ จาก GPU ในระหว่างกระบวนการ แต่ฉันต้องการสิ่งที่เขียนในpythonสคริปต์

มีวิธีทำเช่นนั้นหรือไม่?

คำตอบ:


259

มันจะไปทำงาน:

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


10
ฉันคิดว่านี่เป็นเพียงการแสดงให้เห็นว่าอุปกรณ์เหล่านี้มีอยู่ในเครื่อง แต่ฉันไม่แน่ใจว่าคุณจะได้รับจำนวนหน่วยความจำที่ใช้จาก GPU แต่ละเครื่องหรือไม่ ..
kmario23

4
การวิ่งtorch.cuda.current_device()มีประโยชน์สำหรับฉัน มันแสดงให้เห็นว่าน่าเสียดายที่ GPU ของฉันเก่าเกินไป: "พบ GPU0 GeForce GTX 760 ซึ่งเป็นความสามารถของ cuda 3.0 PyTorch ไม่รองรับ GPU นี้อีกต่อไปเพราะมันเก่าเกินไป"
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ kmario23 ขอบคุณที่ชี้ให้เห็น มีการเรียกใช้ฟังก์ชันที่ให้ข้อมูลกับเรา (GPU แต่ละหน่วยใช้หน่วยความจำเท่าไร)? :)
นาธาน

1
@frank ใช่แล้วเพียงแค่คำสั่งนี้: $ watch -n 2 nvidia-smiทำงานได้ สำหรับรายละเอียดเพิ่มเติมโปรดดูคำตอบของฉันด้านล่าง
kmario23

75

ในขณะที่มันยังไม่ได้รับการเสนอชื่อที่นี่ฉันเพิ่มวิธีการใช้เช่นนี้จะมีประโยชน์มากเมื่อเริ่มต้นเทนเซอร์ในที่ถูกต้อง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()และมันจะใช้


ฉันลองใช้รหัสของคุณแล้วจะรู้จักการ์ดกราฟิก แต่การจัดสรรและแคชมีทั้ง 0GB เป็นเรื่องปกติหรือฉันจำเป็นต้องกำหนดค่าหรือไม่
KubiK888

@ KubiK888 หากคุณยังไม่ได้ทำการคำนวณใด ๆ มาก่อนนี่เป็นเรื่องปกติอย่างสมบูรณ์ เป็นไปได้ค่อนข้างยากที่คุณสามารถตรวจจับโมเดล GPU ภายใน PyTorch แต่ไม่สามารถเข้าถึงได้ ลองทำการคำนวณบางอย่างกับ GPU และคุณจะเห็นว่าค่ามีการเปลี่ยนแปลง
MBT

ฉันจะสร้างสคริปต์ .py อยู่บนพื้นฐานของการกวดวิชานี้ - analyticsvidhya.com/blog/2018/02/pytorch-tutorial โดยเฉพาะอย่างยิ่งคัดลอก / วางส่วนที่ขึ้นต้นด้วย## neural network in pytorchแล้วฉันจะเพิ่มรหัสของคุณในตอนท้าย มันยังคงแสดงให้เห็นถึงการใช้อุปกรณ์: cuda; และ 0Gb สำหรับการจัดสรรและแคช ลองใส่ในตอนท้ายของ for loop for i in range(epoch):หลังจาก back-propagation, ทั้งหมด
0GB

1
@ KubiK888 คุณต้องสอดคล้องกันคุณไม่สามารถดำเนินการข้ามอุปกรณ์ได้ การดำเนินการใด ๆ เช่นmy_tensor_on_gpu * my_tensor_on_cpuจะล้มเหลว
MBT

2
คำตอบของคุณดีมาก แต่สำหรับบรรทัดการมอบหมายอุปกรณ์แรกฉันต้องการจะชี้ให้เห็นว่าเพียงเพราะมีอุปกรณ์ cuda อยู่ไม่ได้หมายความว่าเราสามารถใช้งานได้ ตัวอย่างเช่นฉันมีสิ่งนี้ในคอมพิวเตอร์เครื่องเก่าของฉันที่เชื่อถือได้: 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.
hekimgil

44

หลังจากที่คุณเริ่มใช้ลูปการฝึกอบรมหากคุณต้องการดูด้วยตนเองจากเทอร์มินัลว่าโปรแกรมของคุณใช้ทรัพยากร 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/


2
เพียงจำไว้ว่า PyTorch ใช้ตัวจัดสรรหน่วยความจำ GPU ที่แคชไว้ คุณอาจเห็น GPU-Utill ต่ำสำหรับ nividia-smi แม้ว่ามันจะใช้อย่างเต็มที่ก็ตาม
Jakub Bielan

1
@JakubBielan ขอบคุณ! คุณช่วยกรุณาอ้างอิงสำหรับการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้?
kmario23

1
ที่watchจะเป็นประโยชน์
javadba


15

จากมุมมองเชิงปฏิบัติเพียงหนึ่งพูดนอกเรื่องเล็กน้อย:

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

ทั้งหมดนี้มีความซับซ้อนและเข้าใจเพียงครั้งเดียวช่วยให้คุณสามารถจัดการกับการดีบั๊กได้รวดเร็วขึ้น


1
คือM()อะไร อยู่ที่ไหนMกำหนด?
Sycorax

1
อัปเดตด้วยคลาส M บางตัวที่กำหนดเป็นคลาสย่อยของ nn.Module ขอบคุณสำหรับการจับ
prosti

9

วิธีตรวจสอบว่ามี GPU หรือไม่:

torch.cuda.is_available()

หากผลตอบแทนที่ฟังก์ชั่นดังกล่าวข้างต้นFalse,

  1. คุณไม่มี GPU
  2. หรือไดรเวอร์ Nvidia ยังไม่ได้รับการติดตั้งดังนั้นระบบปฏิบัติการจึงไม่เห็น GPU
  3. หรือ GPU 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


5

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

เคล็ดลับที่ดีสำหรับนักวิจัย
prosti

3

เพียงแค่จาก 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')

2

ถ้าคุณอยู่ที่นี่เพราะ pytorch ของคุณมักจะให้Falseสำหรับtorch.cuda.is_available()ว่าอาจเป็นเพราะคุณติดตั้งรุ่น pytorch ของคุณโดยการสนับสนุน GPU (เช่นคุณเขียนโค้ดไว้ในแล็ปท็อปแล้วทดสอบบนเซิร์ฟเวอร์)

ทางออกคือการถอนการติดตั้งและติดตั้ง pytorch อีกครั้งด้วยคำสั่งที่ถูกต้องจากหน้าดาวน์โหลด pytorch ยังหมายนี้ปัญหา pytorch


1
แม้ว่าสิ่งที่คุณเขียนจะเกี่ยวข้องกับคำถาม คำถามคือ: "จะตรวจสอบว่า pytorch ใช้ GPU ได้อย่างไร" และไม่ใช่"ฉันต้องทำอย่างไรหาก PyTorch ตรวจไม่พบ GPU ของฉัน" ดังนั้นฉันจะบอกว่าคำตอบนี้ไม่ได้เป็นของคำถามนี้ แต่คุณอาจพบคำถามอื่นเกี่ยวกับปัญหาเฉพาะนี้ซึ่งคุณสามารถแบ่งปันความรู้ของคุณ ถ้าไม่ใช่คุณสามารถเขียนคำถามและตอบคำถามด้วยตัวเองเพื่อช่วยเหลือผู้อื่นในประเด็นเดียวกัน!
MBT

-4

สร้างเมตริกซ์บน GPU ดังนี้:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

อย่าออกจากการเปิดเทอร์มินัลอื่นและตรวจสอบว่ากระบวนการไพ ธ อนกำลังใช้ GPU โดยใช้:

$ nvidia-smi

2
ฉันขอเฉพาะโซลูชันที่ไม่มีส่วนเกี่ยวข้องnvidia-smiจากบรรทัดคำสั่ง
vinzee

ดีในทางเทคนิคคุณสามารถแยกการส่งออกเครื่องมือบรรทัดคำสั่งใด ๆ nvidia-smiรวมทั้ง
Pastafarianist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.