grounded SAM 사용

FSA·2024년 4월 19일
0

vision

목록 보기
5/25

-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가 설치된 환경이 필요
  1. Docker 설치:
  • Docker가 아직 설치되지 않았다면, Docker 공식 웹사이트에서
  • Docker Desktop (Windows/Mac) 또는 Docker Engine (Linux)을 설치
  1. Dockerfile 위치 확인: Dockerfile이 있는 디렉토리로 터미널이나 명령 프롬프트에서 이동
  2. 이미지 빌드:
    docker build -t image_name:tag .
    • -t image_name:tag는 빌드된 이미지에 이름(image_name)과 태그(tag)를 지정
    • 태그는 생략 가능하며, 생략 시 latest가 기본값으로 사용
    • 마지막의 .는 Dockerfile이 현재 디렉토리에 있다는 것을 의미
  3. 컨테이너 실행:
    docker run -it image_name:tag
    • 여기서 -it는 컨테이너를 대화형 터미널 모드로 실행하게 함
    • 다양한 옵션을 추가하여 네트워크 설정, 볼륨 마운트 등을 구성할 수 있음

0.2. Makefile 실행

  • Makefile은 여러 명령어를 묶어 빌드, 테스트, 배포 등을 자동화하는 스크립트 파일
  • Makefile을 실행하기 위해선 일반적으로 make 도구가 필요
  1. Make 도구 설치:
  • 대부분의 UNIX 기반 시스템에는 이미 make가 설치되어 있음
  • Windows 사용자는 Cygwin, MinGW, WSL 등을 통해 make를 설치할 수 있음
  1. Makefile 위치 확인:
  • Makefile이 있는 디렉토리로 터미널을 이동
  1. Make 실행:
    make target_name
    • target_name은 Makefile 내에 정의된 타겟을 의미
      • build나 run 등이 될 수 있다.
    • 타겟은 특정 작업(예: 컴파일, 테스트 실행 등)을 지칭하며, 이를 지정하지 않으면 Makefile의 첫 번째 타겟이 실행

0.3. 정리

  • Dockerfile은 컨테이너 이미지를 만들고 실행하는 데 사용되며, Makefile은 일련의 빌드 및 관리 작업을 자동화하는 데 사용됩니다.

1. Makefile

  • 이 Makefile은, Docker 환경에서 CUDA를 활용해 특정 소프트웨어 빌드와 실행을 관리하기 위한 설정들을 포함

1.0. Makefile에 적혀있는 주석

  1. CUDA 버전 확인 및 활성화:
  • "Get version of CUDA and enable it for compilation if CUDA > 11.0" 이 부분은 CUDA의 버전을 확인하고, 만약 설치된 CUDA의 버전이 11.0을 초과한다면 컴파일에 CUDA를 활성화하겠다는 의미
  1. 문제 해결 참조:
  • CUDA 버전을 확인하고 설정하는 과정이 GitHub의 두 이슈(#53과 #84)를 해결한다고 언급
  • 이 이슈들은 아마도 Docker 환경에서 프로젝트를 실행할 때 발생하는 CUDA 관련 문제들일 것
  1. NVCC 설치 확인:
  • 'nvcc'는 NVIDIA CUDA Compiler의 약자로, CUDA 코드를 컴파일하는 데 사용됨
    • CUDA 프로그래밍 언어로 작성된 코드를 컴파일 (GPU에서 실행할 수 있는 형식으로 변환)
  • 설치되어 있지 않다면, CUDA를 사용할 수 없음을 의미하며, 이 경우 스크립트는 CUDA를 사용하지 않고 진행할 것

1.1. CUDA 버전 확인 및 설정

  1. NVCC 확인:
  • NVCC 변수는 which nvcc 명령어를 사용하여 시스템에 설치된 CUDA 컴파일러의 경로를 찾음
  • 만약 nvcc가 설치되어 있지 않다면, NVCC 변수는 비어 있게 됩니다.
  1. CUDA 사용 여부 설정:
  • ifeq ($(NVCC),) 구문은 NVCC 변수가 비어 있는지 확인
  • 만약 NVCC가 설치되어 있지 않다면, USE_CUDA 변수를 0으로 설정하고, NVCC_VERSION을 "not installed"로 설정
  • 반대로 NVCC가 있다면, CUDA 버전을 확인하고, 그 버전이 11.0을 초과하는지 확인하여 USE_CUDA 변수를 설정
  1. 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_anythingGroundingDINO 프로젝트를 편집 가능한 상태로 설치합니다.

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가 실행되도록 함
profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

0개의 댓글