deepdata: core product code (backend, frontend, runtime, deepflow module)
This commit is contained in:
@@ -0,0 +1,297 @@
|
||||
# 自定义算子开发规范指南
|
||||
|
||||
本文档旨在为开发者提供一套标准的自定义数据处理算子开发规范。通过遵循本指南,您可以开发出能够无缝集成到数据处理系统中的高质量算子。
|
||||
|
||||
## 1. 目录结构规范
|
||||
|
||||
一个标准的算子开发包(Package)应包含以下核心文件。请确保文件命名准确,以便系统正确识别。
|
||||
|
||||
```text
|
||||
operator_package/
|
||||
├── __init__.py # [必要] 算子注册入口,用于将算子注册到全局工厂
|
||||
├── metadata.yml # [必要] 算子元数据、UI 参数定义及资源配置
|
||||
├── process.py # [必要] 算子核心逻辑代码
|
||||
├── requirements.txt # [可选] 算子运行所需的第三方 Python 依赖
|
||||
└── README.md # [可选] 算子功能说明文档
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 元数据与配置 (metadata.yml)
|
||||
|
||||
`metadata.yml` 定义了算子在系统中的“身份”、前端显示的配置组件以及运行时资源限制。
|
||||
|
||||
### 2.1 基础信息配置
|
||||
|
||||
| 字段 | 说明 | 示例 |
|
||||
| --- |------------------------------------| --- |
|
||||
| `name` | 算子显示名称 | 测试算子 |
|
||||
| `description` | 算子描述 | 这是一个测试算子。 |
|
||||
| `language` | 算子使用的语言,当前仅支持python | python |
|
||||
| `raw_id` | **关键字段**,必须与 `process.py` 中的类名完全一致 | TestMapper |
|
||||
| `version` | 语义化版本号 | 1.0.0 |
|
||||
| `vendor` | 厂商 | deepdata |
|
||||
| `modal` | 支持的数据模态 (text/image/audio/video) | text |
|
||||
| `inputs` | 输入的数据模态 (text/image/audio/video) | text |
|
||||
| `outputs` | 输出的数据模态 (text/image/audio/video) | text |
|
||||
|
||||
### 2.2 算子功能分类
|
||||
|
||||
定义算子功能分类,支持清洗与标注。
|
||||
|
||||
```yaml
|
||||
types:
|
||||
- 'cleaning'
|
||||
- 'annotation'
|
||||
```
|
||||
|
||||
### 2.3 算子版本更新日志 (release)
|
||||
|
||||
定义算子当前版本较上版本更新内容。
|
||||
|
||||
```yaml
|
||||
release:
|
||||
- '首次发布'
|
||||
- '支持基本处理操作'
|
||||
```
|
||||
|
||||
### 2.4 运行时资源与指标 (runtime & metrics)
|
||||
|
||||
定义算子运行时的资源配额及性能指标参考。
|
||||
|
||||
```yaml
|
||||
runtime:
|
||||
memory: 10485760 # 内存 单位bytes
|
||||
cpu: 0.05 # CPU 核心数
|
||||
gpu: 0.1 # GPU 卡数
|
||||
npu: 0.1 # NPU 卡数
|
||||
storage: 10MB # 存储空间
|
||||
|
||||
metrics: # 算子性能参考指标
|
||||
- name: '吞吐量'
|
||||
metric: '20 images/sec'
|
||||
- name: '准确率'
|
||||
metric: '99.5%'
|
||||
```
|
||||
|
||||
### 2.5 参数设置 (settings) - UI 组件规范
|
||||
|
||||
通过 `settings` 字段,开发者可以自定义用户在前端界面配置算子时的交互组件。系统支持以下类型:
|
||||
|
||||
* **Slider (滑动条)** - 用于数值范围调整
|
||||
```yaml
|
||||
sliderParam: # 参数的唯一标识符,process.py 中通过该参数获取值
|
||||
name: '参数展示名称' # 界面上显示给用户的参数标题
|
||||
description: '参数展示描述' # 用户鼠标悬停时显示的详细功能说明或帮助文本
|
||||
type: 'slider' # 组件类型
|
||||
defaultVal: 0.5 # 算子加载时的初始值,必须位于 min 和 max 之间
|
||||
required: false # 是否必填
|
||||
min: 0 # [下限] 滑动条允许调整的最小值
|
||||
max: 1 # [上限] 滑动条允许调整的最大值
|
||||
step: 0.1 # [步长] 每次拖动的增量 (例如 0.1 代表保留一位小数,1 代表整数)
|
||||
```
|
||||
|
||||
* **Switch (开关)** - 用于布尔值控制
|
||||
```yaml
|
||||
switchParam:
|
||||
name: '参数展示名称'
|
||||
description: '参数展示描述'
|
||||
type: 'switch'
|
||||
defaultVal: 'true' # 注意 yaml 中布尔值建议使用引号或标准写法
|
||||
required: false # 是否必须参数
|
||||
checkedLabel: '选中' # 选中时的展示
|
||||
unCheckedLabel: '未选中' # 未选中时的展示
|
||||
```
|
||||
|
||||
* **Select / Radio (下拉 / 单选)** - 用于枚举选项
|
||||
```yaml
|
||||
selectParam:
|
||||
name: '参数展示名称'
|
||||
description: '参数展示描述'
|
||||
type: 'select' # 或 'radio'
|
||||
defaultVal: 'option1' # 默认后端传递值,为options其中一个选项
|
||||
required: false
|
||||
options:
|
||||
- label: '选项1' # 前端显示标签
|
||||
value: 'option1' # 后端传递值
|
||||
- label: '选项2'
|
||||
value: 'option2'
|
||||
```
|
||||
|
||||
* **Range (范围区间)**
|
||||
```yaml
|
||||
rangeParam:
|
||||
name: '参数展示名称'
|
||||
description: '参数展示描述'
|
||||
type: 'range'
|
||||
properties:
|
||||
- name: 'rangeLeft' # 范围下限
|
||||
type: 'inputNumber'
|
||||
defaultVal: 100
|
||||
min: 0
|
||||
max: 10000
|
||||
step: 1
|
||||
- name: 'rangeRight' # 范围上限
|
||||
type: 'inputNumber'
|
||||
defaultVal: 8000
|
||||
min: 0
|
||||
max: 10000
|
||||
step: 1
|
||||
```
|
||||
|
||||
* **Checkbox (多选)**
|
||||
```yaml
|
||||
checkboxParam:
|
||||
name: '参数展示名称'
|
||||
description: '参数展示描述'
|
||||
type: 'checkbox'
|
||||
defaultVal: 'option1,option2' # 多个值用逗号分隔
|
||||
required: false
|
||||
options:
|
||||
- label: '选项1'
|
||||
value: 'option1'
|
||||
- label: '选项2'
|
||||
value: 'option2'
|
||||
|
||||
```
|
||||
|
||||
* **Input (文本输入)**
|
||||
```yaml
|
||||
inputParam:
|
||||
name: '参数展示名称'
|
||||
description: '参数展示描述'
|
||||
type: 'input'
|
||||
defaultVal: '默认值'
|
||||
required: false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心逻辑实现 (`process.py`)
|
||||
|
||||
`process.py` 是算子的执行主体。开发者需继承基础类并实现数据处理逻辑。
|
||||
|
||||
### 开发规范
|
||||
|
||||
1. **继承基类**:必须从 `deepdata.core.base_op` 继承 `Mapper`或 `Filter`。
|
||||
2. **类名一致性**:Python 类名建议与后续 `metadata.yml` 中的 `raw_id` 保持一致。
|
||||
3. **Execute 方法**:必须实现 `execute` 方法,接收 `sample` (字典) 并返回处理后的字典。
|
||||
|
||||
### 代码模板
|
||||
|
||||
```python
|
||||
from typing import Dict, Any
|
||||
from deepdata.core.base_op import Mapper
|
||||
|
||||
class YourOperatorName(Mapper):
|
||||
"""
|
||||
算子类名建议使用驼峰命名法定义,例如 TestMapper
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.slider_param = float(kwargs.get("sliderParam", 0.5))
|
||||
self.switch_param = kwargs.get('switchParam', False)
|
||||
self.select_param = kwargs.get('selectParam', '')
|
||||
self.radio_param = kwargs.get('radioParam', '')
|
||||
self.range_param = kwargs.get('rangeParam', [0, 0])
|
||||
self.checkbox_param = kwargs.get('checkboxParam', [])
|
||||
self.input_param = kwargs.get('inputParam', '').strip()
|
||||
|
||||
def execute(self, sample: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""
|
||||
核心处理逻辑
|
||||
:param sample: 输入的数据样本,通常包含 text_key 等字段
|
||||
:return: 处理后的数据样本
|
||||
"""
|
||||
# 示例:获取文本并进行修改
|
||||
# input_text = sample['text']
|
||||
# processed_text = do_something(input_text)
|
||||
# sample['text'] = processed_text
|
||||
|
||||
return sample
|
||||
|
||||
```
|
||||
|
||||
其中,sample字段包含如下参数:
|
||||
|
||||
```json
|
||||
{
|
||||
"text": "源文件读取的文本内容",
|
||||
"data": "源文件读取的二进制数据(针对图片等)",
|
||||
"fileName": "源文件名",
|
||||
"fileType": "源文件类型(扩展名)",
|
||||
"fileId": "源文件ID",
|
||||
"filePath": "源文件路径",
|
||||
"fileSize": "源文件大小",
|
||||
"export_path": "目标文件导出路径信息",
|
||||
"ext_params": "额外扩展参数",
|
||||
"target_type": "目标文件类型"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 算子注册 (`__init__.py`)
|
||||
|
||||
`__init__.py` 用于将开发好的算子注册到系统中。
|
||||
|
||||
### 注册规范
|
||||
|
||||
使用 `OPERATORS.register_module` 方法进行注册。
|
||||
|
||||
* **module_name**: 对应 `metadata.yml` 中的 `raw_id` 及 Python 类名。
|
||||
* **module_path**: 指向 `process.py` 的引用路径(注意路径层级)。
|
||||
|
||||
### 代码模板
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
from deepdata.core.base_op import OPERATORS
|
||||
|
||||
# 假设 process.py 位于 operator_package 目录下
|
||||
OPERATORS.register_module(
|
||||
module_name='YourOperatorName',
|
||||
module_path="ops.user.operator_package.process"
|
||||
)
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 开发注意事项
|
||||
|
||||
1. **依赖管理**:如果算子依赖非标准库(如 pandas, numpy),请在 `requirements.txt` 中列出。
|
||||
2. **异常处理**:在 `process.py` 中建议添加适当的 try-catch 逻辑,避免单条数据异常导致整个任务崩溃。
|
||||
3. **数据类型**:在 `metadata.yml` 中定义的参数类型(如 slider 返回 float,input 返回 string),在 Python 代码中使用时需注意类型转换。
|
||||
|
||||
---
|
||||
|
||||
## 6. 算子打包与上传
|
||||
|
||||
开发完成后,需将所有文件打包为一个压缩包进行上传。**包名必须严格遵循注册路径规范**。
|
||||
|
||||
### 打包规范
|
||||
|
||||
1. **文件完整性**:压缩包内必须包含 `__init__.py`, `metadata.yml`, `process.py` 及相关依赖。
|
||||
2. **命名一致性(重要)**:压缩包的文件名(不含后缀)必须与 `__init__.py` 中 `module_path` 所指定的**包目录名**保持一致。
|
||||
|
||||
### 示例说明
|
||||
|
||||
假设您在 `__init__.py` 中的注册代码如下:
|
||||
|
||||
```python
|
||||
OPERATORS.register_module(
|
||||
module_name='TestMapper',
|
||||
# 这里 ops.user.my_custom_op.process 中的 'my_custom_op' 为包目录名
|
||||
module_path="ops.user.my_custom_op.process"
|
||||
)
|
||||
|
||||
```
|
||||
|
||||
则您的压缩包名称必须命名为:
|
||||
|
||||
> **`my_custom_op.zip`** (或 .tar)
|
||||
|
||||
系统解压后将基于此名称构建导入路径,名称不一致将导致 `ModuleNotFoundError`。
|
||||
Reference in New Issue
Block a user