Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

[딥러닝/Pytorch/Python] Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument tensors in method wrapper_cat) / 딥러닝 GPU 사용안하고, CPU 사용하기

https://koreapy.tistory.com/m/1720

[딥러닝/Pytorch/Python] Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when

에러 메시지 Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument tensors in method wrapper_cat) 원인 동일한 디바이스가 아닌 멀티 디바이스에 텐서를 던

koreapy.tistory.com

1. 에러 메시지

RuntimeError: CUDA out of memory. Tried to allocate xx MiB (GPU xxx; xxx GiB total capacity; xxx GiB already allocated; xxx MiB free; xxx cached)

2. 문제

근본 원인: GPU의 램이 부족할 경우

3. 확인사항

$ nvidia-smi

로 현재 진행중인 process가 있는지 확인, 혹은 서버의 경우 다른 사람이 사용하고 있는지 여부 확인 후 GPU 램에 올라간 거 다 내려도 되는지 확인하고 진행(혼자 쓴다면, 램에 올라가 있는 데이터가 필요 없는지 확인)

>> 만약 nvidia-smi에 process가 아무것도 안뜬다면, 글 맨 마지막 쪽 RAM GPU 지우기 수행


3-1. 만약 누가 사용하고 있는 process가 있을 경우

해결 방안

1. 공용 클러스터일 경우

- 클러스터에 공용 GPU를 사용하고 있을 경우, 이미 다른 유저가 GPU를 점유하고 있어서, GPU 메모리 에러가 발생

- 이미 GPU램에 너무 많은 데이터가 올라가 있다.

해결방안: 누군가가 다 쓰길 기다린다.

3-2. 나 혼자 사용하고 있으며, GPU RAM이 모자를 경우

2. 로컬의 경우

클러스터나 서버가 아니라 내 모델이 로컬 GPU나 서버 GPU에서 나 혼자 쓰는데, 에러 메시지가 나올 경우

해결방안:

1. GPU RAM이 큰 GPU를 산다(GTX 3080) (실제로 MRI 데이터의 경우 full3dresolution으로 학습돌리면 최소 12GB의 GPU램이 확보되어야하고, 배치별로 다르긴 하겠지만 더 커야할 경우도 많이 발생)

2. 배치 사이즈를 줄이거나 한번에 보는 영역을 좀 좁혀서 메모리에 한번에 올려서 학습하게 되므로, 이를 조절해준다. 물론 trasform을 더 작게 해주는 등의 작업도 가능하다.

피하는 방법이 있지만 확실히 GPU 메모리 크기에 따라 다르다

  1. 데이터를 반복적으로 풀 때 GPU에 데이터를 로드하고,
features, labels in batch:
   features, labels = features.to(device), labels.to(device)
  1. FP_16 또는 단정밀도 float dtypes 사용 (즉, dtype 변경)
  2. 메모리가 부족한 경우 배치 크기를 줄여 보기 (배치 사이즈 감소)
  3. 메서드를 사용 .detach()하여 GPU에서 필요하지 않은 텐서를 제거 (불필요한 텐서가 있는지 확인해서 제거, 전처리 로직 달아주기)

그리고 배치가 길어질 경우, 이를 담는 것도 메모리에 부담이 될 수 있으므로 좀 줄여준다.

모든 배치에서 손실을 요약하려고 할 때 동일한 오류가 발생했습니다.

loss =  self.criterion(pred, label)

total_loss += loss

그런 다음 grads가 필요한 loss 대신 loss.item을 사용하여 문제를 해결했습니다.

loss =  self.criterion(pred, label)

total_loss += loss.item()
import torch
torch.cuda.empty_cache()

수동으로 변수 제거방법

점유된 cuda 메모리를 지우는 좋은 대안을 제공하며 다음을 사용하여 사용하지 않는 변수를 수동으로 지울 수도 있습니다.

import gc
del variables
gc.collect()

