pytrace/README.md

99 lines
3.9 KiB
Markdown
Raw Permalink Normal View History

2026-01-19 00:49:55 +08:00
# TraceStudio
TraceStudio 是一个分布式的、节点式的自动化性能分析平台。它采用 **Master-Worker** 架构,旨在构建通用的性能数据分析与自动化流水线。
## 核心理念 (Core Concepts)
* **分布式架构**:
* **Server (The Hub)**: 负责 API 网关、图解析与任务分发。
* **Client (The Worker)**: 无头Headless计算节点负责算力贡献与自定义逻辑执行。
* **BYOC (Bring Your Own Compute)**: 允许用户接入本地 Client运行自己定义的私有节点逻辑实现数据不出域或利用本地特定环境。
* **协议先行 (Protocol First)**: `pytrace` 核心库定义了一切契约NodeBase, Specs, 序列化Server 与 Client 必须严格遵守同一套标准。
* **去 UI 化**: 后端不包含 Web 前端代码,仅提供 API 供外部前端调用。
## 架构拓扑 (Architecture)
```text
/
├── pytrace/ # [核心共享库] (Python Package)
│ ├── api/ # [面向用户] Node, Decorators, IO
│ ├── runtime/ # [面向系统] Executor, Registry, Context
│ ├── model/ # [面向数据] Specs, Enums, Data
│ ├── internal/ # [面向框架] MetaMap, Constants
│ └── nodes/ # 通用标准节点库
├── server/ # [中心服务器] (The Hub)
│ ├── api/ # HTTP API (FastAPI)
│ └── dispatcher/ # 路由分发器 (基于能力的路由)
├── client/ # [计算节点] (The Headless Worker)
│ └── registry/ # 本地能力注册
└── docs/ # 协议文档
```
## 核心组件说明
### 1. Pytrace (Shared Library)
系统的“通用语言”。Server 和 Client 必须依赖完全一致的 `pytrace` 版本。
* **TraceNode**: 所有可执行节点的抽象基类。
* **Specs**: 使用 Pydantic 定义的数据模型 (`NodeSpec`, `PortSpec`, `ParamSpec`),用于生成前端元数据。
### 2. Server (The Hub)
* **能力路由 (Capability-Based Routing)**: 维护一张路由表,记录哪个 Client 拥有哪个自定义 Node。
* **智能缓存**: 基于 `Hash(NodeVersion + InputData + Params)` 进行结果缓存。
### 3. Client (The Worker)
* **握手机制**: 启动时向 Server 汇报自己拥有的节点列表 (Capabilities)。
* **任务执行**: 监听任务 -> 反序列化 (dill) -> 执行 -> 序列化结果 -> 返回。
## 开发指南:定义节点
TraceStudio 使用**装饰器驱动**的方式来定义节点。所有节点需继承自 `pytrace.api.node.TraceNode`
### 示例代码
```python
pip install -e .
from typing import Any
from pytrace.api.node import TraceNode
from pytrace.api.decorators import input_port, output_port, parameter, node_meta
@node_meta(
display_name="Threshold Filter",
icon="filter-icon",
description="Filters data based on a numeric threshold."
)
class ThresholdFilterNode(TraceNode):
# 定义输入端口 (注意: label 字段是必填的,用于 UI 显示)
@input_port(name="data_in", label="Input Data", type="dataframe")
# 定义输出端口
@output_port(name="data_out", label="Filtered Data", type="dataframe")
# 定义可配置参数
@parameter(name="threshold", label="Threshold Value", type="float", default=0.5)
def process(self, io: Any, context: Any) -> None:
"""
节点的执行逻辑。
"""
# 1. 获取输入
# (假设 io 提供了 get_input 方法)
data = io.get_input("data_in")
# 2. 获取参数
thresh = self.params.get("threshold", 0.5)
# 3. 执行业务逻辑
# result = data[data['value'] > thresh]
# 4. 设置输出
# io.set_output("data_out", result)
pass
```
## 启动服务
```bash
uvicorn server.app.main:app --reload
```