환경 설정 파일(.env.example)에서 하드웨어 자동 감지 및 프레임워크 정책 관련 설정을 추가하고, 모델 경로를 업데이트하였습니다. 요구 사항 파일에 새로운 패키지를 추가하고, 상태 JSON 파일의 워커 수 및 요청 통계를 수정하였습니다. 서버 로그에서 프로세스 ID 변경 사항을 반영하였습니다.

This commit is contained in:
vast 2025-09-30 13:54:06 +00:00
parent dc137030b4
commit 7ea0e44086
14 changed files with 2127 additions and 10771 deletions

80
.env Normal file
View File

@ -0,0 +1,80 @@
# 인페인팅 서버 환경 설정 예시
# 실제 사용 시 .env 파일로 복사하여 사용하세요
# ===== 하드웨어/플랫폼 자동 감지 =====
# 아래 값은 자동 감지로 채워지며, 수동 강제하려면 true/false 지정
IS_JETSON=auto # auto | true | false
IS_X86=auto # auto | true | false
GPU_DEVICE=0 # 사용할 GPU 인덱스
# ===== 프레임워크 정책 (충돌 방지 핵심) =====
# TORCH_GPU_ONLY: Torch만 GPU 사용, TF/ONNX는 CPU
# ORT_GPU: ONNXRuntime GPU 사용(필요 시, TF는 CPU)
# TF_GPU_ONLY: TensorFlow만 GPU (권장하지 않음: 토치와 섞이면 충돌↑)
FRAMEWORK_POLICY=TORCH_GPU_ONLY # TORCH_GPU_ONLY | ORT_GPU | TF_GPU_ONLY
# 개별 토글(정책과 충돌 나면 부트에서 자동 보정)
TF_ENABLED=false
ORT_ENABLED=true
FP16_ENABLED=true
# 서버 설정
HOST=0.0.0.0
PORT=8008
WORKERS=1 # GPU 서버는 프로세스 1개 권장, 내부 비동기로 동시처리
# GPU 설정
CUDA_DEVICE=0
FP16_ENABLED=true
# Jetson 전용 설정
JETSON_MODE=false # 자동 감지됨
JETSON_POWER_MODE=MAXN # MAXN, 5W, 10W, 15W
JETSON_FAN_CONTROL=true
JETSON_TEMP_THRESHOLD=75 # Celsius
JETSON_GPU_FREQ=1200 # MHz
JETSON_CPU_FREQ=1900 # MHz
JETSON_MEMORY_FREQ=1600 # MHz
# 세션 풀 설정 (시스템별 자동 조정)
SIMPLE_LAMA_SESSIONS=4
MIGAN_SESSIONS=4
REMBG_SESSIONS=1
# 워커 설정 (Jetson은 더 적은 워커 사용)
MAX_WORKERS=8 # Jetson: 4, x86: 8
MIN_WORKERS=2 # Jetson: 1, x86: 2
WORKER_TIMEOUT=300
# VRAM 관리 (Jetson은 더 보수적인 설정)
VRAM_THRESHOLD_HIGH=0.8 # Jetson: 70%, x86: 80%
VRAM_THRESHOLD_LOW=0.3 # Jetson: 30%, x86: 40%
VRAM_CHECK_INTERVAL=30 # Jetson: 20초, x86: 30초
# 모델 경로
SIMPLE_LAMA_MODEL_PATH=app/models/onnx/lama_fp32.onnx
MIGAN_MODEL_PATH=app/models/onnx/migan_pipeline_v2.onnx
REMBG_MODEL_PATH=app/models/onnx/BriaRMBG1.4_model_fp16.onnx
# 업로드 설정 (Jetson은 더 작은 파일 크기)
MAX_FILE_SIZE=26214400 # Jetson: 25MB, x86: 50MB
ALLOWED_EXTENSIONS=.jpg,.jpeg,.png,.bmp,.tiff,.webp
# ALLOWED_EXTENSIONS=[".jpg",".jpeg",".png",".bmp",".tiff",".webp"]
# 모니터링
ENABLE_MONITORING=true
MONITORING_PORT=8080
# Jetson 최적화 설정
JETSON_OPTIMIZE_ON_STARTUP=true
JETSON_AUTO_FAN_CONTROL=true
JETSON_POWER_SAVING=false
# ===== TensorRT/ONNX EP =====
TENSORRT_ENABLED=false # 실제 TensorRT 엔진/EP를 쓸 때만 true
ORT_PROVIDERS=CUDAExecutionProvider,CPUExecutionProvider
# Jetson에서 onnxruntime-gpu 특수 빌드 사용 시: TensorrtExecutionProvider,CUDAExecutionProvider,CPUExecutionProvider
# ===== 로깅 =====
LOG_LEVEL=INFO
LOG_DIR=logs

View File

@ -1,13 +1,27 @@
# 인페인팅 서버 환경 설정 예시
# 실제 사용 시 .env 파일로 복사하여 사용하세요
# 시스템 감지 (자동 설정)
# IS_JETSON=true # Jetson Xavier 감지 시 자동 설정
# IS_X86=true # x86 시스템 감지 시 자동 설정
# ===== 하드웨어/플랫폼 자동 감지 =====
# 아래 값은 자동 감지로 채워지며, 수동 강제하려면 true/false 지정
IS_JETSON=auto # auto | true | false
IS_X86=auto # auto | true | false
GPU_DEVICE=0 # 사용할 GPU 인덱스
# ===== 프레임워크 정책 (충돌 방지 핵심) =====
# TORCH_GPU_ONLY: Torch만 GPU 사용, TF/ONNX는 CPU
# ORT_GPU: ONNXRuntime GPU 사용(필요 시, TF는 CPU)
# TF_GPU_ONLY: TensorFlow만 GPU (권장하지 않음: 토치와 섞이면 충돌↑)
FRAMEWORK_POLICY=TORCH_GPU_ONLY # TORCH_GPU_ONLY | ORT_GPU | TF_GPU_ONLY
# 개별 토글(정책과 충돌 나면 부트에서 자동 보정)
TF_ENABLED=false
ORT_ENABLED=true
FP16_ENABLED=true
# 서버 설정
HOST=0.0.0.0
PORT=8000
PORT=8008
WORKERS=1
# GPU 설정
@ -39,19 +53,29 @@ VRAM_THRESHOLD_LOW=0.3 # Jetson: 30%, x86: 40%
VRAM_CHECK_INTERVAL=20 # Jetson: 20초, x86: 30초
# 모델 경로
SIMPLE_LAMA_MODEL_PATH=models/simple-lama
MIGAN_MODEL_PATH=models/migan
REMBG_MODEL_PATH=models/rembg
SIMPLE_LAMA_MODEL_PATH=app/models/onnx/lama_fp32.onnx
MIGAN_MODEL_PATH=app/models/onnx/migan_pipeline_v2.onnx
REMBG_MODEL_PATH=app/models/onnx/BriaRMBG1.4_model_fp16.onnx
# 업로드 설정 (Jetson은 더 작은 파일 크기)
MAX_FILE_SIZE=26214400 # Jetson: 25MB, x86: 50MB
ALLOWED_EXTENSIONS=.jpg,.jpeg,.png,.bmp,.tiff
# ALLOWED_EXTENSIONS=.jpg,.jpeg,.png,.bmp,.tiff,.webp
ALLOWED_EXTENSIONS=[".jpg",".jpeg",".png",".bmp",".tiff",".webp"]
# 모니터링
ENABLE_MONITORING=true
MONITORING_PORT=8001
MONITORING_PORT=8080
# Jetson 최적화 설정
JETSON_OPTIMIZE_ON_STARTUP=true
JETSON_AUTO_FAN_CONTROL=true
JETSON_POWER_SAVING=false
# ===== TensorRT/ONNX EP =====
TENSORRT_ENABLED=false # 실제 TensorRT 엔진/EP를 쓸 때만 true
ORT_PROVIDERS=CUDAExecutionProvider,CPUExecutionProvider
# Jetson에서 onnxruntime-gpu 특수 빌드 사용 시: TensorrtExecutionProvider,CUDAExecutionProvider,CPUExecutionProvider
# ===== 로깅 =====
LOG_LEVEL=INFO
LOG_DIR=logs