그러나 이러한 명령을 사용한 후에도 pytorch가 실제로 메모리를 지우지 않고 변수가 차지하는 메모리에 대한 참조를 지우기 때문에 오류가 다시 나타날 수 있습니다.

 따라서 커널을 다시 시작한 후 batch_size를 줄이고 최적의 batch_size를 찾는 것이 가능한 최선의 선택입니다(그러나 때때로 실현 가능한 것은 아닙니다).

GPU에서 메모리 할당에 대한 더 깊은 통찰력을 얻는 또 다른 방법은 다음을 사용하는 것입니다.

torch.cuda.memory_summary(device=None, abbreviated=False)

여기서 두 인수는 모두 선택 사항입니다. 

이것은 메모리 할당에 대한 읽을 수 있는 요약을 제공하고 CUDA가 메모리 부족을 실행하는 이유를 파악하고 오류가 다시 발생하지 않도록 커널을 다시 시작할 수 있습니다(제 경우와 마찬가지로).

데이터를 반복적으로 전달하면 도움이 될 수 있지만 네트워크 계층의 크기를 변경하거나 계층을 나누는 것도 효과적입니다(예를 들어 전이 학습을 수행하는 동안 모델이 상당한 메모리를 차지하기도 함).

출처: https://stackoverflow.com/questions/59129812/how-to-avoid-cuda-out-of-memory-in-pytorch

How to avoid "CUDA out of memory" in PyTorch

I think it's a pretty common message for PyTorch users with low GPU memory: RuntimeError: CUDA out of memory. Tried to allocate 😊 MiB (GPU 😊; 😊 GiB total capacity; 😊 GiB already allocated; 😊 MiB

stackoverflow.com


3-3. 딥러닝 중 강제 종료되어, GPU RAM에 불필요한 텐서들이 올라가 있어서 메모리 부족 에러가 날 경우

https://pulsar-kkaturi.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%99%EC%8A%B5-%EA%B0%95%EC%A0%9C-%EC%A4%91%EB%8B%A8%ED%96%88%EC%9D%84%EB%95%8C-GPU%EC%97%90-%EB%82%A8%EC%9D%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%95%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

리눅스 터미널에서 딥러닝 학습 강제 중단했을때 GPU에 남은 메모리 정리하는 방법

# 세줄요약 #  ps aux | grep python 명령어를 사용하여 딥러닝 학습을 실행시킨 python 파일의 실행 ID를 찾는다. 찾은 아이디가 예를 들어 '1234' 라면, sudo kill -9 1234 명령어를 사용하여 Kill 명령어를 내..

pulsar-kkaturi.tistory.com

GPU에 남은 램 지우기 

NVIDIA GPU RAM 지우기 파이토치

# 세줄요약 #

  1.  ps aux | grep python  명령어를 사용하여 딥러닝 학습을 실행시킨 python 파일의 실행 ID를 찾는다.
  2. 찾은 아이디가 예를 들어 '1234' 라면,  sudo kill -9 1234  명령어를 사용하여 Kill 명령어를 내린다.
  3. nvidia-smi 명령어로 GPU 메모리가 정리되었는지 확인한다.

# 상세리뷰 #

* 리눅스 터미널에서 ctrl+c 등으로 머신러닝 학습 프로세스를 강제로 종료할 시에는 간혹 프로세스가 완전히 종료되지 않고 GPU 메모리에 데이터가 남아있는 경우를 볼 수 있다.

* 이를 확인하려면 터미널 상에  nvidia-smi  명령어를 입력하여 GPU 가동 현황을 볼 수 있다.

Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

- 위와 같이 4개의 GPU 모두 사용 현황을 확인할 수 있는데 오른쪽에 'GPU-Util'을 보면 GPU가 가동 중이진 않으나(머신러닝 학습 시 GPU 가동 중일 경우 90% 이상으로 표시된다) 중간에 'Memory-Usage'를 보면 메모리가 가득 차 있는 것을 알 수 있다.

- 이러한 경우에는 다시 학습을 실행시키려할 경우 메모리가 가득차서 학습이 되지 않는다. 해결책은 아래와 같다.

1. ps aux | grep python  명령어를 사용하여 딥러닝 학습을 실행시킨 python 파일의 실행 ID를 찾는다.

