열정/연구 일지

Docker를 통해 Ubuntu 16.04, Python 3.7 환경 구축하기

lime9 2024. 7. 8. 13:39

환경 구성을 해야 하는데 패키지 충돌 및 구버전 지원 중단 등의 문제로 인해 애를 먹다 드디어 해결할 수 있다는 silver line이 보여서 작성하게 된 글...

 

환경 설정

연구 수행을 위해서 다음의 환경을 구성해야만 했다:

  • CUDA 9.0
  • Python 3
  • PyTorch 0.4.1

 호환되는 환경을 찾아본 결과 (공식 홈페이지에서 검색할 수 있다), 최종적으로 다음의 환경으로 구성해야 했다:

  • Ubuntu 16.04 또는 17.04 (CUDA 9.0와 호환되는 Ubuntu 버전)
  • Python 3.7 이상 (실행해야할 코드 내에 3.7 이상에서만 사용되는 구문이 들어가 있음)
  • PyTorch 0.4.1
  • CUDA 9.0
  • cuDNN 7.0 이상 (CUDA 9.0과 호환되는 버전)
 

CUDA Toolkit 9.0 Downloads

Get CUDA Toolkit 9.0 for Windows, Linux, and Mac OSX.

developer.nvidia.com

 

cuDNN Archive

Download releases from the GPU-accelerated primitive library for deep neural networks.

developer.nvidia.com

 

현재 내가 사용하고 있는 Ubuntu 버전은 22.04.... (매우 최신 버전)이므로 저 구닥다리 버전들을 당연히 지원할리가 없었다. 따라서 자연스럽게 Docker를 사용하고자 했다.

 

Ubuntu 22.04 내 Docker 환경 구축

2024.07.05 - [열정/연구 일지] - Ubuntu에 Docker 및 NVIDIA 도구 설치 및 사용 방법

 

Ubuntu에 Docker 및 NVIDIA 도구 설치 및 사용 방법

아무리 생각해도  docker가 아니면 연구를 진행할 수 없다고 판단했다... Docker 설치 방법1. 필요한 패키지 설치:sudo apt-get updatesudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release 2. GPG 키 추가:필

mydaydream.tistory.com

 

위의 글을 따라 docker 환경을 구축하면 된다.

 

문제 상황

처음에는 PyTorch에서 분명히 0.4.1+CUDA 9.0+cuDNN 7.0 환경에 대한 이미지를 공식 지원해줄 것이기 때문에 그 이미지를 pull하여 사용하기로 했다. 물론 해당 이미지를 지원해주고 있었고, 이미지를 간단하게 pull하여 코드를 돌려봤는데 에러가 발생하였다.

python 버전이 맞지 않는 오류였다. 해당 이미지는 Python 3.6 버전을 default로 사용하는 이미지였는데, 내가 사용할 코드는 Python 3.7 버전 이상부터만 사용 가능한 라이브러리를 사용해야만 했다.

 

해당 이미지 내에서 Python 3.7 버전으로 변경하려고 했지만... 어째서인지 python 3.7 버전을 찾을 수 없다는 에러가 발생했다. 지금 와서 생각해보면 해당 이미지가 지원하는 python 리스트에 python 3.7이 없는 문제인 것 같다.

 

따라서 기본적인 Ubuntu 이미지를 기반으로 그 내부에서 docker file을 통해 환경 구축을 하여 하나의 이미지를 빌드하고자 했다.

내가 사용하고자 하는 base image는 Ubuntu 16.04 LTS (17.04는 LTS가 아니라 16.04를 사용하기로 선택)이다. 따라서 Ubuntu에서 제공하는 16.04 image를 docker file 내부에서 가져와 사용하고, 그 외 나머지 패키지를 설치하여 사용하고자 했다.

 

FROM ubuntu:16.04

# Install basic dependencies
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    wget \
    ca-certificates

# Install CUDA 9.0
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin && \
    mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
    wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb && \
    dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb && \
    apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub && \
    apt-get update && \
    apt-get -y install cuda

