๊ธฐ๋Šฅ ์ƒ์„ธ ๋ณด๊ณ 

Silo A โ€” 3-Arm ๊ฐ€์ƒ์Šคํฌ๋ฆฌ๋‹ (NVIDIA NIM)

SILO A ์ฒญ์ƒ‰ ๊ณ„์—ด. ๋ณธ ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์‚ฌ์‹ค ์ฃผ์žฅ์€ ์ฝ”๋“œ file:line ๋˜๋Š” ์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ๋กœ ์ธ์šฉํ•œ๋‹ค. ์‹ ๋ขฐ๋“ฑ๊ธ‰: ์‹ค์ธก HIGH / surrogate-์ƒ๋Œ€ MED / surrogate-์ ˆ๋Œ€ LOW.


ํ•ต์‹ฌ ๊ฒฐ๋ก 

  • ์„ค๊ณ„ยท์ฝ”๋“œ๋Š” ์™„์„ฑ, ์‹คํ–‰ ์‚ฌ๋ก€๋Š” 0๊ฑด. Silo A 3-Arm(์†Œ๋ถ„์žยทํŽฉํƒ€์ด๋“œยทde novo) 6๊ฐœ ๋ชจ๋“ˆ์ด ๋ชจ๋‘ ๊ตฌํ˜„๋˜์–ด ๋‹จ์œ„ํ…Œ์ŠคํŠธ(mock) 9๊ฑด์„ ํ†ต๊ณผํ–ˆ์œผ๋‚˜ [๊ทผ๊ฑฐ: docs/meet_preparation/inspect_evidence/silo_a.md:174], end-to-end ์‹คํ–‰์€ ๋‹จ ํ•œ ๋ฒˆ๋„ ์—†๋‹ค(outputs/silo_a/ ๋ฏธ์กด์žฌ) [๊ทผ๊ฑฐ: docs/meet_preparation/inspect_evidence/silo_a.md:171].
  • ์‹คํ–‰ ์ฐจ๋‹จ ์›์ธ์€ NVIDIA NIM API ํ‚ค ๋ถ€์žฌ. Arm1ยทArm3๊ฐ€ ํด๋ผ์šฐ๋“œ NIM์— ์˜์กดํ•˜๋ฉฐ, ํ™œ์„ฑ ๋ผ์šฐํ„ฐ๋Š” _has_nim_api_key()=os.getenv("NVIDIA_NIM_API_KEY")๋กœ ํ‚ค ์œ ๋ฌด๋ฅผ ๊ฒŒ์ดํŠธํ•œ๋‹ค [๊ทผ๊ฑฐ: AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri/backend/routers/silo_a.py:65-66]. ํ˜„์žฌ ํ™˜๊ฒฝ์— ํ‚ค ๋ฏธ์„ค์ • [๊ทผ๊ฑฐ: docs/meet_preparation/inspect_evidence/silo_a.md:195].
  • NIM 3-arm ์ „์ฒด๋Š” ๋น„ํ™œ์„ฑ์ด๋‚˜, ํ™œ์„ฑ ํ†ตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋กœ์ปฌ de novo ๊ฒฝ๋กœ(_run_silo_a)๋ฅผ ์‹ค์ œ ํ˜ธ์ถœํ•œ๋‹ค. NIM ์˜์กด 3-arm(์†Œ๋ถ„์žยทํŽฉํƒ€์ด๋“œยทde novo)์€ ๋ฐฑ์—…ยท์Šคํ… ์ƒํƒœ์ด์ง€๋งŒ, pipeline_local/orchestrator.py:_run_silo_a()๋Š” Arm3์— ํ•ด๋‹นํ•˜๋Š” RFdiffusion+ProteinMPNN์„ NIM ์—†์ด ๋กœ์ปฌ GPU๋กœ ๊ฐ€๋™ํ•œ๋‹ค [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:1395-1454, 843-853]. ์‹ค์ œ ๋ฐœ๊ตด ์„ฑ๊ณผ๋Š” ๋Œ€๋ถ€๋ถ„ Silo B(PyRosetta) ๊ฒฝ๋กœ ์‚ฐ๋ฌผ โ€” "NIM 3-arm ๋ฏธ์‹คํ–‰ / ๋กœ์ปฌ de novo ๋ถ€๋ถ„ ๊ฐ€๋™" ์œผ๋กœ ์ •์ง ํ‘œ๊ธฐ.

1. ์œ„์น˜: "์„ค๊ณ„"๊ฐ€ ์•„๋‹ˆ๋ผ "๊ตฌํ˜„๋จ, ๋ฏธ์‹คํ–‰"

์ฃผ์žฅ โ†’ ๊ทผ๊ฑฐ โ†’ ํ•จ์˜

  • ์ฃผ์žฅ: Silo A๋Š” ์„ค๊ณ„๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์ฝ”๋“œ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค. ๋‹ค๋งŒ ์–ด๋–ค ์œ„์น˜์—์„œ๋„ end-to-end๋กœ ๋Œ์•„๊ฐ„ ์ ์€ ์—†๋‹ค.
  • ๊ทผ๊ฑฐ:
  • ์„ค๊ณ„ ๋ฌธ์„œ: docs/SYSTEM_ARCHITECTURE.md (3-arm ๊ตฌ์กฐ ASCII ๋„์‹) [๊ทผ๊ฑฐ: docs/SYSTEM_ARCHITECTURE.md:25, 34-46]
  • ์‹ค์ œ ์ฝ”๋“œ(๋ฐฑ์—…, ๋น„ํ™œ์„ฑ): _backup/orphaned_20260609/pipelines/silo_a/src/ 6๊ฐœ ๋ชจ๋“ˆ [๊ทผ๊ฑฐ: _backup/orphaned_20260609/pipelines/silo_a/README.md:17-26]
  • ํ™œ์„ฑ HTTP API(์Šคํ…): backend/routers/silo_a.py โ€” Phase 1 dry-run๋งŒ ๋…ธ์ถœ [๊ทผ๊ฑฐ: AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri/backend/routers/silo_a.py:1-7]
  • ํ•จ์˜: "Silo A = ๋ฏธ๊ตฌํ˜„"์€ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ƒํƒœ๋Š” "์ฝ”๋“œ ์™„์„ฑ ยท ์‹คํ–‰ 0๊ฑด ยท API ์Šคํ…". PI ๋ณด๊ณ  ์‹œ "์„ค๊ณ„ ๋‹จ๊ณ„"๋กœ ๋ญ‰๋šฑ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  ๊ตฌํ˜„ ์ˆ˜์ค€์„ ๋ถ„๋ฆฌ ํ‘œ๊ธฐํ•ด์•ผ ์ •์งํ•˜๋‹ค.

1.1 ์œ„์น˜ ๋งต โ€” 4๊ณณ์— ๋ถ„์‚ฐ

