[python] Pytorch가 GPU를 사용하고 있는지 확인하는 방법은 무엇입니까?

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 950M가 사용하고 있음을 알려줍니다 PyTorch.


답변

여기에서 제안되지 않았으므로 torch.device올바른 텐서를 초기화 할 때도 매우 편리하기 때문에을 사용하는 방법을 추가하고 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')

산출:

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)

실제 코드를 변경하지 않고도 CPUGPU 간 전환이 편리 합니다.


편집하다:

캐시할당 된 메모리 에 대한 몇 가지 질문과 혼란이 있었 으므로 추가 정보를 추가하고 있습니다.

device게시물에서 위에 명시된대로 직접 넘겨 주거나 None을 남겨두면 을 사용합니다 current_device().


답변

훈련 루프 실행을 시작한 후 프로그램이 GPU 리소스를 사용하고 있는지 어느 정도까지 터미널에서 수동으로 보고 싶다면 다음 watch과 같이 간단히 사용할 수 있습니다 .

$ watch -n 2 nvidia-smi

ctrl+ 를 누를 때까지 2 초마다 사용 통계가 지속적으로 업데이트됩니다.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를 사용하여.


파이썬 코드 에서이 작업을 수행하려면이 모듈을 살펴보십시오.

https://github.com/jonsafari/nvidia-ml-py 또는 여기 pypi : https://pypi.python.org/pypi/nvidia-ml-py/


답변

사무실 사이트와 시작 페이지에서 아래와 같이 PyTorch의 GPU를 확인하십시오.

import torch
torch.cuda.is_available()

참조 : PyTorch | 시작하기


답변

실질적인 관점에서 단 하나의 사소한 왜곡 :

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

이것은 dev지금의 경우 CUDA 또는 CPU를 알고있다.

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

이 모든 것은 까다 롭고 한 번만 이해하면 디버깅을 덜 처리하는 데 도움이됩니다.


답변

사용 가능한 GPU가 있는지 확인하려면 :

torch.cuda.is_available()

위 함수가를 반환 False하면

  1. GPU가 없거나
  2. 또는 Nvidia 드라이버가 설치되지 않았으므로 OS에 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


답변

여기에 거의 모든 답변이 참조 torch.cuda.is_available()됩니다. 그러나 그것은 동전의 한 부분 일뿐입니다. 실제로 사용 중인지 여부가 아니라 GPU (실제 CUDA)를 사용할 수 있는지 여부를 알려줍니다. 일반적인 설정에서는 다음과 같이 장치를 설정합니다.

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

그러나 더 큰 환경 (예 : 연구)에서는 사용자에게 더 많은 옵션을 제공하는 것이 일반적이므로 입력을 기반으로 CUDA를 비활성화하고 CUDA ID를 지정할 수 있습니다. 이 경우 GPU 사용 여부는 사용 가능한지 여부에 따라 다릅니다. 장치가 토치 장치로 설정되면 typeCUDA인지 여부를 확인하는 속성을 얻을 수 있습니다 .

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