ramn51/titan-orchestrator
요약
Titan은 커스텀 TCP 프로토콜, DAG 스케줄러, AOF 기반 스토어 등을 통합한 분산 실행 런타임입니다. 외부 의존성 없이 단일 JAR 파일로 작업 스케줄링, 라우팅, 실행을 수행하며, 에이전트형 워크플로우와 HITL 게이트를 지원합니다. 이는 복잡한 파이프라인 구축 및 관리를 간소화하는 것을 목표로 합니다.
핵심 포인트
- 단일 JAR 파일로 분산 런타임 구현 (제로 의존성)
- DAG 스케줄링, 서비스 오케스트레이션, 에이전트형 실행 통합
- AOF 기반 스토리지를 통한 충돌 복구 및 상태 공유 지원
- HITL 게이트와 자체 변형 DAG를 갖춘 고급 에이전트 워크플로우 가능
원리부터 구축한 분산 실행 런타임 — 커스텀 TCP 프로토콜, DAG 스케줄러, AOF 기반 스토어, 그리고 에이전트형 런타임을 단일 제로 의존성 JAR (129 KB)에 담았습니다.
5분 퀵스타트 ·
전체 문서 ·
Titan 비교 방법 ·
아키텍처
Titan은 커스텀 DAG 스케줄러, 바이너리 와이어 프로토콜, AOF 기반 KV 스토어, 그리고 에이전트형 실행 엔진을 갖춘 분산 실행 런타임입니다. 핵심 엔진은 외부 의존성이 전혀 없는 단일 JAR 파일이며 — 설치된 것이 아무것도 없어도 클러스터 전반에 걸쳐 작업(schedule), 라우팅(route), 실행(execute)을 수행합니다. 대시보드 (Flask)와 MCP 서버 (mcp package)는 선택적인 확장 기능입니다. 이는 베어 VM이나 노트북에서 실행됩니다.
YAML 또는 Python으로 작업을 제출하면, Titan이 의존성을 해결하고, 적합한 워커로 라우팅하며, 로그를 스트리밍하고, AOF 리플레이를 통해 충돌로부터 복구합니다. 에이전트형 계층에서는 작업이 실행 중간에 새로운 작업을 생성할 수 있고, TitanStore를 통해 노드 간 상태를 공유하며, 계속 진행하기 전에 인간의 승인을 위해 일시 중지될 수 있습니다.
이는 하나의 바이너리에서 세 가지 기능 계층을 다룹니다:
| 계층 | 실행 가능한 작업 |
|---|---|
| T1 — 분산 작업 스케줄러 | 배치 작업, 정적 DAG, GPU/CPU 라우팅 워크로드, 지연 실행 |
| T2 — 서비스 오케스트레이터 | 자동 재시작 및 포트 관리가 가능한 장기 실행 API 및 데몬 |
| T3 — 에이전트형 런타임 | 자체 변형(Self-mutating) DAGs, LLM 기반 에이전트, HITL 게이트를 갖춘 다중 에이전트 파이프라인 |
v1.0 연구 상태입니다. 단일 마스터 토폴로지 (v2 로드맵에서 Raft), 프로세스 수준 격리 (v2에서 Docker), mTLS는 아직 없습니다. 오늘날 프로덕션 환경에서 Kubernetes나 Temporal을 대체하기 위함이 아니라, 이해하기 쉽도록 구축되었습니다.
Titan 런타임, 31개 슬라이드로 요약 — 간결한 버전: 문제점, 아키텍처, 포함된 기능 목록, Airflow / Ray / Nomad / Temporal 대비 솔직한 점수 비교, 그리고 v1이 아닌 것들. Titan이 자신과 관련 있는지 결정하기 전에 이 문서를 읽어보세요.
Titan은 내장 Python Flask 대시보드를 제공합니다. 다섯 개의 뷰가 있으며 — 네 개는 파이프라인용이고, 두 개는 이를 실행하는 스케줄러용입니다:
연결된 모든 워커의 실시간 보기 — 기능 태그 (GENERAL / GPU / HIGH_MEM), 활성 작업 수, 실행 중인 서비스, 최근 활동을 확인할 수 있습니다. 브라우저에서 새 노드를 시작할 수 있는 + Worker 실행 버튼이 포함되어 있습니다.
CLI, SDK, YAML 또는 시각적 Constructor를 통해 클러스터에 제출된 모든 파이프라인은 실시간 의존성 그래프로 자동 렌더링됩니다. 작업이 PENDING → RUNNING → COMPLETED / FAILED을 거치면서 노드 색상이 실시간으로 업데이트됩니다.
노드를 클릭하면 stdout/stderr를 실시간 스트리밍할 수 있습니다.
브라우저 기반의 드래그 앤 드롭 DAG 에디터입니다. 태스크 및 서비스 노드를 추가하고, 의존성 엣지를 그리고, 각 노드별로 스크립트, 기능(capability), 우선순위, HITL 게이트를 구성한 다음 원클릭으로 클러스터에 배포합니다. 구축하는 즉시 동등한 Python SDK와 YAML을 자동 생성합니다.
agent_run_id를 공유하는 모든 DAG 단계를 하나의 타임라인 행으로 그룹화합니다. 에이전트가 반복적으로 실행될 때 (PLAN → ITER → EVAL → SYNTH), 각 단계는 별도의 DAG 제출입니다 — Agent Runs는 전체 수명 주기를 재구성하여 개별 항목을 찾아다닐 필요가 없게 만듭니다.
절대 시간 축(absolute time axis) 상의 모든 작업 디스패치를 보여줍니다. 각 스팬은 작업이 적격 상태가 된 시점과 실제로 시작한 시점을 기록하므로, 대기열에 머문 시간이 실행된 시간과 분리되어 표시됩니다 — 이는 상태 보기로는 알 수 없는 구분입니다. 겹치는 막대는 정말 같은 순간에 실행되었음을 의미합니다.
임계 경로(critical path)와 전체 벽시계 시간(wall clock) 중 차지하는 비중, 실제 병렬성, 별도의 시도로 간주되는 재시도, 스크립트 실패와 준비 상태 실패, 또는 응답하지 않은 워커를 구별하는 실패 이유를 제공합니다. 스팬은 메모리에 유지되며 7일 동안 디스크에 기록되므로 마스터(Master) 재시작 후에도 사후 분석이 가능합니다.
다른 뷰들은 파이프라인을 설명하고, 이 뷰는 해당 파이프라인을 실행하는 시스템을 설명합니다. 스케줄러 자체의 언어로 된 대기(Pending) 이유, 이를 해결할 수 있는 명령어와 관련된 기능적 막힘 지점(capability dead ends), 그리고 단일 '대기' 카운트로는 구분할 수 없는 네 가지 사전 배포 레인(delayed, blocked, ready, parked)이 있습니다.
배포 루프(dispatch loop)는 직렬화되어 있어 그 지속 시간이 스케줄러의 처리량 한계치(throughput ceiling)가 됩니다. 이는 라우팅(routing), 워커 선택(worker selection), 장부 기록(bookkeeping), 스토어 쓰기(store writes), 그리고 공유 테이블을 통한 네트워크 핸드오프(network hand-off)로 세분화됩니다. 게다가 포화도(saturation), 실패율(failure rate), 스토어 읽기/쓰기 지연 시간(store read/write latency), 노드별 호스트 CPU/메모리/부하, 다이얼 가능한 주소를 가진 라이브 서비스 명단(live service roster), 그리고 모든 규모 확장 및 축소에 대한 이유가 기록된 확장 이력까지 포함됩니다.
메트릭 스택(metrics stack)도 없고, 익스포터(exporter)도 없고, Grafana도 없습니다. 모든 것이 Master 내부에서 샘플링되어 동일한 프로세스로 제공됩니다.
| 방법 | 최적의 사용 사례 |
|---|---|
| YAML 파일 | 재현 가능하고 버전 관리되는 파이프라인. git에 커밋하고 언제든지 다시 실행할 수 있습니다. |
| Python SDK | 런타임에 형태가 결정되는 프로그래밍 방식의 파이프라인 — 에이전트 루프(agent loops), 동적 팬아웃(dynamic fan-out). |
| 시각적 생성기 (Visual Constructor) | 코드를 작성하지 않고 파이프라인을 구축합니다. 노드를 드래그하고, 엣지(edges)를 그리고, 한 번의 클릭으로 배포합니다. |
| MCP (자연어) | Claude Desktop 또는 Cursor에서 Titan 제어. 원하는 것을 설명하면 — 에이전트가 스크립트를 작성하고 사용자를 대신하여 DAG를 제출합니다. |
네 가지 경로 모두 동일한 결과를 생성합니다: 작업별 로그, 상태 및 작업 공간 파일이 포함된 시각화기(visualizer)의 추적 가능한 DAG입니다.
노드를 드래그하고 엣지를 그려 파이프라인을 구축하고 — 한 번의 클릭으로 클러스터에 배포하세요.
Screen.Recording.2026-05-17.at.10.23.48.PM.mov
DAG가 체크포인트에서 일시 정지하고, 하위스트림 작업이 재개되기 전에 인간의 승인/거부(Approve/Reject)를 기다립니다.
Screen.Recording.2026-05-17.at.10.25.48.PM.mov
다중 분기 파이프라인에서 실행 중단되는 HITL 게이트(HITL gate) — 시각화기가 일시 정지된 상태를 어떻게 반영하는지 보여줍니다.
Screen.Recording.2026-05-17.at.10.29.38.PM.mov
다단계 에이전트 루프(multi-stage agent loop) — 각 단계는 별도의 DAG 제출이며, Agent Runs 내에서 하나의 타임라인으로 그룹화됩니다.
Screen.Recording.2026-05-17.at.11.22.29.PM.mov
더 알아보기: 동적 DAG 실행(Dynamic DAG Execution), 반응형 스케일링(Reactive Scaling), GPU 라우팅(GPU Routing), 팬아웃(Fanout)
제어 평면(Control Plane): 동적 DAG 실행
dynamic_dag.mp4
반응형 워커 스케일링(Reactive Worker Scaling)
titan_load_scaling.mp4
GPU 친화성 라우팅(GPU Affinity Routing)
GPU_Affinity_yaml.mp4
병렬 실행 (Fanout)
fanout_yaml_dag.mp4
전체 부하 주기 (Scale Up & Descale)
titan_load_descaling.mp4
# 1. 엔진 빌드
pm clean package -DskipTests
# 2. 클러스터 시작 (Master + 2 workers + TitanStore + dashboard)
...
첫 번째 작업 제출:
from titan_sdk.titan_sdk import TitanClient, TitanJob
client = TitanClient()
client.submit_dag(
- Capability 기반 라우팅 (Capability-based routing) — 태그를 가진 워커 지정
`GPU`
,
`HIGH_MEM`
,
또는 사용자 정의; 일치하는 노드가 비어있을 때까지 작업(job)이 대기함 - 친화성 라우팅 (Affinity routing) — 태그로 특정 워커에 작업을 고정시킴
- 사용 가능한 워커 전반에 걸쳐 동시 작업 수 기준으로 부하가 가장 적은 곳으로 분배
- 반응형 자동 스케일링 (Reactive auto-scaling) — 워커의 큐가 포화 상태가 되면, 급증을 흡수하기 위해 동일한 머신에서 자식 워커 프로세스를 생성함; 유휴 버스트 워커는 45초 후에 자동으로 해제됨
**워커 생명주기 (Worker Lifecycle)**
- 영구적(Permanent) 대 일시적(ephemeral) 워커 — 노드를 영구적으로 표시하여 작업 완료 후에도 활성 상태를 유지함; 버스트 워커는 유휴 상태일 때 종료됨
- 재연결 시 워커의 마스터 재등록 (Worker re-register with the Master on reconnect) — 수동 개입 없이도 마스터 재시작을 통해 클러스터가 복구됨
- 시작 시 고아 프로세스 정리 (Orphan cleanup on startup) — 워커는 새 작업을 받기 전에 이전 충돌로 남은 프로세스를 검색하고 종료함
**복원력 (Resilience)**
- AOF 충돌 복구 (AOF crash recovery) — 마스터가 재시작 시 상태를 재생하여 진행 중인 DAG(Directed Acyclic Graph)를 재개함
- 워커 재등록 (Worker re-registration) — 수동 개입 없이도 마스터 재시작을 통해 클러스터가 복구됨
- 지수 백오프(exponential backoff)를 사용한 콜백 재시도
**진행 중인 작업 복구 (In-flight job recovery)** — 워커가 하트비트를 실패하면, 해당 워커가 보유하던 작업들은 사유와 함께 종료되고 정상적인 재시도 경로를 통해 다시 큐에 추가됨. 따라서 죽은 노드가 작업을 방치하거나 종속된 작업을 차단할 수 없음 - 고아 조정 (Orphan reconciliation) — 주기적인 확인을 통해 플릿(fleet)에서 이탈한 워커에서 작업이 실행 중으로 계산되는 일이 없도록 보장하며, 스케일러의 회수 및 해제뿐만 아니라 충돌까지 포괄함
**관측 가능성 (Observability)**
- 노드별 상태와 모든 작업의 실시간 로그 스트리밍이 가능한 라이브 DAG 시각화 기능
- 다단계 에이전트 워크플로우를 위한 Agent Runs 타임라인
- 디스패치(dispatch) 시도당 하나의 스팬 — 적격/시작/종료, 워커, 시도 횟수, 우선순위, 부모 노드 등을 통해 **큐 대기 시간이 작업별로 할당**됨 - 그래프로부터 크리티컬 패스와 병렬성을 계산
**단계별 디스패치 루프 분해**(경로 설정(route) / 선택(select) / 기록(record) / 저장(store) / 전송(send)) 및 공유 테이블 — 포화도, 실패율, 처리량, 스토어 읽기/쓰기 지연 시간, 노드별 하트비트 왕복 시간
- 워커당 호스트 CPU / 메모리 / 부하 평균 보고 (하트비트를 통해)
- 다이얼 가능한 주소와 가동 시간을 갖춘 라이브 서비스 명단
- 선언된 우선순위에 따른 큐 대기 시간 및 실행 전반의 파이프라인 지속 시간 추세
- 스팬 기록을 일별로 분할된 JSONL(7일)에 영구 저장하여 Master 재시작에도 생존 가능
- 마크다운 / JSON 메트릭 내보내기, 그리고 7가지 사전 설정 워크플로우를 갖춘 내장 데모 러너
**Human-in-the-Loop (HITL)**
- 네이티브 HITL 게이트 — 모든 체크포인트에서 DAG 일시 중지 및 대시보드에서 승인/거부
- 구성 가능한 타임아웃(기본값 48시간)
- SDK를 통한 자동 게이트 주입
Titan은 기본적으로 로컬에서 실행됩니다. 클라우드로 이동할 준비가 되면, `package_cloud.sh` 스크립트를 사용합니다.
./package_cloud.sh
→ titan-master-bundle.zip (~2.3 MB) — Master VM에 필요한 모든 것
→ titan-worker-bundle.zip (~120 KB) — 원격 워커용 Worker.jar + titan_sdk
**Multi-VM Setup**— GCP / AWS / Azure의 영구 클러스터
**Remote GPU via SSH Tunnel**— 로컬 머신을 Master로 유지하고, 포트가 열려 있지 않은 RunPod 또는 클라우드 VM을 워커로 터널링
| 예시 | 보여주는 내용 |
|---|---|
| 첫 에이전트 구축 (Build Your First Agent) | Writer → Critic 루프 — 약 60줄 만에 구현 가능한 가장 간단한 에이전트 패턴 |
| ... | |
Titan은 한 명의 개발자가 원리부터 구축한 실험적인 런타임입니다. 버그 보고, 엣지 케이스 발견, 기여를 환영합니다.
Report an Issue · How to Contribute
Apache License 2.0에 따라 라이선스됨. © 2026 Ram Narayanan A S.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기