Title here
Summary here
本文档深入解析 DynamoService 类的设计,包括继承关系、端点管理和依赖链接机制。
DynamoService 采用"装饰者 + 扩展"模式:
| 层次 | 职责 |
|---|---|
| BentoMLService | HTTP API、生命周期管理 |
| DynamoService | 分布式能力、端点管理 |
| UserService | 业务逻辑实现 |
# deploy/dynamo/sdk/src/dynamo/sdk/lib/service.py
class DynamoService(Service[T]):
"""扩展 BentoML Service 的 Dynamo 服务类"""
def __init__(
self,
config: Config | dict[str, Config] | None,
inner: type[T],
image: Image | None = None,
envs: list[dict[str, t.Any]] | None = None,
dynamo_config: DynamoConfig | None = None,
) -> None:
super().__init__(config, inner, image, envs)
# Dynamo 特定属性
self._dynamo_config = dynamo_config or DynamoConfig()
self._dynamo_endpoints: Dict[str, DynamoEndpoint] = {}
self._linked = False
# 收集 @dynamo_endpoint 装饰的方法
self._collect_dynamo_endpoints()def _collect_dynamo_endpoints(self) -> None:
"""扫描并收集所有 Dynamo 端点"""
for name in dir(self.inner):
attr = getattr(self.inner, name, None)
if isinstance(attr, DynamoEndpoint):
self._dynamo_endpoints[attr.name] = attrdef is_dynamo_component(self) -> bool:
"""检查是否配置为 Dynamo 组件"""
return self._dynamo_config.enabled
def get_dynamo_endpoints(self) -> Dict[str, DynamoEndpoint]:
"""获取所有 Dynamo 端点"""
return self._dynamo_endpoints
def get_endpoint(self, name: str) -> DynamoEndpoint | None:
"""获取指定端点"""
return self._dynamo_endpoints.get(name)def link(self) -> None:
"""链接服务依赖"""
if self._linked:
return
# 处理服务依赖
for dep in self._dependencies:
if isinstance(dep, DynamoDependency):
dep._setup_dynamo_client()
self._linked = Trueclass DynamoService(Service[T]):
def is_dynamo_component(self) -> bool:
"""是否启用 Dynamo"""
return self._dynamo_config.enabled
def is_linked(self) -> bool:
"""依赖是否已链接"""
return self._linked
def has_endpoint(self, name: str) -> bool:
"""是否有指定端点"""
return name in self._dynamo_endpoints
@property
def component_name(self) -> str:
"""获取组件名称"""
return self._dynamo_config.name or self.name
@property
def namespace_name(self) -> str:
"""获取命名空间"""
return self._dynamo_config.namespace or "default"def _apply_config(self, config: dict) -> None:
"""应用外部配置"""
# Dynamo 配置
if "dynamo" in config:
dynamo_cfg = config["dynamo"]
if "namespace" in dynamo_cfg:
self._dynamo_config.namespace = dynamo_cfg["namespace"]
if "name" in dynamo_cfg:
self._dynamo_config.name = dynamo_cfg["name"]
# 服务参数
if "ServiceArgs" in config:
svc_args = config["ServiceArgs"]
# 合并到 BentoML 配置
self._update_bentoml_config(svc_args)
# 类属性
for key, value in config.items():
if hasattr(self.inner, key):
setattr(self.inner, key, value)# configs/agg.yaml
VllmWorker:
# 类属性
model_path: /models/llama-7b
tensor_parallel_size: 1
# Dynamo 配置
dynamo:
namespace: production
name: llama-worker
# 服务参数
ServiceArgs:
workers: 2
resources:
gpu: 1
cpu: "10"DynamoService 保持与 BentoML Service 的完全兼容:
@service(
dynamo={"enabled": True, "namespace": "dynamo"},
# BentoML 原生参数
resources={"gpu": 1},
workers=1,
traffic={"timeout": 300},
)
class MyService:
# BentoML API(HTTP)
@bentoml.api
def http_endpoint(self, request: Request) -> Response:
return Response(...)
# Dynamo 端点(RPC)
@dynamo_endpoint()
async def rpc_endpoint(self, request: dict) -> AsyncIterator[dict]:
yield {...}from dynamo.sdk import service, dynamo_endpoint, async_on_start, depends
@service(
dynamo={"enabled": True, "namespace": "dynamo"},
resources={"gpu": 1},
)
class VllmWorker:
"""vLLM Worker 服务"""
# 配置属性(可被 YAML 覆盖)
model_path: str = "/models/default"
def __init__(self):
self.engine = None
@async_on_start
async def async_init(self):
"""异步初始化"""
self.engine = await create_engine(self.model_path)
@dynamo_endpoint()
async def generate(self, request: dict):
"""生成端点"""
async for token in self.engine.generate(request):
yield token
@service(dynamo={"enabled": True, "namespace": "dynamo"})
class Processor:
"""处理器服务"""
# 依赖注入
worker = depends(VllmWorker)
@async_on_start
async def async_init(self):
self.client = await self.worker.get_endpoint("generate")
@dynamo_endpoint()
async def process(self, request: dict):
async for resp in self.client.generate(request):
yield resp# graphs/agg.py
from ..components.worker import VllmWorker
from ..components.processor import Processor
from ..components.frontend import Frontend
# 服务图入口
# 依赖关系自动解析:Frontend -> Processor -> VllmWorker
Frontend = FrontendDynamoService 的核心设计:
| 特性 | 实现 |
|---|---|
| 继承 BentoML | 复用成熟的服务框架 |
| 端点收集 | 自动扫描 @dynamo_endpoint |
| 依赖链接 | link() 建立服务连接 |
| 配置合并 | 支持多级配置覆盖 |
| 双模式 | 同时支持 HTTP 和 RPC |
这套设计让 Dynamo 服务既保持了 BentoML 的易用性,又获得了分布式能力。