- commit track-spec + meta-spec/plan into branch (HIGH: dangling `amends:` ref) - inline parity evidence (cosine 1.0, max_abs_diff 2.01e-7) into HOTFIXES + release notes; drop refs to deleted IMPL_REPORT/SPIKE_REPORT (MEDIUM) - model guard: reject non-e5-large `model` before the 2GB download so model_id() can't mislabel vectors (MEDIUM) + unit test - parity test now covers BOTH query: and passage: prefixes (MEDIUM) - guard encodings.first() index; document zero-attention/pooling invariant; clarify embed_batch prefixing doc (LOW) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.1 KiB
5.1 KiB
Meta-Plan — NUMA-안전 임베딩 백엔드 실행 계획
- 날짜: 2026-06-01
- 우산 스펙: 2026-06-01-embedding-numa-backends-meta-spec.md
- 실행 모델: 트랙별 worktree 격리 + omc teammate (omc-teams, sequential single-team). 트랙 내 단계는 spec → plan → 구현 → 테스트 → PR.
0. 즉시 (본 계획과 병행, 무코드)
- A1 stopgap 문서화 + 사용자 제공:
numactl --cpunodebind=0 --membind=0 kebab ingest(또는taskset -c 0-11). 현재 불통 해소용. 이건 트랙 4의 산출물 일부지만 지금 바로 안내. - 사용자 NUMA 서버에서 A1 로 5150-doc 완주되는지 1회 확인 → "스레드/NUMA 가 원인" 인과 확정(메타스펙 §1 보강).
1. 트랙 실행 순서 & 게이트
candle → ollama → A2 → A1(정식 문서화). 한 트랙의 PR open + NUMA 검증 예약 전까지 다음 트랙 미착수.
조기 종료 (D1 확정): candle 또는 ollama 가 허용 품질(골든 ≥ baseline 무회귀) + NUMA 안전을 만족하면 거기서 종료, 이후 트랙 미진행. 둘 다 품질 미달 시에만 A2 → A1 진행. candle 은 동일 e5-large 라 패리티 통과 시 종착 유력.
트랙 1 — candle (feat/embed-candle)
- Phase 0 — 타당성 스파이크 (게이트, 최우선)
- worktree 에서 candle + candle-transformers 의존성 추가,
xlm_roberta::XLMRobertaModel로intfloat/multilingual-e5-largesafetensors 로드 (CPU). - 몇 개 문장 임베딩 → (a) onnxruntime e5-large 벡터와 cosine 패리티, (b) CPU latency, (c)
RAYON_NUM_THREADS로 스레드 캡 동작, (d) padding_idx 위치 임베딩 정확성. - 산출: 스파이크 리포트(패리티 수치 + latency + 스레드 제어 확인). 통과해야 Phase 1 진행.
- worktree 에서 candle + candle-transformers 의존성 추가,
- Phase 1 — spec: 트랙 spec 작성 (Embedder 구현, config provider="candle", embedding_version, 재색인 절차, 테스트 매트릭스).
- Phase 2 — plan: 구현 plan.
- Phase 3 — 구현:
kebab-embed-candle(신규 crate) 또는kebab-embed-local내 provider 분기. Embedder 구현 + app.rs 주입 분기 + config. - Phase 4 — 테스트: 단위/통합 + 패리티 + 골든. 빌드는 직렬
-j 4. - Phase 5 — PR + 검증: gitea PR. 사용자 NUMA 서버 5150-doc 완주 + 골든 baseline 확인.
트랙 2 — ollama (feat/embed-ollama)
- spec → plan → 구현(
OllamaEmbedder:/api/embed호출, provider="ollama", 모델 선택[e5 GGUF 또는 bge-m3]) → 테스트(패리티/골든, 프로세스 격리로 double-free 부재) → PR + NUMA 검증.
트랙 3 — A2 (feat/embed-ort-direct)
- spec → plan → 구현(fastembed 우회,
ort세션 직접 +with_intra_threads(N)+ NUMA affinity, 토크나이즈/mean-pool/L2 재현, provider="onnx" 기본 유지) → 테스트(기존 e5 벡터와 cosine≈1.0, 재색인 0) → PR + NUMA 검증. - 품질-중립 안전망: 재색인 없이 즉시 default 가능.
트랙 4 — A1 정식화 (docs/embed-numa-affinity)
- 런처 래핑/문서 + (선택) config 노브로 affinity 힌트. README/SMOKE/HOTFIXES 동기화.
2. omc teammate 운용 (메모리 규약 준수)
- spawn: omc-teams tmux pane + brief 파일. sequential single-team (multi-team 동시 spawn 금지).
- 모델 라우팅: executor + initial draft + round-1 review = opus; closure verify / micro-patch round = sonnet. (
OMC_TEAM_ROLE_OVERRIDESenv) - worker spawn 직후 completion polling shell
run_in_background=true(phase=completed/failed 감지 → main session 자동 알림). - 빌드/테스트 직렬,
-j 4기본.CARGO_TARGET_DIR=/build사용 (routinely clean 금지).
3. 워크트리 / 브랜치
| 트랙 | 브랜치 | worktree |
|---|---|---|
| 1 candle | feat/embed-candle |
신규 |
| 2 ollama | feat/embed-ollama |
신규 |
| 3 A2 | feat/embed-ort-direct |
신규 |
| 4 A1 | docs/embed-numa-affinity |
신규 |
각 트랙 머지 후 다음 트랙 rebase. 트랙 간 공유 상태 없음(독립 provider).
4. 리스크 레지스터
- candle Phase 0 패리티 실패 → 트랙 1 강등, ollama 우선.
- candle CPU latency 가 onnxruntime 대비 과도 → opt-in provider 로만.
- ollama 모델이 e5 아님 → 골든 회귀 가능 → default 승격 보류.
- NUMA 검증이 사용자 가용성에 의존 → 각 PR 은 검증 전까지 "merge-pending".
- ort rc.9 자체 버그가 A2 에서도 재현 가능성 → A2 스레드 캡으로도 안 죽는지 NUMA 검증 필수.
5. 진행 상태 (라이브)
- candle 타당성 desk-research (xlm_roberta 모듈 존재 + cembedd 선례) — 2026-06-01
- A1 stopgap 사용자 NUMA 서버 확인
- 트랙 1 Phase 0 스파이크 — VERDICT=PASS (2026-06-01). cosine min=mean=1.000000(onnxruntime 동일), RAYON 스레드 캡 가능, latency ~4×(67.5 vs 16.8 ms/문장, 4 vs 12 스레드). 커밋
76841af. → 조기 종료 유력: candle 이 품질 baseline 자동 충족 → ollama/A2/A1 불필요 전망. 잔여 게이트=골든 실측 + NUMA 서버 5150-doc 완주. - 트랙 1 spec/plan/impl/test/PR (진행)
- 트랙 2 …
- 트랙 3 …
- 트랙 4 …