μΉ κΈ°λ° κ²½λν μλ£ μ°ν©νμ΅(Federated Learning) νλ«νΌ
HELIOSλ κ³ μ±λ₯ μΈνλΌκ° μλ μ€μλ³μλ μΉ λΈλΌμ°μ λ§μΌλ‘ μ°Έμ¬ν μ μλ μ€μκ° μ°ν©νμ΅ νλ«νΌμ λλ€. TensorFlow.jsλ₯Ό νμ©ν On-device Learning κΈ°μ μ ν΅ν΄ μλ£ λ°μ΄ν°κ° λ³μ μΈλΆλ‘ μ μΆλμ§ μλλ‘ λ³΄νΈνλ©°, Python Flower μλ²μ μ°λνμ¬ λ€κΈ°κ΄ νλ ₯ AI λͺ¨λΈμ ꡬμΆν©λλ€.
- π μλ²½ν νλΌμ΄λ²μ (Data Locality): μλ³Έ λ°μ΄ν°λ λΈλΌμ°μ (Local)λ₯Ό μ λ λ λμ§ μμΌλ©°, μνΈνλ κ°μ€μΉ(Weight)λ§ μλ²λ‘ μ μ‘λ©λλ€.
- β‘ Zero-Install νκ²½: λ³λμ μννΈμ¨μ΄ μ€μΉ μμ΄ μΉ λΈλΌμ°μ μ μλ§μΌλ‘ νμ΅μ μ°Έμ¬ν μ μμ΅λλ€.
- π€ Client-side μ€ν λΌλ²¨λ§: CheXpertλ‘ μ¬μ νμ΅λ κ²½λν λͺ¨λΈ(DenseNet121 κΈ°λ°)μ΄ λΈλΌμ°μ λ΄μμ X-rayλ₯Ό μ¦μ λΆμνμ¬ λΌλ²¨λ§μ μλνν©λλ€.
- π€ μ€μκ° μ°ν©νμ΅: Python WebSocket μλ²μ μ°λνμ¬
FedAvg,FedAdamλ±μ μκ³ λ¦¬μ¦μΌλ‘ κΈλ‘λ² λͺ¨λΈμ μ€μκ° μ λ°μ΄νΈν©λλ€. - π μ€μκ° λμ보λ: νμ΅ μ§ν μν©(Loss, Accuracy)μ μ€μκ° κ·Έλνλ‘ μκ°νν©λλ€.
μ΄ νλ‘μ νΈλ **Backend(Python)**μ **Frontend(React)**λ₯Ό κ°κ° μ€νν΄μΌ ν©λλ€.
- Node.js 18.x μ΄μ
- Python 3.9 μ΄μ
μ°ν©νμ΅μ μ€κ°νλ μ€μ μλ²λ₯Ό λ¨Όμ μ€νν©λλ€.
# μλ² ν΄λλ‘ μ΄λ
cd federated/server
# κ°μνκ²½ μμ± λ° νμ±ν (κΆμ₯)
python -m venv venv
source venv/bin/activate # (Windows: venv\Scripts\activate)
# μμ‘΄μ± μ€μΉ
pip install flwr websockets numpy torch torchvision
# μλ² μ€ν (Port: 8080)
python simple_server.pyμ¬μ©μ μΈν°νμ΄μ€ λ° νμ΅ μμ§μ μ€νν©λλ€.
# ν΄λΌμ΄μΈνΈ ν΄λλ‘ μ΄λ
cd Heliosclient
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν (Port: 5173)
npm run devλΈλΌμ°μ μμ http://localhost:5173 μ μ
- Framework: React 18, TypeScript, Vite
- AI/ML: TensorFlow.js (WebGL Backend)
- Styling: Tailwind CSS, Radix UI
- Visualization: Recharts
- Language: Python 3.9+
- FL Framework: Flower (Flwr) (Custom WebSocket Implementation)
- Communication: WebSockets (Asyncio)
- Computation: NumPy, PyTorch (for model conversion)
βββ public/
β βββ models/
β βββ chexpert_tfjs/ # π λ³νλ TF.js λͺ¨λΈ νμΌ μ μ₯μ
β βββ model.json # λͺ¨λΈ ꡬ쑰 (GraphModel)
β βββ group1-shard* # λͺ¨λΈ κ°μ€μΉ (Binary)
β
βββ src/
β βββ lib/ # π§ ν΅μ¬ AI λ° ν΅μ λ‘μ§
β β βββ fl_client.js # [Core] TF.js λ‘컬 νμ΅ μμ
μ
β β β # - CNN λͺ¨λΈ μ μ λ° μ»΄νμΌ
β β β # - fit(): λ‘컬 λ°μ΄ν° νμ΅ μν
β β β # - evaluate(): ν
μ€νΈμ
νκ°
β β βββ flwr/ # [Network] Flower ν΅μ λͺ¨λ
β β βββ index.js # - WebSocket μ°κ²° λ° λ©μμ§ νμ±
β β # - μλ² λͺ
λ Ή(fit, evaluate)μ fl_clientμ μ λ¬
β β
β βββ contexts/ # π μ μ μν κ΄λ¦¬
β β βββ TrainingDataContext.tsx # νμ΅μ© ν
μ(Tensor) λ°μ΄ν° 보κ΄ν¨
β β β # (μ΄λ―Έμ§ -> Tensor λ³ν ν λ©λͺ¨λ¦¬ μ μ§)
β β βββ SessionContext.tsx # μΈμ
μ 보(μκ³ λ¦¬μ¦, ν΄λμ€ λ±) κ΄λ¦¬
β β βββ AuthContext.tsx # μ¬μ©μ λ‘κ·ΈμΈ μν κ΄λ¦¬
β β
β βββ pages/ # π₯οΈ νλ©΄ κ΅¬μ± (Pages)
β β βββ HomePage.tsx # μλΉμ€ λ©μΈ ν (λμ보λ μ§μ
)
β β βββ LoginPage.tsx # μ¬μ©μ λ‘κ·ΈμΈ
β β βββ SignUpPage.tsx # νμκ°μ
β β βββ MyPage.tsx # μ¬μ©μ μ 보 λ° μ°Έμ¬ μ΄λ ₯ κ΄λ¦¬
β β β
β β βββ SessionListPage.tsx # μ°Έμ¬ κ°λ₯ν μ°ν©νμ΅ μΈμ
λͺ©λ‘ μ‘°ν
β β βββ SessionCreatePage.tsx # μΈμ
μμ± (μκ³ λ¦¬μ¦, λ°μ΄ν°μ
, ν΄λμ€ μ€μ )
β β βββ SessionDetailPage.tsx # μΈμ
μμΈ μ 보 νμΈ
β β βββ SessionJoinPage.tsx # μΈμ
μ°Έμ¬ λ°©μ(μλ/μλ) μ ν
β β β
β β βββ LabelingAutoPage.tsx # [AI] μλ λΌλ²¨λ§ (Canvas μ΅μ ν μ μ©)
β β β # - 320x320 리μ¬μ΄μ§ λ° μΆλ‘ μν
β β βββ LabelingManualPage.tsx # [AI] μλ κ²μ λ° λ°μ΄ν° λ³ν
β β β # - Train/Test(8:2) λΆν λ° ν
μ μμ±
β β β
β β βββ SessionTrainingPage.tsx # [FL] μ€μκ° μ°ν©νμ΅ λμ보λ
β β β # - μ€μκ° Loss/Acc κ·Έλν μκ°ν
β β βββ SessionResultsPage.tsx # νμ΅ κ²°κ³Ό 리ν¬νΈ λ° μ±λ₯ μ§ν νμΈ
β β β
β β βββ ModelDownloadPage.tsx # νμ΅ μλ£λ λͺ¨λΈ λͺ©λ‘ λ° λ€μ΄λ‘λ
β β βββ ModelDetailPage.tsx # λͺ¨λΈ μμΈ μ€ν νμΈ
β β βββ AdminPage.tsx # κ΄λ¦¬μ μ μ© νμ΄μ§ (μΉμΈ/κ΄λ¦¬)
β β βββ NotFoundPage.tsx # 404 μλ¬ νμ΄μ§
β β
β βββ components/ # π§© UI μ»΄ν¬λνΈ
β β βββ ui/ # λ²νΌ, μΉ΄λ, μ
λ ₯μ°½ λ± (Re-usable)
β β βββ Layout.tsx # ν€λ/νΈν°λ₯Ό ν¬ν¨ν κ³΅ν΅ λ μ΄μμ
β β
β βββ App.tsx # λΌμ°ν
(Routing) λ° Context Provider μ€μ
β βββ main.tsx # React μ± μ§μ
μ
β
βββ package.json # μμ‘΄μ± κ΄λ¦¬ (@tensorflow/tfjs, recharts λ±)
βββ vite.config.ts # Vite λΉλ μ€μ
- νμ΅ λͺ©νμ λ°λΌ FedAvg (κΈ°λ³Έ) λλ FedAdam (Non-IID νΉν) μκ³ λ¦¬μ¦μ μ ννμ¬ μΈμ μ μμ±ν μ μμ΅λλ€.
- CheXpert κΈ°μ€ 14κ° μ§ν ν΄λμ€λ₯Ό μλμΌλ‘ μ€μ νλ ν리μ μ μ 곡ν©λλ€.
- μλ λΌλ²¨λ§: μ΄λ―Έμ§λ₯Ό μ λ‘λνλ©΄ λΈλΌμ°μ λ΄μ₯ AIκ° 320x320 ν΄μλλ‘ λΆμνμ¬ μ¦μ λΌλ²¨μ μ μν©λλ€.
- μλ κ²μ: μλ£μ§μ΄ AIμ κ²°κ³Όλ₯Ό νμΈνκ³ μμ ν μ μμΌλ©°, νμ λ λ°μ΄ν°λ νμ΅μ© ν μ(Tensor)λ‘ λ³νλ©λλ€.
- λ°μ΄ν° νμ΄νλΌμΈ: μ΄λ―Έμ§(Canvas) β ν μ λ³ν(224x224) β μ κ·ν β λ°°μΉ μ²λ¦¬.
- νμ΅ νλ‘μΈμ€:
- μλ²λ‘λΆν° κΈλ‘λ² κ°μ€μΉ μμ
- λΈλΌμ°μ (GPU)μμ λ‘컬 λ°μ΄ν°λ‘ νμ΅ μν
- κ°±μ λ κ°μ€μΉλ₯Ό μλ²λ‘ μ μ‘
- μ€μκ° Loss/Accuracy κ·Έλν μ λ°μ΄νΈ
- νμ΅μ΄ μλ£λλ©΄ μ΅μ’ μ νλμ μμ€ κ°μ νμΈνκ³ , νμ΅λ λͺ¨λΈμ λ€μ΄λ‘λνμ¬ νμ©ν μ μμ΅λλ€.
- λΈλΌμ°μ νΈνμ±: WebGL κ°μμ μν΄ Chrome λλ Edge λΈλΌμ°μ μ¬μ©μ κΆμ₯ν©λλ€.
- λ©λͺ¨λ¦¬ κ΄λ¦¬: λλμ μ΄λ―Έμ§(100μ₯ μ΄μ) νμ΅ μ λΈλΌμ°μ λ©λͺ¨λ¦¬ 보νΈλ₯Ό μν΄ λ°°μΉ λ¨μ μ²λ¦¬κ° μ μ©λμ΄ μμ΅λλ€.
- μλ² μ°κ²°:
[μ°ν©νμ΅ μμ]λ²νΌμ λλ₯΄κΈ° μ μ λ°λμ **Python μλ²(simple_server.py)**κ° μΌμ Έ μμ΄μΌ ν©λλ€.
μ΄ νλ‘μ νΈλ κ΅μ‘ λ° μ°κ΅¬ λͺ©μ μΌλ‘ μ μλμμ΅λλ€.
HELIOS Team - Connecting Hospitals, Empowering AI π₯β¨