# Install cuDNN 7.6 for CUDA 9.0
ENV CUDNN_VERSION 7.6.4.38
LABEL com.nvidia.cudnn.version="7.6.4"
RUN wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.4.38/Production/9.0_20190923/Ubuntu16_04-x64/libcudnn7-dev_7.6.4.38-1%2Bcuda9.0_amd64.deb && \
    dpkg -i libcudnn7-dev_7.6.4.38-1+cuda9.0_amd64.deb && \
    cp cuda/include/cudnn.h /usr/local/cuda-9.0/include && \
    cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64 && \
    chmod a+r /usr/local/cuda-9.0/include/cudnn.h /usr/local/cuda-9.0/lib64/libcudnn* && \
    rm -rf cuda libcudnn7-dev_7.6.4.38-1+cuda9.0_amd64.deb

# Install Python 3.7 and pip
RUN apt-get install -y --no-install-recommends \
    python3.7 \
    python3.7-dev \
    python3-pip

# Install PyTorch 0.4.1 and torchvision 0.2.1
RUN pip3 install torch==0.4.1 torchvision==0.2.1

# Set Python 3.7 as the default python version
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1

# Cleanup
RUN apt-get autoremove -y && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Set CUDA environment variables
ENV PATH=/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:-}

# Verify CUDA installation
RUN nvcc --version

 

하지만 문제가 또 발생했다.

cuDNN 7.6을 설치하는데에 중간에 user interaction이 필요했다. 지역 설정을 요하는 부분이 있는데, docker file 특성 상 사용자가 docker file 실행 중에는 키보드 입력이 불가능하다. 그뿐만이 아니라, python 3.7도 설치가 제대로 진행되지 않았다. 또 다른 방법을 강구해야 했다.

 

다음 방법은 docker file image build가 아닌 기본 ubuntu 16.04 이미지를 container로 실행하여 interaction하며 나머지 패키지를 설치하는 방법이었다. 가장 실현될 법한 방법이었다. 먼저 Ubuntu 16.04 이미지를 pull하여 실행한다. 현재 내가 pull해온 이미지들이다. 그 중 ubnutu:16.04를 container로 실행하면 된다.

docker pull ubuntu:16.04

docker image 현황

 

Container를 실행한다.

docker run -it ubuntu:16.04 /bin/bash

Ubuntu 16.04 container 실행

 

[1] Python 3.7 설치

자, 그럼 먼저 많은 문제를 일으켰던 python 3.7을 설치해보자. Ubuntu 16.04의 default python 버전은 python 3.5이다. 이 python version을 python 3.7로 변경해야 한다.

 

1. 필수 build dependencies 설치

apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

 

2. Python 다운로드

Python 다운로드 페이지에서 직접 Python 3.7을 다운로드 받는다.

wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz
tar -xf Python-3.7.12.tgz
cd Python-3.7.12

 

https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

 

3. Python configure와 compile

./configure --enable-optimizations
make -j$(nproc)
make altinstall

 

4. Python 설치 확인

python3.7 --version

Python 3.7 설치 완료

 

위의 명령어를 통해 Python 3.7이 정상적으로 설치되었는지 확인할 수 있다. 하지만 python3 --version 명령어로 확인해보면 사용하는 python version은 여전히 Python 3.5.2이다. 즉, default python 버전을 3.7로 변경해줘야 한다.

 

5. Python 3.7 경로 변경

먼저 설치된 위치가 root 디렉토리이므로 python이 설치되는 경로 (python 3.5.2의 위치)로 변경해주자.

mv Python-3.7.12 /usr/bin/

 

제대로 디렉토리가 이동되었는지 확인해보자.

ls | grep Python

경로 이동 확인

 

이렇게 Python-3.7.12가 출력되면 제대로 경로 이동이 된 것이다.

 

6. 기본 Python 버전 변경

alternatives에 python 3.7을 등록한다.

update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
update-alternatives --install /usr/bin/python3 python3 /usr/bin/Python-3.7.12/python 2

 

그 후, default python을 3.7로 변경한다. Selection에서 Python 3.7로 변경하면 된다.

update-alternatives --config python3

Python 3.7 버전 선택

7. Python 버전 확인

python3 --version

Python 버전 확인

 

default 버전이 Python 3.7.12로 변경된 것을 확인할 수 있다.