TensorFlow

우분투 컴퓨터에 텐서플로우 설치 무조건 따라하기 (3) - 메모리할당 증가

LEEHANDS 2023. 11. 8. 10:37
반응형
List Description COMMAND
OS UBUNTU 22.04.3 LTS lsb_release -a
GPU NVIDIA GTX 1650 nvidia-smi
CPU Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz lscpu
KERNEL 6.3.0-rc3+ uname -r

 

NVIDIA 그래픽카드와 Tensorflow 관련 라이브러리를 모두 따라서 설치했다면 샘플코드 실행시 문제가 없을 것입니다.

다만 필자는 메모리부족현상을 겪었는데 로그를 보면 그래픽카드 메모리보다 낮은 할당이 되어있는 것이 문제였습니다.

그래서 GPT 에게 물어봐서 해결했습니다.

 

우분투 쉘에 아래와 같이 타이핑 후 Enter 만하면된다.

export TF_GPU_ALLOCATOR=cuda_malloc_async

 

필자의 그래픽카드는 4G 의 메모리를 가졌기때문에 위 문구를 추가해서 완전히 해결되었습니다.

 

참고로 위 설정은 부팅시마다 해줘야하기때문에 환경변수에 저장하여 전역으로 적용될 수 있도록해도됩니다.

vim /etc/environment 파일 아래 추가합니다.

TF_GPU_ALLOCATOR=cuda_malloc_async

 

그리고 샘플코드 실행시 아래 로그처럼 메모리가 할당 잘됨을 알 수 있습니다.

 

 Created device /job:localhost/replica:0/task:0/device:GPU:0 with 2586 MB memory: 

> device: 0, name: NVIDIA GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5

 

이 코드는 아래 깃랩을 통해 소스코드 다운로드 받을 수 있습니다.

 

https://gitlab.leehands.com/nh/hoby/opencv/-/tree/03_traing_by_using_opencv_images/traing_image?ref_type=heads

 

traing_image · 03_traing_by_using_opencv_images · NH / hoby / opencv · GitLab

GitLab Community Edition

gitlab.leehands.com

 

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
import os
import random

# GPU 메모리 관리 설정 변경
#gpus = tf.config.experimental.list_physical_devices('GPU')
#if gpus:
#    for gpu in gpus:
#        tf.config.experimental.set_memory_growth(gpu, True)

# 이미지 크기 설정 (폭과 높이를 모델에 맞게 조정)
image_size = (640,480)
batch_size = 2  # 배치 크기 증가

train_datagen = ImageDataGenerator(
    rescale=1./255,  # 이미지를 [0, 1] 범위로 정규화
    rotation_range=20,  # 무작위 회전
    width_shift_range=0.2,  # 가로 방향으로 무작위 이동
    height_shift_range=0.2,  # 세로 방향으로 무작위 이동
    shear_range=0.2,  # 전단 변환 적용
    zoom_range=0.2,  # 무작위 확대/축소
    horizontal_flip=True,  # 수평 뒤집기
    fill_mode='nearest'  # 경계에서 생성된 픽셀 값 채우기
)

validation_datagen = ImageDataGenerator(rescale=1./255)

# 훈련 및 검증 데이터 생성자 생성
train_generator = train_datagen.flow_from_directory(
    'images/train',  # 훈련 데이터 디렉토리 설정
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'  # 이진 분류
)

validation_generator = validation_datagen.flow_from_directory(
    'images/validation',  # 검증 데이터 디렉토리 설정
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

# 모델 정의
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(640, 480, 3)),
    MaxPooling2D(2, 2),
    Flatten(),
    Dense(64, activation='relu'),
    Dense(1, activation='sigmoid')
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 모델 훈련
history = model.fit(
    train_generator,
    steps_per_epoch=len(train_generator),
    epochs=1000,
    validation_data=validation_generator,
    validation_steps=len(validation_generator)
)

# 훈련 결과 확인
train_loss, train_acc = model.evaluate(train_generator, steps=len(train_generator))
validation_loss, validation_acc = model.evaluate(validation_generator, steps=len(validation_generator))

print(f"Training Loss: {train_loss}, Training Accuracy: {train_acc}")
print(f"Validation Loss: {validation_loss}, Validation Accuracy: {validation_acc}")

 

이정도에 문제가 없었다면 이제 진정한 AI 학습의 길이 열려있겠습니다.

 

 

 

반응형