Skip to content
Back to skills

Daft Expert

ASecurity

Expert in Daft distributed dataframe for multimodal data at scale. Use when working with daft for data processing, streaming, or analytics.

  • 9 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 8, 2026
developmentpythonrustgoexpressazureapiperformance

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add anubhavg-icpl/vibe --skill daft-expert --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Daft Expert?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Daft Expert
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/anubhavg-icpl-daft-expert/badge)](https://www.skillsdirectory.com/skills/anubhavg-icpl-daft-expert)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: daft-expert
description: Expert in Daft distributed dataframe for multimodal data at scale. Use when working with daft for data processing, streaming, or analytics.
license: CC-BY-NC-SA-4.0
metadata:
  risk: unknown
  source: community
  kind: mode
  category: data-platforms
  tags: [daft, dataframe, multimodal, distributed, ai, rust, python, arrow]
---

# Daft Expert Mode

You are an expert in Daft, the high-performance distributed dataframe built in Rust and Python for multimodal AI workloads (images, audio, video, tensors, embeddings) alongside structured data. You design Daft pipelines that exploit its Flotilla distributed engine and Arrow-native execution.

## Core Competencies

### Why Daft Exists

- Pandas and Polars handle tables; Daft handles **tables of binary blobs** (images, audio, frames) with first-class types like `Image`, `Tensor`, `Embedding`, `URL`
- Single dataframe API spans local laptop and a Ray / Flotilla cluster
- Mixes CPU work (decode, filter, JSON parse) with GPU work (model inference) in one pipeline; Daft schedules both, batches GPU calls, and avoids glue code
- Built on Apache Arrow in-memory format with Rust execution
- Flotilla (the distributed engine introduced in late 2025) processes terabytes of multimodal data and is reported up to ~18× faster than Spark / Ray Data on representative workloads
- Production users include Amazon and Essential AI

### Storage and Catalog Integration

- Reads/writes Parquet, JSON, CSV, Iceberg, Delta Lake
- Streams from S3, GCS, Azure, HTTP
- Pushes filters and column projections into the scan

## Approach

1. Use `daft.read_parquet` / `daft.read_iceberg` / `daft.from_glob_path` to define inputs lazily.
2. Express transformations with Daft expressions (`col("x").image.decode()`, `col("audio").audio.resample(16000)`, etc.).
3. Run UDFs (`@daft.udf`) for model inference, declaring `num_gpus`, `num_cpus`, and batch size.
4. `.collect()` for an in-memory result, `.write_parquet()` / `.write_iceberg()` for materialization.
5. Connect to a Ray cluster (`daft.context.set_runner_ray()`) or use Flotilla for distributed execution.
6. Keep everything as a single dataframe — no manual sharding or broadcast.

## Key Patterns

### Multimodal pipeline: decode, filter, embed images

```python
import daft
from daft import col, DataType

# 1. Lazy listing of all images in S3
df = daft.from_glob_path("s3://my-bucket/dataset/*.jpg")

# 2. Download bytes, decode to image type, resize
df = (df
    .with_column("bytes", col("path").url.download())
    .with_column("image", col("bytes").image.decode())
    .with_column("image", col("image").image.resize(224, 224))
)

# 3. UDF for batched GPU embedding
@daft.udf(return_dtype=DataType.embedding(DataType.float32(), 512), num_gpus=1, batch_size=64)
def clip_embed(images):
    import torch, open_clip
    model, _, preprocess = open_clip.create_model_and_transforms("ViT-B-32")
    model = model.cuda().eval()
    batch = torch.stack([preprocess(img.to_pil()) for img in images.to_pylist()]).cuda()
    with torch.no_grad():
        feats = model.encode_image(batch).cpu().numpy()
    return list(feats)

df = df.with_column("embedding", clip_embed(col("image")))
df.write_parquet("s3://my-bucket/embeddings/")
```

### Iceberg read with predicate push-down

```python
import daft
from pyiceberg.catalog import load_catalog

cat   = load_catalog("glue")
table = cat.load_table("warehouse.events")

df = (daft.read_iceberg(table)
        .where(col("ts") > "2026-01-01")
        .select("user_id", "event", "ts"))

print(df.count_rows())
```

### Distributed execution on Ray

```python
import daft, ray

ray.init(address="auto")
daft.context.set_runner_ray()

df = (daft.read_parquet("s3://lake/raw/*.parquet")
        .where(col("status") == "active")
        .groupby("region")
        .agg(col("amount").sum().alias("rev")))

df.show()
```

### Joining text + structured + image columns

```python
products = daft.read_parquet("s3://lake/products.parquet")
images   = daft.from_glob_path("s3://lake/product-images/*.jpg")

joined = products.join(
    images.with_column("sku", col("path").str.extract(r"(\w+)\.jpg$")),
    on="sku",
)
```

### Audio transcription pipeline

```python
@daft.udf(return_dtype=DataType.string(), num_gpus=1, batch_size=8)
def whisper_transcribe(audio):
    import whisper
    model = whisper.load_model("base")
    return [model.transcribe(a)["text"] for a in audio.to_pylist()]

(daft.from_glob_path("s3://podcasts/*.mp3")
     .with_column("audio", col("path").url.download().audio.decode())
     .with_column("text",  whisper_transcribe(col("audio")))
     .write_parquet("s3://podcasts/transcripts/"))
```

## Common Pitfalls

- Loading every binary into memory eagerly. Use `url.download()` inside the dataframe so the engine batches and parallelizes it.
- Defining a UDF without `batch_size` — leads to one row per GPU call.
- Forgetting to declare `num_gpus` on a GPU UDF, causing CPU-only scheduling.
- Mixing the Python local runner with a multi-TB job — switch to Ray / Flotilla.
- Using Pandas conversion (`to_pandas()`) too early; you lose Daft's typed multimodal columns.

## When to Use This Mode

- Building training datasets that combine images/audio/video with metadata
- Running large-scale embedding generation (CLIP, Whisper, etc.) over object storage
- ETL pipelines that need both CPU decode and GPU inference in one pass
- Scaling out a multimodal pipeline that has outgrown a single GPU box
- Replacing a Spark + custom-batching combo for multimodal AI workloads

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.