FDP 기여 발굴 — ankit#1 base · MP gap · 정책 매핑
[!tldr] 업무 관점 takeaway "FDP 효과 입증 → 개선 → 상류 기여" 흐름에서 무엇을 PR로 만들 것인가를 발굴한 트랙. 핵심 사실 3가지: (1) origin/dev에 FDP 코드는 0줄 — daegyu의
ankit-sam/LMCache#18커밋이 첫 base인데 7주째 OPEN 정체. (2) 그 base의 placement 정책(_assign_fdp_placement_rank_based)은 이름만 거창한 placeholder(placement_ids[0]하나 반환) — 실제 정책 결정이 곧 우리 기여 자리. (3) data/metadata RUH 분리(lifetime isolation)는 이미 hardcode → WAF 효과 입증의 최단 경로. 단, ankit#1 8커밋은 in-process plugin 전용이고 MP adapter 경로엔 0% 반영 → MP 통합이 별도 작업 단위. 근거 원본:raw/work/fdp/contribution/(HANDOFF·items·ankit_base_commits·dev_baseline_status·mp_integration_gap·policy_proposals, 2026-06-25).
1. 작업 흐름 (사용자 합의)
히스토리 → 현재 status → 현재 아키텍처 기준 status → FDP PoC로 효과 입증 + 아이템 발굴 → 기여
| 단계 | 내용 | 상태 |
|---|---|---|
| 1 | 히스토리 — ankit#1 8커밋 해부 | ✅ |
| 2 | 현재 status — origin/dev FDP 표면 | ✅ (0줄) |
| 3 | 현재 아키텍처 기준 — MP 통합 gap | ✅ |
| 4 | FDP PoC로 효과 입증 + 아이템 발굴 | ← 현재 위치 |
| 5 | 기여 — 아이템을 PR-A~PR-E로 매핑 | 대기 |
두 개의 별개 FDP 라인이 있다:
- ankit#1 (
ankit-sam/LMCache#1, daegyu base): in-process plugin, rank-based 단일 PID +fetch_fdp_status자동 조회. - dongdongju PoC (
DongDongJu/LMCache:fdp-waf-agentic-replay-poc, 나연/상윤 측정 중): N-RUH list + worker 분배 + data/metadata 완전 분리. 효과 입증용 harness 보유.
이 트랙(contribution/)은 단계 번호(01~05) 위에서 도는 메타 작업으로, dongdongju PoC 중심의 01_branch_audit/과 관점이 다르고 보완 관계다.
2. 현재 status — dev FDP baseline
grep -ni "fdp\|placement\|ruh"를 plugin / L2 adapter / core에 돌린 결과 전부 empty. dev에 FDP 코드는 한 줄도 없다. 단, FDP가 plug-in될 인프라는 이미 존재한다.
| 표면 | 위치 | FDP 관점 의미 |
|---|---|---|
per_tp_device_paths | plugin rust_raw_block_backend.py | TP rank → device 분리. ankit#1이 이 위에 rank-based PID 정책을 얹음 |
| io_uring_cmd 인프라 | rust/raw_block/src/lib.rs (#3274 머지 완료) | NVMe passthrough write — FDP directive(dspec)가 들어갈 명령 경로 |
RawBlockCore 단일 device/FD | raw_block/core.py | 모든 worker 공유. placement hint 통로 없음 |
RawBlockL2AdapterConfig | raw_block_l2_adapter.py | single device_path + I/O 옵션. per_tp_device_paths 명시 거부 (line 154-157) |
3. ankit#1 8커밋 — "PoC → 운영 설정 핸들링"
remotes/ankit/pr-1 (author daegyu94). 상류 dev 머지 0건.
| # | 커밋 | 카테고리 | 의미 |
|---|---|---|---|
| 1 | 8bb1f36a | safety | placement_id 없으면 FDP directive 끔 (dtype 0x2→0x0, dspec도 unset) |
| 2 | 79183c87 | cleanup | nvme identify 디버그 print 제거 |
| 3 | 9b401488 | docs/example | offload 예제에 --use_fdp/--per_tp_device_paths/--max-data-transfer-size 노출 |
| 4 | 24ae8ab8 | compatibility | FDP status header-first 조회 (nvme-cli 호환) — ankit#1만의 강점 |
| 5 | 2be75bb5 | 정책 | placement 정책 정리 — rank 1개=PID 1개, data/metadata RUH 분리, fail-fast |
| 6 | 10812502 | feature | transfer split auto-config (max_data_transfer_size=-1 → sysfs 자동) |
| 7 | 8b7219e1 | tests | uring_cmd 테스트 fixture 안정화 |
| 8 | 8288b6d1 | style | clippy/rustfmt 정리 |
메인 커밋 #5의 핵심 — 정책은 placeholder다
_get_placement_id_for_cuda_device(cuda index 기반) → _assign_fdp_placement_rank_based로 교체. 그러나 실제 동작은 placement_ids[0] 하나 고정 반환. 코드 코멘트도 "this policy simply uses the first placement ID per rank". 이름만 정책이고 내용은 비어 있다 → daegyu의 3축 정책(rank/domain/model)이 들어갈 자리가 바로 여기.
같은 커밋이 못박은 것:
- lifetime isolation 이미 hardcode: data 쓰기는 단일
_data_placement_id, checkpoint metadata 쓰기는 FDP directive를 안 붙임(default RUH). "수명이 달라 WAF 우려"라는 정성적 근거만 있음 → 정량 입증이 아이템(I-E1). - fail-fast 강화:
use_fdp인데 uring/uring_cmd 꺼져 있거나 status 빈 응답이면 즉시RuntimeError.
ankit#1이 추가하는 표면 (다른 작업이 참조)
- Rust/PyO3:
fetch_fdp_status(max_ruhs) -> Vec<(PID, RUH_ID)>,batched_write(..., placement_ids=None),write_uring(..., placement_id=None),cdw13=(dspec<<16)·cdw12|=(dtype&0x0F). - Config 키(plugin
extradict 전용):rust_raw_block.use_fdp,.per_tp_device_paths,.max_data_transfer_size.
4. MP 통합 gap — ankit#1을 MP에서 돌리려면
ankit#1 8커밋은 전부 in-process plugin(RustRawBlockBackend) 대상. 우리 지향점인 MP mode(RawBlockL2Adapter)엔 어느 것도 반영 안 됨.
| 측면 | ankit#1 (in-process) | MP adapter | gap |
|---|---|---|---|
| 진입 클래스 | RustRawBlockBackend | RawBlockL2Adapter | config 인터페이스 다름 |
| device 모델 | rank마다 다른 device (per_tp_device_paths) | 단일 device 공유 + per-key 격리 | ankit#1 정책 그대로 못 들어감 |
| rank 식별 | self.metadata.worker_id | ObjectKey.kv_rank 비트 패킹 | rank 전달 경로 다름 |
| config | extra["rust_raw_block.*"] dict | RawBlockL2AdapterConfig dataclass + JSON | 키 별도 매핑 필요 |
[!note] MP에서는 FDP placement_id가 isolation의 유일 수단이다. MP adapter가
per_tp_device_paths를 거부하므로 물리 device 분리가 불가 → "rank는 device 분리로 우회됐다"는 단정은 topology dependent한 틀린 일반화. device 수 < rank 수(공유 device)거나 단일 device면 rank별 PID 분리가 의미를 갖는다.
5. 발굴 아이템 (seed) + 우선순위
items.md의 9개 아이템. PoC 환경 1차 확인 후 task 인덱스로 승격 (모두 검증/결정 필요 표시).
| 순서 | ID | 아이템 | 이유 |
|---|---|---|---|
| 1 | I-E4 | dongdongju PoC를 MP setup에 실제로 돌려 trace | 다른 모든 작업의 전제 |
| 2 | I-E1 | data/metadata RUH 분리의 WAF 정량 효과 측정 | ankit#1 hardcode 정당화 / PR-C 데이터 |
| 3 | I-C3 | PlacementPolicy 추상화 vs caller stamp 결정 | I-C1 설계 결정 — daegyu와 합의 필요 |
| 4 | I-C1 | MP adapter에 FDP placement surface 추가 | 실제 기여의 main 단위 |
| 5 | I-E2 | 정책 ① rank isolation 효과 측정 | 정책 정당화 데이터 |
| 6 | I-C4 | ankit#1 fetch_fdp_status 자동 조회를 PoC에 통합 | ankit#1 머지 후 |
| 7 | I-O1 | FDP 관측 지표(WAF, RU utilization, PID histogram) | 운영 도입 시점 |
| 후순위 | I-E3 / I-C2 / I-O2 | access pattern 자료 / fail-fast 검증 / CLI flag | 기반 작업 후 |
PR 분할안 (01_branch_audit/03_fdp_implementation_audit.md §5)
- PR-A (대): config 5개 +
_select_fdp_ruh/_write_directive_for_ruh+ Rust dtype/dspec + directive 검증 - PR-B: ankit#1
fetch_fdp_status자동 조회 통합 - PR-C: metadata RUH 분리 (WAF 효과 입증 후)
- PR-D: file backend FDP (write hint or io_uring_cmd 공유)
- PR-E (선택): FDP WAF stress harness
6. 미해결 — 사용자/daegyu 입력 필요
작업 진입 전 클리어해야 막다른 골목을 안 만난다:
- daegyu와 머지 경로 정렬 — ankit#1을 본 레포로 가져갈 일정, 그 위에 stacked PR로 갈지.
- PoC의 MP 동작 실증 (I-E4) — 누가 어떤 환경에서.
- access pattern 근거 자료 위치 (I-E3) — "상윤/나연 정리 자료"가 어디 있는지.
-
PlacementPolicy추상화 방향 (I-C3) — (A) core abstraction / (B) caller stamp / (C) hybrid.
상류 머지 경로 자체가 미정이다. daegyu의 본 레포 OPEN PR 5건은 모두 다른 raw-block 영역이고 FDP는 빠져 있으며, ankit#1만 7주째 OPEN. 작업 진입 전 daegyu와 정렬이 선행.