377 lines
9.8 KiB
Markdown
377 lines
9.8 KiB
Markdown
# wing-image-analysis Docker 사용 가이드
|
|
|
|
드론 영상 기반 유류 오염 분석 FastAPI 서버를 Docker 컨테이너로 빌드하고 실행하는 방법을 설명한다.
|
|
|
|
---
|
|
|
|
## 목차
|
|
|
|
1. [사전 요구사항](#1-사전-요구사항)
|
|
2. [빠른 시작](#2-빠른-시작)
|
|
3. [빌드 명령어](#3-빌드-명령어)
|
|
4. [실행 명령어](#4-실행-명령어)
|
|
5. [환경변수 설정](#5-환경변수-설정)
|
|
6. [볼륨 구조](#6-볼륨-구조)
|
|
7. [API 엔드포인트 사용 예시](#7-api-엔드포인트-사용-예시)
|
|
8. [로그 확인 및 디버깅](#8-로그-확인-및-디버깅)
|
|
9. [컨테이너 관리](#9-컨테이너-관리)
|
|
10. [주의사항](#10-주의사항)
|
|
11. [CPU 전용 환경 실행](#11-cpu-전용-환경-실행)
|
|
|
|
---
|
|
|
|
## 1. 사전 요구사항
|
|
|
|
| 항목 | 최소 버전 | 확인 명령어 |
|
|
|------|----------|-------------|
|
|
| Docker Engine | 24.0 이상 | `docker --version` |
|
|
| Docker Compose | 2.20 이상 | `docker compose version` |
|
|
| NVIDIA 드라이버 | 525 이상 (CUDA 12.1 지원) | `nvidia-smi` |
|
|
| nvidia-container-toolkit | 최신 | `nvidia-ctk --version` |
|
|
|
|
### nvidia-container-toolkit 설치 (Ubuntu 기준)
|
|
|
|
```bash
|
|
# GPG 키 및 저장소 추가
|
|
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
|
|
| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
|
|
|
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
|
|
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
|
|
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
|
|
|
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
|
|
|
|
# Docker 런타임 설정 및 재시작
|
|
sudo nvidia-ctk runtime configure --runtime=docker
|
|
sudo systemctl restart docker
|
|
```
|
|
|
|
### GPU 동작 확인
|
|
|
|
```bash
|
|
docker run --rm --gpus all nvidia/cuda:12.1-base-ubuntu22.04 nvidia-smi
|
|
```
|
|
|
|
---
|
|
|
|
## 2. 빠른 시작
|
|
|
|
```bash
|
|
# 1. prediction/image/ 디렉토리로 이동
|
|
cd prediction/image
|
|
|
|
# 2. 환경변수 파일 준비 (필요 시)
|
|
cp .env.example .env
|
|
|
|
# 3. 빌드 + 실행 (백그라운드)
|
|
docker compose up -d --build
|
|
|
|
# 4. 서버 상태 확인
|
|
curl http://localhost:5001/docs
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 빌드 명령어
|
|
|
|
### docker compose (권장)
|
|
|
|
```bash
|
|
# 이미지 빌드만 수행 (실행 안 함)
|
|
docker compose build
|
|
|
|
# 빌드 로그를 상세하게 출력
|
|
docker compose build --progress=plain
|
|
|
|
# 캐시 없이 처음부터 빌드 (의존성 변경 시)
|
|
docker compose build --no-cache
|
|
```
|
|
|
|
### docker build (단독)
|
|
|
|
```bash
|
|
# prediction/image/ 디렉토리에서 실행
|
|
docker build -t wing-image-analysis:latest .
|
|
|
|
# 빌드 태그 지정
|
|
docker build -t wing-image-analysis:1.0.0 .
|
|
|
|
# 캐시 없이 빌드
|
|
docker build --no-cache -t wing-image-analysis:latest .
|
|
```
|
|
|
|
> **참고**: 첫 빌드는 PyTorch base 이미지(약 8GB) + GDAL/Python 패키지 설치로 **30~60분** 소요될 수 있다.
|
|
> 이후 빌드는 레이어 캐시로 수 분 내 완료된다.
|
|
|
|
---
|
|
|
|
## 4. 실행 명령어
|
|
|
|
### docker compose (권장)
|
|
|
|
```bash
|
|
# 백그라운드 실행
|
|
docker compose up -d
|
|
|
|
# 빌드 후 즉시 실행
|
|
docker compose up -d --build
|
|
|
|
# 포그라운드 실행 (로그 바로 출력)
|
|
docker compose up
|
|
|
|
# 중지
|
|
docker compose down
|
|
|
|
# 중지 + 볼륨 삭제 (데이터 초기화 시)
|
|
docker compose down -v
|
|
```
|
|
|
|
### docker run (단독 — 테스트용)
|
|
|
|
```bash
|
|
docker run --rm \
|
|
--gpus all \
|
|
-p 5001:5001 \
|
|
--env-file .env \
|
|
-v "$(pwd)/mx15hdi/Metadata/Image/Original_Images:/app/mx15hdi/Metadata/Image/Original_Images" \
|
|
wing-image-analysis:latest
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 환경변수 설정
|
|
|
|
`.env.example`을 복사하여 `.env`를 생성한다.
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
| 변수 | 설명 | 기본값 |
|
|
|------|------|--------|
|
|
| `API_HOST` | 서버 바인드 주소 | `0.0.0.0` |
|
|
| `API_PORT` | 서버 포트 | `5001` |
|
|
|
|
---
|
|
|
|
## 6. 볼륨 구조
|
|
|
|
컨테이너 내부 경로와 호스트 경로의 매핑이다. 이미지/결과 데이터는 컨테이너 외부에 저장되어 컨테이너를 재시작해도 유지된다.
|
|
|
|
```
|
|
호스트 (prediction/image/) 컨테이너 (/app/)
|
|
─────────────────────────────────────────────────────────────────────
|
|
mx15hdi/Metadata/Image/Original_Images/ → mx15hdi/Metadata/Image/Original_Images/ ← 원본 이미지 입력
|
|
mx15hdi/Metadata/CSV/ → mx15hdi/Metadata/CSV/ ← 메타데이터 출력
|
|
mx15hdi/Georeference/Tif/ → mx15hdi/Georeference/Tif/ ← GeoTIFF 출력
|
|
mx15hdi/Georeference/Mask_Tif/ → mx15hdi/Georeference/Mask_Tif/ ← 마스크 GeoTIFF
|
|
mx15hdi/Polygon/Shp/ → mx15hdi/Polygon/Shp/ ← Shapefile 출력
|
|
mx15hdi/Detect/result/ → mx15hdi/Detect/result/ ← 블렌딩 결과
|
|
mx15hdi/Detect/Mask_result/ → mx15hdi/Detect/Mask_result/ ← 마스크 결과
|
|
starsafire/Metadata/Image/Original_Images → starsafire/Metadata/Image/Original_Images ← 열화상 입력
|
|
starsafire/{기타}/ → starsafire/{기타}/ ← 열화상 출력
|
|
stitch/ → stitch/ ← 스티칭 결과
|
|
```
|
|
|
|
---
|
|
|
|
## 7. API 엔드포인트 사용 예시
|
|
|
|
서버 기동 후 `http://localhost:5001/docs`에서 Swagger UI로 전체 API를 확인할 수 있다.
|
|
|
|
### 7.1 전체 분석 파이프라인 실행
|
|
|
|
```bash
|
|
curl -X POST http://localhost:5001/run-script/ \
|
|
-F "files=@/path/to/drone_image.jpg" \
|
|
-F "camTy=mx15hdi" \
|
|
-F "fileId=20240310_001"
|
|
```
|
|
|
|
**응답 예시**:
|
|
```json
|
|
{
|
|
"meta": "drone_image.jpg,37,30,0,126,55,0,...",
|
|
"data": [
|
|
{
|
|
"classId": 2,
|
|
"area": 1234.56,
|
|
"volume": 0.1234,
|
|
"note": "갈색",
|
|
"thickness": 0.0001,
|
|
"wkt": "POLYGON((...))"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### 7.2 메타데이터 조회
|
|
|
|
```bash
|
|
curl http://localhost:5001/get-metadata/mx15hdi/20240310_001
|
|
```
|
|
|
|
### 7.3 원본 이미지 조회 (Base64)
|
|
|
|
```bash
|
|
curl http://localhost:5001/get-original-image/mx15hdi/20240310_001
|
|
```
|
|
|
|
### 7.4 GeoTIFF + 좌표 조회
|
|
|
|
```bash
|
|
curl http://localhost:5001/get-image/mx15hdi/20240310_001
|
|
```
|
|
|
|
### 7.5 이미지 스티칭
|
|
|
|
```bash
|
|
curl -X POST http://localhost:5001/stitch \
|
|
-F "files=@photo1.jpg" \
|
|
-F "files=@photo2.jpg" \
|
|
-F "mode=drone"
|
|
```
|
|
|
|
---
|
|
|
|
## 8. 로그 확인 및 디버깅
|
|
|
|
```bash
|
|
# 실시간 로그 출력
|
|
docker logs wing-image-analysis -f
|
|
|
|
# 최근 100줄만 출력
|
|
docker logs wing-image-analysis --tail 100
|
|
|
|
# 컨테이너 내부 쉘 접속
|
|
docker exec -it wing-image-analysis bash
|
|
|
|
# GPU 사용 현황 확인 (컨테이너 내부)
|
|
docker exec wing-image-analysis nvidia-smi
|
|
|
|
# Python 패키지 목록 확인
|
|
docker exec wing-image-analysis pip list
|
|
```
|
|
|
|
---
|
|
|
|
## 9. 컨테이너 관리
|
|
|
|
```bash
|
|
# 상태 확인
|
|
docker compose ps
|
|
|
|
# 재시작
|
|
docker compose restart
|
|
|
|
# 중지 (볼륨 유지)
|
|
docker compose down
|
|
|
|
# 이미지 삭제
|
|
docker rmi wing-image-analysis:latest
|
|
|
|
# 사용하지 않는 리소스 정리
|
|
docker system prune -f
|
|
```
|
|
|
|
---
|
|
|
|
## 10. 주의사항
|
|
|
|
### GPU 자동 감지
|
|
- 서버 기동 시 `torch.cuda.is_available()`로 GPU 유무를 자동 감지한다.
|
|
- GPU가 있으면 `cuda:0`, 없으면 `cpu`로 자동 폴백된다.
|
|
- 환경변수 `DEVICE`로 device를 명시 지정할 수 있다 (예: `DEVICE=cpu`, `DEVICE=cuda:1`).
|
|
|
|
### 첫 기동 시간
|
|
- AI 모델 로드: 약 **10~30초** 소요 (GPU 메모리에 로딩)
|
|
- 준비 완료 후 로그에 `Application startup complete` 메시지가 출력된다.
|
|
|
|
### workers=1 고정
|
|
- GPU 모델은 프로세스 간 공유가 불가하므로 uvicorn workers는 반드시 `1`로 유지해야 한다.
|
|
- 병렬 처리는 내부 `ThreadPoolExecutor`(max_workers=4)로 처리된다.
|
|
|
|
### 포트 충돌
|
|
- 기본 포트 `5001`이 다른 서비스와 충돌하면 `docker-compose.yml`의 `ports` 항목을 수정한다:
|
|
```yaml
|
|
ports:
|
|
- "5002:5001" # 호스트 5002 → 컨테이너 5001
|
|
```
|
|
|
|
---
|
|
|
|
## 11. CPU 전용 환경 실행
|
|
|
|
GPU(NVIDIA)가 없는 환경에서는 CPU 전용 설정을 사용한다.
|
|
|
|
### 사전 요구사항 (CPU 모드)
|
|
|
|
| 항목 | 최소 버전 | 확인 명령어 |
|
|
|------|----------|-------------|
|
|
| Docker Engine | 24.0 이상 | `docker --version` |
|
|
| Docker Compose | 2.20 이상 | `docker compose version` |
|
|
| NVIDIA 드라이버 | **불필요** | — |
|
|
|
|
### 빠른 시작 (CPU)
|
|
|
|
```bash
|
|
# prediction/image/ 디렉토리로 이동
|
|
cd prediction/image
|
|
|
|
# 환경변수 파일 준비 (필요 시)
|
|
cp .env.example .env
|
|
|
|
# CPU 이미지 빌드 + 실행
|
|
docker compose -f docker-compose.cpu.yml up -d --build
|
|
|
|
# 서버 상태 확인
|
|
curl http://localhost:5001/docs
|
|
```
|
|
|
|
### 빌드 명령어 (CPU)
|
|
|
|
```bash
|
|
# CPU 이미지만 빌드
|
|
docker compose -f docker-compose.cpu.yml build
|
|
|
|
# 캐시 없이 빌드
|
|
docker compose -f docker-compose.cpu.yml build --no-cache
|
|
```
|
|
|
|
> **참고**: CPU 기반 PyTorch 이미지는 GPU 이미지(~8GB) 대비 약 70% 용량이 절감된다.
|
|
> 단, CPU 추론은 GPU 대비 처리 속도가 느리므로 대용량 이미지 분석 시 시간이 더 소요된다.
|
|
|
|
### 실행 명령어 (CPU)
|
|
|
|
```bash
|
|
# 백그라운드 실행
|
|
docker compose -f docker-compose.cpu.yml up -d
|
|
|
|
# 포그라운드 실행 (로그 바로 출력)
|
|
docker compose -f docker-compose.cpu.yml up
|
|
|
|
# 중지
|
|
docker compose -f docker-compose.cpu.yml down
|
|
```
|
|
|
|
### 로컬 직접 실행 (Docker 없이)
|
|
|
|
```bash
|
|
# GPU 있으면 자동으로 cuda:0 사용, 없으면 cpu로 폴백
|
|
python api.py
|
|
|
|
# device 강제 지정
|
|
DEVICE=cpu python api.py
|
|
DEVICE=cuda:1 python api.py
|
|
```
|
|
|
|
### GPU/CPU 모드 확인
|
|
|
|
서버 기동 로그에서 사용 device를 확인할 수 있다:
|
|
|
|
```
|
|
[Inference] 사용 device: cpu ← CPU 모드
|
|
[Inference] 사용 device: cuda:0 ← GPU 모드
|
|
```
|