2
=0.0.9
View File

@ -1,2 +0,0 @@
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: python-multipart in /home/ckh08045/.local/lib/python3.8/site-packages (0.0.6)

View File

@ -1,131 +1,302 @@
# app/core/config.py
# -*- coding: utf-8 -*-
"""
Configuration settings for the inpainting server
- Jetson/x86 자동 감지
- 프레임워크 충돌 방지 정책 (기본: TORCH_GPU_ONLY)
- VRAM/플랫폼 기반 자동 튜닝 유효성 검사
- 환경변수 가드/스모크 테스트 제공
"""
import os
import json
import platform
from typing import Dict, Any, Optional, ClassVar
from pydantic_settings import BaseSettings
from pathlib import Path
import logging
from pathlib import Path
from typing import Optional, ClassVar
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field, AliasChoices
logger = logging.getLogger(__name__)
class Settings(BaseSettings):
# System detection
IS_JETSON: ClassVar[bool] = "aarch64" in platform.machine().lower() and "tegra" in platform.release().lower()
PROJECT_ROOT: ClassVar[str] = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# pydantic v2 설정: .env 읽기 + 여분 키 무시
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
extra="ignore", # .env에 있는 미정의 키는 무시
case_sensitive=True,
)
# --- 동적 세션 풀 및 메모리 관리 설정 ---
# 각 모델별 최소/최대 세션 수. 서버 시작 시 min 만큼 생성되고, VRAM 여유 시 max까지 확장됨.
SIMPLE_LAMA_MIN_SESSIONS: int = 2 if IS_JETSON else 2
SIMPLE_LAMA_MAX_SESSIONS: int = 4 if IS_JETSON else 4
MIGAN_MIN_SESSIONS: int = 2 if IS_JETSON else 1 # x86에서는 Migan을 기본으로 로드하지 않음
MIGAN_MAX_SESSIONS: int = 4 if IS_JETSON else 4
REMBG_MIN_SESSIONS: int = 2 if IS_JETSON else 1
REMBG_MAX_SESSIONS: int = 4 if IS_JETSON else 3
# =========================
# 플랫폼/프로젝트 경로
# =========================
IS_JETSON: ClassVar[bool] = (
"aarch64" in platform.machine().lower()
and "tegra" in platform.release().lower()
)
PROJECT_ROOT: ClassVar[str] = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
)
# 세션 추가 생성 VRAM 임계값 (%). 남은 VRAM이 이 값보다 커야 새 세션 생성.
# 예: 12GB VRAM에 0.3이면, 3.6GB 이상 여유가 있어야 함.
SESSION_VRAM_THRESHOLD: float = 0.3 if IS_JETSON else 0.3 # Jetson에서는 통합 메모리이므로 좀 더 여유롭게 설정
# 유휴 세션 자동 제거 시간 (초). 0이면 비활성화.
SESSION_IDLE_TIMEOUT: int = 1800 # 30분
# --- 마이크로 배치 설정 ---
USE_MICRO_BATCHING: bool = True # SimpleLama에 대한 배치 처리 활성화
MICRO_BATCH_SIZE: int = 4 # 최대 배치 크기
MICRO_BATCH_TIMEOUT_MS: int = 100 # 배치 생성을 위한 최대 대기 시간 (밀리초)
# --- 서버 환경 설정 (클래스 내부로 이동) ---
# =========================
# 앱 기본
# =========================
APP_VERSION: str = "3.0.0-dynamic-pool"
APP_NAME: str = "Inpaint & RemoveBG Server"
API_PREFIX: str = "/api/v1"
HOST: str = "0.0.0.0"
PORT: int = 8008
WORKERS: int = 1 # 개발 모드에서는 1로 고정, 프로덕션에서는 gunicorn으로 관리
WORKERS: int = 1 # GPU 서버는 프로세스 1 권장(내부 동시성/세션풀 활용)
# GPU settings (Jetson Xavier 최적화)
CUDA_DEVICE: int = 0
USE_CUDA: bool = True # CUDA 사용 여부 (Jetson에서 항상 True)
USE_FP16: bool = True # FP16 사용 여부 (Jetson 최적화)
FP16_ENABLED: bool = True # 기존 호환성
# ONNX Runtime 최적화 설정
USE_TENSORRT: bool = True # TensorRT 사용 여부 (최고 성능)
TENSORRT_FP16: bool = True # TensorRT FP16 사용
# =========================
# GPU/프레임워크 정책
# =========================
# NOTE: .env의 GPU_DEVICE도 받아들이도록 별칭 설정
CUDA_DEVICE: int = Field(0, validation_alias=AliasChoices("CUDA_DEVICE", "GPU_DEVICE"))
USE_CUDA: bool = True
USE_FP16: bool = True
FP16_ENABLED: bool = True # 이전 호환
# 프레임워크 사용 정책:
# - TORCH_GPU_ONLY: Torch만 GPU, TF/ONNX는 CPU
# - ORT_GPU: ONNXRuntime GPU, TF는 CPU
# - TF_GPU_ONLY: TF만 GPU(권장 X; Torch와 혼용 시 충돌↑)
FRAMEWORK_POLICY: str = "TORCH_GPU_ONLY"
# ONNX Runtime / TensorRT / TensorFlow
ORT_ENABLED: bool = True
ORT_PROVIDERS: str = "CPUExecutionProvider" # 기본은 CPU EP (정책에 따라 변경)
USE_TENSORRT: bool = False # 내부 사용 플래그
TENSORRT_FP16: bool = True
TENSORRT_WORKSPACE_SIZE: int = 2 * 1024 * 1024 * 1024 # 2GB
# Jetson specific settings
TENSORRT_ENABLED: Optional[bool] = None # .env 호환용 (명시되면 USE_TENSORRT와 동기화)
TF_ENABLED: bool = False # 정책에서 최종 보정
# =========================
# Jetson 설정
# =========================
JETSON_MODE: bool = IS_JETSON
JETSON_POWER_MODE: str = "MAXN" # MAXN, 5W, 10W, 15W
JETSON_FAN_CONTROL: bool = True
JETSON_TEMP_THRESHOLD: int = 75 # Celsius
# Session pool settings (Jetson Xavier는 32GB 통합 메모리로 더 많은 세션 가능)
SIMPLE_LAMA_SESSIONS: int = 4 if IS_JETSON else 4 # Jetson: 통합 32GB vs 데스크톱: VRAM 제한
MIGAN_SESSIONS: int = 4 if IS_JETSON else 4 # Jetson이 더 많은 세션 운영 가능
REMBG_SESSIONS: int = 3 if IS_JETSON else 2 # 메모리 공유 방식의 이점 활용
# Worker settings (Jetson은 통합 메모리로 더 효율적)
MAX_WORKERS: int = 10 if IS_JETSON else 8
MIN_WORKERS: int = 10 if IS_JETSON else 4
WORKER_TIMEOUT: int = 120 # 2 minutes
# 사용할 REMBG 모델 설정: "briaai/RMBG-1.4" 또는 onnx 파일 경로
REMBG_MODEL: str = "briaaiRMBG-1.4"
JETSON_GPU_FREQ: int = 1200 # MHz
JETSON_CPU_FREQ: int = 1900 # MHz
JETSON_MEMORY_FREQ: int = 1600 # MHz
# 메모리 관리 (Jetson은 32GB 통합 메모리로 여유로움)
VRAM_THRESHOLD_HIGH: float = 0.85 if IS_JETSON else 0.80 # 워커 추가 생성 중단
VRAM_THRESHOLD_LOW: float = 0.4 if IS_JETSON else 0.40 # 워커 제거 시작
VRAM_CHECK_INTERVAL: int = 30 if IS_JETSON else 15 # Jetson은 덜 자주 체크
# Model paths
# =========================
# 동적 세션 풀/메모리
# =========================
SIMPLE_LAMA_MIN_SESSIONS: int = 2
SIMPLE_LAMA_MAX_SESSIONS: int = 4
# x86에서는 MIGAN 미로딩(지연 로딩) 기본 → MIN=0
MIGAN_MIN_SESSIONS: int = 2 if IS_JETSON else 1
MIGAN_MAX_SESSIONS: int = 4
REMBG_MIN_SESSIONS: int = 2 if IS_JETSON else 1
REMBG_MAX_SESSIONS: int = 4 if IS_JETSON else 3
# 여유 VRAM 비율(남은 VRAM이 이 값보다 커야 세션 추가)
SESSION_VRAM_THRESHOLD: float = 0.30
SESSION_IDLE_TIMEOUT: int = 1800 # 초 (0이면 비활성)
# 마이크로 배치(SimpleLAMA)
USE_MICRO_BATCHING: bool = True
MICRO_BATCH_SIZE: int = 4
MICRO_BATCH_TIMEOUT_MS: int = 100
# 사전 확정 세션(플랫폼 감안 기본치)
SIMPLE_LAMA_SESSIONS: int = 4
MIGAN_SESSIONS: int = 4
REMBG_SESSIONS: int = 3 if IS_JETSON else 2
# 워커(내부 큐/스레드 워커, 프로세스는 WORKERS)
MAX_WORKERS: int = 4 if IS_JETSON else 8
MIN_WORKERS: int = 1 if IS_JETSON else 4
WORKER_TIMEOUT: int = 120
# =========================
# 메모리/VRAM 관리
# =========================
VRAM_THRESHOLD_HIGH: float = 0.70 if IS_JETSON else 0.80
VRAM_THRESHOLD_LOW: float = 0.30 if IS_JETSON else 0.40
VRAM_CHECK_INTERVAL: int = 20 if IS_JETSON else 15 # 초
# =========================
# 모델/경로
# =========================
SIMPLE_LAMA_MODEL_PATH: str = "app/models/pt/big-lama.pt"
MIGAN_MODEL_PATH: str = "app/models/onnx/migan_pipeline_v2.onnx"
REMBG_MODEL_PATH: str = "app/models/onnx/BriaRMBG1.4_model_fp16.onnx"
# MIGAN ONNX settings
MIGAN_ONNX_PATH: Optional[str] = "app/models/onnx/migan_pipeline_v2.onnx" # 커스텀 ONNX 파일 경로
# MIGAN ONNX
MIGAN_ONNX_PATH: Optional[str] = "app/models/onnx/migan_pipeline_v2.onnx"
MIGAN_INTRA_THREADS: int = 0
MIGAN_INTER_THREADS: int = 0
# REMBG settings (자동 다운로드 방식)
REMBG_MODEL_NAME: str = "briaai/RMBG-1.4" # BriaAI RMBG 1.4 모델
LOCAL_REMBG_MODEL_PATH: Optional[str] = None # 로컬 파일 사용 안함
# Upload settings (Jetson Xavier는 32GB 메모리로 대용량 처리 가능)
MAX_FILE_SIZE: int = 100 * 1024 * 1024 if IS_JETSON else 50 * 1024 * 1024 # Jetson: 100MB, 데스크톱: 50MB
MAX_IMAGE_SIZE: int = 4096 if IS_JETSON else 3072 # Jetson: 4K, 데스크톱: 3K (VRAM 고려)
ALLOWED_EXTENSIONS: set = {".jpg", ".jpeg", ".png", ".bmp", ".tiff"}
# Monitoring
# REMBG (자동 다운로드)
REMBG_MODEL_NAME: str = "briaai/RMBG-1.4"
LOCAL_REMBG_MODEL_PATH: Optional[str] = None
# =========================
# 업로드/이미지 제한
# =========================
MAX_FILE_SIZE: int = (100 * 1024 * 1024) if IS_JETSON else (50 * 1024 * 1024)
MAX_IMAGE_SIZE: int = 4096 if IS_JETSON else 3072
# ALLOWED_EXTENSIONS는 env에서 문자열로 받고 내부 파싱
ALLOWED_EXTENSIONS_RAW: str = Field(
".jpg,.jpeg,.png,.bmp,.tiff,.webp",
validation_alias=AliasChoices("ALLOWED_EXTENSIONS", "ALLOWED_EXTENSIONS_RAW"),
)
@property
def ALLOWED_EXTENSIONS(self) -> set[str]:
"""
.env에서 다음 형식을 모두 허용:
1) JSON 리스트: [".png",".jpg"]
2) 콤마 문자열: .png,.jpg,.webp
공백/중복은 자동 정리
"""
s = (self.ALLOWED_EXTENSIONS_RAW or "").strip()
if not s:
return {".jpg", ".jpeg", ".png", ".bmp", ".tiff"}
# JSON 리스트 우선
try:
data = json.loads(s)
if isinstance(data, (list, tuple, set)):
return {str(x).strip() for x in data if str(x).strip()}
except Exception:
pass
# 콤마 문자열
return {p.strip() for p in s.split(",") if p.strip()}
# =========================
# Jetson 부가 토글 (.env 호환)
# =========================
JETSON_OPTIMIZE_ON_STARTUP: bool = False
JETSON_AUTO_FAN_CONTROL: bool = False
JETSON_POWER_SAVING: bool = False
# =========================
# 모니터링/알림/로깅
# =========================
ENABLE_MONITORING: bool = True
MONITORING_PORT: int = 8888
# Discord 웹훅 알림 설정
DISCORD_WEBHOOK_URL: Optional[str] = None
LOG_LEVEL: str = "INFO"
LOG_DIR: str = "logs"
# Jetson performance settings
JETSON_GPU_FREQ: int = 1200 # MHz
JETSON_CPU_FREQ: int = 1900 # MHz
JETSON_MEMORY_FREQ: int = 1600 # MHz
class Config:
env_file = ".env"
env_file_encoding = 'utf-8'
protected_namespaces = ()
# -------------------------
# 런타임 보정/검증
# -------------------------
def finalize(self) -> "Settings":
"""
- 정책 기반 프레임워크 토글/EP 보정
- 세션 min/max/고정값 일관성 보정
- x86/Jetson별 기본값 자동 조정
- 경계/오타/모순값 사전 차단
"""
# 0) policy 정상화 + TF 기본값
policy = (self.FRAMEWORK_POLICY or "TORCH_GPU_ONLY").upper()
if policy not in {"TORCH_GPU_ONLY", "ORT_GPU", "TF_GPU_ONLY"}:
logger.warning(f"알 수 없는 FRAMEWORK_POLICY='{self.FRAMEWORK_POLICY}', TORCH_GPU_ONLY로 강제")
policy = "TORCH_GPU_ONLY"
self.FRAMEWORK_POLICY = policy
self.TF_ENABLED = (policy == "TF_GPU_ONLY")
settings = Settings()
# 1) .env의 TENSORRT_ENABLED가 명시되면 내부 USE_TENSORRT와 동기화
if self.TENSORRT_ENABLED is not None:
self.USE_TENSORRT = bool(self.TENSORRT_ENABLED)
# 파일에서 웹훅 URL 로드 (환경 변수보다 우선순위 낮음)
# 2) 정책별 기본 EP/TF/ORT/TPU 정리
if policy == "TORCH_GPU_ONLY":
self.ORT_ENABLED = True
self.ORT_PROVIDERS = "CPUExecutionProvider"
self.USE_TENSORRT = False
elif policy == "ORT_GPU":
self.ORT_ENABLED = True
if self.ORT_PROVIDERS.strip() in {"", "CPUExecutionProvider"}:
# x86 기본 CUDA EP, Jetson 특수 빌드면 TensorrtExecutionProvider를 직접 넣어도 됨
self.ORT_PROVIDERS = "CUDAExecutionProvider,CPUExecutionProvider"
elif policy == "TF_GPU_ONLY":
self.ORT_ENABLED = False
# TF-TRT 경로를 따로 준비하지 않았다면 False 유지
self.USE_TENSORRT = False
# 3) 세션 min/max 일관성 보정
def fix_min_max(name_min, name_max):
mn = getattr(self, name_min)
mx = getattr(self, name_max)
if mn < 0:
logger.warning(f"{name_min} < 0 → 0으로 보정")
mn = 0
if mx < mn:
logger.warning(f"{name_max} < {name_min}{name_min}로 보정")
mx = mn
setattr(self, name_min, mn)
setattr(self, name_max, mx)
fix_min_max("SIMPLE_LAMA_MIN_SESSIONS", "SIMPLE_LAMA_MAX_SESSIONS")
fix_min_max("MIGAN_MIN_SESSIONS", "MIGAN_MAX_SESSIONS")
fix_min_max("REMBG_MIN_SESSIONS", "REMBG_MAX_SESSIONS")
# x86에서 MIGAN 지연 로딩 기본화
if not self.IS_JETSON and self.MIGAN_MIN_SESSIONS == 0 and self.MIGAN_SESSIONS > 0:
logger.info("x86에서 MIGAN_MIN_SESSIONS=0 → MIGAN_SESSIONS=0(지연 로딩)")
self.MIGAN_SESSIONS = 0
# 4) VRAM 임계/체크 주기 보정
if not (0.0 < self.VRAM_THRESHOLD_LOW < self.VRAM_THRESHOLD_HIGH < 0.99):
logger.warning(
f"VRAM 임계값 비정상(HIGH={self.VRAM_THRESHOLD_HIGH}, LOW={self.VRAM_THRESHOLD_LOW}) → 플랫폼 기본으로 보정"
)
if self.IS_JETSON:
self.VRAM_THRESHOLD_HIGH, self.VRAM_THRESHOLD_LOW = 0.70, 0.30
self.VRAM_CHECK_INTERVAL = 20
else:
self.VRAM_THRESHOLD_HIGH, self.VRAM_THRESHOLD_LOW = 0.80, 0.40
self.VRAM_CHECK_INTERVAL = 15
# 5) 파일/이미지 제한 sanity check
if self.MAX_FILE_SIZE <= 0:
self.MAX_FILE_SIZE = (100 * 1024 * 1024) if self.IS_JETSON else (50 * 1024 * 1024)
if self.MAX_IMAGE_SIZE <= 0:
self.MAX_IMAGE_SIZE = 4096 if self.IS_JETSON else 3072
# 6) REMBG 모델 문자열 교정
if self.REMBG_MODEL_NAME.replace(" ", "") in {"briaaiRMBG-1.4", "briaai\\RMBG-1.4"}:
self.REMBG_MODEL_NAME = "briaai/RMBG-1.4"
# 7) 로그 안내
logger.info(
f"플랫폼: {'Jetson' if self.IS_JETSON else 'x86_64'}, 정책: {self.FRAMEWORK_POLICY}, "
f"ORT_PROVIDERS: {self.ORT_PROVIDERS}, TF_ENABLED: {self.TF_ENABLED}"
)
logger.info(
f"세션(MIN~MAX/boot): "
f"LAMA {self.SIMPLE_LAMA_MIN_SESSIONS}~{self.SIMPLE_LAMA_MAX_SESSIONS}/{self.SIMPLE_LAMA_SESSIONS}, "
f"MIGAN {self.MIGAN_MIN_SESSIONS}~{self.MIGAN_MAX_SESSIONS}/{self.MIGAN_SESSIONS}, "
f"REMBG {self.REMBG_MIN_SESSIONS}~{self.REMBG_MAX_SESSIONS}/{self.REMBG_SESSIONS}"
)
logger.info(
f"VRAM 임계: HIGH={self.VRAM_THRESHOLD_HIGH:.2f}, LOW={self.VRAM_THRESHOLD_LOW:.2f}, "
f"CHECK_INTERVAL={self.VRAM_CHECK_INTERVAL}s"
)
return self
# -------------------------
# 전역 설정 인스턴스
# -------------------------
settings = Settings().finalize()
# 파일에서 웹훅 URL 로드(환경 변수보다 우선순위 낮음)
if not settings.DISCORD_WEBHOOK_URL:
try:
webhook_file = Path(settings.PROJECT_ROOT) / "webhook_url.txt"
webhook_file = Path(Settings.PROJECT_ROOT) / "webhook_url.txt"
if webhook_file.exists():
url = webhook_file.read_text().strip()
if url:
@ -133,3 +304,65 @@ if not settings.DISCORD_WEBHOOK_URL:
logger.info(f"파일에서 Discord 웹훅 URL을 로드했습니다: {url[:30]}...")
except Exception as e:
logger.warning(f"webhook_url.txt 파일 로드 실패: {e}")
# -------------------------
# 런타임 가드/스모크 테스트 헬퍼
# -------------------------
def apply_env_guards() -> None:
"""
프레임워크 충돌을 줄이기 위한 환경변수 가드.
- TORCH_GPU_ONLY: Torch만 GPU, TF/ORT는 CPU
- ORT_GPU: ORT GPU, TF는 CPU
- TF_GPU_ONLY: TF만 GPU
"""
os.environ.setdefault("CUDA_VISIBLE_DEVICES", str(settings.CUDA_DEVICE))
os.environ.setdefault("TF_CPP_MIN_LOG_LEVEL", "2")
os.environ.setdefault("TF_FORCE_GPU_ALLOW_GROWTH", "true")
if settings.FRAMEWORK_POLICY == "TORCH_GPU_ONLY":
os.environ["TF_VISIBLE_DEVICES"] = "" # TF는 GPU 비노출
elif settings.FRAMEWORK_POLICY == "ORT_GPU":
os.environ["TF_VISIBLE_DEVICES"] = "" # TF는 CPU 고정
elif settings.FRAMEWORK_POLICY == "TF_GPU_ONLY":
# Torch 비활성은 코드단에서 선택적으로 처리
pass
logger.info(
f"[ENV GUARD] policy={settings.FRAMEWORK_POLICY}, "
f"TF_ENABLED={settings.TF_ENABLED}, ORT_ENABLED={settings.ORT_ENABLED}, "
f"ORT_PROVIDERS={settings.ORT_PROVIDERS}"
)
def framework_smoketest() -> None:
"""
선택적 스모크 테스트: 배포 환경 검증용
"""
try:
import torch # noqa
import torch.cuda # noqa
logger.info(f"Torch CUDA 사용 가능: {torch.cuda.is_available()}")
if torch.cuda.is_available():
logger.info(f"GPU[{settings.CUDA_DEVICE}]: {torch.cuda.get_device_name(settings.CUDA_DEVICE)}")
except Exception as e:
logger.error(f"Torch 점검 실패: {e}")
if settings.TF_ENABLED:
try:
import tensorflow as tf # noqa
try:
if settings.FRAMEWORK_POLICY != "TF_GPU_ONLY":
tf.config.set_visible_devices([], "GPU")
except Exception:
pass
logger.info(f"TF {tf.__version__}, GPUs: {tf.config.list_physical_devices('GPU')}")
except Exception as e:
logger.error(f"TF 점검 실패: {e}")
if settings.ORT_ENABLED:
try:
import onnxruntime as ort # noqa
logger.info(f"ONNXRuntime {ort.__version__}, Providers: {ort.get_available_providers()}")
except Exception as e:
logger.error(f"ONNXRuntime 점검 실패: {e}")

