에코프로.AI

[CUDA] 2. pytorch에서 GPU를 사용하는 방법 본문

AI Tutorial

[CUDA] 2. pytorch에서 GPU를 사용하는 방법

AI_HitchHiker 2025. 1. 8. 12:23

https://miro.medium.com/v2/resize:fit:1400/1*droP75TUXXXfAAzPs-c4WA.png


CUDA를 설치하지 않으셨으면 아래의 링크를 통해서 선행 설치해야 진행가능합니다.

[CUDA] 1. 소개 및 설치 for windows(Feat. GTX 1650)

 


Check GPU

  • GPU 가용성 확인
    GPU에 액세스할 수 있는지 확인하는 가장 쉬운 방법은 torch.cuda.is_available()을 호출하는 것입니다. True를 반환하면 시스템에 torch버전에 맞는 CUDA가 올바르게 설치되어 있다는 뜻입니다.
import torch
torch.cuda.is_available()

 

  • 현재 선택한 디바이스의 인덱스를 가져옵니다. 
torch.cuda.current_device()

 

  • 사용 가능한 GPU 수를 확인합니다.
torch.cuda.device_count()

 

  • 디바이스 이름을 가져옵니다.
torch.cuda.get_device_name(0)

 

  • 사용 가능한 CPU,GPU를 반환합니다.
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)

 

Use GPU

GPU사용
  • PyTorch는 CPU에서 생성된 텐서를 GPU로 전송하기 위해 사용하기 쉬운 API를 제공합니다. 다행히도 새로운 텐서는 부모 텐서와 동일한 device(장치)에서 생성됩니다.
X_train = X_train.to(device)
X_train.is_cuda

  • 텐서를 GPU에 배치하려면 .cuda()를 호출하면 됩니다
X_train= torch.FloatTensor([0., 1., 2.])
X_train = X_train.cuda()
X_train.is_cuda

 

CPU 사용
  • 기본적으로 텐서는 CPU에서 생성됩니다. 모델도 CPU에서 초기화됩니다. 따라서 GPU를 사용하여 작업이 수행되는지 수동으로 확인해야 합니다.
X_train = torch.FloatTensor([0., 1., 2.])
X_train.is_cuda

  • 텐서를 CPU에 배치하려면 .cpu()를 호출하면 됩니다.
    ※ .cuda() or .cpu() 둘다 설정 안하는 경우 기본은 cpu로 처리 합니다.
X_train= torch.FloatTensor([0., 1., 2.])
X_train = X_train.cpu()
X_train.is_cuda

 


 

CUDA 성능 테스트

그리 성능이 좋지 않은 GTX1650 인데요, GPU가 CPU보다 거의 10배 정도 빠른 것을 알 수 있습니다.

구분 GPU(CUDA) CPU
평균 추론 시간 (ms) 4.10 38.27
초당 처리량 ( FPS) 243.78 26.13

 

GPU(CUDA)
import torch                               # PyTorch 메인 라이브러리 임포트
import torchvision.models as models        # 사전 학습된 모델을 사용하기 위한 torchvision 모델 임포트
import time                                # 시간 측정을 위한 time 라이브러리 임포트

# CUDA 설정
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  # CUDA 사용 가능 여부 확인 후 디바이스 설정
torch.backends.cudnn.benchmark = True                                  # CUDA 연산 최적화를 위한 벤치마크 모드 활성화

# 모델 생성 및 GPU 이동
model = models.resnet18(pretrained=True).to(device)  # 사전 학습된 ResNet18 모델을 불러와서 지정된 디바이스로 이동
model.eval()                                         # 모델을 평가 모드로 설정 (학습 모드 비활성화)

# 테스트용 입력 데이터 생성
input_tensor = torch.rand(1, 3, 224, 224).to(device) # 1개의 배치, 3채널, 224x224 크기의 랜덤 입력 텐서 생성

# CUDA 이벤트 생성
start = torch.cuda.Event(enable_timing=True)   # CUDA 이벤트 시작점 생성
end = torch.cuda.Event(enable_timing=True)     # CUDA 이벤트 종료점 생성

# 워밍업 (첫 실행의 초기화 시간 제외)
# 초기화 오버헤드를 제외하기 위해 10회 예비 실행
for _ in range(10):
    _ = model(input_tensor)

# 성능 측정
times = []
for _ in range(100):                            # 100회 반복 측정
    start.record()                              # 시작 시간 기록
    output = model(input_tensor)                # 모델 추론 실행
    end.record()                                # 종료 시간 기록
    
    torch.cuda.synchronize()                    # GPU 연산 완료 대기
    times.append(start.elapsed_time(end))       # 경과 시간을 리스트에 추가

# 결과 출력
avg_time = sum(times) / len(times)              # 평균 실행 시간 계산
print(f'평균 추론 시간: {avg_time:.2f} ms')     # 밀리초 단위로 평균 시간 출력
print(f'초당 처리량: {1000/avg_time:.2f} FPS')  # 초당 프레임 수(FPS) 출력

 

결과 값

 

CPU
import torch                            # PyTorch 메인 라이브러리 임포트
import torchvision.models as models     # 사전 학습된 모델을 사용하기 위한 torchvision 모델 임포트
import time                             # 시간 측정을 위한 time 라이브러리 임포트

# CPU 설정
device = torch.device('cpu')            # CPU를 연산 디바이스로 설정

# 모델 생성
model = models.resnet18(pretrained=True).to(device)  # 사전 학습된 ResNet18 모델을 불러와서 CPU로 설정
model.eval()                                         # 모델을 평가 모드로 설정 (배치 정규화, 드롭아웃 등 비활성화)

# 테스트용 입력 데이터 생성
# 랜덤 입력 텐서 생성
#  1: 배치 크기
#  3: RGB 채널
#  224x224: 이미지 크기
input_tensor = torch.rand(1, 3, 224, 224).to(device)

# 워밍업 (첫 실행의 초기화 시간 제외)
# 초기 실행시 발생하는 오버헤드를 제외하기 위한 예비 실행
for _ in range(10):
    _ = model(input_tensor)

# 성능 측정
times = []
for _ in range(100):                              # 100회 반복 측정
    start_time = time.time()                      # 시작 시간 기록
    output = model(input_tensor)                  # 모델 추론 실행
    end_time = time.time()                        # 종료 시간 기록
    times.append((end_time - start_time) * 1000)  # ms(밀리초) 단위로 변환하여 저장

# 결과 출력
avg_time = sum(times) / len(times)                # 평균 실행 시간 계산
print(f'평균 추론 시간: {avg_time:.2f} ms')       # 밀리초 단위로 평균 시간 출력
print(f'초당 처리량: {1000/avg_time:.2f} FPS')    # 초당 처리할 수 있는 이미지 수 계산

 

결과 값

 

 

[참고사이트]

https://wandb.ai/wandb/common-ml-errors/reports/How-To-Use-GPU-with-PyTorch---VmlldzozMzAxMDk

 

 

 

끝~