6.8 KiB
6.8 KiB
이미지 번역 워커 시스템
이 워커 시스템은 Redis와 Celery를 사용하여 이미지 번역 작업을 분산 처리합니다.
메인 서버의 Redis에 연결하여 translate_me 요청을 처리하고, ImageProcessor의 process_single_image 메서드를 실행합니다.
시스템 구조
메인서버 (FastAPI + Redis + Flower + Celery Client)
↓ (Redis Queue)
워커서버 (Celery Worker + ImageProcessor + Redis Client)
워커 역할: 작업 수행만 담당 (Redis 서버, Flower 모니터링은 메인서버에서 운영)
필요한 환경
- Python 3.8+
- 메인서버: Redis 서버, Flower 대시보드 (이미 구축됨)
- 워커서버: Celery 워커, Redis 클라이언트
- CUDA 지원 GPU (선택사항, 성능 향상)
설치 및 설정
1. 워커 전용 의존성 설치
pip install -r requirements.txt
주요 패키지:
celery: 워커 프로세스 실행redis: Redis 서버 연결용 클라이언트flower: 메인서버에서만 필요 (워커에는 불필요)
2. 환경 변수 설정
# Redis 서버 주소 (메인서버 주소)
export REDIS_URL="redis://메인서버IP:6379/0"
# 메인 서버 주소
export MAIN_SERVER_HOST="메인서버IP"
# 워커 식별명 (선택사항)
export WORKER_NAME="worker-AGX-$$"
# 동시 처리 수 (선택사항)
export CONCURRENCY="2"
워커 실행 방법
방법 1: 자동 시작 스크립트 사용
# Docker 모드로 실행
WORKER_MODE=docker ./start_worker.sh
# 로컬 모드로 실행
WORKER_MODE=local ./start_worker.sh
# 원격 모드로 실행 (다른 서버에서)
WORKER_MODE=remote REDIS_URL=redis://메인서버IP:6379/0 ./start_worker.sh
방법 2: 직접 실행
# Python으로 직접 실행
python worker.py --concurrency 2 --redis-url redis://메인서버IP:6379/0
# Docker Compose로 실행
docker-compose up -d
방법 3: Docker로 실행
# Docker 이미지 빌드
docker build -t image-worker .
# Docker 컨테이너 실행
docker run -d \
-e REDIS_URL=redis://메인서버IP:6379/0 \
-e MAIN_SERVER_HOST=메인서버IP \
-v ./modules:/worker/modules \
-v ./models:/worker/models \
image-worker
사용 가능한 작업 (Tasks)
1. translate_me_task
- 용도: 전체 이미지 번역 처리 (OCR → 번역 → 인페인팅 → 텍스트 렌더링)
- 큐:
translate - 파라미터:
{ 'image_data': 'base64_encoded_image', # 또는 image_path 사용 'image_path': '/path/to/image.jpg', # 또는 image_data 사용 'toggle_states': { 'ocr': True, 'watermark_text': '번역완료' }, 'unwanted_texts': { '광고': '이미지삭제', '홍보': '공지' }, 'index': 0, 'file_prefix': 'test' }
2. ocr_task
- 용도: OCR만 수행
- 큐:
ocr - 파라미터:
{ 'image_data': 'base64_encoded_image', # 또는 image_path 사용 'image_path': '/path/to/image.jpg' # 또는 image_data 사용 }
3. inpaint_task
- 용도: 인페인팅만 수행
- 큐:
inpaint
테스트 방법
1. 워커 상태 확인
python test_worker_client.py --test-type status
2. OCR 테스트
python test_worker_client.py --image sample.jpg --test-type ocr
3. 번역 테스트
python test_worker_client.py --image sample.jpg --test-type translate
4. 전체 테스트
python test_worker_client.py --image sample.jpg --test-type all
메인서버에서 워커 호출 예제
from celery import Celery
import base64
# Celery 클라이언트 설정
celery_app = Celery(
"main_server",
broker="redis://localhost:6379/0",
backend="redis://localhost:6379/0"
)
# 이미지를 base64로 인코딩
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode('utf-8')
# translate_me 작업 요청
result = celery_app.send_task(
'worker.translate_me_task',
kwargs={
'image_data': image_data,
'toggle_states': {
'ocr': True,
'watermark_text': '번역완료'
},
'unwanted_texts': {
'광고': '이미지삭제'
},
'index': 0
}
)
# 결과 대기
task_result = result.get(timeout=300)
print(f"상태: {task_result['status']}")
print(f"워커: {task_result['worker_name']}")
# 결과 이미지 저장
if task_result.get('output_image'):
with open("result.png", "wb") as f:
f.write(base64.b64decode(task_result['output_image']))
모니터링
Flower 대시보드 사용 (메인서버에서만)
중요: Flower는 메인서버에서만 실행합니다. 워커에서는 설치/실행할 필요가 없습니다.
# 메인서버에서만 실행
flower --broker=redis://localhost:6379/0 --port=5555
브라우저에서 http://메인서버IP:5555로 접속하여 워커 상태 확인
명령행으로 상태 확인 (워커서버에서도 가능)
# 활성 워커 목록
celery -A worker inspect active
# 등록된 작업 목록
celery -A worker inspect registered
# 통계 정보
celery -A worker inspect stats
문제 해결
1. 워커가 연결되지 않는 경우
- Redis 서버가 실행 중인지 확인
- 방화벽 설정 확인 (Redis 포트 6379)
- REDIS_URL 환경 변수 확인
2. 작업이 실행되지 않는 경우
- 워커가 정상적으로 시작되었는지 로그 확인
- 큐 이름이 올바른지 확인
- ImageProcessor 의존성 모듈들이 설치되었는지 확인
3. 메모리 부족 오류
- CONCURRENCY 값을 낮춤 (1 또는 2)
- Docker의 메모리 제한 확인
4. GPU 관련 오류
- CUDA 드라이버 설치 확인
- requirements.txt의 GPU 패키지들 설치 확인
로그 확인
# Docker 로그 확인
docker-compose logs -f worker
# 로컬 실행 시 로그는 터미널에 출력됨
성능 최적화
- 동시 처리 수 조정:
--concurrency옵션으로 CPU/GPU 리소스에 맞게 조정 - 메모리 사용량 모니터링: 이미지 크기에 따라 메모리 사용량 증가
- 네트워크 최적화: 메인서버와 워커서버 간 네트워크 지연 최소화
- Redis 설정 최적화: Redis 메모리 및 연결 수 설정 조정
패키지 역할 정리
메인서버에 필요한 패키지
redis: Redis 서버flower: 워커 모니터링 대시보드celery: 작업 전송용 클라이언트
워커서버에 필요한 패키지
celery: 워커 프로세스 실행redis: Redis 연결용 클라이언트ImageProcessor관련 의존성들
결론: 워커는 단순히 작업을 받아서 처리하는 역할만 하므로, Redis 서버나 Flower 대시보드를 별도로 실행할 필요가 없습니다.