把一段文字变成图片,再把这张图片变成一段短视频——这件事可以在Amazon SageMaker AI上完成。做法是部署两个端点,它们用的是同一个AWS vLLM-Omni深度学习容器(DLC):一个实时端点跑FLUX.2-klein-4B做图像生成,一个异步端点跑Wan2.1-VACE-1.3B做视频生成。

整个流程是:先把文字提示词发给图像端点,拿到一张静态图;再把这张图和一段运动提示词交给视频端点;生成完成后,从Amazon Simple Storage Service(Amazon S3)取回MP4文件。示例还附带了一个可选的Streamlit界面。

打开网易新闻 查看精彩图片

AWS深度学习容器把框架和依赖打包好,用于在AWS上做训练和推理。AWS vLLM-Omni DLC打包了经过跟踪的vLLM-Omni版本,并加入了面向SageMaker AI的路由中间件。vLLM-Omni把vLLM从文本生成扩展到能处理或生成文本、音频、图像和视频的模型,走的是兼容OpenAI的API。

两个端点,两种响应模式

这套方案把同一个固定版本的AWS vLLM-Omni DLC镜像部署到两个SageMaker AI端点上。部署脚本只改一个环境变量SM_VLLM_MODEL,一个端点加载FLUX.2-klein,另一个加载Wan VACE。共用同一个容器镜像能减少服务栈的差异,而分开的端点让每个模型各自选用适合自己工作负载的实例类型和推理方式。

  • SageMaker AI实时端点跑FLUX.2-klein,请求路由到/v1/images/generations
  • SageMaker异步推理端点跑Wan VACE,请求路由到/v1/videos/sync
  • Amazon S3存放多部分视频请求和生成的MP4。

请求路径是这样的:应用把图像提示词发给FLUX.2-klein,收到一个base64编码的PNG。它把图片缩放到视频尺寸,转成紧凑的JPEG数据URL,再把这个引用塞进Wan VACE的请求里。SageMaker异步推理从Amazon S3读取多部分请求,并把MP4写到返回的输出位置。

换成编号的请求-响应序列看,图像调用直接返回给应用;视频调用返回的是一个异步输出位置,生成结束后应用再去Amazon S3取MP4。

为什么图片用实时、视频用异步

SageMaker AI把推理流量发到/invocations。DLC读取CustomAttributes请求头,把请求转发到选定的vLLM-Omni路由。示例在把多部分视频请求体上传到Amazon S3之前就预先构建好了它,这样发给vLLM-Omni Videos API的请求内容保持明确。成功的响应和调用失败分别存放在不同的Amazon S3前缀下。

图像用实时推理,是因为应用需要拿到直接响应,才能构造下一个请求。视频生成是耗时更长的操作,还带着图像条件的多部分负载。SageMaker异步推理把请求排队,用Amazon S3做输入和输出,客户端可以轮询结果位置,而不必让一个同步请求一直挂着。

这是针对具体工作负载的选择,不是所有视频模型都必须遵守的规则。按模型的延迟、负载和客户端交互方式来选推理选项就好。

示例用的是固定的ml.g6.xlarge和ml.g6e.xlarge实例类型。对于实时图像端点,SageMaker的容量感知实例池可以按优先级顺序列出兼容的实例类型。只有在验证过每个候选类型满足图像模型的GPU显存和性能要求之后,才添加实例池。这个示例让异步视频端点保持固定实例类型。

跑起来需要什么

开始之前需要准备:一个AWS账户,凭证已为AWS命令行界面(AWS CLI)或某个AWS SDK配置好;一个能访问示例Amazon S3存储桶的SageMaker AI执行角色;创建和调用SageMaker AI端点的权限;所选AWS区域中ml.g6.xlarge和ml.g6e.xlarge的端点配额;Git;Python 3.11或更高版本。

这套操作使用美国东部(弗吉尼亚北部)AWS区域。部署GPU端点前,先查看SageMaker AI的定价。

具体步骤分三步。第一步,克隆托管示例仓库,进入vLLM-Omni图像与视频示例目录。第二步,安装Python依赖,创建虚拟环境并安装示例所需依赖。第三步,部署图像和视频端点:设置SageMaker AI执行角色并运行部署脚本。

脚本固定使用omni-sagemaker-cuda-v1.6,创建一个实时图像端点,创建一个异步视频端点,并把它们的资源名写入.vllm_omni_media_state.json。环境变量SM_VLLM_MODEL告诉每个容器加载哪个模型。视频端点开启了变分自编码器(VAE)分块,以降低视频解码时的峰值内存。如果端点启动期间本地AWS凭证过期,刷新凭证后用--resume重跑命令,脚本会复用已保存的资源。

最后一步,用图像提示词和运动提示词运行端到端的命令行工作流。FLUX.2-klein返回一个兼容OpenAI的JSON响应,其中包含base64数据的PNG。