用 SQL 和 Python,处理多模态数据

在一条流水线中完成文件处理、模型推理与关系查询,从本地开发扩展到 Ray 执行。

pip install vane-ai
quickstart.py
import vane


con = vane.connect()
images = con.sql("""
    SELECT image_file(
        'quickstart-images/large.png'
    ) AS source
""")


images.select("""
    source,
    image_file_metadata(source).width AS width,
    resize(decode_image_file(source, 'RGB'),
           224, 224) AS thumbnail
""").show()
准备样本并运行示例 →

数据处理与模型推理,统一执行

多模态输入

在同一数据模型中处理媒体与业务字段。

  • 文本与文档VARCHAR · FILE
  • 图片IMAGEFILE · IMAGE
  • 音频AUDIOFILE · TENSOR
  • 视频VIDEOFILE · IMAGE
数据表本机文件对象存储
Vane Data统一数据模型,统一执行计划。

Relation 流水线

SQL / Python
  1. 读取
  2. 筛选
  3. 预处理
  4. 推理
  5. 查询与写出
Python UDF

自定义逻辑与有状态处理

AI Functions

ai_prompt · ai_embed

模型服务vLLM · 模型 API

统一执行

本机 / Ray
I/O↔CPU↔GPU

动态批处理 · 并发 · 背压

实例状态复用 · 重试与恢复

可继续查询的结果

分析结果可直接参与筛选、关联与聚合。

  • 结构化字段

    模型输出直接映射为 STRUCT。

  • 向量

    有类型的向量,可继续检索。

  • 可查询结果

    筛选、关联、聚合与写出。

继续查询或保存结果

参与下一次查询,或写入目标存储。

统一数据模型

多模态文件与业务字段,可在同一数据模型中查询。

可组合的处理逻辑

组合 SQL、Python UDF 与 AI Functions,完成预处理与推理。

统一执行机制

统一协调批处理、并发与计算资源。

阅读架构详解 →

像编写 ETL 一样,构建多模态处理流水线

通过设备巡检案例,了解如何组合原生类型、Python UDF、AI 信息提取、向量化与业务查询。

file.sql
SELECT file AS source_file
FROM list_files($file_glob)
WHERE file_path(file) LIKE '%.pdf'
  AND file_size(file) < 20*1024*1024;
运行配置与参数import vane
con = vane.connect()
root = "s3://manufacturing/factory-a"

两种接口共用输入关系、指令、模型配置与输出 Schema。SQL 参数通过 con.sql(..., params=...) 绑定;完整案例提供准备步骤与索引。

设备巡检示例

先筛选文件,再读取内容

source_file
FILE
source_url
equipment/A-017/manual.pdf
size
2.4 MB

先根据对象元数据筛选,需要内容时再读取候选文件。

结果为示例;模型调用需配置适配相应输入的模型。查看完整案例

协同调度 I/O、CPU 与 GPU

让读取、预处理与推理跨批次重叠执行,通过背压控制中间数据量。

批次时间线:读取 C、预处理 B、推理 A 同时推进;各批次按读取、预处理、推理、写出依次完成。模型实例复用,有界提交使上游在下游变慢时等待。
批次执行机制示意

读取 C、预处理 B、推理 A,同时推进。

I/O 读取
ABC
CPU 预处理
ABC
GPU 推理
ABC
结果写出
ABC

在 Actor 实例内初始化并复用模型。

上游批次有界提交推理实例

↶ 下游处理变慢时,上游等待可用容量。

跨阶段流水线执行

读取下一批、准备当前批、推理上一批可以重叠进行,减少资源等待。

背压与容量控制

批次与提交限制约束中间数据量,下游变慢时,上游等待可用容量。

模型与客户端实例复用

有状态 UDF 在一次执行的实例内复用模型或客户端,减少重复初始化。

执行机制示意。各阶段重叠运行;错误处理与重试遵循相应执行配置。

了解执行架构 →

从本地开发,扩展到分布式执行

复用处理逻辑,按需选择本地或 Ray 执行。

同一份 SQL 或 Python 定义,由本机子进程 Worker 执行,或由 Ray 调度 CPU Worker 与 GPU Actor。分布式执行要求所有 Worker 能访问输入、依赖和结果存储。

同一定义:读取 → 预处理 / UDF → AI → 查询与写出

一台机器 · Local Runner

应用 / Driverimport vane
本机 Worker / 子进程CPU 执行
输入与结果存储

