답변:
이것은 작동 할 것입니다 :
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.cuda.current_device()
것이 나에게 도움이되었다. 내 GPU가 불행히도 너무 오래되었다는 것을 보여 주었다. "큐다 기능이 3.0 인 GPU0 GeForce GTX 760을 찾았습니다. PyTorch는 더 이상이 GPU를 지원하지 않습니다."
torch.cuda.is_available()
여기에서 제안되지 않았으므로 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()
.
## neural network in pytorch
넣은 다음 끝에 코드를 추가하십시오. 여전히 장치 사용 중 : cuda; 할당 및 캐시 된 경우 0Gb 또한 for i in range(epoch):
역 전파 후 for 루프의 끝에 삽입하려고 시도했지만 여전히 0GB
my_tensor_on_gpu * my_tensor_on_cpu
은 실패합니다.
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.
훈련 루프 실행을 시작한 후 프로그램이 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/
watch
유용합니다
사무실 사이트와 시작 페이지에서 아래와 같이 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
이 모든 것은 까다 롭고 한 번만 이해하면 디버깅을 덜 처리하는 데 도움이됩니다.
M()
? 어디에 M
정의되어 있습니까?
사용 가능한 GPU가 있는지 확인하려면 :
torch.cuda.is_available()
위 함수가를 반환 False
하면
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
pytorch가 항상 제공 False
하기 때문에 여기에 있다면 torch.cuda.is_available()
GPU 지원없이 pytorch 버전을 설치했기 때문일 수 있습니다. (예 : 랩톱에서 코딩 한 다음 서버에서 테스트)
해결책은 pytorch 다운로드 페이지 에서 올바른 명령으로 pytorch를 제거하고 다시 설치하는 것 입니다. 이 pytorch 문제 도 참조하십시오 .
다음과 같이 GPU에서 텐서를 생성하십시오.
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
종료하지 말고 다른 터미널을 열고 파이썬 프로세스가 GPU를 사용하고 있는지 확인하십시오.
$ nvidia-smi
nvidia-smi
명령 행에서 포함되지 않는 해결책을 구체적으로 요청했다
nvidia-smi
.