用 SQL 和 Python,处理多模态数据
在一条流水线中完成文件处理、模型推理与关系查询,从本地开发扩展到 Ray 执行。
pip install vane-aiimport 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
Relation 流水线
SQL / Python- 读取
- 筛选
- 预处理
- 推理
- 查询与写出
Python UDF自定义逻辑与有状态处理
AI Functionsai_prompt · ai_embed
统一执行
本机 / Ray动态批处理 · 并发 · 背压
实例状态复用 · 重试与恢复
可继续查询的结果
分析结果可直接参与筛选、关联与聚合。
- 结构化字段
模型输出直接映射为 STRUCT。
- 向量
有类型的向量,可继续检索。
- 可查询结果
筛选、关联、聚合与写出。
参与下一次查询,或写入目标存储。
多模态文件与业务字段,可在同一数据模型中查询。
组合 SQL、Python UDF 与 AI Functions,完成预处理与推理。
统一协调批处理、并发与计算资源。
像编写 ETL 一样,构建多模态处理流水线
通过设备巡检案例,了解如何组合原生类型、Python UDF、AI 信息提取、向量化与业务查询。
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,同时推进。
在 Actor 实例内初始化并复用模型。
↶ 下游处理变慢时,上游等待可用容量。
跨阶段流水线执行
读取下一批、准备当前批、推理上一批可以重叠进行,减少资源等待。
背压与容量控制
批次与提交限制约束中间数据量,下游变慢时,上游等待可用容量。
模型与客户端实例复用
有状态 UDF 在一次执行的实例内复用模型或客户端,减少重复初始化。
执行机制示意。各阶段重叠运行;错误处理与重试遵循相应执行配置。
从本地开发,扩展到分布式执行
复用处理逻辑,按需选择本地或 Ray 执行。
同一定义:读取 → 预处理 / UDF → AI → 查询与写出
一台机器 · Local Runner
import vane本机文件或可访问的对象存储。
本地开发与验证
使用本地执行器完成开发、验证与按需处理,无需启动 Ray。
import vane vane.configure(runner="local") con = vane.connect() result = con.sql(pipeline_sql) result.show()
同一定义:读取 → 预处理 / UDF → AI → 查询与写出
Ray Runtime / Cluster
import vane所有执行节点需能访问输入、模型、依赖与输出存储。
通过 Ray 扩展执行
在单机或集群中运行 Ray,按声明的资源需求调度 CPU Worker 与 GPU Actor。
import vane # Ray is the default runner. con = vane.connect() result = con.sql(pipeline_sql) result.show()
示例复用同一份 pipeline_sql。执行前需准备相应凭据、依赖与数据访问;Ray 可在本机或集群运行,并负责 GPU 资源调度。
运行与部署指南 →多模态流水线性能测试
查看执行耗时、工作负载、硬件与配置,了解性能结果的适用条件。
图片35.1% 相比 Ray Data 耗时降低
音频2.2% 相比 Ray Data 耗时降低
视频9.8% 相比 Ray Data 耗时增加
36 CPU / 64 GB RAM / 2080 Ti, 22 GB 改装显存。单机、批大小调优结果。
本次单机测试参考 Ray Data 多模态 AI 基准测试的工作负载设计。结果仅适用于列明的硬件、数据与配置。Daft 在本次图片和音频负载中出现内存不足(OOM);完整测试方法与脚本见性能测试页。
查看测试方法、脚本与完整结果 →运行第一条多模态查询
安装并运行图片处理示例,无需配置模型服务。
先准备两种写法共用的三张图片
保存为 prepare_images.py,在工作目录中执行一次 python3 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")
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;
保存上面的查询,然后运行:
python3 -c 'import sys, vane; vane.configure(runner="local"); vane.connect().sql(sys.stdin.read()).show()' < quickstart.sql| source_width | source_height | width | height |
|---|---|---|---|
| 640 | 480 | 224 | 224 |
| 320 | 240 | 224 | 224 |
64 × 64 的图片在像素解码前被过滤。其余图片转为原生 IMAGE,并缩放至 224 × 224。
安装与运行
python3 -m pip install 'vane-ai[image]'在虚拟环境中安装,准备样本图片,再选择 SQL 或 Python 运行相同的处理示例。