>>> ps aux | grep pythonjovyan    4894 63.6 18.5 136732984 48807976 pts/2 Tl Apr06 565:54 python main.py

- 터미널에 명령어를 치면 위와 같이 나온다. python이 실행 중인 프로세스를 찾는 것.

- 실행 ID는 위의 예시의 경우에는 '4894'이다.

2. 찾은 아이디가 예를 들어 '1234' 라면,  sudo kill -9 1234  명령어를 사용하여 Kill 명령어를 내린다.

3. nvidia-smi 명령어로 GPU 메모리가 정리되었는지 확인한다. 

Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

- 처음 그림과 비교하면 이번에는 메모리도 모두 비워져있고, 아래에 프로세스 현황 또한 없는 것(No running processes found)을 확인할 수 있다.


[딥러닝] torch.cuda gpu 사용 불가능할 때 inference 하는 방법 / GPU에 저장하고, CPU에서 불러오기, GPU

1. torch에서 cuda.is_available로 cpu와 gpu 자원 체크하기 >>> import torch >>> torch.cuda.is_available() True >>> torch.cuda.device_count() 1 >>> torch.cuda.current_device() 0 >>> torch.cuda.device(0) >>> torch.cuda.get_device_name(0) 'GeForce GTX

koreapy.tistory.com

1. torch에서 cuda.is_available로 cpu와 gpu 자원 체크하기

>>> import torch

>>> torch.cuda.is_available()
True

>>> torch.cuda.device_count()
1

>>> torch.cuda.current_device()
0

>>> torch.cuda.device(0)


>>> torch.cuda.get_device_name(0)
'GeForce GTX 950M'
# 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_reserved(0)/1024**3,1), 'GB')
$ watch -n 2 nvidia-smi

This will continuously update the usage stats for every 2 seconds until you press ctrl+c


If you need more control on more GPU stats you might need, you can use more sophisticated version of nvidia-smi with --query-gpu=.... Below is a simple illustration of this:

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
0

which would output the stats something like:

Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

Note: There should not be any space between the comma separated query names in --query-gpu=.... Else those values will be ignored and no stats are returned.


Also, you can check whether your installation of PyTorch detects your CUDA installation correctly by doing:

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
1
features, labels in batch:
   features, labels = features.to(device), labels.to(device)
2

2. torch 모델로드할 때, 작업해주기

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
3

PYTORCH에서 다양한 장치 간 모델을 저장하고 불러오기[원문 보기]

다양한 장치(device)에서 당신의 신경망 모델을 저장하거나 불러오고 싶은 경우가 생길 수 있습니다.

개요

PyTorch를 사용하여 장치 간의 모델을 저장하거나 불러오는 것은 비교적 간단합니다. 이번 레시피에서는, CPU와 GPU에서 모델을 저장하고 불러오는 방법을 실험할 것입니다.

설정

이번 레시피에서 모든 코드 블록이 제대로 실행되게 하려면, 우선 런타임(runtime) 설정을 “GPU”나 더 높게 지정해주어야 합니다. 이후, 아래와 같이 ``torch``를 설치해야 PyTorch를 사용할 수 있습니다.

단계

  1. 데이터 활용에 필요한 모든 라이브러리 Import 하기
  2. 신경망을 구성하고 초기화하기
  3. GPU에서 저장하고 CPU에서 불러오기
  4. GPU에서 저장하고 GPU에서 불러오기
  5. CPU에서 저장하고 GPU에서 불러오기
  6. DataParallel 모델을 저장하고 불러오기

1. 데이터 활용에 필요한 모든 라이브러리 Import 하기

이번 레시피에서 우리는 torch 및 하위 패키지인 ``torch.nn``와 ``torch.optim``을 사용할 것입니다.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
4

2. 신경망을 구성하고 초기화하기

예로, 이미지 트레이닝을 위한 신경망을 생성해보겠습니다. 자세한 내용은 신경망 정의 레시피를 참조하세요.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
5

3. GPU에서 저장하고 CPU에서 불러오기

GPU로 학습된 모델을 CPU에서 불러올 때는 torch.load() 함수의 map_location 인자에 ``torch.device(‘cpu’)``를 전달합니다.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
6

