-1. 요약
-1.1. Makefile
- Docker 환경에서 CUDA를 활용해 특정 소프트웨어 빌드와 실행을 관리하기 위한 설정들을 포함
- make build를 수행하면, Docker 이미지를 빌드
- make run을 수행하면,
- SAM과 grounding DINO 에 대한 weight를 여기서 설정하고 다운로드
- 설정된 옵션들과 함께 Docker 컨테이너를 실행
- 1.2. Dockerfile
- Docker 이미지를 생성하기 위한 구성 파일
- 이미지에
- 패키지들 설치
- segment_anything / GroundingDINO 설치
- ENTRYPOINT: python main.py
0. 사용법
0.1. Dockerfile 실행
- Dockerfile은
컨테이너 이미지를 빌드하기 위한 명령어 모음
- Dockerfile을 실행하기 위해서는 Docker가 설치된 환경이 필요
- Docker 설치:
- Docker가 아직 설치되지 않았다면, Docker 공식 웹사이트에서
- Docker Desktop (Windows/Mac) 또는 Docker Engine (Linux)을 설치
- Dockerfile 위치 확인: Dockerfile이 있는 디렉토리로 터미널이나 명령 프롬프트에서 이동
- 이미지 빌드:
docker build -t image_name:tag .
-t image_name:tag
는 빌드된 이미지에 이름(image_name
)과 태그(tag
)를 지정
- 태그는 생략 가능하며, 생략 시
latest
가 기본값으로 사용
- 마지막의
.
는 Dockerfile이 현재 디렉토리에 있다는 것을 의미
- 컨테이너 실행:
docker run -it image_name:tag
- 여기서
-it
는 컨테이너를 대화형 터미널 모드로 실행하게 함
- 다양한 옵션을 추가하여 네트워크 설정, 볼륨 마운트 등을 구성할 수 있음
0.2. Makefile 실행
- Makefile은 여러 명령어를 묶어 빌드, 테스트, 배포 등을 자동화하는 스크립트 파일
- Makefile을 실행하기 위해선 일반적으로
make
도구가 필요
- Make 도구 설치:
- 대부분의 UNIX 기반 시스템에는 이미
make
가 설치되어 있음
- Windows 사용자는 Cygwin, MinGW, WSL 등을 통해
make
를 설치할 수 있음
- Makefile 위치 확인:
- Makefile이 있는 디렉토리로 터미널을 이동
- Make 실행:
make target_name
target_name
은 Makefile 내에 정의된 타겟을 의미
- 타겟은 특정 작업(예: 컴파일, 테스트 실행 등)을 지칭하며, 이를 지정하지 않으면 Makefile의 첫 번째 타겟이 실행
0.3. 정리
- Dockerfile은 컨테이너 이미지를 만들고 실행하는 데 사용되며, Makefile은 일련의 빌드 및 관리 작업을 자동화하는 데 사용됩니다.
1. Makefile
- 이 Makefile은, Docker 환경에서 CUDA를 활용해 특정 소프트웨어 빌드와 실행을 관리하기 위한 설정들을 포함
1.0. Makefile에 적혀있는 주석
- CUDA 버전 확인 및 활성화:
- "Get version of CUDA and enable it for compilation if CUDA > 11.0" 이 부분은 CUDA의 버전을 확인하고, 만약 설치된 CUDA의 버전이 11.0을 초과한다면 컴파일에 CUDA를 활성화하겠다는 의미
- 문제 해결 참조:
- CUDA 버전을 확인하고 설정하는 과정이 GitHub의 두 이슈(#53과 #84)를 해결한다고 언급
- 이 이슈들은 아마도 Docker 환경에서 프로젝트를 실행할 때 발생하는 CUDA 관련 문제들일 것
- NVCC 설치 확인:
- 'nvcc'는 NVIDIA CUDA Compiler의 약자로, CUDA 코드를 컴파일하는 데 사용됨
- CUDA 프로그래밍 언어로 작성된 코드를 컴파일 (GPU에서 실행할 수 있는 형식으로 변환)
- 설치되어 있지 않다면, CUDA를 사용할 수 없음을 의미하며, 이 경우 스크립트는 CUDA를 사용하지 않고 진행할 것
1.1. CUDA 버전 확인 및 설정
- NVCC 확인:
NVCC
변수는 which nvcc
명령어를 사용하여 시스템에 설치된 CUDA 컴파일러의 경로를 찾음
- 만약
nvcc
가 설치되어 있지 않다면, NVCC
변수는 비어 있게 됩니다.
- CUDA 사용 여부 설정:
ifeq ($(NVCC),)
구문은 NVCC
변수가 비어 있는지 확인
- 만약 NVCC가 설치되어 있지 않다면,
USE_CUDA
변수를 0으로 설정하고, NVCC_VERSION
을 "not installed"로 설정
- 반대로 NVCC가 있다면, CUDA 버전을 확인하고, 그 버전이 11.0을 초과하는지 확인하여
USE_CUDA
변수를 설정
- CUDA 아키텍처 목록 설정:
- 만약
USE_CUDA
가 1이라면(즉, 사용 가능한 CUDA 버전이 설치되어 있다면), TORCH_CUDA_ARCH_LIST
변수에 지원되는 CUDA 아키텍처 목록을 설정
- 그렇지 않다면
TORCH_CUDA_ARCH_LIST
를 비워 CUDA 지원 메시지를 설정
- 설명
TORCH_CUDA_ARCH_LIST
는 PyTorch 프레임워크에서 사용되는 변수로, NVIDIA GPU 아키텍처의 버전 목록을 나타냄
- 이 변수는 PyTorch가 GPU에서 코드를 컴파일할 때, 어떤 GPU 아키텍처를 지원할지를 명시하는 데 사용
- 여기서 "아키텍처"는 GPU의 설계나 구조를 의미하며, 각 아키텍처에는 서로 다른 기능과 성능 특성이 있음
- 예를 들어, NVIDIA는 여러 세대의 GPU 아키텍처를 가지고 있으며, 각각의 이름이나 코드명이 있음
- 예를 들어 "Turing", "Volta", "Pascal" 등
TORCH_CUDA_ARCH_LIST
에 지정된 아키텍처들은 PyTorch가 그에 맞게 최적화된 코드를 생성할 수 있게 해줌
- 이는 PyTorch가 다양한 종류의 GPU에서 최고의 성능을 발휘할 수 있도록 돕습니다.
- 각 아키텍처에 대응하는 숫자들(예: "3.5;5.0;6.0;6.1;7.0;7.5;8.0;8.6+PTX")은 특정 NVIDIA GPU 아키텍처의 버전을 나타냄
- 따라서, 이 목록을 설정함으로써 개발자는 특정 CUDA 버전이 설치된 시스템에서 PyTorch가 사용할 수 있는 GPU 아키텍처를 정확하게 지정할 수 있음
1.2. 빌드 및 실행 설정
- 빌드 명령:
build:
타겟에서는 docker build
명령어를 사용하여 Docker 이미지를 빌드
- CUDA 사용 여부(
USE_CUDA
)와 CUDA 아키텍처(TORCH_ARCH
)를 빌드 인자로 넘김
- 빌드 완료 후, CUDA 지원 여부에 따른 메시지(
BUILD_MESSAGE
)를 출력
- 실행 명령:
run:
타겟에서는 필요한 모델 파일들이 workspace 디렉터리에 없을 경우, 이를 다운로드
- SAM과 grounding DINO 에 대한 weight를 여기서 설정하고 다운로드
- 그 후, 설정된 옵션들과 함께 Docker 컨테이너를 실행
- 이때 GPU를 활용하도록 설정하며, X11 디스플레이 서버와 호스트의
/workspace
디렉터리를 컨테이너와 공유
- 실행할 대상(
$(target)
)은 명령어 라인에서 지정할 수 있습니다.
- 여기서 실행할 대상이란, grounded-SAM을 돌리려는 대상 이미지들이나 폴더를 의미.
1.3. 핵심 목적
- 이 Makefile은 CUDA가 제대로 설치되고 지원되는 환경에서, 특정 소프트웨어(여기서는 'Grounded-Segment-Anything'와 관련된 모델)를 빌드하고 실행하는 과정을 자동화
- CUDA 버전에 따라 다르게 처리하여, 최적화된 환경에서 소프트웨어를 실행할 수 있도록 도와줌
2. Dockerfile
- 이 Dockerfile은 Docker 이미지를 생성하기 위한 구성 파일
- PyTorch 기반의 환경을 설정하고, 여러 추가 의존성들을 설치하여 사용자의 프로젝트를 실행할 수 있게 준비
2.1. 베이스 이미지 선택
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
이미지를 베이스 이미지로
- 이 이미지는 PyTorch 1.13.1, CUDA 11.6, 그리고 cuDNN 8을 포함한 개발 버전
2.2. 빌드 인자 설정
ARG USE_CUDA=0
ARG TORCH_ARCH=
USE_CUDA
: CUDA 사용 여부를 결정하는 빌드 인자입니다. 기본값은 0(사용 안 함)입니다.
TORCH_ARCH
: PyTorch가 컴파일될 때 고려할 GPU 아키텍처를 지정합니다.
2.3. 환경 변수 설정
ENV AM_I_DOCKER True
ENV BUILD_WITH_CUDA "${USE_CUDA}"
ENV TORCH_CUDA_ARCH_LIST "${TORCH_ARCH}"
ENV CUDA_HOME /usr/local/cuda-11.6/
AM_I_DOCKER
: 컨테이너가 도커 환경 내에서 실행되고 있음을 나타내는 환경 변수
BUILD_WITH_CUDA
: CUDA 사용 설정을 환경 변수로 전달
TORCH_CUDA_ARCH_LIST
: 사용할 CUDA 아키텍처 목록을 환경 변수로 설정
CUDA_HOME
: CUDA가 설치된 경로를 지정
2.4. 프로젝트 디렉터리 설정
RUN mkdir -p /home/user/Grounded-Segment-Anything
COPY Grounded-Segment-Anything /home/user/Grounded-Segment-Anything/
- 먼저, 도커 컨테이너 내에, 폴더를 생성
- 그 후,
- COPY: 이 명령어는 빌드 컨텍스트(일반적으로 Dockerfile이 위치한 디렉토리와 그 하위 디렉토리를 포함)에서 파일이나 디렉토리를 -> 이미지의 파일시스템으로 복사하는 데 사용
- Grounded-Segment-Anything: 소스 디렉토리 또는 파일의 이름
- /home/user/Grounded-Segment-Anything/: 목적지 경로입니다. 이 경로는 RUN mkdir -p 명령어를 통해 이미 생성
2.5. 패키지 설치
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
wget \
ffmpeg=7:* \
libsm6=2:* \
libxext6=2:* \
git=1:* \
nano=2.* \
vim=2:* \
&& apt-get clean \
&& apt-get autoremove \
&& rm -rf /var/lib/apt/lists/*
- 필요한 시스템 패키지를 설치
- 여기에는
wget
, ffmpeg
, libsm6
, libxext6
, git
, nano
, vim
등이 포함
apt-get clean
, apt-get autoremove
, rm -rf /var/lib/apt/lists/*
를 통해 불필요한 파일을 제거하고 이미지 크기를 최소화
2.6. Python 라이브러리 설치
WORKDIR /home/user/Grounded-Segment-Anything
RUN python -m pip install --no-cache-dir -e segment_anything && \
python -m pip install --no-cache-dir -e GroundingDINO
- 로컬에 있는(컨테이너 밖에 있는)
segment_anything
과 GroundingDINO
프로젝트를 편집 가능한 상태로 설치합니다.
2.7. 추가 Python 패키지 설치
RUN pip install --no-cache-dir diffusers[torch]==0.15.1 opencv-python==4.7.0.72 \
pycocotools==2.0.6 matplotlib==3.5.3 \
onnxruntime==1.14.1 onnx==1.13.1 ipykernel==6.16.2 scipy gradio openai
- 필요한 Python 라이브러리들을 설치합니다. 이는 딥러닝, 이미지 처리, 시각화 등에 사용되는 라이브러리를 포함합니다.
2.8. 작업 디렉터리 설정 및 엔트리포인트
WORKDIR /home/user/workspace
ENTRYPOINT ["python", "main.py"]
WORKDIR
를 /home/user/workspace
로 설정하여 이후의 모든 RUN, CMD, ENTRYPOINT 명령어의 작업 디렉터리로 지정합니다.
ENTRYPOINT
를 설정하여 컨테이너가 실행될 때 python main.py
가 실행되도록 함