File diff suppressed because it is too large Load Diff

View File

@ -1,48 +1,499 @@
Failed to initialize jtop: The jtop.service is not active. Please run:
sudo systemctl restart jtop.service
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/__main__.py", line 4, in <module>
uvicorn.main()
File "/home/ckh08045/.local/lib/python3.8/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
File "/home/ckh08045/.local/lib/python3.8/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
File "/home/ckh08045/.local/lib/python3.8/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/ckh08045/.local/lib/python3.8/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/main.py", line 416, in main
run(
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/main.py", line 587, in run
server.run()
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/server.py", line 61, in run
return asyncio.run(self.serve(sockets=sockets))
File "/usr/lib/python3.8/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/server.py", line 68, in serve
config.load()
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/config.py", line 467, in load
self.loaded_app = import_from_string(self.app)
File "/home/ckh08045/.local/lib/python3.8/site-packages/uvicorn/importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/ckh08045/work/inpaintServer/main.py", line 17, in <module>
from app.core.worker_manager import worker_manager
File "/home/ckh08045/work/inpaintServer/app/core/worker_manager.py", line 18, in <module>
from ..core.session_pool import ModelType
File "/home/ckh08045/work/inpaintServer/app/core/session_pool.py", line 106
else:
^
SyntaxError: invalid syntax
WARNING:root:jtop library not found. Jetson monitoring will be limited. Please run 'sudo pip install jetson-stats'
INFO: Started server process [8030]
INFO: Waiting for application startup.
INFO:main:🚀 인페인팅 서버 시작 중...
2025-09-30 13:41:49,438 - main - INFO - 🚀 인페인팅 서버 시작 중...
INFO:main:✅ 공유 객체를 app.state에 저장 완료
2025-09-30 13:41:49,438 - main - INFO - ✅ 공유 객체를 app.state에 저장 완료
INFO:main:🔄 상태 저장 백그라운드 작업 생성 중...
2025-09-30 13:41:49,438 - main - INFO - 🔄 상태 저장 백그라운드 작업 생성 중...
INFO:main:✅ 상태 저장 백그라운드 작업 생성 완료
2025-09-30 13:41:49,438 - main - INFO - ✅ 상태 저장 백그라운드 작업 생성 완료
INFO:main:🚀 세션 풀 초기화 (CUDA 자동 감지)
2025-09-30 13:41:49,438 - main - INFO - 🚀 세션 풀 초기화 (CUDA 자동 감지)
INFO:app.core.session_pool:Initializing dynamic session pools...
2025-09-30 13:41:49,438 - app.core.session_pool - INFO - Initializing dynamic session pools...
INFO:app.core.session_pool:Pre-loading 2 sessions for simple_lama
2025-09-30 13:41:49,439 - app.core.session_pool - INFO - Pre-loading 2 sessions for simple_lama
INFO:main:🔄 상태 저장 백그라운드 작업 시작됨
2025-09-30 13:41:49,439 - main - INFO - 🔄 상태 저장 백그라운드 작업 시작됨
INFO:app.core.session_pool:Creating new session simple_lama_0 for simple_lama...
2025-09-30 13:41:49,439 - app.core.session_pool - INFO - Creating new session simple_lama_0 for simple_lama...
INFO:app.core.session_pool:Creating new session simple_lama_1 for simple_lama...
2025-09-30 13:41:51,057 - app.core.session_pool - INFO - Creating new session simple_lama_1 for simple_lama...
INFO:app.models.simple_lama:Loading Simple LAMA model...
2025-09-30 13:41:51,058 - app.models.simple_lama - INFO - Loading Simple LAMA model...
INFO:app.models.simple_lama:실제 SimpleLama 모델 로딩 완료
2025-09-30 13:41:52,010 - app.models.simple_lama - INFO - 실제 SimpleLama 모델 로딩 완료
INFO:app.models.simple_lama:Simple LAMA model loaded successfully
2025-09-30 13:41:52,010 - app.models.simple_lama - INFO - Simple LAMA model loaded successfully
INFO:app.models.simple_lama:Loading Simple LAMA model...
2025-09-30 13:41:52,010 - app.models.simple_lama - INFO - Loading Simple LAMA model...
INFO:app.models.simple_lama:실제 SimpleLama 모델 로딩 완료
2025-09-30 13:41:52,738 - app.models.simple_lama - INFO - 실제 SimpleLama 모델 로딩 완료
INFO:app.models.simple_lama:Simple LAMA model loaded successfully
2025-09-30 13:41:52,739 - app.models.simple_lama - INFO - Simple LAMA model loaded successfully
INFO:app.core.session_pool:Successfully created session simple_lama_0
2025-09-30 13:41:52,739 - app.core.session_pool - INFO - Successfully created session simple_lama_0
INFO:app.core.session_pool: Session Created (simple_lama). Status -> simple_lama: 0, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.3%)
2025-09-30 13:41:52,740 - app.core.session_pool - INFO - Session Created (simple_lama). Status -> simple_lama: 0, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.3%)
INFO:app.core.session_pool:Successfully created session simple_lama_1
2025-09-30 13:41:52,740 - app.core.session_pool - INFO - Successfully created session simple_lama_1
INFO:app.core.session_pool: Session Created (simple_lama). Status -> simple_lama: 0, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.3%)
2025-09-30 13:41:52,740 - app.core.session_pool - INFO - Session Created (simple_lama). Status -> simple_lama: 0, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.3%)
INFO:app.core.session_pool:Pre-loading 1 sessions for migan
2025-09-30 13:41:52,740 - app.core.session_pool - INFO - Pre-loading 1 sessions for migan
INFO:app.core.session_pool:Creating new session migan_0 for migan...
2025-09-30 13:41:52,741 - app.core.session_pool - INFO - Creating new session migan_0 for migan...
INFO:app.models.migan:Loading MIGAN ONNX model...
2025-09-30 13:41:52,761 - app.models.migan - INFO - Loading MIGAN ONNX model...
INFO:app.models.migan:MIGAN ONNX 런타임 세션 생성 시도...
2025-09-30 13:41:52,761 - app.models.migan - INFO - MIGAN ONNX 런타임 세션 생성 시도...
INFO:app.models.migan:MIGAN ONNX providers 설정: ['CUDAExecutionProvider', 'CPUExecutionProvider']
2025-09-30 13:41:52,761 - app.models.migan - INFO - MIGAN ONNX providers 설정: ['CUDAExecutionProvider', 'CPUExecutionProvider']
INFO:app.models.migan:MIGAN ONNX 세션 생성 완료. Providers: ['CUDAExecutionProvider', 'CPUExecutionProvider']
2025-09-30 13:41:53,076 - app.models.migan - INFO - MIGAN ONNX 세션 생성 완료. Providers: ['CUDAExecutionProvider', 'CPUExecutionProvider']
INFO:app.models.migan:MIGAN ONNX model loaded successfully
2025-09-30 13:41:53,076 - app.models.migan - INFO - MIGAN ONNX model loaded successfully
INFO:app.core.session_pool:Successfully created session migan_0
2025-09-30 13:41:53,077 - app.core.session_pool - INFO - Successfully created session migan_0
INFO:app.core.session_pool: Session Created (migan). Status -> simple_lama: 2, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.7%)
2025-09-30 13:41:53,077 - app.core.session_pool - INFO - Session Created (migan). Status -> simple_lama: 2, migan: 0, rembg: 0 | VRAM: 0.0/0.0 GB (7.7%)
INFO:app.core.session_pool:Pre-loading 1 sessions for rembg
2025-09-30 13:41:53,077 - app.core.session_pool - INFO - Pre-loading 1 sessions for rembg
INFO:app.core.session_pool:Creating new session rembg_0 for rembg...
2025-09-30 13:41:53,077 - app.core.session_pool - INFO - Creating new session rembg_0 for rembg...
INFO:app.models.bria_rmbg_onnx:BriaRMBGOnnxProcessor 초기화 완료
2025-09-30 13:41:53,078 - app.models.bria_rmbg_onnx - INFO - BriaRMBGOnnxProcessor 초기화 완료
INFO:app.models.bria_rmbg_onnx:Bria RMBG ONNX 세션 생성 중... path=app/models/onnx/BriaRMBG1.4_model_fp16.onnx
2025-09-30 13:41:53,078 - app.models.bria_rmbg_onnx - INFO - Bria RMBG ONNX 세션 생성 중... path=app/models/onnx/BriaRMBG1.4_model_fp16.onnx
INFO:app.models.bria_rmbg_onnx:Bria RMBG ONNX 세션 생성 완료, Providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] | Input: input, Output: output
2025-09-30 13:41:53,499 - app.models.bria_rmbg_onnx - INFO - Bria RMBG ONNX 세션 생성 완료, Providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] | Input: input, Output: output
INFO:app.core.session_pool:Successfully created session rembg_0
2025-09-30 13:41:53,501 - app.core.session_pool - INFO - Successfully created session rembg_0
INFO:app.core.session_pool: Session Created (rembg). Status -> simple_lama: 2, migan: 1, rembg: 0 | VRAM: 0.0/0.0 GB (9.0%)
2025-09-30 13:41:53,501 - app.core.session_pool - INFO - Session Created (rembg). Status -> simple_lama: 2, migan: 1, rembg: 0 | VRAM: 0.0/0.0 GB (9.0%)
INFO:app.core.session_pool:Session pools initialized successfully
2025-09-30 13:41:53,502 - app.core.session_pool - INFO - Session pools initialized successfully
INFO:main:✅ 세션 풀 초기화 완료
2025-09-30 13:41:53,502 - main - INFO - ✅ 세션 풀 초기화 완료
INFO:app.core.worker_manager:Starting worker manager...
2025-09-30 13:41:53,502 - app.core.worker_manager - INFO - Starting worker manager...
INFO:app.core.worker_manager:Worker manager started with 2 workers
2025-09-30 13:41:53,503 - app.core.worker_manager - INFO - Worker manager started with 2 workers
INFO:main:✅ 워커 매니저 시작 완료
2025-09-30 13:41:53,503 - main - INFO - ✅ 워커 매니저 시작 완료
INFO:app.core.batch_manager:Starting BatchManager...
2025-09-30 13:41:53,503 - app.core.batch_manager - INFO - Starting BatchManager...
INFO:app.core.batch_manager:BatchManager started successfully.
2025-09-30 13:41:53,503 - app.core.batch_manager - INFO - BatchManager started successfully.
INFO:main:✅ 배치 관리자 시작 완료
2025-09-30 13:41:53,503 - main - INFO - ✅ 배치 관리자 시작 완료
INFO:main:🎉 인페인팅 서버 시작 완료!
2025-09-30 13:41:53,503 - main - INFO - 🎉 인페인팅 서버 시작 완료!
WARNING:app.utils.discord_notifier:Discord 웹훅 URL이 설정되지 않아 알림을 보낼 수 없습니다.
2025-09-30 13:41:53,504 - app.utils.discord_notifier - WARNING - Discord 웹훅 URL이 설정되지 않아 알림을 보낼 수 없습니다.
INFO:app.core.session_pool:Idle session reaper started. Timeout: 1800s, Check Interval: 60s
2025-09-30 13:41:53,505 - app.core.session_pool - INFO - Idle session reaper started. Timeout: 1800s, Check Interval: 60s
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8008 (Press CTRL+C to quit)
INFO: 127.0.0.1:40950 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:40966 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 122.35.47.45:51827 - "GET /docs HTTP/1.1" 200 OK
INFO: 122.35.47.45:51827 - "GET /openapi.json HTTP/1.1" 200 OK
INFO: 122.35.47.45:51827 - "GET /docs HTTP/1.1" 200 OK
INFO: 122.35.47.45:51827 - "GET /openapi.json HTTP/1.1" 200 OK
INFO: 127.0.0.1:51770 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51772 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51786 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36330 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36338 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:36340 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36344 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36348 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36352 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36368 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36372 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42270 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42272 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42274 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42276 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42288 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:42292 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37120 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37128 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37142 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37154 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37164 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37180 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50422 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50426 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50428 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:50440 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50446 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50452 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50460 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39780 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39788 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39804 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39812 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39820 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39824 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39828 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34278 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34280 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34282 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34292 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34298 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34308 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43312 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43322 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43324 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:43328 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43332 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43342 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43356 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43368 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37340 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37354 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37356 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37366 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37370 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37380 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40926 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40936 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40938 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40944 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40948 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40952 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:54950 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:54958 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:54966 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:54972 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:54976 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:54988 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55002 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44864 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44868 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44874 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44888 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44902 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:44910 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59202 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59214 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59224 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59238 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59240 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59250 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40680 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40688 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40700 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:40706 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40710 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40714 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:40718 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55740 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55756 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55770 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55782 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55790 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55804 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41190 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41196 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41198 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41200 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41212 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41220 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41236 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57758 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57772 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57778 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:57794 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57800 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57806 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57816 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57826 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49716 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49718 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49726 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49742 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49754 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49764 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35094 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35098 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35108 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35124 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35140 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35150 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35162 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56620 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56630 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56646 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:56658 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56674 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56682 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56698 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59358 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59360 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59368 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59384 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59386 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59396 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59886 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59892 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59902 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59918 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59930 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59936 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51650 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51666 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51676 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51690 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:51698 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51706 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51716 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56056 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56070 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56076 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56092 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56106 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56116 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56492 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56498 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56508 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56522 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56532 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56548 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57686 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57690 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57704 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57710 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57720 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:57736 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:57738 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41450 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41452 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41468 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41474 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41476 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41480 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35860 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35868 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35878 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35884 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35900 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35908 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35916 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37996 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38004 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38008 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38016 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38030 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38036 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:38052 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38056 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52420 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52426 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52438 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52450 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52464 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52474 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49978 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49984 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49992 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50002 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50012 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50018 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37348 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37356 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37368 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37380 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37388 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37398 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37406 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:50410 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50420 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50424 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50436 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50446 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50456 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34512 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34520 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34530 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34540 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34542 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34546 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55372 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55382 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55394 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55398 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55410 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55422 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:55424 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:47164 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:47178 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:47180 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:47188 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:47198 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:47202 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48968 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48980 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48992 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49000 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49012 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49028 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49038 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41792 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41806 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41822 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41828 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41832 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41848 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41860 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:41862 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:37968 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37982 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37994 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38002 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38014 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56402 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56418 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56434 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56438 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56450 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56462 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:56472 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36790 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36802 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36818 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36824 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36826 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36830 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36842 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:36856 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:38068 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38076 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38092 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38100 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38102 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38114 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43516 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43530 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43540 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43542 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43556 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:43568 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45942 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45958 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45972 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45974 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45986 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:45996 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:46000 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48010 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48026 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:48032 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48038 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48048 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48054 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48064 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48066 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37730 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37744 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37754 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37766 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37768 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37778 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51766 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51780 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51782 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51784 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51786 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:51788 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50002 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50016 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50020 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:50022 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50036 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50044 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50054 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50070 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48460 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48462 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48472 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48480 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48496 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48512 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52154 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52164 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52178 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52184 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52186 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52200 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52630 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52634 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52638 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:52640 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52648 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52660 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:52674 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60092 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60102 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60106 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60114 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60124 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60126 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60136 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60790 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60800 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60806 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60820 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60836 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60848 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60160 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60162 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60178 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:60182 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60196 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60208 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:60218 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37996 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38010 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38016 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38030 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38038 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38048 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58906 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58908 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58910 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58918 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58932 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:58934 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39180 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39182 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39196 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:39206 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39210 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39216 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39228 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48208 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48210 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48220 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48226 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48232 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48240 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:48248 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34080 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34092 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34104 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34110 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34116 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34130 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38284 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38294 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38308 - "GET /api/v1/health HTTP/1.1" 200 OK
INFO: 127.0.0.1:38316 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38328 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38330 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38342 - "GET /api/v1/stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:38344 - "GET /api/v1/stats HTTP/1.1" 200 OK

