引言:具身智能时代的数据工程挑战
在大模型跨界多模态的浪潮下,具身智能(Embodied AI) 正成为人工智能的下一个前沿高地。与传统 AI 依赖互联网静态图文不同,具身智能的训练高度依赖来自真实物理世界的多模态感知数据——包括第一人称视角(Egocentric)视频、深度传感器数据、力反馈信号等。
以训练一个能理解厨房操作的机器人为例,我们需要采集数千小时的人类佩戴摄像头拍摄的操作视频。解码后,这些数据将产生数亿张图像帧。然而,原始数据中充斥着大量“噪音”:静止画面、模糊镜头、无效空帧。如何从海量冗余中高效提取高质量训练样本,已成为制约具身智能发展的核心瓶颈。
为了解决这一行业痛点,阿里云 EMR Serverless Spark 引入了 Ray 分布式计算框架,并深度集成了专为多模态 AI 工作负载设计的高性能数据引擎——Daft。本文将深入解析如何利用这套组合拳,构建从视频抽帧、清洗到标注的全自动化流水线。
一、 Daft:为 AI 多模态而生的高性能数据引擎
1.1 为什么需要 Daft?
Daft 是一款专为 AI 时代多模态数据处理而设计的分布式 DataFrame 引擎。在大模型驱动的智能应用浪潮中,企业需要处理的数据早已不止于结构化表格——视频、图像、音频、Embedding 等非结构化数据正成为 AI 工作负载的核心燃料。Daft 正是为此而生。
在大模型驱动的智能应用中,数据早已超越结构化表格。视频、图像、音频、Embedding 等非结构化数据成为了 AI 的核心燃料。传统数据处理引擎在处理这些复杂类型时往往力不从心,而 Daft 正是为此而生:
- 多模态原生支持:Daft 从底层类型系统将
Image、Video、Audio、Tensor视为“一等公民”,天然理解其物理布局并进行针对性优化。 - 极简开发体验:开发者只需一行表达式,即可在分布式集群上完成视频解码、帧提取、图像变换,无需关心底层的分片调度。
- “数据处理即 AI 推理”:通过 UDF 机制,Daft 允许将通义千问等大模型的推理能力直接嵌入 DataFrame 流水线。图像理解、视频描述生成等 AI 任务与数据清洗无缝衔接,将原本割裂的多套系统收敛为一条统一的 Python Pipeline。
1.2 架构优势
- Rust 核心 + Arrow 列式内存:Daft 以 Python API 暴露数据处理能力,底层由 Rust 执行引擎支撑,并利用 Apache Arrow 生态的列式内存表示,降低序列化与数据交换开销。
- 面向 AI/多模态负载的执行优化:Daft 采用惰性求值,执行前会进行规则优化和代价优化,例如谓词/投影下推、Join 重排等。面向 UDF、模型推理、下载、解码等高开销环节,Daft 通过 Source、UDF 和 AI Functions 等机制进行任务化执行,并支持批处理、并发控制和自适应背压。
- CPU 与 GPU 资源调度能力:常规数据处理主要由本地执行引擎或分布式 runner 执行;对模型推理等 GPU 任务,可通过 AI Functions 或 UDF 声明 GPU 资源、batch size 与并发度,在吞吐、显存和延迟之间做调优。
- 从单机到集群扩展:同一套 DataFrame/SQL API 可在本地 native runner 上运行,也可通过 Ray 扩展到分布式集群,适合从开发环境平滑迁移到大规模处理场景。
二、 EMR Serverless 集成 Daft 引擎的价值
阿里云 EMR Serverless Spark 在其 Serverless 架构中深度集成了 Ray 分布式计算框架,并内置了 Daft 引擎,为用户提供了一套开箱即用的多模态数据处理基础设施与引擎。
- 极致的弹性与免运维
依托 EMR Serverless 架构,用户无需关心底层集群的搭建、扩缩容和节点维护。只需聚焦于业务逻辑开发,按需使用、按量计费,真正实现了多模态数据处理基础设施的“零运维”,大幅降低 TCO。
- 内置多模态算子,AI 与数据无缝融合
EMR Serverless Spark 在 Daft 引擎中内置了丰富的多模态 AI 函数,支持图片、视频、音频、文本等数据的直接处理。同时,与阿里云百炼平台上的大语言模型(如 Qwen 系列)无缝集成,让数据清洗、特征提取与 AI 标注可以在同一流水线中高效完成,加速 AI 应用落地。
- 统一的数据湖体验,打通存储孤岛
EMR Serverless Spark 提供了与阿里云 OSS、OSS-HDFS 等对象存储的深度集成,并支持无缝挂载 NAS 和 CPFS 高性能文件系统,满足模型训练与推理阶段对海量非结构化数据的高吞吐读写需求,实现结构化与非结构化数据的统一访问与管理。
- 稳定性提升
Daft基于Ray的架构天然支持异构资源,EMR Serverless Daft在异构节点的任务调度时细粒度控制,避免关键节点(如Header)负载过高,解决部分算子因为依赖配置而非实际资源引起的作业Hang住现场。实施对内存的监管,针对核心算子基于运行时内存使用情况支持Spill机制,解决大数据量规模下算子运行稳定性问题。
- 可观测性提升
Dashboard以及细粒度的Metrics是分析和优化作业的核心参考之一。EMR Serverless Daft提供了全托管的Daft Dashboard,保证云上作业信息随时可查;同时基于在Spark的丰富经验拓展多项算子和UDF(包括AI Function)等运行时指标信息,全面提升作业的可观测性。
- 融入 OpenLake 生态,释放数据要素价值
作为阿里云 OpenLake 多模态解决方案的关键组件,EMR Serverless Daft 全面支持 Data Lake Formation(DLF)与 Apache Paimon。依托 DLF 对湖上元数据的统一管理,借助 Paimon 的 Blob、Vector 等多模态原生能力,进一步发挥 Daft 引擎在“结构化+多模态”混合处理场景中的独特优势,助力企业构建统一的智能数据底座。
三、 具身智能实践:从原始视频到高质量训练数据的全流程流水线
3.1 场景背景
训练具身智能模型理解和复现人类日常操作动作时,研发人员通常会让真实人类佩戴头戴式摄像头(Head-mounted Camera),在厨房等真实生活场景中执行烹饪、切菜、翻炒等操作,采集大量第一人称视角(Egocentric)的原始视频。
如下图所示,这类视频记录了人类在厨房中翻炒食材的完整过程,是训练 VLA(视觉-语言-动作)模型的宝贵数据来源。
这些视频中包含大量无价值的冗余帧——例如操作间隙的静止画面、模糊镜头,或镜头朝向地面/天花板时拍摄到的无效内容。我们需要一个高效的自动化流水线,从海量视频中抽取关键帧,并利用多模态大模型对图片进行智能筛选,最终只保留包含有效烹饪操作内容(例如"锅具"或"食材处理")的高质量图片帧,用于后续的模型训练。
3.2 流水线架构
整个流程分为五个核心步骤,实现了从原始视频到高质量数据集的端到端自动化转化:
步骤 1:分布式视频读取与高效抽帧
利用 Daft 的流式优化能力,直接在 OSS 上进行分布式读取和解码,避免本地下载开销。
import daft from daft import col # 流式读取 OSS 视频,仅提取关键帧,每2秒采样一次 df = daft.read_video_frames( path="oss://<your-bucket>/cooking_videos/*.mp4", image_height=480, image_width=640, is_key_frame=True, # 只取关键帧,减少冗余 sample_interval_seconds=2.0, # 采样频率 max_frames_per_video=100, # 限制单视频最大帧数 io_config=io_config, )
步骤 2:图像编码与批量写入 OSS
抽取的原始视频帧是未经压缩的张量,直接存储成本极高。Daft 提供了 encode_image 函数,可将帧数据即时编码为 JPEG 格式。随后,通过 FrameUploader 批量 UDF 将图片写入 OSS,并获取每张图片的 OSS 路径:
from daft.functions import encode_image from daft.emr.functions import emr_udf # 1. 编码为 JPEG df = df.with_column("jpeg_bytes", encode_image(col("data"), "JPEG")) # 2. 批量上传至 OSS (并发控制最大化 I/O 吞吐) df = df.with_column( "oss_path", emr_udf( FrameUploader, construct_args={"output_base": output_base}, concurrency=4, batch_size=32, )(col("path"), col("frame_index"), col("jpeg_bytes")), )
FrameUploader 内部使用 Daft 内置的 io_put 接口写入 OSS,无需引入额外的 oss2 SDK,并且通过 concurrency 参数控制并发写入数量,最大化网络 I/O 吞吐量。
步骤 3:集成多模态大模型进行智能筛选
这是最关键的一步。利用 ai_query 函数,让 Qwen-VL 大模型直接通过签名 URL 读取 OSS 图片进行推理,无需将图片数据拉回计算节点再转发给模型网关,极大地节省了带宽并降低了延迟:
from daft.emr.functions import ai_query from daft import lit # 调用 Qwen-VL 进行视觉判断 df = df.with_column( "llm_result", ai_query( prompt=lit("判断这张图片是否包含有效的烹饪操作画面(如锅具、食材处理、手部操作等)。如果包含请只回复KEEP,不包含请只回复DROP,不要输出其他内容"), data=col("oss_path"), # 传入 OSS 路径,模型服务端直接拉取 model="qwen-vl-plus", concurrency=32, # 32并发,充分利用模型吞吐 batch_size=32, options={"enable_thinking": False}, ), )
通过配置 max_concurrency=32,流水线将启动 32 个并发的 UDF 实例,充分利用模型服务的吞吐能力,大幅缩短整体处理时间。
步骤 4:结果解析与冗余数据自动清理
解析 LLM 返回的结果,保留标记为 "KEEP" 的图片,物理删除标记为 "DROP" 的无效数据。
from daft.functions import get as struct_get df = df.with_column("llm_content", struct_get(col("llm_result"), "content")) df = df.with_column("keep", col("llm_content").upper().contains("KEEP")) # 物化结果,统计保留与删除数量 df = df.collect() result_dict = df.to_pydict() total = len(result_dict["keep"]) kept = sum(1 for k in result_dict["keep"] if k) dropped = total - kept # 删除 LLM 判定为 DROP 的帧 if dropped > 0: df_drop = df.where(col("keep") != True).select("oss_path") df_drop = df_drop.with_column( "deleted", emr_udf(OSSDeleter, concurrency=4, batch_size=32)(col("oss_path")), ) df_drop.collect()
3.3 流程总结
通过这四个步骤,我们构建了一个端到端、全自动的具身智能数据处理流水线。整个流程的数据流向如下表所示:
步骤 |
输入 |
操作 |
输出 |
视频读取与抽帧 |
OSS 上的原始 MP4 视频 |
|
解码后的图像帧张量 |
图像编码 |
图像帧张量 |
|
JPEG 字节流 |
写入 OSS |
JPEG 字节流 |
|
OSS 图片路径( |
LLM 智能筛选 |
OSS 图片路径 |
|
KEEP/DROP 标注结果 |
数据清理 |
DROP 标注的 OSS 路径 |
|
清洗后的高质量图片集 |
原始的第一人称视角烹饪视频输入,高质量、经过大模型标注和清洗的训练图片集输出。整个过程无需人工干预,且能够随着 Ray 集群的弹性伸缩轻松应对 PB 级的数据规模。
四、 EMR Serverless Ray & Daft 产品架构与生态能力
4.1 灵活的运行模式
Daft 作为新一代多模态 DataFrame 框架,向下无缝对接弹性计算资源,向上提供统一的数据处理 API。在底座层面,Ray 引擎实现了 CPU 与 GPU 队列组的混合调度,并全面接入 Kerberos 与 Ranger,为企业级应用提供坚实的安全隔离保障。
针对不同阶段的业务需求,平台提供了三种灵活的运行模式:
- Local Mode(本地模式):该模式在单 Pod 容器内直接执行,零启动开销。其按需计费、用完即释放的特性,是轻量级代码调试与单机验证的理想选择。
- On Ray - Ephemeral(临时集群模式):专为大规模 CPU&GPU 批处理设计。系统在任务提交时自动拉起临时 Ray 集群,任务完成后自动销毁,用户仅需指定计算规格,实现基础设施的完全免运维和任务之间的完全隔离。
- On Ray - Persistent(常驻集群模式):主要面向 CPU&GPU 多模态数据处理,深度学习推理及生产环境。该模式支持将任务路由至常驻 Ray 集群,实现计算资源的长期复用,并通过统一的 Dashboard 提供完善的作业监控。
4.2 100+ 开箱即用算子
在业务落地过程中,非结构化数据的预处理往往是工程链路上最耗时的环节。为此,EMR Serverless Spark 平台在 Daft 框架内深度沉淀了 100 余个开箱即用的多模态处理算子,全面覆盖视频、文本/文档、图片及音频四大核心场景。
在视频与图片处理方面,算子库涵盖了从基础的切片、抽帧、格式转换,到高阶的视频理解、人脸模糊及 OCR 识别;在文本与文档领域,不仅提供标准化的切分与去重功能,更针对 RAG(检索增强生成)场景内置了 PDF 智能解析与向量化提取能力;同时,音频处理也实现了从格式互转到多语种识别的全链路覆盖。
企业无需投入高昂的算法研发成本,也无需自行拼凑开源组件,即可快速构建高可用、企业级的多模态数据清洗与转换流水线,显著缩短 AI 业务的上线周期。
4.3 API 封装释放大模型生产力
为了进一步降低分布式数据处理的门槛,Daft 算子在设计上被划分为两类:负责传统数据过滤与聚合的基础算子,以及深度集成百炼等大模型服务的 AI 算子。
以“视觉理解(VisionUnderstanding)”算子为例,在传统的开发模式下,开发者需要自行处理模型加载、网络请求及分布式并发控制。而在 EMR Serverless 平台中,用户仅需通过数行极简代码,即可从 OSS 读取多模态数据,并调用 AI 算子完成复杂的推理任务。
这种设计的价值在于:
- 开箱即用:免除繁琐的模型部署。
- 极简 API:数行代码完成复杂推理。
- 分布式透明化:底层由 Ray 自动接管并发调度与批处理加速。
五、 适用场景
这套技术栈适合以下几类典型场景:
具身智能行为数据集构建
从佩戴摄像头采集的第一人称视角原始视频中,自动完成抽帧、质量过滤、目标识别标注,构建 VLA(视觉-语言-动作)模型训练所需的高质量图文对数据集。
视频内容理解与特征提取
对监控视频、工业检测视频等进行批量帧级分析,提取关键事件帧,用于下游的模型训练或业务分析。
大规模多模态数据清洗与标注
对互联网爬取的图文、视频数据进行去重、质量评估、内容分类,为多模态大模型的预训练提供高质量数据源。
结语
阿里云 EMR Serverless Spark 引入 Ray 分布式计算框架与 Daft 高性能数据引擎,为用户提供了一套开箱即用、免运维且极致高效的多模态数据处理基础设施。正如我们在具身智能视频抽帧与 LLM 筛选实践中所展示的,Daft on Ray 打破了传统批处理引擎在内存管理和异构资源调度上的瓶颈,让数据工程师和 AI 研究员能够以极简的代码,构建出稳定、高效的大规模多模态数据流水线,大幅加速具身智能数据飞轮的迭代速度,为下一代具身智能模型的研发提供坚实的数据基础。