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


10
이것은 단지이 장치들이 머신에서 사용 가능하다는 것을 보여 주지만 각 GPU에서 얼마나 많은 메모리를 사용하고 있는지 알 수 없는지 모르겠습니다.
kmario23

4
달리는 torch.cuda.current_device()것이 나에게 도움이되었다. 내 GPU가 불행히도 너무 오래되었다는 것을 보여 주었다. "큐다 기능이 3.0 인 GPU0 GeForce GTX 760을 찾았습니다. PyTorch는 더 이상이 GPU를 지원하지 않습니다."
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ kmario23 지적 해 주셔서 감사합니다. 정보를 제공하는 함수 호출이 있습니까 (각 GPU에서 사용중인 메모리 양)? :)
Nathan

1
@frank Yep,이 명령 $ watch -n 2 nvidia-smi은 간단합니다 . 자세한 내용은 아래 내 답변을 참조하십시오 .
kmario23

75

여기에서 제안되지 않았으므로 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().


코드를 시도했지만 그래픽 카드를 인식하지만 할당 및 캐시는 모두 0GB입니다. 정상입니까 아니면 구성해야합니까?
KubiK888

@ KubiK888 만약 계산을하지 않았다면 이것이 정상입니다. PyTorch 내에서 GPU 모델을 감지 할 수는 있지만 액세스 할 수는 없습니다. GPU에서 일부 계산을 시도하면 값이 변경되는 것을 볼 수 있습니다.
MBT

이 자습서 ( analyticsvidhya.com/blog/2018/02/pytorch-tutorial)를 기반으로 .py 스크립트를 만듭니다 . 특히로 시작하는 섹션을 복사 / 붙여 ## neural network in pytorch넣은 다음 끝에 코드를 추가하십시오. 여전히 장치 사용 중 : cuda; 할당 및 캐시 된 경우 0Gb 또한 for i in range(epoch):역 전파 후 for 루프의 끝에 삽입하려고 시도했지만 여전히 0GB
KubiK888

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

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/


2
PyTorch는 캐시 된 GPU 메모리 할당자를 사용합니다. 완전히 사용하더라도 nividia-smi의 GPU-Utill이 낮을 수 있습니다.
Jakub Bielan 2016 년

1
@JakubBielan 감사합니다! 이것에 대한 더 많은 참고 자료를 제공해 주시겠습니까?
kmario23

1
watch유용합니다
javadba


15

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

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

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


1
무엇입니까 M()? 어디에 M정의되어 있습니까?
Sycorax

1
nn.Module의 하위 클래스로 정의 된 일부 클래스 M으로 업데이트되었습니다. 캐치 주셔서 감사합니다.
prosti

9

사용 가능한 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


5

여기에 거의 모든 답변이 참조 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

연구원을위한 좋은 팁.
prosti

3

명령 프롬프트 나 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()GPU 지원없이 pytorch 버전을 설치했기 때문일 수 있습니다. (예 : 랩톱에서 코딩 한 다음 서버에서 테스트)

해결책은 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.