Ubuntu 실습(1)

zeusqoi·2026년 9월 4일

개인공부

목록 보기
8/42

이번에는 Ubuntu 환경에서 TensorFlow를 설치하고 NVIDIA GPU를 연결한 뒤, TensorFlow 공식 Quickstart를 따라 MNIST 손글씨 숫자 분류 실습을 진행했다.

앞선 글에서 Miniconda와 PyCharm까지 설정했기 때문에, 이번에는 Conda 환경을 활용해 TensorFlow 개발 환경을 구축했다.


1. Conda 가상환경 활성화

앞서 생성해 둔 test 환경을 사용했다.

conda activate test

2. TensorFlow 설치

TensorFlow와 GPU 사용에 필요한 NVIDIA 라이브러리를 함께 설치했다.

python -m pip install "tensorflow[and-cuda]"

설치 후 TensorFlow 버전을 확인했다.

python -c "import tensorflow as tf; print(tf.__version__)"
2.21.0

3. GPU 인식 확인

TensorFlow에서 GPU가 정상적으로 인식되는지 확인했다.

python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

처음에는 다음과 같이 출력되었다.

[]

또한 다음과 같은 오류 메시지가 나타났다.

Cannot dlopen some GPU libraries.
Skipping registering GPU devices...

NVIDIA 드라이버 자체는 nvidia-smi를 통해 정상적으로 인식되고 있었기 때문에, TensorFlow가 CUDA 관련 라이브러리를 찾을 수 있도록 추가 설정을 진행했다.


4. CUDA 라이브러리 연결

TensorFlow 패키지 디렉터리로 이동했다.

cd "$CONDA_PREFIX/lib/python3.10/site-packages/tensorflow"

이후 NVIDIA 라이브러리를 TensorFlow에서 사용할 수 있도록 심볼릭 링크를 생성했다.

bash -c 'ln -svf ../nvidia/*/lib/*.so* .'

Zsh 환경에서는 *를 포함한 명령어가 정상적으로 처리되지 않는 경우가 있어서 bash -c를 사용했다.


5. ptxas 연결

CUDA 컴파일러에 포함된 ptxas 파일의 위치를 찾았다.

find ../nvidia -name ptxas -type f -print

찾은 ptxas를 Conda 환경의 bin 디렉터리에 연결했다.

ln -sf "$(find ../nvidia -name ptxas -type f -print -quit)" "$CONDA_PREFIX/bin/ptxas"

6. CUDA 라이브러리 경로 설정

이후 TensorFlow가 CUDA 라이브러리를 찾을 수 있도록 LD_LIBRARY_PATH를 설정했다.

LD_LIBRARY_PATH="$CONDA_PREFIX/lib/python3.10/site-packages/tensorflow:$LD_LIBRARY_PATH" python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

이번에는 다음과 같이 GPU가 정상적으로 인식되었다.

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

7. Conda 환경에 GPU 설정 적용

처음에는 .zshrc에 직접 환경변수를 추가했지만, Conda의 base 환경이 활성화되는 시점과 경로가 맞지 않는 문제가 있었다.

그래서 test 환경을 활성화할 때만 자동으로 환경변수가 설정되도록 변경했다.

mkdir -p "$CONDA_PREFIX/etc/conda/activate.d"
echo 'export LD_LIBRARY_PATH="$CONDA_PREFIX/lib/python3.10/site-packages/tensorflow:$LD_LIBRARY_PATH"' > "$CONDA_PREFIX/etc/conda/activate.d/tensorflow.sh"

이후:

conda deactivate
conda activate test

다시 GPU를 확인했다.

python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

새 터미널에서도 동일하게 GPU가 인식되는 것을 확인했다.


8. TensorFlow 공식 Quickstart 실습

GPU 환경 설정이 완료되었으니 TensorFlow 공식 튜토리얼인 MNIST 손글씨 숫자 분류를 실습했다.

프로젝트 폴더를 만들었다.

mkdir -p ~/tensorflow-study
cd ~/tensorflow-study

그리고 mnist.py 파일을 생성했다.

nano mnist.py

9. MNIST 데이터셋 불러오기

먼저 TensorFlow와 MNIST 데이터셋을 불러왔다.

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0

MNIST는 손글씨 숫자 이미지 데이터셋이고, 각각의 이미지는 28×28 픽셀로 구성되어 있다.

픽셀값을 0~255에서 0~1 범위로 정규화했다.


10. 신경망 모델 생성

간단한 Sequential 모델을 구성했다.

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10)
])

각 계층의 역할은 다음과 같다.

  • Flatten: 28×28 이미지를 1차원 데이터로 변환
  • Dense(128): 128개의 뉴런으로 특징 학습
  • Dropout(0.2): 과적합 방지를 위해 일부 뉴런을 무작위로 제외
  • Dense(10): 숫자 0~9까지 10개의 클래스 출력

11. 모델 컴파일

손실 함수와 최적화 알고리즘을 설정했다.

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model.compile(
    optimizer='adam',
    loss=loss_fn,
    metrics=['accuracy']
)

여기서는 Adam 최적화 알고리즘과 SparseCategoricalCrossentropy 손실 함수를 사용했다.


12. 모델 학습

MNIST 학습 데이터를 이용해 모델을 5번 반복 학습시켰다.

model.fit(
    x_train,
    y_train,
    epochs=5
)

실행 결과:

Epoch 1/5
accuracy: 0.9137 - loss: 0.2975

Epoch 2/5
accuracy: 0.9581 - loss: 0.1426

Epoch 3/5
accuracy: 0.9679 - loss: 0.1075

Epoch 4/5
accuracy: 0.9736 - loss: 0.0869

Epoch 5/5
accuracy: 0.9772 - loss: 0.0731

학습이 진행될수록 정확도는 상승하고 손실값은 감소하는 것을 확인할 수 있었다.


13. 테스트 데이터 평가

학습에 사용하지 않은 테스트 데이터를 이용해 모델의 성능을 확인했다.

model.evaluate(x_test, y_test, verbose=2)

최종 결과:

313/313 - 1s - 3ms/step
accuracy: 0.9774
loss: 0.0748

최종 테스트 정확도는 약 97.74%로, 학습 데이터뿐만 아니라 테스트 데이터에서도 높은 정확도를 보여 정상적으로 학습되었음을 확인했다.


14. 실제 GPU 사용 확인

처음 GPU 라이브러리 문제를 해결한 후 MNIST를 다시 실행했을 때 다음과 같은 로그가 출력되었다.

Loaded cuDNN version 9250

또한:

Compiled cluster using XLA!

메시지도 확인할 수 있었다.

이를 통해 TensorFlow가 CUDA/cuDNN 환경을 정상적으로 로드하고 GPU 연산을 수행할 수 있는 상태임을 확인했다.

최종적으로 NVIDIA GeForce RTX 4070을 사용하는 TensorFlow GPU 환경 구축에 성공했다.


마무리

이번 실습을 통해 단순히 TensorFlow를 설치하는 것에서 끝나는 것이 아니라,

Ubuntu
  ↓
NVIDIA Driver
  ↓
RTX 4070
  ↓
CUDA / cuDNN
  ↓
TensorFlow 2.21.0
  ↓
MNIST 신경망 학습

까지 직접 연결해 볼 수 있었다.

특히 처음에는 TensorFlow에서 GPU가 빈 리스트로 인식되지 않았지만, CUDA 라이브러리 경로와 ptxas를 설정한 후 정상적으로 GPU가 인식되었다.

0개의 댓글