# Daft Udf Tuning

> Optimize Daft UDF performance. Invoke when user needs GPU inference, encounters slow UDFs, or asks about async/batch processing.

- Skill: `eventual-inc/daft-udf-tuning` (Agent Skill)
- Install (CLI): `npx skillmds@latest add eventual-inc/daft-udf-tuning`
- Raw SKILL.md: https://api.skillmd.com/api/skills/eventual-inc/daft-udf-tuning/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: eventual-inc (https://skillmd.com/u/eventual-inc)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/eventual-inc/daft-udf-tuning

---


# Daft UDF Tuning

Optimize User-Defined Functions for performance.

## UDF Types

| Type | Decorator | Use Case |
|---|---|---|
| **Stateless** | `@daft.func` | Simple transforms. Use `async` for I/O-bound tasks. |
| **Stateful** | `@daft.cls` | Expensive init (e.g., loading models). Supports `gpus=N`. |
| **Batch** | `@daft.func.batch` | Vectorized CPU/GPU ops (NumPy/PyTorch). Faster. |

## Quick Recipes

### 1. Async I/O (Web APIs)

```python
@daft.func
async def fetch(url: str):
    async with aiohttp.ClientSession() as s:
        return await s.get(url).text()
```

### 2. GPU Batch Inference (PyTorch/Models)

```python
@daft.cls(gpus=1)
class Classifier:
    def __init__(self):
        self.model = load_model().cuda() # Run once per worker

    @daft.method.batch(batch_size=32)
    def predict(self, images):
        return self.model(images.to_pylist())

# Run with concurrency
df.with_column("preds", Classifier(max_concurrency=4).predict(df["img"]))
```

## Tuning Keys

-   **`max_concurrency`**: Total parallel UDF instances.
-   **`gpus=N`**: GPU request per instance.
-   **`batch_size`**: Rows per call. Too small = overhead; too big = OOM.
-   **`into_batches(N)`**: Pre-slice partitions if memory is tight.

