Show HN: Xorq – AI를 위한 오픈 컴퓨팅 카탈로그
요약
Xorq는 ML 파이프라인 구축 시 발생하는 파편화된 도구와 복잡한 글루 코드 문제를 해결하기 위한 오픈 컴퓨팅 카탈로그입니다. YAML 매니페스트를 통해 컨텍스트를 구조화하고, 결정론적 실행을 지원하는 빌드 시스템인 Exprs와 다양한 기술 템플릿을 제공합니다.
핵심 포인트
- YAML 매니페스트를 사용하여 모든 ML 계산을 구조화된 컨텍스트로 관리합니다.
- Ibis 표현식을 확장하여 캐싱, 멀티 엔진 실행, 사용자 정의 함수(UDFs)를 지원합니다.
- 도구 간의 재작성을 최소화하고 결정론적 실행을 보장하는 빌드 시스템을 제공합니다.
- 피처 스토어나 오케스트레이터 같은 수직적 사일로 대신 컨텍스트와 기술 중심의 접근 방식을 취합니다.
ML을 위한 컴퓨팅 매니페스트 (compute manifest) 및 조합 가능한 도구들.
</div>문제점 (The Problem)
당신은 피처 파이프라인 (feature pipeline)을 작성합니다. 당신의 노트북에서는 DuckDB와 함께 잘 작동합니다. 이를 Snowflake에 배포하려고 하니 결국 코드를 다시 작성해야 합니다. 중간 결과물들을 캐싱 (cached)해야 하므로 인프라와 결과 명명 시스템을 추가합니다. 파이프라인 변경 사항을 추적해야 한다는 요구사항이 생겨 메타데이터 저장소 (metadata store)를 추가합니다. 축하합니다, 이제 프로덕션 (production)에 배포할 차례입니다! 서빙 레이어 (serving layer)를 추가할 시간입니다 ...
6개월 후: 서로 소통하지 않는 5개의 도구와 단 한 사람만이 이해할 수 있는 파이프라인
| 고통 (Pain) | 증상 (Symptom) |
|---|---|
| 도처에 깔린 글루 코드 (Glue code) | 각 엔진이 사일로 (silo)화 되어 있습니다. 엔진 간 이동은 조합이 아닌 재작성을 의미합니다. |
| 런타임 피드백 (Runtime Feedback) | 명령형 Python 코드로 작성되어, 작업이 실행되는 동안에만 실패 여부를 알 수 있습니다. |
| 불필요한 재계산 (Unnecessary recomputations) | 무엇이 변경되었는지에 대한 공유된 이해가 없습니다. 모든 것이 처음부터 다시 실행됩니다. |
| 불투명한 리니지 (Opaque Lineages) | 피처 로직, 메타데이터, 리니지 (lineage)가 모두 서로 다른 시스템에 있습니다. 디버깅은 고고학 작업이 됩니다. |
| "내 컴퓨터에서는 되는데" (Works on my machine) | 환경이 어긋납니다. 결과를 재현하려면 누군가의 설정을 역공학 (reverse engineering)하고 자신의 설정을 조사해야 합니다. |
| 상태 유지 오케스트레이터 (Stateful orchestrators) | 재시도 로직, 태스크 상태, 장애 복구. 관리해야 할 또 다른 시스템이자, 또 다른 고장 요소입니다. |
피처 스토어 (Feature stores), 모델 레지스트리 (Model registries), 오케스트레이터 (Orchestrators): 에이전트 프로세스 (agentic processes)에 도움이 되지 않는 수직적 사일로들입니다. 에이전트 프로세스에는 카테고리가 아닌 컨텍스트 (context)와 기술 (skills)이 필요합니다.
Xorq
매니페스트 (Manifest) = 컨텍스트 (Context). 모든 ML 계산은 구조화되고 입력 주소로 지정된 YAML 매니페스트가 됩니다.
Exprs = 도구 (Tools). 발견을 위한 카탈로그입니다. 사용자 지정 캐싱 (user directed caching)을 통해 어디에서나 결정론적으로 실행할 수 있는 빌드 시스템입니다.
템플릿 (Templates) = 기술 (Skills). scikit-learn 파이프라인, 피처 스토어, 시맨틱 레이어 (semantic layers) 등 시작을 돕는 다양한 기술들입니다.
$ pip install xorq[examples]
$ xorq init -t penguins
표현식 (The Expression)
표현식 (The Expression)
도구처럼 실행할 수 있는 선언적 Ibis 표현식을 작성하세요. Xorq는 캐싱 (Caching), 멀티 엔진 실행 (Multi-engine execution), 그리고 사용자 정의 함수 (UDFs)를 통해 Ibis를 확장합니다.
import ibis
import xorq.api as xo
from xorq.common.utils.ibis_utils import from_ibis
...
어떤 노드에서든 .cache()를 선언하세요. 나머지는 Xorq가 처리합니다. 생성하거나 관리해야 할 캐시 키 (Cache keys)도 없고, 작성해야 할 무효화 로직 (Invalidation logic)도 없습니다.
엔진 간의 조합 (Compose across engines)
하나의 표현식, 여러 개의 엔진. 파이프라인의 일부는 DuckDB에서 실행되고, 일부는 Xorq의 임베디드된 DataFusion 엔진에서 실행되며, UDFs는 Arrow Flight를 통해 실행됩니다. Xorq는 낮은 오버헤드로 데이터 전송 (Data transit)을 체계적으로 처리합니다. 글루 코드 (Glue code)는 이제 안녕입니다.
expr = from_ibis(penguins).into_backend(xo.sqlite.connect())
expr.ls.backends
(<xorq.backends.sqlite.Backend at 0x7926a815caa0>,
<xorq.backends.duckdb.Backend at 0x7926b409faa0>)
표현식은 도구이고, Arrow는 파이프입니다
Unix는 stdout을 통해 조합되는 작은 프로그램들을 우리에게 주었습니다. Xorq는 Arrow를 통해 조합되는 표현식을 제공합니다.
In [6]: expr.to_pyarrow_batches()
Out[6]: <pyarrow.lib.RecordBatchReader at 0x15dc3f570>
매니페스트 (The Manifest)
표현식을 빌드하면 매니페스트 (Manifest)를 얻습니다.
$ xorq build expr.py
builds/28ecab08754e
$ tree builds/28ecab08754e
builds/28ecab08754e
├── database_tables
...
외부 메타데이터 저장소 (External metadata store)가 필요 없습니다. 별도의 리니지 도구 (Lineage tool)도 필요 없습니다. 빌드 디렉토리 자체가 버전 관리되고, 캐싱되었으며, 이식 가능한 아티팩트 (Artifact)입니다.
# 입력 주소 지정 방식, 조합 가능, 이식 가능
# 요약된 expr.yaml
nodes:
...
재현 가능한 빌드 (Reproducible builds)
매니페스트는 왕복 가능 (Roundtrippable)하며 머신이 작성할 수 있습니다 (Machine-writeable). 파이프라인을 Git-diff 하세요. 기능을 코드 리뷰하세요. Python 의존성 (Dependencies)을 추적하세요. YAML만으로 다시 빌드하세요.
$ xorq uv build expr.py
builds/28ecab08754e/
...
빌드는 표현식 그래프 (Expression graph), 의존성 (Dependencies), 메모리 테이블 (Memory tables) 등 모든 것을 캡처합니다. sdist가 포함된 빌드를 공유하면 동일한 결과를 얻을 수 있습니다. "내 컴퓨터에서는 되는데"라는 상황은 없습니다.
변경된 부분만 재계산 (Only recompute what changed)
매니페스트(Manifest)는 입력값 기반으로 주소 지정(input-addressed)됩니다: 동일한 입력 = 동일한 해시(hash). 입력을 변경하면 새로운 해시가 생성됩니다.
expr.ls.get_cache_paths()
(PosixPath('/home/user/.cache/xorq/parquet/letsql_cache-7c3df7ccce5ed4b64c02fbf8af462e70.parquet'),)
해시가 곧 캐시 키(cache key)입니다. 디버깅해야 할 무효화(invalidation) 로직이 없습니다.
표현식(expression)이 동일하면 해시도 동일하며, 캐시는 유효합니다.
입력을 변경하면 새로운 해시를 얻게 되고, 재계산(recomputation)이 트리거됩니다.
전통적인 캐싱은 "이것이 만료되었는가?"라고 묻습니다. 입력 기반 캐싱은 "이것이 동일한 계산인가?"라고 묻습니다. 두 번째 질문은 결정론적인(deterministic) 답을 가집니다.
도구 (The Tools)
매니페스트는 컨텍스트(context)를 제공합니다. 도구는 기술을 제공합니다: 카탈로그(catalog), 조사(introspect), 서빙(serve), 실행(execute).
카탈로그 (Catalog)
# 카탈로그에 추가
$ xorq catalog add builds/28ecab08754e/ --alias penguins-agg
Added build 28ecab08754e as entry a498016e-5bea-4036-aec0-a6393d1b7c0f revision r1
...
실행 (Run)
$ xorq run builds/28ecab08754e -o out.parquet
서빙 (Serve)
Arrow Flight를 통해 어디에서나 표현식을 서빙할 수 있습니다:
$ xorq serve-unbound builds/28ecab08754e/ \
--to_unbind_hash 31f0a5be37713fe2c1a2d8ad8fdea69f \
--host localhost --port 9002
import xorq.api as xo
backend = xo.flight.connect(host="localhost", port=9002)
...
species avg_bill_length
0 Adelie 39.1
1 Chinstrap 49.0
...
확신을 가지고 디버깅하기 (Debug with confidence)
더 이상 고고학(archaeology)을 할 필요가 없습니다. 계보(lineage)는 도구들에 흩어져 있는 것이 아니라 매니페스트에 인코딩되어 있으며, CLI에서 쿼리할 수 있습니다.
$ xorq lineage penguins-agg
Lineage for column 'avg_bill_length':
...
상태 없는 워크플로우 (Workflows, without state)
태스크 상태(task states)는 없습니다. 실패 시 재시도할 뿐입니다.
Xorq는 표현식을 Arrow RecordBatch 스트림으로 실행합니다. 체크포인트(checkpoint)를 만들어야 하는 태스크의 DAG(Directed Acyclic Graph)는 없으며, 오직 연산자(operator)를 통해 흐르는 데이터만 존재합니다. 무언가 실패하면 매니페스트로부터 다시 실행하십시오. 캐시된 노드는 즉시 해결되며, 나머지는 재계산됩니다.
Scikit-learn 통합 (Scikit-learn Integration)
Xorq는 scikit-learn 파이프라인(Pipeline) 객체를 지연된 표현식(deferred expressions)으로 변환합니다:
from xorq.expr.ml.pipeline_lib import Pipeline
sklearn_pipeline = ...
...
템플릿 (Templates)
기술(skills)로서 즉시 시작 가능한 코드:
$ xorq init -t <template>
| 템플릿 (Template) | 설명 (Description) |
|---|---|
penguins | 최소한의 예제: 캐싱 (caching), 집계 (aggregation), 멀티 엔진 (multi-engine) |
sklearn | 훈련/예측 (train/predict) 분리가 포함된 분류 (Classification) 파이프라인 |
사용자를 위한 기술 (Skills for humans)
템플릿은 사용자의 데이터 소스(sources)와 결합할 준비가 된 표현식(expressions)을 포함하여, 쉽게 시작할 수 있는 컴포넌트로서 작동합니다.
출시 예정 (Coming Soon)
feast— 피처 스토어 (Feature store) 통합boring-semantic-layer— 메트릭 (Metrics) 및 차원 (dimensions) 카탈로그dbt— dbt 모델 구성 (composition)- 피처 선택 (Feature Selection)
수평적 스택 (The Horizontal Stack)
Python으로 작성하세요. YAML로 카탈로그화하세요. Ibis를 통해 어디에서나 구성하세요. DataFusion을 기반으로 구축된 휴대 가능한 컴퓨팅 엔진 (Portable compute engine)입니다. Arrow Flight를 통한 범용 UDF (Universal UDFs)를 지원합니다.
리니지 (Lineage), 캐싱 (caching), 버전 관리 (versioning)는 매니페스트 (manifest)와 함께 이동합니다. 특정 벤더의 데이터베이스에 종속되지 않고 카탈로그화됩니다.
통합 (Integrations): Ibis • scikit-learn • Feast (개발 중) • dbt (출시 예정)
더 알아보기 (Learn More)
1.0 버전 이전 단계입니다. 마이그레이션 가이드와 함께 파괴적 변경 (breaking changes)이 발생할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기