apache / apache/paimon

[Feature] PyPaimon Support ML integrated

Open
#6,762 1 comment 1 reaction 0 assignees View on GitHub
enhancement
Dominant language
Java
Stars
3.4k
Forks
1.4k
Avg merge
1d 11h
Merged PRs (30d)
396

Description

### Search before asking

- [x] I searched in the [issues](https://github.com/apache/paimon/issues) and found nothing similar.

### Motivation

## I. Overview

### 1.1 Existing Architecture

Apache Paimon has already implemented a comprehensive Python API that supports multiple data format outputs:

Current supported output formats include:
- **Arrow Format**: `to_arrow()`, `to_arrow_batch_reader()` - provides stream-based batch processing
- **Pandas**: `to_pandas()` - converts to DataFrame
- **Ray**: `to_ray()` - distributed computing integration
- **DuckDB**: `to_duckdb()` - SQL analytics
- **Iterator**: `to_iterator()` - native Python row-level iteration

### 1.2 Core Capabilities
- **Sharded Reading**: Split-based data sharding mechanism
- **Predicate Pushdown**: Filtering condition pushdown optimization
- **Column Pruning**: Projection pushdown reduces data transfer
- **Streaming Processing**: Arrow RecordBatch streaming reads
- **Incremental Reading**: Supports timestamp range incremental queries

### 1.3 Technical Gap
After code search confirmation, there is currently **no** PyTorch or TensorFlow integration code. Implementation is needed from scratch.

## II. Technical Solution Design

### 2.1 PyTorch Dataset Interface Implementation Plan

#### 2.1.1 Architecture Design

```
┌─────────────────────────────────────────────────────────────┐
│ PyTorch Training Loop │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ PaimonIterableDataset │
│ - Inherits torch.utils.data.IterableDataset │
│ - Supports worker sharding │
│ - Provides __iter__ method │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ PaimonMapDataset │
│ - Inherits torch.utils.data.Dataset │
│ - Supports random access via __getitem__ │
│ - Caches splits metadata │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ TableRead (Existing Paimon API) │
│ - to_arrow_batch_reader() for streaming │
│ - to_arrow() for full table │
│ - Split-based parallel reading │
└─────────────────────────────────────────────────────────────┘
```

#### 2.1.2 Implementation Details

**File Structure**:
```
paimon-python/pypaimon/ml/
├── __init__.py
├── pytorch/
│ ├── __init__.py
│ ├── dataset.py # PaimonIterableDataset, PaimonMapDataset
│ ├── transforms.py # Data transformation utilities
│ └── collate.py # Batch collation functions
└── tensorflow/
├── __init__.py
└── dataset.py # TensorFlow Dataset implementation
```

**Core Class Design - PaimonIterableDataset**:

Based on the existing `to_arrow_batch_reader()` method, implements streaming iteration:

```python
class PaimonIterableDataset(torch.utils.data.IterableDataset):
"""
Streaming dataset, suitable for large-scale data training
- Supports PyTorch DataLoader multiprocessing
- Automatically shards to different workers
- Memory-efficient streaming reads
"""
```

**Core Class Design - PaimonMapDataset**:

Based on the `to_arrow()` method, implements random access:

```python
class PaimonMapDataset(torch.utils.data.Dataset):
"""
Map-style dataset, supports random access
- Implements __len__ and __getitem__
- Suitable for scenarios requiring random sampling
- Can be used with PyTorch Sampler
"""
```

#### 2.1.3 Key Technical Points

**1. Worker Sharding Support**

Leveraging Paimon's Shard Read functionality, automatically allocates in `__iter__`:

```python
def __iter__(self):
worker_info = torch.utils.data.get_worker_info()
if worker_info is None:
# Single process
splits = self.scan.plan().splits()
else:
# Multi-process: uses with_shard for automatic sharding
shard_index = worker_info.id
total_shards = worker_info.num_workers
splits = self.scan.with_shard(shard_index, total_shards).plan().splits()
```

**2. Data Transformation Pipeline**

Supports flexible data transformation:
```python
class PaimonDatasetConfig:
- transform: Optional[Callable] # Custom transformation function
- target_column: Optional[str] # Label column
- feature_columns: List[str] # Feature columns
- tensor_type: torch.dtype # Output tensor type
```

**3. Batch Processing Optimization**

Leverages Arrow's efficient batch processing to reduce memory copies.

### 2.2 TensorFlow Dataset Interface Implementation Plan

#### 2.2.1 Architecture Design

```
┌─────────────────────────────────────────────────────────────┐
│ TensorFlow Training Loop │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ PaimonTensorFlowDataset │
│ - Uses tf.data.Dataset.from_generator() │
│ - Supports prefetching and parallelism │
│ - TFRecord-compatible output │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ TableRead (Existing Paimon API) │
│ - to_arrow_batch_reader() for streaming │
│ - Automatic type conversion to TF tensors │
└─────────────────────────────────────────────────────────────┘
```

#### 2.2.2 Implementation Strategy

**Core Method**: Using `tf.data.Dataset.from_generator()`

```python
class PaimonTensorFlowDataset:
"""
TensorFlow Dataset wrapper
- Based on from_generator implementation
- Supports all tf.data API features
- Automatic type inference and conversion
"""

@staticmethod
def from_paimon(table, read_builder, splits):
def generator():
# Use to_arrow_batch_reader for streaming generation
batch_reader = table_read.to_arrow_batch_reader(splits)
for batch in batch_reader:
# Convert to TF compatible format
yield convert_arrow_to_tf(batch)

# Create tf.data.Dataset
return tf.data.Dataset.from_generator(
generator,
output_signature=infer_tf_signature(read_builder.read_type())
)
```

#### 2.2.3 Key Technical Points

**1. Type Mapping**

Establishes mapping from Paimon data types to TensorFlow types:

```
Paimon Type → TF Type
INT/BIGINT → tf.int32/tf.int64
FLOAT/DOUBLE → tf.float32/tf.float64
STRING → tf.string
BOOLEAN → tf.bool
TIMESTAMP → tf.int64 (milliseconds)
```

**2. Performance Optimization**

- Uses `.prefetch()` to pre-fetch data
- Uses `.batch()` for dynamic batch processing
- Uses `.map()` for parallel data transformation
- Supports `tf.distribute.Strategy` for distributed training

## III. Implementation Plan

### 3.1 Phase One: PyTorch Dataset (High Priority)

**Phase 1.1: Basic Implementation (2 weeks)**
- [ ] Create `pypaimon/ml/pytorch/` module structure
- [ ] Implement `PaimonIterableDataset` base class
- [ ] Implement worker sharding logic
- [ ] Add basic type conversion (Arrow → PyTorch Tensor)
- [ ] Write unit tests

**Phase 1.2: Feature Enhancement (1 week)**
- [ ] Implement `PaimonMapDataset` for random access support
- [ ] Add data transformation pipeline (`transforms.py`)
- [ ] Implement custom `collate_fn`
- [ ] Support common ML scenarios (classification, regression, sequence)

**Phase 1.3: Testing and Documentation (1 week)**
- [ ] End-to-end integration tests
- [ ] Performance benchmark tests
- [ ] Write user documentation and example code
- [ ] Add to official documentation

### 3.2 Phase Two: TensorFlow Dataset (2 weeks)

**Phase 2.1: Core Implementation**
- [ ] Create `pypaimon/ml/tensorflow/` module
- [ ] Implement `PaimonTensorFlowDataset` class
- [ ] Establish type mapping system
- [ ] Implement streaming generator

**Phase 2.2: Optimization and Testing**
- [ ] Performance tuning (prefetch, cache, parallel map)
- [ ] Support `tf.distribute.Strategy`
- [ ] Unit and integration tests
- [ ] Documentation and examples

### 3.3 Phase Three: Production Optimization (1-2 weeks)

**Performance Optimization**:
- [ ] Zero-copy conversion (Arrow → Tensor)
- [ ] Memory pool management
- [ ] Adaptive batch sizing

**Feature Completeness**:
- [ ] Support online feature engineering
- [ ] Add caching mechanism
- [ ] Support data augmentation

**Monitoring and Diagnostics**:
- [ ] Add performance metrics
- [ ] Data sampling preview
- [ ] Error handling and retry logic

## IV. Dependency Management

### 4.1 Update requirements.txt

Add optional dependencies:
```python
# ML/AI framework support (optional)
torch>=1.9.0; extra == "pytorch"
tensorflow>=2.8.0; extra == "tensorflow"
```

### 4.2 Update setup.py

```python
extras_require={
'pytorch': ['torch>=1.9.0'],
'tensorflow': ['tensorflow>=2.8.0'],
'ml': ['torch>=1.9.0', 'tensorflow>=2.8.0'],
}
```

## V. API Usage Examples

### 5.1 PyTorch Usage Example

```python
from pypaimon import CatalogFactory
from pypaimon.ml.pytorch import PaimonIterableDataset
import torch
from torch.utils.data import DataLoader

# 1. Create Catalog and get table
catalog = CatalogFactory.create({'warehouse': '/path/to/warehouse'})
table = catalog.get_table('default.training_data')

# 2. Configure reading
read_builder = table.new_read_builder() \
.with_projection(['feature1', 'feature2', 'label']) \
.with_filter(predicate_builder.greater_than('timestamp', '2024-01-01'))

# 3. Create PyTorch Dataset
dataset = PaimonIterableDataset(
read_builder=read_builder,
feature_columns=['feature1', 'feature2'],
target_column='label',
transform=lambda x: torch.tensor(x, dtype=torch.float32)
)

# 4. Create DataLoader (automatically shards to multiple workers)
dataloader = DataLoader(
dataset,
batch_size=32,
num_workers=4 # Automatically uses Paimon shard read
)

# 5. Training loop
for epoch in range(10):
for batch in dataloader:
features, labels = batch
# Train model...
```

### 5.2 TensorFlow Usage Example

```python
from pypaimon import CatalogFactory
from pypaimon.ml.tensorflow import PaimonTensorFlowDataset
import tensorflow as tf

# 1. Get table and configure reading
catalog = CatalogFactory.create({'warehouse': '/path/to/warehouse'})
table = catalog.get_table('default.training_data')
read_builder = table.new_read_builder()

# 2. Create TensorFlow Dataset
tf_dataset = PaimonTensorFlowDataset.from_paimon(
table=table,
read_builder=read_builder,
feature_columns=['feature1', 'feature2'],
label_column='label'
)

# 3. Apply TF transformations
tf_dataset = tf_dataset \
.batch(32) \
.prefetch(tf.data.AUTOTUNE) \
.cache()

# 4. Train model
model = create_model()
model.fit(tf_dataset, epochs=10)
```

## VI. Quality Assurance

### 6.1 Testing Strategy

**Unit Tests**: Based on existing test framework

```
tests/ml/
├── pytorch/
│ ├── test_iterable_dataset.py
│ ├── test_map_dataset.py
│ ├── test_transforms.py
│ └── test_integration.py
└── tensorflow/
├── test_tf_dataset.py
└── test_integration.py
```

### Solution

_No response_

### Anything else?

_No response_

### Are you willing to submit a PR?

- [ ] I'm willing to submit a PR!

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reviewing the existing Paimon Python APIs named in the issue, especially to_arrow_batch_reader() and to_arrow(), then assess the proposed pypaimon/ml/pytorch/ and pypaimon/ml/tensorflow/ modules. Use the listed tests under tests/ml/ as the testing target; done would require the phased PyTorch and TensorFlow integrations, tests, documentation, and dependency updates described in the plan.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, pytorch, tensorflow
Domain
data-engineering, machine-learning
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.