๊ณ„์ธต ๊ฒฝ๋กœ ์ƒํƒœ ๊ทผ๊ฑฐ
์„ค๊ณ„ ๋ฌธ์„œ docs/SYSTEM_ARCHITECTURE.md โœ… ์™„์„ฑ (์˜๋„ ๊ตฌ์กฐ) docs/SYSTEM_ARCHITECTURE.md:24-30
ํ•ต์‹ฌ ์ฝ”๋“œ _backup/orphaned_20260609/pipelines/silo_a/src/ (6 ๋ชจ๋“ˆ) โœ… ๊ตฌํ˜„, ๋น„ํ™œ์„ฑ ๋ฐฑ์—… _backup/orphaned_20260609/pipelines/silo_a/README.md:17-26
NIM ํด๋ผ์ด์–ธํŠธ _backup/orphaned_20260609/bionemo/ (5 ํด๋ผ์ด์–ธํŠธ) โœ… ๊ตฌํ˜„, ๋น„ํ™œ์„ฑ ๋ฐฑ์—… EV08 ยง2.C
ํ™œ์„ฑ API โ€ฆ/ai4sci-kaeri/backend/routers/silo_a.py ๐ŸŸก Phase 1 dry-run ์Šคํ… backend/routers/silo_a.py:119-128
ํ™œ์„ฑ ๋กœ์ปฌ ๋Œ€์•ˆ pipeline_local/orchestrator.py:_run_silo_a() ๐ŸŸก ๊ฐ€๋™ ๊ฐ€๋Šฅ โ€” Arm3์— ํ•ด๋‹นํ•˜๋Š” RFdiffusion+ProteinMPNN๋งŒ ๋กœ์ปฌ ์‹คํ–‰, Arm1ยทArm2ยทESMFold ๋ฏธํฌํ•จ (ยง8) pipeline_local/orchestrator.py:1395-1454

[๋ฐ์ดํ„ฐ: _workspace/report_site2/_evidence/EV08_silo_a_trace.md ยง2] โ€” ์œ„ ๋งต์€ EV08 ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์š”์•ฝํ•œ ๊ฒƒ.


2. 3-Arm ์•„ํ‚คํ…์ฒ˜ ๋„์‹