View File

@ -1 +1 @@
841903
8030

View File

@ -1,18 +1,141 @@
Failed to initialize jtop: The jtop.service is not active. Please run:
sudo systemctl restart jtop.service
INFO: Started server process [840568]
WARNING:root:jtop library not found. Jetson monitoring will be limited. Please run 'sudo pip install jetson-stats'
INFO: Started server process [8148]
INFO: Waiting for application startup.
Fan control not available
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8888 (Press CTRL+C to quit)
INFO: 127.0.0.1:57182 - "GET /api/simple HTTP/1.1" 200 OK
Task exception was never retrieved
future: <Task finished name='Task-4' coro=<health_check_and_restart() done, defined at /home/ckh08045/work/inpaintServer/app/monitoring/dashboard.py:2084> exception=AttributeError("module 'asyncio' has no attribute 'to_thread'")>
Traceback (most recent call last):
File "/home/ckh08045/work/inpaintServer/app/monitoring/dashboard.py", line 2094, in health_check_and_restart
response = await asyncio.to_thread(requests.get, health_url, timeout=10)
AttributeError: module 'asyncio' has no attribute 'to_thread'
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [840568]
INFO: 127.0.0.1:33342 - "GET /api/simple HTTP/1.1" 200 OK
INFO: 122.35.47.45:51860 - "GET / HTTP/1.1" 200 OK
INFO: 122.35.47.45:51865 - "WebSocket /ws" [accepted]
INFO: connection open
INFO: 122.35.47.45:51860 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:51861 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51867 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51866 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51868 - "GET /favicon.ico HTTP/1.1" 404 Not Found
INFO: 122.35.47.45:51873 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51873 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51873 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51877 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51876 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:51875 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51878 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51895 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51895 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51895 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51918 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:51916 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51919 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51917 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51938 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51938 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51938 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51973 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:51974 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51975 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51972 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51986 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:51986 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:51986 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52008 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52005 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52007 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52006 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52025 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52025 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52025 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52046 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52047 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52049 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52048 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52054 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52054 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52054 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52061 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52060 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52058 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52059 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52069 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52069 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52069 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52082 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52084 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52081 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52083 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52087 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52087 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52087 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52112 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52114 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52115 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52113 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52113 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52113 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52113 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52131 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52130 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52129 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52132 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52144 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52144 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52144 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52154 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52151 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52153 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52152 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52164 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52164 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52164 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52170 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52169 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52171 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52172 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52177 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52183 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52182 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52184 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52185 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52195 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52194 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52194 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52214 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52213 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52216 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52215 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52225 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52225 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52234 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52235 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52236 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52237 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52238 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52245 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52245 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52245 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52257 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52259 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52256 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52258 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52261 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52261 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52261 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52268 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52265 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52266 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52267 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52272 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52272 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52272 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52276 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52278 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52275 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52277 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52290 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52290 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52290 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52307 - "GET /api/logs?lines=50 HTTP/1.1" 200 OK
INFO: 122.35.47.45:52309 - "GET /api/performance-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52308 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52306 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52316 - "GET /api/system-alerts HTTP/1.1" 200 OK
INFO: 122.35.47.45:52316 - "GET /api/model-usage-stats HTTP/1.1" 200 OK
INFO: 122.35.47.45:52316 - "GET /api/system-alerts HTTP/1.1" 200 OK

