Weights Biases Hexagonal Architecture

Weights & Biases Hexagonal Architecture คืออะไร

Weights & Biases (W&B) เป็น MLOps platform สำหรับ experiment tracking, model versioning, dataset management และ collaboration ในทีม ML Hexagonal Architecture (Ports and Adapters) เป็นรูปแบบการออกแบบซอฟต์แวร์ที่แยก business logic ออกจาก external dependencies ผ่าน ports (interfaces) และ adapters (implementations) การรวมสองแนวคิดนี้ช่วยสร้าง ML systems ที่ testable, maintainable และเปลี่ยน infrastructure ได้ง่าย เช่น สลับจาก W&B ไป MLflow โดยไม่แก้ core logic
W&B Adapter

# wandb_adapter.py — Weights & Biases adapter
import json
class WandbAdapter:
CODE = """
# adapters/wandb_tracker.py
import wandb
from ports import ExperimentTrackerPort, Experiment
class WandbExperimentTracker(ExperimentTrackerPort):
def __init__(self, project: str, entity: str = None):
self.project = project
self.entity = entity
self.run = None
def init_experiment(self, experiment: Experiment) -> str:
self.run = wandb.init(
project=self.project,
entity=self.entity,
name=experiment.name,
config=experiment.config,
tags=list(experiment.tags.values()) if experiment.tags else None,
)
return self.run.id
def log_metrics(self, metrics: dict, step: int) -> None:
wandb.log(metrics, step=step)
def log_params(self, params: dict) -> None:
wandb.config.update(params)
def log_artifact(self, path: str, name: str) -> None:
artifact = wandb.Artifact(name, type='model')
artifact.add_file(path)
self.run.log_artifact(artifact)
def finish(self) -> None:
if self.run:
wandb.finish()
# adapters/wandb_registry.py
class WandbModelRegistry(ModelRegistryPort):
def __init__(self, project: str, entity: str = None):
self.api = wandb.Api()
self.project = project
self.entity = entity
def register_model(self, artifact: ModelArtifact) -> str:
run = wandb.init(project=self.project, job_type='register')
art = wandb.Artifact(artifact.name, type='model')
art.add_file(artifact.path)
art.metadata = artifact.metrics
run.log_artifact(art)
wandb.finish()
return f"{artifact.name}:latest"
def get_model(self, name: str, version: str) -> ModelArtifact:
artifact = self.api.artifact(f"{self.entity}/{self.project}/{name}:{version}")
path = artifact.download()
return ModelArtifact(name=name, version=version, path=path, metrics=artifact.metadata)
def promote_model(self, name: str, version: str, stage: str) -> None:
artifact = self.api.artifact(f"{self.entity}/{self.project}/{name}:{version}")
artifact.aliases.append(stage)
artifact.save()
"""
MLFLOW_ADAPTER = """
# adapters/mlflow_tracker.py — Alternative adapter
import mlflow
class MLflowExperimentTracker(ExperimentTrackerPort):
def __init__(self, tracking_uri: str):
mlflow.set_tracking_uri(tracking_uri)
def init_experiment(self, experiment: Experiment) -> str:
mlflow.set_experiment(experiment.name)
run = mlflow.start_run()
mlflow.log_params(experiment.config)
return run.info.run_id
def log_metrics(self, metrics: dict, step: int) -> None:
mlflow.log_metrics(metrics, step=step)
def log_params(self, params: dict) -> None:
mlflow.log_params(params)
def log_artifact(self, path: str, name: str) -> None:
mlflow.log_artifact(path)
def finish(self) -> None:
mlflow.end_run()
"""
def show_wandb(self):
print("=== W&B Adapter ===")
print(self.CODE[:600])
def show_mlflow(self):
print(f"\n=== MLflow Adapter (swap!) ===")
print(self.MLFLOW_ADAPTER[:400])
adapter = WandbAdapter()
adapter.show_wandb()
adapter.show_mlflow()
FAQ - คำถามที่พบบ่อย
Q: Hexagonal Architecture จำเป็นสำหรับ ML projects ไหม?
A: ไม่จำเป็นทุก project: Small/POC: ไม่จำเป็น — เขียนตรงๆ เร็วกว่า Production ML systems: แนะนำมาก — เปลี่ยน tracking tool, data source, model store ได้ง่าย Team projects: จำเป็น — แบ่ง responsibilities ชัดเจน, test ง่าย กฎ: ถ้า project มีแนวโน้มจะเปลี่ยน infrastructure → ใช้ Hexagonal
เนื้อหาเกี่ยวข้อง — แนะนำให้อ่าน carry trade ne demek
Q: W&B กับ MLflow อันไหนดี?
แนะนำเพิ่มเติม — ติดตาม XM Signal
A: W&B: UI สวย, collaboration ดีมาก, hosted (ไม่ต้อง manage), team features MLflow: Open source, self-hosted, free, customizable, community ใหญ่ W&B: เหมาะ teams ที่ต้องการ managed solution ($) MLflow: เหมาะ teams ที่ต้องการ control + ไม่มี budget ด้วย Hexagonal: เปลี่ยนได้ตลอด — ไม่ต้อง commit วันนี้
เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: Fail2ban Advanced GreenOps Sustainability
Q: Ports and Adapters ทำให้ code ซับซ้อนขึ้นไหม?
A: เพิ่ม boilerplate เล็กน้อย (interfaces + adapters) แต่: Tests เร็วขึ้น 10x (fake adapters), เปลี่ยน infrastructure ง่าย, team เข้าใจ boundaries ชัด, debug ง่ายกว่า Trade-off คุ้ม: เพิ่ม code 20% แต่ลด maintenance cost 50%+
แนะนำเพิ่มเติม — คอร์สเทรด Forex ที่ iCafeForex
เนื้อหาเกี่ยวข้อง — ดูเพิ่มเติมเรื่อง Payload CMS Internal Developer Platform
Q: Dependency Injection ใน Python ทำยังไง?
A: Simple: Constructor injection (ส่ง dependencies ผ่าน __init__) Libraries: dependency-injector, inject, python-inject Recommended: Constructor injection สำหรับ ML projects — simple, explicit, ไม่ต้อง framework เพิ่ม ใน Composition Root (main.py): wire ทุก dependencies จุดเดียว
เนื้อหาเกี่ยวข้อง — แนะนำให้อ่าน white paper คือ — ข้อมูลครบถ้วน 2026