flowchart TB subgraph SA["SILO A ยท 3-Arm ๊ฐ€์ƒ์Šคํฌ๋ฆฌ๋‹ (์ฒญ์ƒ‰)"] direction TB seed["์‹œ๋“œ ์ž…๋ ฅ
SSTR2 pocket PDB + ์‹œ๋“œ๋ถ„์ž/wildtype"] subgraph A1["Arm 1 ยท ์†Œ๋ถ„์ž"] m1["MolMIM ์ƒ์„ฑ
(NIM)"] --> m2["QED ํ•„ํ„ฐ"] --> m3["DiffDock ๋„ํ‚น
(NIM)"] end subgraph A2["Arm 2 ยท ํŽฉํƒ€์ด๋“œ"] p1["๋ณ€์ด์ฒด 11์ข…
(Ala scan + ๋ณด์กด์น˜ํ™˜)"] --> p2["FlexPepDock
(PyRosetta, ์กฐ๊ฑด๋ถ€)"] end subgraph A3["Arm 3 ยท de novo"] d1["RFdiffusion
๋ฐฑ๋ณธ์„ค๊ณ„ (NIM)"] --> d2["ProteinMPNN
์„œ์—ด์„ค๊ณ„ (NIM)"] --> d3["ESMFold
pLDDTโ‰ฅ70 (NIM)"] end seed --> A1 & A2 & A3 A1 & A2 & A3 --> us["UnifiedScorer
์ •๊ทœํ™”ยท๊ฐ€์ค‘ํ•ฉ์‚ฐ"] us --> rank["์ˆœ์œ„ ํ›„๋ณด
(โ†’ outputs/silo_a ๊ณ„ํš, ๋ฏธ์‹คํ–‰)"] end classDef blue fill:#e3f0fb,stroke:#1a6fbf,color:#0b3d66; class SA,A1,A2,A3 blue;

๋„์‹ ์ถœ์ฒ˜: ์ฝ”๋“œ ๊ตฌ์กฐ(arms.py 3 Runner + scoring.py UnifiedScorer) [๊ทผ๊ฑฐ: _backup/orphaned_20260609/pipelines/silo_a/src/arms.py:24-284, scoring.py:9-76]. rank โ†’ outputs/silo_a๋Š” ๊ณ„ํš ๋‹จ๊ณ„(๋ฏธ์‹คํ–‰) [๊ทผ๊ฑฐ: docs/meet_preparation/inspect_evidence/silo_a.md:171].


3. Arm๋ณ„ ๊ตฌํ˜„ ์ƒ์„ธ (์ฝ”๋“œ ํ๋ฆ„: ๋ชฉ์  โ†’ ์ž…๋ ฅ โ†’ ์—ฐ์‚ฐ โ†’ ์ถœ๋ ฅ)

๊ฐ Arm์€ ์ถ”์ƒ ๋ฒ ์ด์Šค ArmRunner.run(config, clients)๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ง„์ž… ์‹œ cfg.enabled๊ฐ€ False๋ฉด ์ฆ‰์‹œ RunStatus.SKIPPED๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์˜ˆ์™ธ๋Š” errors ๋ฆฌ์ŠคํŠธ์— ๋ˆ„์ ํ•ด SUCCESS/PARTIAL๋กœ ์ƒํƒœ๋ฅผ ๋ถ„๊ธฐํ•œ๋‹ค [๊ทผ๊ฑฐ: _backup/orphaned_20260609/pipelines/silo_a/src/arms.py:13-21, 35-40, 90-97].

Arm 1 โ€” ์†Œ๋ถ„์ž (MolMIM ์ƒ์„ฑ โ†’ QED ์ •๋ ฌ โ†’ DiffDock ๋„ํ‚น)

  • ๋ชฉ์ : ๊ธฐ์กด SSTR2 ๋ฆฌ๊ฐ„๋“œ SMILES๋ฅผ ์‹œ๋“œ๋กœ ์•ฝ๋ฌผ์œ ์‚ฌ ์‹ ๊ทœ ์†Œ๋ถ„์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํฌ์ผ“์— ๋„ํ‚นํ•ด ๊ฒฐํ•ฉ ์‹ ๋ขฐ๋„๋ฅผ ๋งค๊ธด๋‹ค. ์‹ค์ธก HIGH(์ฝ”๋“œ ์กด์žฌ)
  • ์ž…๋ ฅ: config์˜ arm1.seed_molecules(์ด๋ฆ„ยทSMILES ์Œ), ์ƒ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ(molmim_num_molecules=10, molmim_algorithm="CMA-ES", molmim_property="QED", molmim_min_similarity=0.3), ๊ทธ๋ฆฌ๊ณ  ๋„ํ‚น ํƒ€๊นƒ pocket.complex_pdb [๊ทผ๊ฑฐ: config.py:36-46].
  • ํ๋ฆ„: 1. ๊ฐ ์‹œ๋“œ๋งˆ๋‹ค clients.molmim.generate(...)๋กœ ๋ถ„์ž ์ง‘๋‹จ์„ ๋ฐ›๊ณ , ์‘๋‹ต dict์—์„œ sample(SMILES)๊ณผ score(QED)๋ฅผ ์ถ”์ถœํ•ด CandidateRecord๋กœ ์ ์žฌ [๊ทผ๊ฑฐ: arms.py:42-61]. 2. ์ „์ฒด ํ›„๋ณด๋ฅผ qed ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์ƒ์œ„ top_k_for_docking(๊ธฐ๋ณธ 15)๋งŒ ๋„ํ‚น ๋Œ€์ƒ์œผ๋กœ ์„ ๋ณ„ [๊ทผ๊ฑฐ: arms.py:65-66, config.py:43]. 3. ์„ ๋ณ„๋œ ๊ฐ ํ›„๋ณด๋ฅผ clients.diffdock.dock_smiles(protein_pdb_path, smiles, num_poses=5)๋กœ ๋„ํ‚นํ•˜๊ณ  ์‘๋‹ต์˜ confidence๋ฅผ ํ”ผ์ฒ˜์— ๋ณ‘ํ•ฉ [๊ทผ๊ฑฐ: arms.py:71-81, config.py:44]. ๋„ํ‚น ์˜ˆ์™ธ ์‹œ ํ•ด๋‹น ํ›„๋ณด๋Š” dock_confidence=0, dock_success=0์œผ๋กœ ํด๋ฐฑ ์ ์žฌ [๊ทผ๊ฑฐ: arms.py:82-88].
  • ์ถœ๋ ฅ: dock_confidence/dock_success๊ฐ€ ์ฑ„์›Œ์ง„ CandidateRecord ๋ฆฌ์ŠคํŠธ + ์ง‘๊ณ„ ํ”ผ์ฒ˜(total_generated, total_docked)๋ฅผ ๋‹ด์€ ArmResult [๊ทผ๊ฑฐ: arms.py:90-97].
  • ํ•จ์˜: ๊ณจ๊ฒฉ์€ ์™„๋น„๋์œผ๋‚˜ molmim.generateยทdiffdock.dock_smiles ๋ชจ๋‘ NIM ํด๋ผ์šฐ๋“œ ํ˜ธ์ถœ์ด๋ผ ํ‚ค ๋ถ€์žฌ ์‹œ ์ „๋Ÿ‰ ์˜ˆ์™ธ ํด๋ฐฑ โ†’ ์‚ฌ์‹ค์ƒ ๋ฏธ๊ฐ€๋™. 1์ฐจ ํƒ€๊นƒ์ด ํŽฉํƒ€์ด๋“œ(SST-14)๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•˜๋˜ ๊ฒƒ์œผ๋กœ ๋ณด์ž„ โ€” [๋ฏธ๊ฒ€์ฆ: ์šฐ์„ ์ˆœ์œ„ ๊ฒฐ์ • ๊ทผ๊ฑฐ ๋ฌธ์„œ ์—†์Œ].

Arm 2 โ€” ํŽฉํƒ€์ด๋“œ (๋ณ€์ด์ฒด โ†’ ๋ณ€์ด ์ถ”์ถœ โ†’ FlexPepDock, ์กฐ๊ฑด๋ถ€)

  • ๋ชฉ์ : wildtype ๋Œ€๋น„ ๋ณ€์ด์ฒด ํŽฉํƒ€์ด๋“œ์˜ ๊ฒฐํ•ฉ ์—๋„ˆ์ง€๋ฅผ PyRosetta ๋„ํ‚น์œผ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค. PyRosetta๊ฐ€ ์—†์œผ๋ฉด ๋ณ€์ด ๊ฐœ์ˆ˜๋งŒ ๊ธฐ๋กํ•˜๋Š” ์กฐ๊ฑด๋ถ€ ๊ตฌํ˜„. ์กฐ๊ฑด๋ถ€
  • ์ž…๋ ฅ: arm2.wildtype ์„œ์—ด, arm2.variants(์ด๋ฆ„ยท์„œ์—ด), ๊ฒŒ์ดํŠธ ํ”Œ๋ž˜๊ทธ use_pyrosetta(๊ธฐ๋ณธ True)ยทcomplex_pdbยทrelax_after_dock [๊ทผ๊ฑฐ: config.py:49-60].
  • ํ๋ฆ„: 1. use_pyrosetta=True ์ด๊ณ  complex_pdb๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ pipelines.silo_b.src.docking.PyRosettaDockingRunner๋ฅผ importํ•ด ๋„ํ‚น ๋Ÿฌ๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”. import ์‹คํŒจ ์‹œ ๊ฒฝ๊ณ ๋งŒ ๋‚จ๊ธฐ๊ณ  ์„œ์—ด ๋ถ„์„ ๋ชจ๋“œ๋กœ ๊ฐ•๋“ฑ, complex_pdb ๋ฏธ์„ค์ • ์‹œ ๋„ํ‚น ๋น„ํ™œ์„ฑ ๊ฒฝ๊ณ  [๊ทผ๊ฑฐ: arms.py:121-144]. 2. ๊ฐ ๋ณ€์ด์ฒด์— ๋Œ€ํ•ด wildtype๊ณผ ๊ธธ์ด๋ฅผ ๊ฒ€์ฆ(๋ถˆ์ผ์น˜ ์‹œ error ์ ์žฌ ํ›„ skip)ํ•˜๊ณ , ์œ„์น˜๋ณ„ ์ฐจ์ด๋ฅผ {wt}{i+1}{mt} ํ˜•์‹ ๋ณ€์ด ๋ฌธ์ž์—ด๋กœ ์ถ”์ถœ [๊ทผ๊ฑฐ: arms.py:146-160]. 3. ๋„ํ‚น ๋Ÿฌ๋„ˆ๊ฐ€ ์žˆ์œผ๋ฉด dock_candidate(...)๋กœ ฮ”G(delta_energy)ยท์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์‚ฐ์ถœํ•˜๊ณ , ์„ฑ๊ณต+relax_after_dock์ด๋ฉด PyRosettaComplexRelaxer.relax(...)๋กœ ฮ”G๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉฐ clash/interface/RMSD๋ฅผ ์ถ”๊ฐ€. ๋„ํ‚น ๋Ÿฌ๋„ˆ๊ฐ€ ์—†์œผ๋ฉด dock_success=0๋งŒ ๊ธฐ๋ก [๊ทผ๊ฑฐ: arms.py:162-184].
  • ์ถœ๋ ฅ: ๋ณ€์ด ๊ฐœ์ˆ˜์™€(๊ฐ€๋Šฅ ์‹œ) ๋„ํ‚น/relax ํ”ผ์ฒ˜๋ฅผ ๋‹ด์€ CandidateRecord ๋ฆฌ์ŠคํŠธ์˜ ArmResult [๊ทผ๊ฑฐ: arms.py:185-197].
  • ํ•จ์˜: Arm2๋Š” Silo B(PyRosetta ๋ณ€์ด+๋„ํ‚น)์™€ ๋™์ผ ์ž์›์— ์˜์กดํ•˜๋ฏ€๋กœ(์ฝ”๋“œ์ƒ์œผ๋กœ๋„ silo_b.src.docking์„ ์ง์ ‘ import), ์‹ค์ œ ๋ฐœ๊ตด์€ Silo B๊ฐ€ ์ „๋‹ดํ•˜๊ณ  Arm2๋Š” Silo A ๋‚ด๋ถ€์—์„œ ์ค‘๋ณตยท๋ฏธ๊ฐ€๋™ ์ƒํƒœ๊ฐ€ ๋จ.

Arm 3 โ€” de novo (RFdiffusion ๋ฐฑ๋ณธ โ†’ ProteinMPNN ์„œ์—ด โ†’ ESMFold pLDDT)

  • ๋ชฉ์ : ํฌ์ผ“์„ ํƒ€๊นƒ์œผ๋กœ ๋ฐฑ๋ณธ์„ ๋””์ž์ธํ•˜๊ณ (RFdiffusion) ๊ทธ ์œ„์— ์„œ์—ด์„ ์ž…ํ˜€(ProteinMPNN) ์ ‘ํž˜ ์‹ ๋ขฐ๋„(ESMFold pLDDT)๋กœ ๊ฑฐ๋ฅด๋Š” ์‹ ๊ทœ ๋ฐ”์ธ๋” 3๋‹จ ์„ค๊ณ„. ์‹ค์ธก HIGH(์ฝ”๋“œ ์กด์žฌ)
  • ์ž…๋ ฅ: pocket.complex_pdb, arm3.num_designs(๊ธฐ๋ณธ 5), seqs_per_backbone(4), diffusion_steps(50), plddt_threshold(70.0), ๊ทธ๋ฆฌ๊ณ  config.seed [๊ทผ๊ฑฐ: config.py:63-70].
  • ํ๋ฆ„: 1. num_designsํšŒ clients.rfdiffusion.design_binder(pdb_path, contigs="B1-369/0 10-30", hotspot_res=[], diffusion_steps, random_seed=seed+i)๋ฅผ ํ˜ธ์ถœํ•ด ๋ฐฑ๋ณธ PDB๋ฅผ ์ˆ˜์ง‘ [๊ทผ๊ฑฐ: arms.py:217-231]. 2. ๊ฐ ๋ฐฑ๋ณธ์— clients.proteinmpnn.predict(input_pdb, num_seq_per_target, sampling_temp=0.2)๋กœ ์„œ์—ด์„ ๋””์ž์ธํ•˜๊ณ , ์‘๋‹ต์ด FASTA ๋ฌธ์ž์—ด์ด๋ฉด parse_fasta๋กœ, ๋ฆฌ์ŠคํŠธ๋ฉด ๊ทธ๋Œ€๋กœ ํŒŒ์‹ฑ [๊ทผ๊ฑฐ: arms.py:233-252]. 3. ๊ฐ ์„œ์—ด์„ clients.esmfold.predict(seq)๋กœ ์ ‘๊ณ  mean_plddt(๋ฆฌ์ŠคํŠธ๋ฉด ํ‰๊ท )๋ฅผ ๊ณ„์‚ฐ, plddt >= plddt_threshold(70.0)์ธ ์„œ์—ด๋งŒ CandidateRecord๋กœ ์ฑ„ํƒ [๊ทผ๊ฑฐ: arms.py:254-272, config.py:67].
  • ์ถœ๋ ฅ: pLDDTโ‰ฅ70 ์„œ์—ด์˜ CandidateRecord + ์ง‘๊ณ„ ํ”ผ์ฒ˜(backbones, designed_seqs)๋ฅผ ๋‹ด์€ ArmResult [๊ทผ๊ฑฐ: arms.py:276-283].
  • ํ•จ์˜: ๊ฐ€์žฅ ์•ผ์‹ฌ์ฐฌ ๊ฒฝ๋กœ์ด๋‚˜ 3๊ฐœ NIM(RFdiffusion/ProteinMPNN/ESMFold)์ด ๋ชจ๋‘ ํ•„์š” โ†’ NIM ํ‚ค ์—†์ด๋Š” ๊ฐ€๋™ ๋ถˆ๊ฐ€. ๋‹จ, ๊ฐ™์€ RFdiffusion+ProteinMPNN ์กฐํ•ฉ์ด ํ™œ์„ฑ ๋ ˆํฌ์˜ ๋กœ์ปฌ ๊ฒฝ๋กœ(pipeline_local)์—์„œ๋Š” NIM ์—†์ด ์‹ค์ œ๋กœ ๊ฐ€๋™๋œ๋‹ค(ยง8 ์ฐธ์กฐ).

4. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ โ€” Arm ์ˆœ์ฐจ ์‹คํ–‰ โ†’ ํ†ตํ•ฉ ๋žญํ‚น โ†’ UnifiedCandidate ๋ณ€ํ™˜

  • ๋ชฉ์ : 3๊ฐœ Arm์„ ์ˆœ์„œ๋Œ€๋กœ ๋Œ๋ ค ํ›„๋ณด๋ฅผ ๋ชจ์œผ๊ณ , ๋‹จ์ผ ์ ์ˆ˜๋กœ ํ†ตํ•ฉ ๋žญํ‚นํ•œ ๋’ค, ์‚ฌ์ผ๋กœ ๊ฐ„ ๋น„๊ต์šฉ ํ‘œ์ค€ํ˜•(UnifiedCandidate)์œผ๋กœ ํ™˜์‚ฐํ•œ๋‹ค. ์‹ค์ธก HIGH(์ฝ”๋“œ ์กด์žฌ)
  • ์ž…๋ ฅ: config ๊ฒฝ๋กœ + NimClientBundle(์ฃผ์ž…ํ˜• ํด๋ผ์ด์–ธํŠธ ๋ฌถ์Œ) [๊ทผ๊ฑฐ: _backup/orphaned_20260609/pipelines/silo_a/src/orchestrator.py:30-41].
  • ํ๋ฆ„: 1. _build_arms()๊ฐ€ [Arm1, Arm2, Arm3]๋ฅผ ์ƒ์„ฑํ•˜๊ณ  execute()๊ฐ€ ๊ฐ Arm์„ ์ˆœ์ฐจ ์‹คํ–‰ โ€” Arm์ด ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ๋„ RunStatus.FAILED๋กœ ๊ฐ์‹ธ ๋‹ค์Œ Arm์œผ๋กœ ์ง„ํ–‰(๋ถ€๋ถ„ ์‹คํŒจ ๊ฒฉ๋ฆฌ) [๊ทผ๊ฑฐ: orchestrator.py:43-68]. 2. ๋ชจ๋“  Arm ํ›„๋ณด๋ฅผ ํ•ฉ์ณ UnifiedScorer.rank_candidates(...)๋กœ ์ ์ˆ˜ยท์ˆœ์œ„ ๋ถ€์—ฌ [๊ทผ๊ฑฐ: orchestrator.py:70]. 3. Arm๋ณ„ ์ƒํƒœยทํ›„๋ณด์ˆ˜ยท์—๋Ÿฌ์ˆ˜๋ฅผ ์š”์•ฝํ•œ manifest๋ฅผ JSON์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  PipelineResult ๋ฐ˜ํ™˜ [๊ทผ๊ฑฐ: orchestrator.py:72-97]. 4. to_unified()๊ฐ€ Armโ†’Modality ๋งคํ•‘๊ณผ ํ•จ๊ป˜ ํ”ผ์ฒ˜๋ฅผ bridge ์ง€ํ‘œ(dg_est, clash, stability, feasibility)๋กœ ํ™˜์‚ฐํ•ด UnifiedCandidate ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ [๊ทผ๊ฑฐ: orchestrator.py:99-144].
  • ์ถœ๋ ฅ: run_manifest.json + ๋žญํ‚น๋œ ํ›„๋ณด + ์‚ฌ์ผ๋กœ ํ†ตํ•ฉ์šฉ UnifiedCandidate ๋ฆฌ์ŠคํŠธ.
  • ํ•จ์˜: ๋ถ€๋ถ„ ์‹คํŒจ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ผ ์ผ๋ถ€ Arm๋งŒ ๊ฐ€๋™๋ผ๋„ ํŒŒ์ดํ”„๋ผ์ธ์ด ์™„์ฃผํ•˜๋„๋ก ์„ค๊ณ„๋จ. ๋‹จ ยง6๋Œ€๋กœ end-to-end ์‹คํ–‰ ์ž์ฒด๊ฐ€ 0๊ฑด์ด๋ผ manifest ์‚ฐ์ถœ๋ฌผ์€ ๋ฏธ์กด์žฌ.

5. UnifiedScorer โ€” ์ด์งˆ Arm ์ ์ˆ˜ ํ†ตํ•ฉ (์ •๊ทœํ™” โ†’ ๊ฐ€์ค‘ํ•ฉ์‚ฐ โ†’ ์ •๋ ฌ)

  • ๋ชฉ์ : 3๊ฐœ Arm์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ”ผ์ฒ˜(QED, dock_confidence, ฮ”E, pLDDT)๋ฅผ ๊ณตํ†ต 0โ€“1 ์ฒ™๋„๋กœ ์ •๊ทœํ™”ยท๊ฐ€์ค‘ํ•ฉ์‚ฐํ•ด Arm ๊ฐ„ ์ง์ ‘ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์ ์ˆ˜๋ฅผ ์‚ฐ์ถœํ•˜๊ณ  ์ˆœ์œ„๋ฅผ ๋งค๊ธด๋‹ค. ์‹ค์ธก HIGH(์ฝ”๋“œ ์กด์žฌ)
  • ์ž…๋ ฅ: ScoringConfig.weights(qed 0.15ยทdock_confidence 0.35ยทdelta_energy 0.25ยทplddt 0.15ยทdiversity 0.10) + ๊ฐ ํ›„๋ณด์˜ features dict [๊ทผ๊ฑฐ: _backup/orphaned_20260609/pipelines/silo_a/src/config.py:73-80].
  • ํ๋ฆ„: 1. score_candidate(features, arm)๊ฐ€ Arm ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ•ด๋‹น ํ”ผ์ฒ˜๋งŒ normalize(value, lo, hi)๋กœ minmax ์ •๊ทœํ™” ํ›„ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•ด arm_score/arm_max๋ฅผ ๋ˆ„์  [๊ทผ๊ฑฐ: scoring.py:21-36]. 2. arm_max>0์ด๋ฉด arm_score/arm_max๋กœ 0โ€“1 ์žฌ์ •๊ทœํ™”(clamp) [๊ทผ๊ฑฐ: scoring.py:38-44]. 3. ๋‹ค์–‘์„ฑ ํ•ญ๊ณผ ๊ฒฐํ•ฉ: score = (1 โˆ’ w.diversity)ยทnormalized_arm + w.diversityยทdiversity ํ›„ 0โ€“1 clamp + 4์ž๋ฆฌ ๋ฐ˜์˜ฌ๋ฆผ [๊ทผ๊ฑฐ: scoring.py:46-49]. 4. rank_candidates(...)๊ฐ€ ์ „ ํ›„๋ณด์— ์ ์ˆ˜๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด 1๋ถ€ํ„ฐ rank๋ฅผ ์ฑ„์›Œ ์ƒˆ CandidateRecord๋กœ ์žฌ์ƒ์„ฑ [๊ทผ๊ฑฐ: scoring.py:51-76].
  • ์ถœ๋ ฅ: scoreยทrank๊ฐ€ ์ฑ„์›Œ์ง„ ์ •๋ ฌ๋œ CandidateRecord ๋ฆฌ์ŠคํŠธ.
Arm ํ”ผ์ฒ˜ ์ •๊ทœํ™” ๋ฒ”์œ„ ๊ฐ€์ค‘์น˜ ๋ณ€์ˆ˜ ๊ทผ๊ฑฐ line
Arm1 SmallMol qed 0โ€“1 w.qed (0.15) scoring.py:27
Arm1 SmallMol dock_confidence 0โ€“1 w.dock_confidence (0.35) scoring.py:28
Arm2 FlexPep โˆ’delta_energy 0โ€“50 w.delta_energy (0.25) scoring.py:31-32
Arm3 DeNovo plddt 0โ€“100 w.plddt (0.15) scoring.py:35
๊ณตํ†ต diversity 0โ€“1 w.diversity (0.10) scoring.py:46-47
  • ํ•จ์˜: Arm ๊ฐ„ ์ง์ ‘ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต ์ฒ™๋„๋ฅผ ์„ค๊ณ„ํ•œ ์ ์€ ๊ฐ•์ . ๋‹จ, ๋ชจ๋“  ์ ์ˆ˜๋Š” ์ƒ๋Œ€ ์ˆœ์œ„์šฉ surrogate โ€” ์ ˆ๋Œ€ ์นœํ™”๋„/ํ™œ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Œ surrogate-์ƒ๋Œ€ MED.

โš ๏ธ ์•Œ๋ ค์ง„ ๊ฒฐํ•จ: diversity ๊ฐ€์ค‘์น˜(scoring.py:46-47)๊ฐ€ ํ•ฉ์‚ฐ์— ๋“ค์–ด๊ฐ€๋‚˜, ์–ด๋–ค Arm๋„ diversity ํ”ผ์ฒ˜๋ฅผ ์‚ฐ์ถœํ•˜์ง€ ์•Š์Œ โ†’ features.get("diversity", 0.0)์ด ํ•ญ์ƒ 0์œผ๋กœ ๊ท€๊ฒฐ, ์ฆ‰ ๋‹ค์–‘์„ฑ ํ•ญ์ด ์ ์ˆ˜์— ๊ธฐ์—ฌํ•˜์ง€ ์•Š๊ณ  ์ตœ๋Œ€ ์ ์ˆ˜๋ฅผ 0.9๋กœ ๊นŽ๋Š” ํšจ๊ณผ๋งŒ ๋‚จ์Œ [๋ฏธ๊ฒ€์ฆ: ์˜๋„ ๋ฏธ๊ตฌํ˜„์ธ์ง€ ์‚ฌํ›„ ์ถ”๊ฐ€ ๊ณ„ํš์ธ์ง€ ๋ถˆ๋ช…] [๊ทผ๊ฑฐ: scoring.py:47, docs/meet_preparation/inspect_evidence/silo_a.md:156-165, EV08 ยง4].


6. NVIDIA NIM ์˜์กด์„ฑ โ€” ์‹คํ–‰ ์ฐจ๋‹จ์˜ ํ•ต์‹ฌ

์ฃผ์žฅ โ†’ ๊ทผ๊ฑฐ โ†’ ํ•จ์˜

  • ์ฃผ์žฅ: Arm1ยทArm3๋Š” NVIDIA NIM ํด๋ผ์šฐ๋“œ API์— ์ง์ ‘ ์˜์กดํ•˜๋ฉฐ, ์ด๊ฒƒ์ด Silo A ๋ฏธ์‹คํ–‰์˜ ๊ทผ๋ณธ ์›์ธ์ด๋‹ค.
  • ๊ทผ๊ฑฐ:
  • 5๊ฐœ NIM ํด๋ผ์ด์–ธํŠธ๊ฐ€ bionemo/์— ๊ตฌํ˜„๋จ (MolMIM, DiffDock, ProteinMPNN, ESMFold, RFdiffusion 5๊ฐœ *_client.py ํŒŒ์ผ ๋ชจ๋‘ ์‹ค์žฌ ํ™•์ธ) [๊ทผ๊ฑฐ: _backup/orphaned_20260609/bionemo/{molmim,diffdock,proteinmpnn,esmfold,rfdiffusion}_client.py]
  • ์—”๋“œํฌ์ธํŠธ ์˜ˆ: MolMIM https://health.api.nvidia.com/v1/biology/nvidia/molmim, DiffDock โ€ฆ/mit/diffdock [๊ทผ๊ฑฐ: EV08 ยง2.C]
  • ํ™œ์„ฑ API์˜ dry-run ๊ฒŒ์ดํŠธ โ€” _has_nim_api_key() = os.getenv("NVIDIA_NIM_API_KEY") [๊ทผ๊ฑฐ: backend/routers/silo_a.py:65-66], ํ‚ค ์—†์œผ๋ฉด dry-run ๊ฐ•์ œ [๊ทผ๊ฑฐ: backend/routers/silo_a.py:69-70]
  • ํ˜„์žฌ ํ™˜๊ฒฝ ํ‚ค ๋ฏธ์„ค์ • [๊ทผ๊ฑฐ: docs/meet_preparation/inspect_evidence/silo_a.md:195]
  • ํ•จ์˜: Silo A ์‹คํ–‰ = ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์ž๊ฒฉ์ฆ๋ช… ํ™•๋ณด๊ฐ€ ์„ ํ–‰์กฐ๊ฑด. ์˜จํ”„๋ ˆ๋ฏธ์Šค(KAERI) ์šด์˜ ์ •์ฑ…์ƒ ํด๋ผ์šฐ๋“œ ์˜์กด์ด ๋ถ€๋‹ด์ด์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์‹ค์ œ ํ™œ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ์€ NIM์„ ์ œ๊ฑฐํ•˜๊ณ  ๋กœ์ปฌ ๊ฒฝ๋กœ๋กœ ์ „ํ™˜๋จ(ยง8).

7. ํ™œ์„ฑ HTTP API โ€” Phase 1 ์Šคํ… (๋ชฉ์  โ†’ ์ž…๋ ฅ โ†’ ์—ฐ์‚ฐ โ†’ ์ถœ๋ ฅ)

  • ๋ชฉ์ : ํ™œ์„ฑ ๋ ˆํฌ์˜ Silo A FastAPI ๋ผ์šฐํ„ฐ๋Š” ์‹ค์ œ ์ถ”๋ก  ์—†์ด dry-run ์žก ์ˆ˜๋ฝ๊ณผ ํ™˜๊ฒฝ ํ—ฌ์Šค ํ”„๋กœ๋ธŒ๋งŒ ๋…ธ์ถœํ•œ๋‹ค. ์‹ค์ œ ๋ชจ๋ธ ํ˜ธ์ถœ์€ Phase 2 ์›Œ์ปค๋กœ ์œ ๋ณด. ์Šคํ…
  • ์ž…๋ ฅ: SiloARunRequest(sequencesยทuse_nimยทarms) [๊ทผ๊ฑฐ: AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri/backend/routers/silo_a.py:25-28].
  • ํ๋ฆ„:
  • ํ—ค๋” ์ฃผ์„์ด ์˜๋„๋ฅผ ๋ช…์‹œ: "Phase 1 intentionally exposes dry-run orchestration and health probes onlyโ€ฆReal ProteinMPNN, RFdiffusion, ESMFold, and DiffPepBuilder calls are reserved for the Phase 2 worker integration." [๊ทผ๊ฑฐ: backend/routers/silo_a.py:1-7]
  • POST /run์€ _nim_dry_run_enabled(use_nim)(= use_nim and not _has_nim_api_key())๋กœ dry-run ์—ฌ๋ถ€๋ฅผ ํŒ์ •ํ•˜๊ณ , ์ƒˆ job_id(uuid4)์™€ "inference is deferred to Phase 2" ๋ฉ”์‹œ์ง€๋งŒ ๋ฐ˜ํ™˜ โ€” ์‹ค์ œ ์ถ”๋ก  ํ˜ธ์ถœ ์—†์Œ [๊ทผ๊ฑฐ: backend/routers/silo_a.py:69-70, 119-129].
  • GET /status/{job_id}ยทGET /results/{job_id}๋Š” ๋นˆ stub ์‘๋‹ต [๊ทผ๊ฑฐ: backend/routers/silo_a.py:132-150].
  • GET /health๋Š” _has_nim_api_key()์™€ _discover_conda_env_names()(conda env list --json subprocess)๋กœ NIM ํ‚ค ์œ ๋ฌดยทํ•„์ˆ˜ conda env 4์ข…(proteinmpnn/rfdiffusion/esmfold/diffpepbuilder) ๊ฐ€์šฉ์„ฑ์„ ์ ๊ฒ€ํ•ด ๋ณด๊ณ  [๊ทผ๊ฑฐ: backend/routers/silo_a.py:22, 73-116, 153-168].
  • ์ถœ๋ ฅ: dry-run ํŒ์ •ยทjob_idยทํ—ฌ์Šค ์ƒํƒœ ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ JSON (๋ชจ๋ธ ์‚ฐ์ถœ๋ฌผ ์—†์Œ).
  • ํ•จ์˜: API ๊ณ„์•ฝ(์Šคํ‚ค๋งˆยท๋ผ์šฐํŠธ)์€ ์ •์˜๋์œผ๋‚˜ ์›Œ์ปค ํ†ตํ•ฉ(Phase 2)์€ ๋ฏธ๊ตฌํ˜„. PI ๊ด€์ ์—์„œ "API๊ฐ€ ์žˆ๋‹ค โ‰  ์ถ”๋ก ์ด ๋ˆ๋‹ค"๋ฅผ ๋ถ„๋ช…ํžˆ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•จ.

8. ํ™œ์„ฑ ๋กœ์ปฌ ๊ฒฝ๋กœ โ€” pipeline_local._run_silo_a() (NIM ์—†์ด ์‹ค์ œ ๊ฐ€๋™)

์ค‘์š” ์ •์ •: Silo A๊ฐ€ 100% ๋น„ํ™œ์„ฑ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ†ตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ(pipeline_local)์€ NIM์„ ์ œ๊ฑฐํ•œ ๋กœ์ปฌ de novo ๊ฒฝ๋กœ๋ฅผ ์‹ค์ œ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. (Arm1 ์†Œ๋ถ„์žยทArm2 ํŽฉํƒ€์ด๋“œ๋Š” ๋ฏธํฌํ•จ, Arm3์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฑ๋ณธ+์„œ์—ด ์„ค๊ณ„๋งŒ)

  • ๋ชฉ์ : ๋“€์–ผ ์‚ฌ์ผ๋กœ ๋ฃจํ”„์—์„œ Silo A ๋ชซ์œผ๋กœ RFdiffusion ๋ฐฑ๋ณธ ์„ค๊ณ„ + ProteinMPNN ์„œ์—ด ์„ค๊ณ„๋ฅผ ๋กœ์ปฌ GPU๋กœ ์‹คํ–‰ํ•ด ์„œ์—ด ํ›„๋ณด๋ฅผ ๊ณต๊ธ‰ํ•œ๋‹ค. ์‹ค์ธก HIGH(์ฝ”๋“œ ์กด์žฌ)
  • ์ž…๋ ฅ: step01_out(receptor_pdb_path, pocket_residues), iteration, ๊ทธ๋ฆฌ๊ณ  config["dual_silo"]["silo_a"](gpu_device ๊ธฐ๋ณธ 2, ์„ ํƒ์  n_backboneยทk_seq_per_backbone) [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:1395-1426].
  • ํ๋ฆ„: 1. dual ์ „์šฉ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ config๋ฅผ ๋ฎ์–ด์“ฐ๊ณ  device="cuda:{gpu_device}" ์„ค์ • [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:1414-1426]. 2. step02_backbone.generate_backbones(receptor_pdb, pocket_info, config) ์‹คํ–‰ โ€” ๋ฐฑ๋ณธ PDB๊ฐ€ ์—†์œผ๋ฉด ๊ฒฝ๊ณ  ํ›„ ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜(Silo B๋งŒ์œผ๋กœ ์ง„ํ–‰) [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:1428-1438]. 3. step03_sequence.design_sequences(backbones, config)๋กœ ์„œ์—ด ์„ค๊ณ„, ์‹คํŒจ ์‹œ ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜ [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:1441-1450]. 4. ํ˜ธ์ถœ๋ถ€์—์„œ ๋กœ๊ทธ "Silo A (RFdiffusion + ProteinMPNN) ์‹คํ–‰ ์ค‘..." ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋“€์–ผ ๋ถ„๊ธฐ๋กœ ์ „๋‹ฌ [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:843-853].
  • ์ถœ๋ ฅ: SequenceEntry ๋ฆฌ์ŠคํŠธ(์‹คํŒจ ์‹œ ๋นˆ ๋ฆฌ์ŠคํŠธ). ์ดํ›„ ํ›„๋ณด์—๋Š” source="silo_a" ํƒœ๊ทธ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด Silo B ์‚ฐ๋ฌผ๊ณผ ๊ตฌ๋ถ„ยทํ†ตํ•ฉ๋œ๋‹ค [๊ทผ๊ฑฐ: pipeline_local/orchestrator.py:983-990, 1217-1228].
  • ํ•จ์˜: ๋ฐฑ์—…์˜ NIM 3-arm๊ณผ ๋‹ฌ๋ฆฌ, ํ™œ์„ฑ ๋กœ์ปฌ ๊ฒฝ๋กœ๋Š” Arm3 ๊ณจ๊ฒฉ(RFdiffusion+ProteinMPNN)๋งŒ ๋กœ์ปฌ๋กœ ์šด์˜ํ•˜๋ฉฐ ESMFoldยทMolMIMยทDiffDockยทFlexPep์€ ๋น ์ ธ ์žˆ๋‹ค. ์ฆ‰ "Silo A ์ „๋Ÿ‰ ๋ฏธ์‹คํ–‰"์ด ์•„๋‹ˆ๋ผ "NIM 3-arm ๋ฏธ์‹คํ–‰ / ๋กœ์ปฌ de novo ๋ถ€๋ถ„ ๊ฐ€๋™ ๊ฐ€๋Šฅ"์œผ๋กœ ์ •์ง ํ‘œ๊ธฐํ•ด์•ผ ํ•œ๋‹ค.

9. ์ •์ง ํ‘œ๊ธฐ: ์˜๋„ ๊ตฌ์กฐ vs. ์‹ค์ œ ํ™œ์„ฑ ์ฝ”๋“œ (P5 ๊ดด๋ฆฌ)

์ฃผ์žฅ โ†’ ๊ทผ๊ฑฐ โ†’ ํ•จ์˜

  • ์ฃผ์žฅ: docs/SYSTEM_ARCHITECTURE.md๊ฐ€ ๊ธฐ์ˆ ํ•œ Silo A/B ๋ถ„๋ฆฌ ๊ตฌ์กฐ๋Š” ํ˜„์žฌ ํ™œ์„ฑ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทผ๊ฑฐ:
  • ์˜๋„: ์ตœ์ƒ์œ„ pipelines/silo_a/ยทpipelines/silo_b/ [๊ทผ๊ฑฐ: docs/SYSTEM_ARCHITECTURE.md:24-30]
  • ์‹ค์ œ: ์ตœ์ƒ์œ„ pipelines/ ๋ถ€์žฌ, ํ™œ์„ฑ ์ฝ”๋“œ๋Š” ๋…๋ฆฝ ๋ ˆํฌ โ€ฆ/ai4sci-kaeri/์˜ pyrosetta_flow/ + AG_src/pipeline/ ๋‹จ์ผ ํ†ตํ•ฉ [๊ทผ๊ฑฐ: EV14 ยง1, docs/SYSTEM_ARCHITECTURE.md vs ์‹ค์ œ ls ๊ฒฐ๊ณผ]
  • NIM ํด๋ผ์ด์–ธํŠธ๋Š” ํ™œ์„ฑ ๋ ˆํฌ์— ๋ถ€์žฌ(๋ฐฑ์—…์—๋งŒ ์กด์žฌ), runner๋Š” "ESMFold ํ•„์š” โ†’ OFF" ๋“ฑ NIM ๋น„ํ™œ์„ฑ ๋ช…์‹œ [๊ทผ๊ฑฐ: EV14 ยง3]
  • ํ•จ์˜: Silo A๋Š” ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜(ํด๋ผ์šฐ๋“œ NIM 3-arm)์˜ ์œ ์‚ฐ์œผ๋กœ, ์˜จํ”„๋ ˆ๋ฏธ์Šค PyRosetta ํ†ตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ง„ํ™”ํ•˜๋ฉฐ ๋น„ํ™œ์„ฑ ๋ณด์กด๋จ. ๋ณธ ๋ณด๊ณ ๋Š” ์‹ค์ œ ์ฝ”๋“œ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ด ๊ดด๋ฆฌ๋ฅผ ๋ช…์‹œํ•œ๋‹ค(์›์น™ P5).
flowchart LR subgraph INTENT["์˜๋„ (๋ฌธ์„œ, ๋ฏธ๋™๊ธฐ)"] ia["pipelines/silo_a (NIM 3-arm)"] ib["pipelines/silo_b"] end subgraph REAL["์‹ค์ œ ํ™œ์„ฑ ์ฝ”๋“œ"] r1["ai4sci-kaeri/pyrosetta_flow
(ํ†ตํ•ฉยทNIM OFF)"] r2["AG_src/pipeline"] r3["pipeline_local _run_silo_a
(RFdiff+MPNN ๋กœ์ปฌ, Arm3๋งŒ)"] end subgraph BAK["๋ฐฑ์—… (๋น„ํ™œ์„ฑ)"] b1["_backup/.../silo_a (๊ตฌํ˜„๋จ)"] b2["_backup/.../bionemo (NIM ํด๋ผ)"] end ia -.์ง„ํ™”/๋น„ํ™œ์„ฑํ™”.-> b1 ia -.๋กœ์ปฌ ๋ถ€๋ถ„ ๊ณ„์Šน.-> r3 ib -.ํ†ตํ•ฉ.-> r1 classDef blue fill:#e3f0fb,stroke:#1a6fbf,color:#0b3d66; classDef gray fill:#f0f0f0,stroke:#999,color:#555; class INTENT,ia,ib gray; class REAL,r1,r2,r3 blue; class BAK,b1,b2 gray;

๋„์‹ ์ถœ์ฒ˜ [๊ทผ๊ฑฐ: _workspace/report_site2/_evidence/EV14_arch_gap.md ยง1, ยง3].


10. ์ข…ํ•ฉ ์ƒํƒœํ‘œ (์ •์ง ๋“ฑ๊ธ‰)

๋‹จ๊ณ„ ์ƒํƒœ ์‹ ๋ขฐ๋“ฑ๊ธ‰ ๊ทผ๊ฑฐ
์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ โœ… ์™„๋ฃŒ HIGH docs/SYSTEM_ARCHITECTURE.md (์ „์ฒด)
NIM 3-arm ์ฝ”๋“œ ๊ตฌํ˜„(6 ๋ชจ๋“ˆ) โœ… ์™„๋ฃŒ(๋ฐฑ์—…) HIGH _backup/.../silo_a/README.md:17-26
๋‹จ์œ„ ํ…Œ์ŠคํŠธ(mock) โœ… 9๊ฑด ํ†ต๊ณผ HIGH inspect_evidence/silo_a.md:174
ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ โŒ ๋ฏธ์ž‘์„ฑ โ€” inspect_evidence/silo_a.md:175
HTTP API ๐ŸŸก Phase 1 dry-run ์Šคํ… โ€” backend/routers/silo_a.py:1-7
NIM 3-arm End-to-End ์‹คํ–‰ โŒ 0๊ฑด (outputs/silo_a ๋ฏธ์กด์žฌ) โ€” inspect_evidence/silo_a.md:171
NIM API ํ‚ค โŒ ๋ฏธ์„ค์ • โ€” inspect_evidence/silo_a.md:195
ํ™œ์„ฑ ๋กœ์ปฌ de novo ๊ฒฝ๋กœ ๐ŸŸก _run_silo_a() ๊ฐ€๋™ ๊ฐ€๋Šฅ(Arm3๋งŒ, NIM ์—†์ด) MED pipeline_local/orchestrator.py:1395-1454

์ดํ‰: Silo A = NIM 3-arm ์„ค๊ณ„+๊ตฌํ˜„ ์™„๋ฃŒ / NIM ๊ฒฝ๋กœ ์‹คํ–‰ 0๊ฑด / ํ™œ์„ฑ ๋กœ์ปฌ de novo(Arm3) ๋ถ€๋ถ„ ๊ฐ€๋™ ๊ฐ€๋Šฅ. ์‹ค์ œ ๋ฐœ๊ตด ์„ฑ๊ณผ๋Š” ๋Œ€๋ถ€๋ถ„ Silo B ๊ฒฝ๋กœ ์‚ฐ๋ฌผ์ด๋ฉฐ, NIM 3-arm ์ „์ฒด๋Š” ํด๋ผ์šฐ๋“œ ํ‚ค ์žฌ๋„์ž… ๋˜๋Š” ์›Œ์ปค(Phase 2) ํ†ตํ•ฉ ์‹œ ์žฌํ™œ์„ฑ ๊ฐ€๋Šฅํ•œ ์ž์‚ฐ.


์šฉ์–ด

  • NIM (NVIDIA Inference Microservice): NVIDIA๊ฐ€ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์ƒ๋ฌผํ•™ ๋ชจ๋ธ ์ถ”๋ก  ํด๋ผ์šฐ๋“œ API (MolMIMยทDiffDockยทRFdiffusionยทProteinMPNNยทESMFold).
  • QED: Quantitative Estimate of Drug-likeness (์•ฝ๋ฌผ์œ ์‚ฌ์„ฑ 0โ€“1).
  • pLDDT: ESMFold ๊ตฌ์กฐ ์˜ˆ์ธก ์‹ ๋ขฐ๋„ (0โ€“100, 70 ์ด์ƒ ์ฑ„ํƒ).
  • FlexPepDock: PyRosetta ๊ธฐ๋ฐ˜ ์œ ์—ฐ ํŽฉํƒ€์ด๋“œ ๋„ํ‚น ํ”„๋กœํ† ์ฝœ.
  • dry-run: ์‹ค์ œ ์ถ”๋ก  ์—†์ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๋งŒ ๊ฒ€์ฆํ•˜๋Š” ๋ชจ์˜ ์‹คํ–‰.