View File

@ -1 +1 @@
840568
8148

View File

@ -201,7 +201,7 @@ async def save_status_periodically():
import traceback
logger.error(f"상세 오류: {traceback.format_exc()}")
await asyncio.sleep(1)
await asyncio.sleep(5)
@asynccontextmanager
async def lifespan(app: FastAPI):

View File

@ -1,33 +1,62 @@
# ============================
# requirements_x86.txt (Linux x86_64, CUDA 11.8)
# ============================
# PyTorch CUDA 11.8 휠 받기 (기본 PyPI + 추가 인덱스)
--extra-index-url https://download.pytorch.org/whl/cu118
########################
# 서버/웹 기본
########################
fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
pillow==10.0.1
numpy==1.23.5
opencv-python==4.8.1.78
psutil==5.9.6
requests==2.31.0
# PyTorch - x86 시스템용 (CUDA 11.8 지원)
# Python 3.10 호환 버전
torch==2.0.1+cu118
torchvision==0.15.2+cu118
# CUDA 관련 (x86 전용)
pycuda==2022.2.2
# 인페인팅 모델들
rembg==2.0.50
simple-lama-inpainting==0.1.0
# 시스템 모니터링
asyncio-throttle==1.0.2
aiofiles==23.2.1
asyncio-throttle==1.0.2
requests==2.31.0
psutil==5.9.6
websockets
########################
# 이미지/수치
########################
pillow==10.0.1
# TensorFlow 2.12.0은 numpy<1.24 요구 → 충돌 방지 위해 범위 고정
numpy==1.26.4
opencv-python==4.8.1.78
########################
# 설정/검증
########################
pydantic==2.7.4
pydantic-settings==2.8.1
# x86 GPU 모니터링
pynvml==11.5.0
nvidia-ml-py3==7.352.0
########################
# DL 프레임워크
########################
# TensorFlow (GPU 포함 단일 패키지)
# tensorflow==2.12.0
# 추가 최적화 패키지들 (Python 3.10 호환)
# PyTorch (CUDA 11.8 휠)
torch==2.2.2
torchvision==0.17.2
########################
# 인페인팅/배경제거
########################
rembg==2.0.50
simple-lama-inpainting
# rembg 가속용 (CUDA 11.8 빌드)
onnxruntime-gpu==1.16.3
########################
# GPU 모니터링
########################
pynvml==11.5.0
# nvidia-ml-py3==7.352.0 # ← 기능 중복이라 제거 권장
########################
# (선택) CUDA 커널 직접 호출 시만
########################
#pycuda==2022.2.2

