pytrace/README.md
2026-01-19 00:49:55 +08:00

99 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```