Vision-Agents에서 gRPC 기반 분산 서비스 통신 구축하기

Vision-Agents는 Stream의 에지 네트워크를 기반으로 하는 오픈소스 비전 에이전트 프레임워크로, 다양한 모델과 영상 제공자를 빠르게 연결해 초저지연 실시간 상호작용을 가능하게 한다. 본문에서는 이 프레임워크가 gRPC를 활용해 서비스 간 효율적인 통신을 구현하는 방식과 그 설계 원리를 살펴본다.

gRPC를 Vision-Agents 통신 기반으로 선택한 이유

분산 환경에서 서비스 간 데이터 교환 효율은 전체 시스템 성능을 좌우한다. Vision-Agents가 gRPC를 채택한 이유는 다음과 같다.

  • 바이너리 직렬화 효율: JSON이나 XML 대신 Protocol Buffers를 사용해 데이터 크기를 대폭 줄이고 파싱 속도를 높임
  • 계약 기반 인터페이스: .proto 파일로 서비스 경계를 명확히 정의해 빌드 시점에 타입 오류를 방지
  • 폴리글랏 지원: 여러 언어용 클라이언트 및 서버 스텁을 자동 생성해 다양한 플러그인 생태계에 대응
  • 스트리밍 모델: 단일 요청·응답부터 양방향 스트림까지 4가지 통신 패턴을 제공해 실시간 영상 파이프라인에 적합

Protobuf 기반 이벤트 모델 설계

Vision-Agents는 서비스 간 일관된 데이터 교환을 위해 Protobuf로 통합 이벤트 스키마를 관리한다. SFU(Selective Forwarding Unit) 이벤트를 자동으로 파이썬 데이터 클래스로 변환하는 핵심 도구는 다음 경로에 있다.

agents-core/vision_agents/_generate_sfu_events.py

이 스크립트는 Protobuf 정의를 읽어 타입 안전한 래퍼 클래스를 생성한다. 예를 들어 다음과 같은 구조가 만들어진다.

@dataclass
class AudioLevelEvent(BaseEvent):
    """video.sfu.event.events_pb2.AudioLevel에 대응하는 이벤트 클래스"""
    type: str = field(default="stream.video.sfu.event.AudioLevel", init=False)
    payload: Optional[events_pb2.AudioLevel] = field(default=None, repr=False)

    @property
    def user_id(self) -> Optional[str]:
        if self.payload is None:
            return None
        return getattr(self.payload, "user_id", None)

생성된 코드는 agents-core/vision_agents/core/edge/sfu_events.py에 위치하며, 모든 SFU 이벤트 타입의 변환 규칙을 담고 있다.

gRPC 통신 아키텍처 구성

이벤트 중심 메시지 체계

모든 서비스 간 상호작용은 사전 정의된 이벤트 타입을 통해 이루어진다. 이벤트의 등록과 라우팅을 담당하는 중앙 모듈은 다음과 같다.

agents-core/vision_agents/core/events/manager.py

SFU 이벤트 처리 파이프라인

실시간 영상 통신의 핵심인 SFU와의 gRPC 연동은 전용 모듈에서 처리된다. 연결 품질 변화 이벤트의 예시는 다음과 같다.

@dataclass
class ConnectionQualityChangedEvent(BaseEvent):
    type: str = field(
        default="stream.video.sfu.event.ConnectionQualityChanged", init=False
    )
    payload: Optional[events_pb2.ConnectionQualityChanged] = field(
        default=None, repr=False
    )

    @property
    def connection_quality_updates(self) -> Optional[List[Any]]:
        if self.payload is None:
            return None
        return getattr(self.payload, "connection_quality_updates", None)

플러그인 간 통신适配

외부 AI 모델 서비스와의 연결도 표준화된 gRPC 인터페이스를 통해 이루어진다. OpenAI 플러그인의 통신 구현 예시는 다음 경로를 참고한다.

plugins/openai/vision_agents/plugins/openai/

실전 적용: 실시간 영상 분석 파이프라인

양방향 스트림을 활용한 전형적인 영상 처리 워크플로우는 다음과 같다.

  1. 캡처 모듈이 gRPC 스트림으로 원본 프레임을 추론 서비스로 전송
  2. 추론 서비스가 객체 인식·행위 분석 등을 수행해 구조화된 결과 산출
  3. 결과 메타데이터를 gRPC를 통해 대시보드 또는 알림 서비스로 전파

성능 최적화 전략

압축 알고리즘 적용

대역폭이 중요한 환경에서는 채널 옵션으로 압축을 명시적으로 설정한다.

conn = grpc.insecure_channel(
    'inference.cluster.local:50051',
    options=[
        ('grpc.default_compression_algorithm', grpc.Compression.Gzip),
    ]
)

연결 재활용

매 요청마다 연결을 새로 만드는 비효율을 피하기 위해 Vision-Agents는 연결 풀을 운영한다. 관련 로직은 다음 파일에서 확인할 수 있다.

agents-core/vision_agents/core/mcp/mcp_manager.py

비동기 I/O 활용

처리량 극대화를 위해 gRPC의 비동기 API를 활용한 구현체는 다음 경로에 있다.

agents-core/vision_agents/core/runner/http/api.py

시작 가이드

gRPC 통신 기능을 직접 확인하려면 다음 단계를 따른다.

# 저장소 복제
git clone https://gitcode.com/GitHub_Trending/vi/Vision-Agents

# 의존성 설치
cd Vision-Agents
pip install -e .

# gRPC 서비스 샘플 실행
python examples/08_agent_server_example/agent_server_example.py

클라이언트 측에서는 자동 생성된 스텁을 다음과 같이 활용한다.

from vision_agents.core.edge.sfu_events import AudioLevelEvent

def on_audio_level(evt: AudioLevelEvent):
    print(f"사용자 {evt.user_id}의 음성 레벨: {evt.level}")

Vision-Agents는 gRPC와 Protobuf의 조합을 통해 분산 비전 에이전트 시스템에 필요한 낮은 지연과 높은 처리량을 달성하고 있으며, 이 패턴은 실시간 영상 분석, 다중 모델 오케스트레이션, 에지-클라우드 협업 등 다양한 시나리오로 확장 가능하다.

태그: gRPC Protocol Buffers Vision-Agents Stream SFU

6월 24일 16:31에 게시됨