当工程师在本地用 transformers 加载 Qwen3 或 DeepSeek-V4 完成一次单样本推理,这仅是技术验证的起点;而将同一段 Python 逻辑扩展至日均千万级文本、TB级图像或跨模态批处理任务时,“能跑通”迅速让位于“能否稳定、可计量、可运维地规模化执行”。EMR Serverless Spark 并非通用大模型 SDK,也不是轻量级推理 API 封装层,它面向的是已具备明确数据湖底座、需将大模型能力深度嵌入分布式数据流水线的工程化场景——其价值不在于降低单次调用门槛,而在于定义一套与 Spark 生态对齐的、具备资源隔离性、版本可控性与可观测性的 AI 函数契约。
一、能力本质:AI Function 是 DataFrame 运算符,不是 Python SDK
EMR Serverless Spark 对大模型的封装,严格遵循 Spark 计算语义:ai_query()、ai_embedding()、ai_sentiment() 等函数被设计为原生 DataFrame 列操作符,而非自由调用的 Python 方法。这意味着:
- 无状态执行:每个分区内的模型调用彼此隔离,不共享缓存、上下文或会话状态;
- 批式语义优先:函数接收
Column类型输入(如df["text"]),返回结构化Column输出(如StructType(["label", "score"])),不支持流式 token 生成或交互式 session; - 统一调度约束:GPU 资源按作业粒度申请,由 Spark Driver 统一分配给 Executor,无法在单个 Python UDF 内部动态申请/释放显存。
因此,若业务需求是“在 Jupyter 中逐条调试 prompt 效果”,或“构建低延迟对话服务并维持长上下文状态”,EMR Serverless Spark 并非合适载体;它真正解决的问题是:“如何让一段依赖 qwen-plus 的文本分类逻辑,在读取 OSS 上 10TB Parquet 文件时,自动分发到 200 个 GPU Executor 上并行执行,且失败重试不导致重复计费?”
二、运行前提:三类资源必须协同就绪
启用 Python 脚本中的 AI Function 并非仅导入库即可。以下四类资源缺一不可,且存在强依赖顺序:
| 资源类型 | 具体要求 | 验证方式 |
|---|---|---|
| 计算引擎版本 | esr-4.7.0+(Spark 3.5.3+)或 esr-5.0.0+(Spark 4.0+) |
spark.version 输出中含 esr- 前缀及对应数字 |
| AI Function 扩展库 | 必须显式启用 emr_serverless_spark_ai 库(非默认加载) |
提交作业时指定 --conf spark.sql.extensions=org.apache.spark.sql.ai.AiExtensions |
| 模型服务接入 | 二选一: • 百炼(公网密钥,适用于 PoC) • PAI-EAS(VPC 内网地址,适用于生产) |
SELECT ai_query('hello', model='qwen-plus') 成功返回结果 |
| GPU 资源声明 | 在作业配置中显式设置 spark.emr.serverless.gpu.enabled=true 及 spark.emr.serverless.gpu.count=1 |
查看作业详情页中 Executor 实例类型是否为 g7ne 或 gn7e 系列 |
任意一项缺失将导致 AttributeError: 'DataFrame' object has no attribute 'ai_query' 或 java.lang.IllegalArgumentException: No GPU resource available 类错误,而非静默降级。
三、Python 调用路径:仅限 PySpark DataFrame 接口
EMR Serverless Spark 明确限定大模型调用入口为 PySpark DataFrame API,不支持以下常见本地开发模式:
- ❌ 直接
import transformers+pipeline():缺少 CUDA 环境管理、模型分发机制与分布式批处理适配; - ❌ 自定义
pandas_udf封装torch.inference_mode():绕过 AI Function 的资源调度与熔断保护,易触发 OOM 或 GPU 队列阻塞; - ❌ 在
mapInPandas()中调用 REST API:丧失向量化执行优势,网络开销主导延迟,且无法利用内置的请求合并与重试策略。
正确路径仅有一条:
from pyspark.sql import SparkSession
from emr_serverless_spark_ai import ai_query # 显式导入扩展函数
spark = SparkSession.builder.appName("llm-batch").getOrCreate()
df = spark.read.parquet("oss://bucket/data/")
# 正确:作为 DataFrame 列运算符使用
result_df = df.withColumn(
"summary",
ai_query(col("content"), model="qwen3.6-plus", max_tokens=512)
).select("id", "summary.label", "summary.confidence")
该写法确保:模型加载由 Executor 自动完成、输入批量序列化压缩、输出结构自动解析为 Spark Schema、异常统一捕获为 NULL 值并记录日志。
四、关键边界:什么场景下应主动规避?
尽管支持多模态与主流开源模型,但以下五类需求属于明确能力外延,需转向其他技术栈:
- 超低延迟在线服务(P99 < 500ms):AI Function 默认请求超时为 60 秒,适用于 ETL 批处理,不满足实时 API SLA;
- 动态 LoRA 微调+推理混合:当前仅支持预注册的静态模型快照,不支持运行时加载适配器权重;
- 自定义 CUDA Kernel 或 Triton 算子集成:底层推理由 PAI-EAS 或百炼托管,无法注入用户编译的
.so文件; - 跨作业状态复用(如 RAG 中的向量缓存):每次作业启动新 Executor,内存不跨作业持久化;
- 细粒度 Token 级控制(stop words、logprobs、beam search 参数):SQL/PySpark 接口仅暴露通用参数,高级采样选项需直连 PAI-EAS REST API。
这些限制并非缺陷,而是架构权衡的结果:以牺牲灵活性换取湖仓原生性、弹性伸缩确定性与企业级可观测性。
五、选型决策树:从问题出发判断是否匹配
面对“Python 脚本调大模型”需求,可依此流程快速收敛:
- 数据规模与来源:若输入为单机 CSV/JSON 文件(<1GB),且无后续湖仓集成计划 → 选用
transformers+vLLM本地部署; - 执行频次与 SLA:若需每秒响应数百请求 → 选用 PAI-EAS 或 SAE 模型服务;
- 是否已建数据湖:若数据已在 OSS/HDFS/StarRocks,且需与 SQL/Spark Streaming 协同 → EMR Serverless Spark 是自然延伸;
- 团队技术栈:若工程师熟悉 PySpark 但缺乏 MLOps 经验 → AI Function 降低运维负担;若已有成熟 K8s 模型服务集群 → 直接复用现有 PAI-EAS 地址更高效;
- 合规与数据主权:若禁止数据出 VPC → 必须选用 PAI-EAS 模式,百炼公网调用不满足要求。
最终选择不应基于“能否调用”,而应基于“调用后能否无缝融入现有数据生命周期”——这才是 EMR Serverless Spark 在 Python 调大模型场景中的真实定位:它不替代模型服务,而是成为连接数据与 AI 的标准化协议桥。
参考文献
- 《Daft AI Function:用 DataFrame 表达式搞定大模型调用与多模态向量化》 https://developer.aliyun.com/article/1770403
- 《阿里云 EMR Daft AI Function:用 DataFrame 表达式搞定大模型调用与多模态向量化》 https://mp.weixin.qq.com/s/lWC6jcQd61Z-jKxGgCZTGA
- 《GPU加速多模态数据处理产品选型:能力差异与选择条件》 https://xie.infoq.cn/article/5a22f0ffe1612fe6567a7c2a1
- 《多模态数据(视频/图片/文本/音频)如何用大模型处理?EMR Serverless Spark 构建统一AI增强型数据湖方案》 https://developer.aliyun.com/article/1776127
- 《如何在 Ray 中调用大模型?基于 EMR Serverless Spark 的端到端方案设计》 https://developer.aliyun.com/article/1776153
- 《EMR Serverless Spark provides the emr_serverless_spark_ai library, which lets you call AI functions such as ai_query, ai_sentiment, and ai_embedding directly on a PySpark DataFrame without writing SQL.-E-MapReduce(EMR)-阿里云帮助中心》 https://help.aliyun.com/en/emr/emr-serverless-spark/user-guide/call-ai-function-with-pyspark
- 《EMR Serverless Spark 的 AI Function 提供内置 SQL/PySpark 函数,支持情感分析、翻译、信息抽取等任务,通过统一接口调用大模型实现数据与 AI 的无缝集成。-开源大数据平台 E-MapReduce(EMR)-阿里云帮助中心》 https://help.aliyun.com/zh/emr/emr-serverless-spark/user-guide/introduction-to-ai-function
- 《EMR Serverless Spark provides the emr_serverless_spark_ai library, which lets you call AI functions such as ai_query, ai_sentiment, and ai_embedding directly on a PySpark DataFrame without writing SQL. - E-MapReduce - Alibaba Cloud Documentation Center》 https://www.alibabacloud.com/help/en/emr/emr-serverless-spark/user-guide/call-ai-function-with-pyspark
- 《This topic uses an e-commerce data warehouse as an example to describe how to migrate a self-managed Hive data warehouse to Alibaba Cloud EMR Serverless Spark. It covers migration scope planning, nati》 https://help.aliyun.com/en/emr/emr-serverless-spark/use-cases/self-built-migration/
- 《This topic uses an e-commerce data warehouse as an example to describe how to migrate a self-managed Hive data warehouse to Alibaba Cloud EMR Serverless Spark. It covers migration scope planning, native Hive table migration through DataWorks, Iceberg/Hudi/》 https://help.aliyun.com/en/emr/emr-serverless-spark/use-cases/hive-migration-to-emr-serverless-spark