이 경우, Tensor의 저장된 내용은 map_location 인자를 통하여 CPU 장치에 동적으로 재배치됩니다.

4. GPU에서 저장하고 GPU에서 불러오기

GPU에서 학습하고 저장된 모델을 GPU에서 불러올 때는, 초기화된 모델에 ``model.to(torch.device(‘cuda’))``을 호출하여 CUDA에 최적화된 모델로 변환해주세요.

그리고 모든 입력에 .to(torch.device('cuda')) 함수를 호출해야 모델에 데이터를 제공할 수 있습니다.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
7

my_tensor.to(device)``를 호출하면 GPU에 ``my_tensor``의 복사본이 반환되며, 이는 ``my_tensor``를 덮어쓰는 것이 아닙니다. 그러므로, Tensor를 직접 덮어써 주어야 한다는 것을 기억하세요: ``my_tensor = my_tensor.to(torch.device('cuda')).

5. CPU에서 저장하고 GPU에서 불러오기

CPU에서 학습하고 저장된 모델을 GPU에서 불러올 때는,``torch.load()``함수의 ``map_location``인자를 ``cuda:device_id``로 설정해주세요. 그러면 주어진 GPU 장치에 모델이 불러와 집니다.

모델의 매개변수 Tensor를 CUDA Tensor로 변환하기 위해, ``model.to(torch.device(‘cuda’))``를 호출해주세요.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
8

6. torch.nn.DataParallel 모델을 저장하고 불러오기

``torch.nn.DataParallel``은 병렬 GPU 활용을 가능하게 하는 모델 래퍼(wrapper)입니다.

DataParallel 모델을 범용적으로 저장하기 위해서는 ``model.module.state_dict()``을 사용하면 됩니다. 그러면 원하는 장치에 원하는 방식으로 유연하게 모델을 불러올 수 있습니다.

features, labels in batch:
   features, labels = features.to(device), labels.to(device)
9

PyTorch에서 다양한 장치 간에 모델을 성공적으로 저장하고 불러왔습니다.

더 알아보기

다른 레시피를 둘러보고 계속 배워보세요:


관련글

https://koreapy.tistory.com/1720

https://koreapy.tistory.com/1628


NVDIA GPU 확인

1. 작업표시줄 맨 우측(우하단)에서 nvidia Geforce Game ready 실행

2. 실행시 우상단에 보이는 공유버튼처럼 보이는 버튼 클릭 *(다음 스크린샷의 초록색)

Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

3. 클릭 후 뜨는 창에서 [성능] 버튼 클릭

단축키가 있었는데... 찾아봐야겠습니다. 블로그에도 올린 적이 있는데 검색이 안되네요...


(추가)시스템 정보 확인하기

시스템 정보 확인

loss =  self.criterion(pred, label)

total_loss += loss
0

리눅스 시스템 정보 확인하기

리눅스 시스템 정보(CPU, 메모리, 디스크, 네트워크 카드 등)를 확인하는 명령어에 대해 작성한 글입니다

zzsza.github.io


1. 코어수 확인하기

loss =  self.criterion(pred, label)

total_loss += loss
1

2. GPU 상세(온도, 팬사용량, 카드명칭 ,전력, 메모리사용량,GPU코어)

loss =  self.criterion(pred, label)

total_loss += loss
2

옵션

-d 변화된 수치에 인트를 넣어준다. 

-n 갱신 시간  위 예제에선 0.5초마다 갱신

Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

3. GPU 제품이름 확인하기

loss =  self.criterion(pred, label)

total_loss += loss
3
Tensorflow GPU 사용 확인 - Tensorflow GPU sayong hwag-in

[리눅스] 우분투에서 GPU 사용량 확인하기/ CPU수 확인하기

하드웨어적인 부분이 궁금하거나 할 때가 있는데 기본적으로 하드웨어의 정보들은 /proc/ 하위 디렉토리에 존재하게 된다 . 하지만 명령어를 통해 쉽게 찾아보자. 1. 코어수 확인하기 cat /proc/cpuinf