AI 학습 허브

로컬 AI 모듈 목차

Air-Gapped Engineering Standard
Module 06

올인원 로컬 AI 웹 UI & 실시간 자원 관제 대시보드

검은 터미널 창을 벗어나 한눈에 모니터링하는 VRAM/RAM 실시간 텔레메트리 및 원클릭 프로세스 제어 센터

RTX 3060 VRAM 점유량 83.3%
10.0 / 12.0 GB
● FLUX.1-dev Q4_0 GGUF 연산 적재 중
64GB 시스템 메모리 (RAM) 28.4%
18.2 / 64.0 GB
● Docling OCR & ChromaDB 백그라운드 상주
CPU 연산 부하율 45.8%
45.8 %
● 8 스레드 문서 파싱 구동 중
Ollama LLM Engine 가동 중

포트: localhost:11434
활성 모델: hermes3:8b (대기 1분 후 자동 언로드 설정 적용)

ComfyUI 비주얼 허브 가동 중

포트: localhost:8188
파이프라인: FLUX GGUF / LTX-Video (--lowvram 모드)

웹UI 접속
리눅스 마스터 RAG 워커 파싱 중

대상: 기출필기 / 기출실기 / 이론 3대 핵심 파일
벡터 서고: C:\ai_workspace\chroma_db

🖥️ 실시간 통합 시스템 이벤트 로그 (Live Telemetry Monitor)
[SYSTEM INIT] Local AI Workspace Telemetry Monitor connected. [OLLAMA] Service listening at http://127.0.0.1:11434 (Keep-Alive: 1m configured) [COMFYUI] Dynamic block paging active (--lowvram). Model cache ready at :8188 [DOCLING] Processing targets: '리눅스마스터1급_기출_필기', '기출_실기', '이론' [WATCHDOG] RTX 3060 12GB VRAM allocation healthy. Zero CUDA memory fragmentation.

대시보드 실제 연동: 1초 구동 파이썬 백엔드 스크립트

이 웹 대시보드가 실제 윈도우의 VRAM, RAM, CPU 사용률을 읽어오고 버튼 클릭 시 Ollama/ComfyUI 프로세스를 직접 제어할 수 있도록 해주는 초경량 FastAPI 백엔드 스크립트(dashboard_server.py)입니다.

💡 백엔드 실행 방법 (가상환경 활성화 상태)
python -m pip install fastapi uvicorn psutil
python C:\ai_workspace\dashboard_server.py

실행 후 브라우저에서 page6_dashboard_webui.php을 열면 3초마다 실제 PC의 하드웨어 수치가 실시간 동기화됩니다.

백엔드 서버 전체 코드 (C:\ai_workspace\dashboard_server.py)

import psutil
import subprocess
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import torch

app = FastAPI(title="Local AI Workspace Dashboard")

# 웹 UI 브라우저 접근 허용 (CORS 활성화)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"]
)

@app.get("/api/telemetry")
def get_telemetry():
    # GPU VRAM 수치 계측
    vram_used = 0.0
    vram_total = 12.0
    if torch.cuda.is_available():
        vram_used = round(torch.cuda.memory_allocated(0) / (1024**3), 2)

    # 시스템 RAM 및 CPU 수치 계측
    ram = psutil.virtual_memory()
    ram_used = round(ram.used / (1024**3), 2)
    ram_total = round(ram.total / (1024**3), 2)

    return {
        "vram_used": vram_used,
        "vram_total": vram_total,
        "vram_pct": round((vram_used / vram_total) * 100, 1),
        "ram_used": ram_used,
        "ram_total": ram_total,
        "ram_pct": ram.percent,
        "cpu_pct": psutil.cpu_percent()
    }

@app.post("/api/service/{name}/{action}")
def control_service(name: str, action: str):
    if name == "ollama" and action == "stop":
        subprocess.run(["ollama", "stop", "hermes3:8b"], shell=True)
        subprocess.run(["ollama", "stop", "student"], shell=True)
    elif name == "comfyui" and action == "stop":
        # ComfyUI 프로세스 종료 처리 예시
        subprocess.run(["taskkill", "/F", "/IM", "python.exe", "/T"], shell=True)
    return {"status": "success", "service": name, "action": action}

if __name__ == "__main__":
    print("[*] Local AI Dashboard API Server listening on http://127.0.0.1:8000")
    uvicorn.run(app, host="127.0.0.1", port=8000)