Làm thế nào để kiểm tra xem pytorch có đang sử dụng GPU không?


160

Tôi muốn biết nếu pytorchđang sử dụng GPU của tôi. Có thể phát hiện nvidia-sminếu có bất kỳ hoạt động nào từ GPU trong quá trình, nhưng tôi muốn một cái gì đó được viết bằng một pythontập lệnh.

Có cách nào để làm vậy không?

Câu trả lời:


259

Đây là đi làm:

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

Điều này cho tôi biết GPU GeForce GTX 950Mđang được sử dụng PyTorch.


10
Tôi nghĩ rằng điều này chỉ cho thấy rằng các thiết bị này có sẵn trên máy nhưng tôi không chắc liệu bạn có thể nhận được bao nhiêu bộ nhớ đang được sử dụng từ mỗi GPU hay không ..
kmario23

4
chạy torch.cuda.current_device()là hữu ích cho tôi. Điều đó cho thấy gpu của tôi không may quá cũ: "Đã tìm thấy GPU0 GeForce GTX 760, có khả năng cuda 3.0. PyTorch không còn hỗ trợ GPU này vì nó quá cũ."
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ kmario23 Cảm ơn bạn đã chỉ ra điều này. Có cuộc gọi chức năng nào cung cấp cho chúng tôi thông tin đó không (mỗi GPU được sử dụng bao nhiêu bộ nhớ)? :)
Nathan

1
@frank Yep, đơn giản là lệnh này: $ watch -n 2 nvidia-smithực hiện công việc. Để biết thêm chi tiết, xin vui lòng xem câu trả lời của tôi dưới đây .
kmario23

75

Vì nó chưa được đề xuất ở đây, tôi đang thêm một phương thức bằng cách sử dụng torch.device, vì điều này khá tiện dụng, cũng như khi khởi tạo các tenxơ đúng device.

# 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')

Đầu ra:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

Như đã đề cập ở trên, sử dụng devicecó thể :

  • Để di chuyển tenxơ đến tương ứng device:

    torch.rand(10).to(device)
  • Để tạo một tenxơ trực tiếp trên device:

    torch.rand(10, device=device)

Điều này làm cho việc chuyển đổi giữa CPUGPU thoải mái mà không thay đổi mã thực tế.


Biên tập:

Vì đã có một số câu hỏi và nhầm lẫn về bộ nhớ được phân bổlưu trữ , tôi đang thêm một số thông tin bổ sung về nó:


Bạn có thể trực tiếp bàn giao một devicenhư được chỉ định ở trên trong bài viết hoặc bạn có thể để lại Không và nó sẽ sử dụng current_device().


Tôi đã thử mã của bạn, nó nhận ra card đồ họa nhưng được cấp phát và lưu trữ đều là 0GB. Nó là bình thường hay tôi cần phải cấu hình chúng?
KubiK888

@ KubiK888 Nếu bạn chưa thực hiện bất kỳ tính toán nào trước khi điều này là hoàn toàn bình thường. Cũng không chắc là bạn có thể phát hiện mô hình GPU trong PyTorch nhưng không truy cập được. Hãy thử thực hiện một số tính toán trên GPU và bạn sẽ thấy rằng các giá trị thay đổi.
MBT

Tôi tạo một tập lệnh .py dựa trên hướng dẫn này - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Đặc biệt sao chép / dán phần bắt đầu bằng ## neural network in pytorch, sau đó tôi thêm mã của bạn vào cuối. Nó vẫn hiển thị Sử dụng thiết bị: cuda; và 0Gb cho phân bổ và lưu trữ. Cũng đã thử chèn nó vào cuối vòng lặp for for i in range(epoch):sau khi truyền ngược lại, tất cả vẫn là 0GB
KubiK888

1
@ KubiK888 Bạn phải nhất quán, bạn không thể thực hiện các thao tác trên các thiết bị. Bất kỳ hoạt động như thế my_tensor_on_gpu * my_tensor_on_cpusẽ thất bại.
MBT