本机文件或可访问的对象存储。

本地开发与验证

使用本地执行器完成开发、验证与按需处理,无需启动 Ray。

local_job.py
import vane


vane.configure(runner="local")
con = vane.connect()
result = con.sql(pipeline_sql)
result.show()

同一定义:读取 → 预处理 / UDF → AI → 查询与写出

Ray Runtime / Cluster

Driverimport vane
Ray 调度 · 任务与资源
CPU Worker
GPU Actor模型实例复用
输入与结果存储

所有执行节点需能访问输入、模型、依赖与输出存储。

通过 Ray 扩展执行

在单机或集群中运行 Ray,按声明的资源需求调度 CPU Worker 与 GPU Actor。

job.py
import vane


# Ray is the default runner.
con = vane.connect()
result = con.sql(pipeline_sql)
result.show()

示例复用同一份 pipeline_sql。执行前需准备相应凭据、依赖与数据访问;Ray 可在本机或集群运行,并负责 GPU 资源调度。

运行与部署指南 →

多模态流水线性能测试

查看执行耗时、工作负载、硬件与配置,了解性能结果的适用条件。

Vane DataRay DataDaft执行耗时(秒),越低越好

文档32.2% 相比 Ray Data 耗时降低

Vane Data
86.09 s
Ray Data
127 s
Daft
413 s
工作负载与配置

文档内容提取与处理。

批次大小:Vane 2560, Ray 320, Daft 20.

工作负载定义与脚本 →

图片35.1% 相比 Ray Data 耗时降低

Vane Data
1147 s
Ray Data
1767.11 s
Daft
OOM
工作负载与配置

图像处理流水线。

批次大小:Vane 100, Ray 100, Daft OOM.

工作负载定义与脚本 →

音频2.2% 相比 Ray Data 耗时降低

Vane Data
2312 s
Ray Data
2363.08 s
Daft
OOM
工作负载与配置

音频处理流水线。

批次大小:Vane 128, Ray 128, Daft OOM.

工作负载定义与脚本 →

视频9.8% 相比 Ray Data 耗时增加

Vane Data
7603 s
Ray Data
6922 s
Daft
8322 s
工作负载与配置

视频处理流水线。

批次大小:Vane 32, Ray 32, Daft 未设置.

工作负载定义与脚本 →

36 CPU / 64 GB RAM / 2080 Ti, 22 GB 改装显存。单机、批大小调优结果。

本次单机测试参考 Ray Data 多模态 AI 基准测试的工作负载设计。结果仅适用于列明的硬件、数据与配置。Daft 在本次图片和音频负载中出现内存不足(OOM);完整测试方法与脚本见性能测试页。

查看测试方法、脚本与完整结果 →

运行第一条多模态查询

安装并运行图片处理示例,无需配置模型服务。

先准备两种写法共用的三张图片

保存为 prepare_images.py,在工作目录中执行一次 python3 prepare_images.py。

prepare_images.py
from pathlib import Path
from PIL import Image


folder = Path("quickstart-images")
folder.mkdir(exist_ok=True)
for name, size in [("large", (640, 480)),
                   ("medium", (320, 240)), ("small", (64, 64))]:
    Image.new("RGB", size, "#546354").save(folder / f"{name}.png")
quickstart.sql
WITH images AS (
  SELECT image_file(file) AS source
  FROM list_files('quickstart-images/*.png')
), metadata AS (
  SELECT source, image_file_metadata(source) AS info FROM images
), thumbnails AS (
  SELECT info.width AS source_width, info.height AS source_height,
         resize(decode_image_file(source, 'RGB'), 224, 224) AS thumbnail
  FROM metadata WHERE info.width >= 300
)
SELECT source_width, source_height,
       image_width(thumbnail) AS width,
       image_height(thumbnail) AS height
FROM thumbnails ORDER BY source_width DESC;

保存上面的查询,然后运行:

terminal
python3 -c 'import sys, vane; vane.configure(runner="local"); vane.connect().sql(sys.stdin.read()).show()' < quickstart.sql
两种接口,得到相同结果
source_widthsource_heightwidthheight
640480224224
320240224224

64 × 64 的图片在像素解码前被过滤。其余图片转为原生 IMAGE,并缩放至 224 × 224。

安装与运行

install.sh
python3 -m pip install 'vane-ai[image]'

在虚拟环境中安装,准备样本图片,再选择 SQL 或 Python 运行相同的处理示例。