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)
실제 코드를 변경하지 않고도 CPU 와 GPU 간 전환이 편리 합니다.
편집하다:
캐시 및 할당 된 메모리 에 대한 몇 가지 질문과 혼란이 있었 으므로 추가 정보를 추가하고 있습니다.
-
torch.cuda.max_memory_cached(device=None)
주어진 장치에 대해 캐싱 할당자가 관리하는 최대 GPU 메모리를 바이트 단위로 반환합니다.
-
torch.cuda.memory_allocated(device=None)
주어진 장치에 대한 텐서의 현재 GPU 메모리 사용량을 바이트 단위로 반환합니다.
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
하면
- GPU가 없거나
- 또는 Nvidia 드라이버가 설치되지 않았으므로 OS에 GPU가 표시되지 않습니다.
- 또는 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 사용 여부는 사용 가능한지 여부에 따라 다릅니다. 장치가 토치 장치로 설정되면 type
CUDA인지 여부를 확인하는 속성을 얻을 수 있습니다 .
if device.type == 'cuda':
# do something