2
Câu trả lời của bạn rất hay nhưng đối với dòng gán thiết bị đầu tiên, tôi muốn chỉ ra rằng chỉ vì có sẵn một thiết bị cuda, không có nghĩa là chúng ta có thể sử dụng nó. Ví dụ: tôi có cái này trong máy tính cũ đáng tin cậy của tôi: 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

Sau khi bạn bắt đầu chạy vòng đào tạo, nếu bạn muốn xem thủ công từ thiết bị đầu cuối xem chương trình của bạn có sử dụng tài nguyên GPU hay không và ở mức độ nào, thì bạn có thể chỉ cần sử dụng watchnhư trong:

$ watch -n 2 nvidia-smi

Điều này sẽ liên tục cập nhật số liệu thống kê sử dụng cứ sau 2 giây cho đến khi bạn nhấn ctrl+c


Nếu bạn cần kiểm soát nhiều hơn về số liệu thống kê GPU nhiều hơn bạn có thể cần, bạn có thể sử dụng phiên bản tinh vi hơn nvidia-smivới--query-gpu=... . Dưới đây là một minh họa đơn giản về điều này:

$ 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

mà sẽ xuất ra các số liệu thống kê như:

nhập mô tả hình ảnh ở đây

Lưu ý : Không nên có bất kỳ khoảng trắng nào giữa các tên truy vấn được phân tách bằng dấu phẩy --query-gpu=.... Khác những giá trị đó sẽ bị bỏ qua và không có số liệu thống kê được trả lại.


Ngoài ra, bạn có thể kiểm tra xem cài đặt PyTorch của bạn có phát hiện chính xác cài đặt CUDA của bạn hay không bằng cách thực hiện:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

Truetrạng thái có nghĩa là PyTorch được cấu hình chính xác và đang sử dụng GPU mặc dù bạn phải di chuyển / đặt các thang đo với các câu lệnh cần thiết trong mã của mình.


Nếu bạn muốn làm điều này bên trong mã Python, thì hãy xem xét mô-đun này:

https://github.com/jonsafari/nvidia-ml-py hoặc bằng pypi tại đây: https://pypi.python.org/pypi/nvidia-ml-py/


2
Chỉ cần nhớ rằng PyTorch sử dụng bộ cấp phát bộ nhớ GPU được lưu trữ. Bạn có thể thấy GPU-Utill thấp cho nividia-smi ngay cả khi nó được sử dụng đầy đủ.
Jakub Bielan

1
@JakubBielan cảm ơn! bạn có thể vui lòng cung cấp một tài liệu tham khảo để đọc thêm về điều này?
kmario23

1
Điều đó watchrất hữu ích
javadba


15

Từ quan điểm thực tế chỉ là một lạc đề nhỏ:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

Điều này devbây giờ biết nếu cuda hoặc cpu.

Và có một sự khác biệt về cách bạn đối phó với mô hình và với các tenxơ khi chuyển sang cuda. Đó là một chút lạ lúc đầu.

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

Tất cả điều này là khó khăn và hiểu nó một lần, giúp bạn giải quyết nhanh chóng với ít gỡ lỗi.


1
M()gì Trường hợp được Mxác định?
Sycorax

1
Cập nhật với một số lớp M được định nghĩa là một lớp con của nn.Module. Cảm ơn đã bắt.
prosti

9

Để kiểm tra xem có sẵn GPU hay không:

torch.cuda.is_available()

Nếu hàm trên trả về False,

  1. bạn không có GPU
  2. hoặc trình điều khiển Nvidia chưa được cài đặt để HĐH không nhìn thấy GPU,
  3. hoặc GPU đang bị ẩn bởi biến môi trường CUDA_VISIBLE_DEVICES. Khi giá trị CUDA_VISIBLE_DEVICESlà -1, thì tất cả các thiết bị của bạn đang bị ẩn. Bạn có thể kiểm tra giá trị đó trong mã với dòng này:os.environ['CUDA_VISIBLE_DEVICES']

