본문 바로가기
TIL _Today I Learned/2024.12

[DAY 110] 최종 프로젝트_ 라벨링 자동화 파이프라인 개선

by gamdong2 2024. 12. 24.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.12.24

📕 프로젝트 작업 내역

  • PostgreSQL / Django 컨테이너 실행
  • Django API 구축
  • Labeling Pipeline 소요 시간 확인
  • Django 와 Labeling Pipeline 연결

 

📗 수행 결과

1. PostgreSQL / Django 컨테이너 연결

1) PostgreSQL / Django 컨테이너 실행

  • postgres 폴더 생성 → Dockerfile / requirements.txt / docker-compose.yml 생성
# Dockerfile

# Python 기반 이미지 사용
FROM python:3.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# Python 환경 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 의존성 파일 복사 및 설치
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# Django 애플리케이션 소스 복사
COPY . /app/

# Django 개발 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# requirements.txt
Django>=4.2,<5.0
psycopg2-binary>=2.9
# docker-compose.yml

# Python 기반 이미지 사용
FROM python:3.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# Python 환경 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 의존성 파일 복사 및 설치
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# Django 애플리케이션 소스 복사
COPY . /app/

# Django 개발 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ cat requirements.txt 
Django>=4.2,<5.0
psycopg2-binary>=2.9
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ cat docker-compose.yml 
version: "3.8"  # Docker Compose 파일 버전

services:
  db:
    image: postgres:latest
    container_name: postgres-container
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin123
      - POSTGRES_DB=mydatabase
    restart: always

  web:
    build: .  # Django 애플리케이션이 포함된 Dockerfile 기준으로 빌드
    container_name: django-container-2  # 기존 장고 컨테이너와 충돌 방지 위해 이름 변경
    ports:
      - "8000:8000"
    depends_on:
      - db  # db 서비스가 먼저 실행되어야 함
    environment:
      - DATABASE_URL=postgresql://admin:admin123@db:5432/mydatabase
    volumes:
      - .:/app
    restart: always

volumes:
  postgres_data:  # PostgreSQL 데이터를 저장할 볼륨
  • docker-compose.yml 실행
    • Error 발생1: 기존 django container와 포트(8000) 충돌
    • Error 발생2: 해당 사용자가 존재하지 않음
docker-compose.yml up -d

"""
Creating postgres-container ... done
Creating django-container-2 ... 
Creating django-container-2 ... error

ERROR: for django-container-2  Cannot start service web: driver failed programming external connectivity on endpoint django-container-2 (xxx): Error starting userland proxy: listen tcp4 0.0.0.0:8000: bind: address already in use

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint django-container-2 (xxx): Error starting userland proxy: listen tcp4 0.0.0.0:8000: bind: address already in use
ERROR: Encountered errors while bringing up the project.
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ sudo lsof -i :8000
COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 238221 ubuntu    8u  IPv4 1230028      0t0  TCP *:8000 (LISTEN)
python3 238221 ubuntu    9u  IPv4 1230118      0t0  TCP ip-172-31-17-163.ap-northeast-2.compute.internal:8000->xxx:xxx (ESTABLISHED)
python3 238221 ubuntu   11u  IPv4 1230119      0t0  TCP ip-172-31-17-163.ap-northeast-2.compute.internal:8000->xxx:xxx (ESTABLISHED)
"""
  • Error 해결
    • 포트 사용 중인 프로세스 확인 
    • 포트 점유 프로세스 종료
    • Docker Compose 다시 실행
# 포트를 사용 중인 프로세스 확인
sudo lsof -i :8000
"""
COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 xxx ubuntu    8u  IPv4 xxx      0t0  TCP *:8000 (LISTEN)
"""

# 포트 점유 프로세스 종료
sudo kill -9 <PID>

# Docker Compose 다시 실행
docker-compose up -d

 

2. Django API 구축

1)

 

3. PostgreSQL 마이그레이션

1) 관계형 데이터 테이블 구상

① FileRecord

컬럼명 데이터 타입 설명
id int (Primary Key, Auto Increment) 기본 키
file_name varchar(255) 파일 이름
s3_uri varchar(255) S3에 저장된 경로
status varchar(50) 파일의 현재 상태
uploaded_at datetime (Default: CURRENT_TIMESTAMP) 파일 업로드 시간

 

② ProcessedQuestion

컬럼명 데이터 타입 설명
id int (Primary Key, Auto Increment) 기본 키
file_record_id int (Foreign Key) FileRecord 테이블의 외래 키
bboxes jsonb 텍스트 영역의 좌표 정보
question_text text 문제 텍스트 내용
  JSONB 타입 PostgreSQL 배열 타입
저장 형태 JSON 형식으로 키-값 구조 저장 다차원 배열({{}})로 데이터 저장
유연성 키-값 구조로 다양한 데이터 저장 가능 고정된 필드 구조 (e.g., class_id, x_center 등)
쿼리 편의성 JSON 키로 데이터 필터링 및 검색 가능 배열 인덱스를 사용해 특정 값 검색
확장성 데이터 구조 변경 시 유연 필드가 추가되면 테이블 설계 수정 필요
적합한 경우 필드가 많거나, 동적으로 변할 가능성이 있는 데이터 구조가 고정적이고, 데이터 필드가 명확할 때
예시 [{"class_id": 0, "x_center": 0.3, "y_center": 0.2, "width": 0.5, "height": 0.1}, {"class_id": 1, "x_center": 0.6, "y_center": 0.4, "width": 0.3, "height": 0.2}] {{0,0.3,0.2,0.5,0.1},{1,0.6,0.4,0.3,0.2}}

 

③ LabellingResult

컬럼명 데이터 타입 설명
id int (Primary Key, Auto Increment) 기본 키
file_record_id int (Foreign Key) FileRecord 테이블의 외래 키
category_label varchar(255) 파일의 대분류 라벨
leaf_label varchar(255) 파일의 세부 하위 분류 라벨
processed_at datetime (Default: CURRENT_TIMESTAMP) 라벨링이 처리된 시간

 

2) ERD 그리기

 

 

 

 

 

 

 

📙 내일 일정

  • OCR 모델 학습