Câu trả lời:
Đâ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
.
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ũ."
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
thự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 .
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 device
nó có 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 CPU và GPU thoải mái mà không thay đổi mã thực tế.
Vì đã có một số câu hỏi và nhầm lẫn về bộ nhớ được phân bổ và lưu trữ , tôi đang thêm một số thông tin bổ sung về nó:
torch.cuda.max_memory_cached(device=None)
Trả về bộ nhớ GPU tối đa được quản lý bởi bộ cấp phát bộ đệm theo byte cho một thiết bị nhất định.
torch.cuda.memory_allocated(device=None)
Trả về mức sử dụng bộ nhớ GPU hiện tại bằng các tenx theo byte cho một thiết bị nhất định.
Bạn có thể trực tiếp bàn giao một device
như đượ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()
.
## 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
my_tensor_on_gpu * my_tensor_on_cpu
sẽ thất bạ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.
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 watch
như 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-smi
vớ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ư:
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
True
trạ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/
watch
rất hữu ích
Trên trang web văn phòng và trang bắt đầu, hãy kiểm tra GPU cho PyTorch như sau:
import torch
torch.cuda.is_available()
Tham khảo: PyTorch | Bắt đầu
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 dev
bâ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.
M()
gì Trường hợp được M
xác định?
Để kiểm tra xem có sẵn GPU hay không:
torch.cuda.is_available()
Nếu hàm trên trả về False
,
CUDA_VISIBLE_DEVICES
. Khi giá trị CUDA_VISIBLE_DEVICES
là -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
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
Đơ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')
Nếu bạn ở đây vì pytorch của bạn luôn cung cấp False
cho 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.
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
nvidia-smi
dòng lệnh
nvidia-smi
.