Nếu chức năng trên trả về Trueđiều đó không nhất thiết có nghĩa là bạn đang sử dụng GPU. Trong Pytorch, bạn có thể phân bổ các tenxơ cho các thiết bị khi bạn tạo chúng. Theo mặc định, các tenxơ được phân bổ cho cpu. Để kiểm tra vị trí tenor của bạn được phân bổ, hãy làm:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated

Lưu ý rằng bạn không thể hoạt động trên các thang đo được phân bổ trong các thiết bị khác nhau. Để xem cách phân bổ một tenxơ cho GPU, hãy xem tại đây: https://pytorch.org/docs/urdy/notes/cuda.html


5

Hầu như tất cả các câu trả lời ở đây tham khảo torch.cuda.is_available(). Tuy nhiên, đó chỉ là một phần của đồng tiền. Nó cho bạn biết liệu GPU (thực sự là CUDA) có khả dụng hay không, liệu nó có thực sự được sử dụng hay không. Trong một thiết lập thông thường, bạn sẽ đặt thiết bị của mình giống như thế này:

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

nhưng trong các môi trường lớn hơn (ví dụ như nghiên cứu), thông thường cũng cung cấp cho người dùng nhiều tùy chọn hơn, do đó, dựa trên đầu vào, họ có thể vô hiệu hóa CUDA, chỉ định ID CUDA, v.v. Trong trường hợp như vậy, việc GPU có được sử dụng hay không không chỉ dựa trên việc nó có khả dụng hay không. Sau khi thiết bị đã được đặt thành thiết bị đèn pin, bạn có thể lấy thuộc tính của thiết bị typeđể xác minh xem đó có phải là CUDA hay không.

if device.type == 'cuda':
    # do something

Lời khuyên tốt đẹp cho các nhà nghiên cứu.
prosti

3

Đơn giản là từ dấu nhắc lệnh hoặc môi trường Linux chạy lệnh sau.

python -c 'import torch; print(torch.cuda.is_available())'

Ở trên nên in True

python -c 'import torch; print(torch.rand(2,3).cuda())'

Cái này nên in như sau:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')

2

Nếu bạn ở đây vì pytorch của bạn luôn cung cấp Falsecho torch.cuda.is_available()điều đó có thể là do bạn đã cài đặt phiên bản pytorch của mình mà không hỗ trợ GPU. (Ví dụ: bạn đã mã hóa trong máy tính xách tay sau đó thử nghiệm trên máy chủ).

Giải pháp là gỡ cài đặt và cài đặt lại pytorch với lệnh bên phải từ trang tải xuống pytorch . Cũng đề cập đến vấn đề pytorch này.


1
Mặc dù những gì bạn đã viết có liên quan đến câu hỏi. Câu hỏi là: "Làm thế nào để kiểm tra xem pytorch có đang sử dụng GPU không?" và không "Tôi có thể làm gì nếu PyTorch không phát hiện GPU của tôi?" Vì vậy, tôi sẽ nói rằng câu trả lời này không thực sự thuộc về câu hỏi này. Nhưng bạn có thể tìm thấy một câu hỏi khác về vấn đề cụ thể này, nơi bạn có thể chia sẻ kiến ​​thức của mình. Nếu không, bạn thậm chí có thể viết một câu hỏi và tự trả lời nó để giúp đỡ những người khác có cùng vấn đề!
MBT

-4

Tạo một tenxơ trên GPU như sau:

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

Không thoát, mở một thiết bị đầu cuối khác và kiểm tra xem quy trình python có đang sử dụng GPU hay không:

$ nvidia-smi

2
Tôi đặc biệt yêu cầu một giải pháp không liên quan đến nvidia-smidòng lệnh
vinzee

Vâng, về mặt kỹ thuật, bạn luôn có thể phân tích cú pháp đầu ra bất kỳ công cụ dòng lệnh nào, bao gồm nvidia-smi.
khứ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.