View File

@ -1,75 +1,19 @@
{
"worker_status": {
"running": true,
"total_workers": 10,
"total_workers": 2,
"queue_size": 0,
"workers_by_status": {
"idle": [
{
"id": "worker_f70b814c",
"id": "worker_67ac071e",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_7ef5e684",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_63d0f5bb",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_9b7b1de3",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_7952c8ab",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_7af356b5",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_156f8680",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_e9ca4545",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_ad1a8fc2",
"status": "idle",
"task_count": 0,
"error_count": 0,
"last_task_at": null
},
{
"id": "worker_3a52ecf2",
"id": "worker_99f585de",
"status": "idle",
"task_count": 0,
"error_count": 0,
@ -91,53 +35,69 @@
"available": 2
},
"migan": {
"min": 2,
"min": 1,
"max": 4,
"total": 2,
"total": 1,
"in_use": 0,
"available": 2
"available": 1
},
"rembg": {
"min": 2,
"max": 4,
"total": 2,
"min": 1,
"max": 3,
"total": 1,
"in_use": 0,
"available": 2
"available": 1
}
},
"api_stats": {
"total_requests": 7,
"successful_requests": 7,
"total_requests": 400,
"successful_requests": 400,
"failed_requests": 0,
"success_rate": 100.0,
"endpoint_usage": {
"GET /api/v1/health": 2,
"POST /api/v1/remove_bg": 5
"GET /api/v1/health": 22,
"GET /docs": 2,
"GET /openapi.json": 2,
"GET /api/v1/stats": 374
},
"endpoint_stats": {
"GET /api/v1/health": {
"count": 2,
"avg_time": 0.0023573637008666992,
"min_time": 0.0011353492736816406,
"max_time": 0.003579378128051758,
"count": 22,
"avg_time": 0.0008184367960149592,
"min_time": 0.0004703998565673828,
"max_time": 0.001514434814453125,
"current_concurrent": 0
},
"POST /api/v1/remove_bg": {
"count": 5,
"avg_time": 15.194099569320679,
"min_time": 0.29595065116882324,
"max_time": 74.70842432975769,
"GET /docs": {
"count": 2,
"avg_time": 0.0005669593811035156,
"min_time": 0.0005576610565185547,
"max_time": 0.0005762577056884766,
"current_concurrent": 0
},
"GET /openapi.json": {
"count": 2,
"avg_time": 0.0098419189453125,
"min_time": 0.0009410381317138672,
"max_time": 0.018742799758911133,
"current_concurrent": 0
},
"GET /api/v1/stats": {
"count": 374,
"avg_time": 0.0007271456718444824,
"min_time": 0.0005671977996826172,
"max_time": 0.0024929046630859375,
"current_concurrent": 0
}
},
"average_response_time": 10.853601796286446,
"min_response_time": 0.0011353492736816406,
"max_response_time": 74.70842432975769,
"average_response_time": 0.0007895290851593018,
"min_response_time": 0.00044035911560058594,
"max_response_time": 0.018742799758911133,
"current_concurrent": 0,
"max_concurrent": 1,
"requests_per_second": 0.019528829012151992,
"uptime": 358.4444308280945,
"requests_per_second": 0.6403491471578444,
"uptime": 624.6592218875885,
"recent_errors": []
},
"timestamp": 1756730843.4636421
"timestamp": 1759240334.0925634
}

20
tf_check.py Normal file
View File

@ -0,0 +1,20 @@
# tf_check.py
import os
print("PYTHON:", os.sys.version)
try:
import tensorflow as tf
print("TF VERSION:", tf.__version__)
print("TF Built with CUDA:", tf.test.is_built_with_cuda())
print("TF GPUs:", tf.config.list_physical_devices('GPU'))
except Exception as e:
print("TF CHECK ERROR:", e)
try:
import torch
print("TORCH VERSION:", torch.__version__)
print("TORCH CUDA AVAILABLE:", torch.cuda.is_available())
if torch.cuda.is_available():
print("TORCH DEVICE:", torch.cuda.get_device_name(0))
except Exception as e:
print("TORCH CHECK ERROR:", e)

1
venv/lib64 Symbolic link
View File

@ -0,0 +1 @@
lib