You need to enable JavaScript to run this app.
导航
火山引擎扩散模型服务框架veFuser :超低延迟打造视频生成新体验
最近更新时间:2025.05.09 11:09:12首次发布时间:2025.04.15 11:20:21
我的收藏
有用
有用
无用
无用
1. veFuser 产品介绍

在当下生视频与生图大模型持续取得重大突破,不断拓展创意产业的边界。字节跳动依托自身强大的技术研发实力,精心构建了基于扩散模型(Diffusion Model)的生图、生视频推理服务框架 VeFuser,实现了低延迟、低成本的高质量图片与视频生成,为创作者带来了更低延迟、更具性价比的创作体验。
veFuser能够在配备 24GB 显存的低端 GPU 卡上,针对图像生成任务运行当前主流的图像生成模型 FLUX.1-dev 和 HiDream-I1-Full。与开源实现相比,其最大程度地将推理时间缩减了 83%。在 FLUX.1-dev 模型上,出图时间只需 3 秒;在 HiDream-I1-Full 模型上,出图时间只需 13 秒。这一表现显著提升了用户的使用体验,并降低了使用成本。
而对于生视频任务,veFuser针对生视频模型 Wan2.1 在 32卡集群上可以实现 16秒延迟 生成 5秒 480P 的视频的极致用户体验。如果使用百卡扩展规模,可以实现 5sec 生成 5sec 视频的实时生成效果。
火山引擎的客户可在火山机器学习平台以及火山方舟一站式大模型开发平台这两款产品中运用 veFuser 的强大功能。

2. veFuser 优势

字节跳动 veFuser 推理框架为 DiT 模型部署提供了有效的解决方案:

2.1 降低计算复杂度与延迟

  • 高性能算子:高度优化的 Attention 算子,细粒度的通信计算重叠。在 D、A、L、H 不同架构 GPU 对扩散模型常用的算子进行了深度调优,对计算密集算子进行无损的量化和稀疏化。

  • 稀疏 Attention: 打破传统自注意力机制对序列中所有元素进行全局计算的模式。在处理高分辨率图像或长视频的长输入序列时,它基于对数据特征的深入分析,运用特定的算法筛选出与当前计算任务最为相关的关键信息。

2.2 攻克模型架构异构性难题

  • 分布式架构: 扩散模型工作流往往包含多个独立的角色(Text Encoder、VAE 、LLM等),各个阶段对显存、计算、带宽等不同资源瓶颈。针对这对特点,我们为不同角色选择最适合的并行方法和资源配置,并将工作流看成一张 DAG。将耦合一个工作流中的不同角色(如Encoder、VAE、DiT等),拆分为独立的微服务,统一调度异步执行没有依赖的角色,比如 image encoder 和 text encoder。

  • 异构部署: 同时结合各个阶段对显存、计算、带宽等不同资源瓶颈,利用异构硬件的不同特性,优化部署成本。

  • 灵活可扩展: 支持自定义 pipeline 和服务组件,支持不同类型的模型推理的低成本接入。

2.3 突破实时性与扩展性限制

  • 内存优化:根据模型结构以最佳方式排布中间结果内存,消除算子激增的临时内存。可以让 24GB 内存轻松运行 720p 视频生成。

  • 高效并行框架:支持混合流水线并行(PipeFusion)、序列并行(USP 并行)和 CFG 并行,显著提升多卡扩展性。

  • 通信效率提升: 通过 veTurbo rpc (支持在 vpc 上实现虚拟 RDMA 传输通信协议)实现多角色的通信,同时针对 tensor 数据做了传输性能优化。

2.4 多Lora动态切换

Lora(Low Rank Adaptation)在内容生成任务中是一个常用的插件能力,能够很好地控制生成内容的风格模式。而频繁地切换Lora往往会带来较高的开销,因此veFuser针对这一通用能力,实现了基于请求的多Lora动态切换能力,可以实现几乎无感的切换体验。

2.5 精度无损

速度优化都不会造成精度损失,经过严格的 GSB(Good Same Bad)评测保证。不会为了速度损失生成效果。

alt

3. veFuser 性能优势

3.1 Wan2.1 单机性能(Dit 单机 8 卡)

  1. 测试模型:Wan2.1-14B

  2. 机器分布:

    1. H20/A800 单卡*2 :放 text encoder bf16 + VAE

    或 H20/A800 单卡*3 :放 text encoder bf16 + VAE + image encoder

    1. A800/H20/L20 八卡:放DiT

    2. 备注:单卡 VAE/image encoder/text encoder 可以支持上百组 Dit,所以其成本相比 Dit 基本可以忽略

3.1.1 A800

  • veFuser 详细延时分布:

画面比例

帧率

step

并行
(A800 8卡)

视频时长

生成类型

视频生成耗时(单位:s)

公式计算的tokens

16:912807201640SP85秒I2V16074256
16:912807201650SP85秒T2V17075600
16:98324801640SP85秒I2V5032136
16:98324801650SP85秒T2V5332760

3.1.2 H20

  • veFuser 详细延时分布:

画面比例

帧率

step

并行
(H3c 8卡)

视频时长

生成类型

视频生成耗时(单位:s)

公式计算的tokens

16:912807201640SP85秒I2V20874256
16:912807201650SP85秒T2V21275600
16:98324801640SP85秒I2V8832136
16:98324801650SP85秒T2V9032760

3.1.3 L20

  • veFuser 详细延时分布:

画面比例

帧率

step

并行
(L3c 8卡)

视频时长

生成类型

视频生成耗时(单位:s)

公式计算的tokens

16:912807201640SP85秒I2V29574256
16:912807201650SP85秒T2V32575600
16:98324801640SP85秒I2V11332136
16:98324801650SP85秒T2V12532760

3.2 Wan2.1 多机扩展性能

3.2.1 多机延迟 - A100

  • A800 具有 RDMA,这一优势使得计算集群的并行规模能够从 16 卡进一步拓展至 32 卡,显著提升了大规模并行计算的性能与效率。

  • 通过多机部署,可以实现极低的延迟,比如 480P-5秒-T2V 在 A100 上最低耗时可以到 16 秒(32卡并行) ,vefuser 在 RDMA 互联硬件上具有非常好的扩展性。

  • 以 A800 T2V 为例子进行说明,Dit 部分进行并行扩展:



画面比例

帧率

step

并行
(Dit 部分)

视频时长

总卡数

T2V视频生成耗时(单位:s)

Dit 耗时

Dit 部分加速比(VS A800 单机)

公式计算的tokens

16:91280720165085秒8160154100%75600
16:912807201650165秒168377200%75600
16:912807201650325秒3247 41 375%75600
16:9832480165085秒85148100%32760
16:98324801650165秒162724200%32760
16:98324801650325秒3216 14 340%32760

3.2.2 多机扩展加速比

  • 如上图所示,从 8 卡到 32 卡可以实现近乎线性的加速比,在极大减少延迟的前提下,TCO 基本不变

  • 如上图所示,按照当前的理论拓展性,当推理卡数增加到128张A800后, 实际生图速度(蓝线) 实时生图所需速度(黑线) 重合,表示在这个设置下,理论上可以实现视频生成时间小于等于视频的时间,达到实时生视频的效果。

3.3 FLUX.1 & HiDream-I1单机性能

说明

  • 对于FLUX.1-dev模型:在L20上性能相较于开源实现单卡延时降低 76% 左右,1024px下生成单图的时间仅需 6.22s

  • 对于HiDream-I1-Full模型:在L20上性能相较于开源实现单卡延时降低 57% 左右,四卡延时降低 86% 左右,1024px下生成单图的时间仅 13.17s

  1. 测试模型:FLUX.1-dev(12B) & HiDream-I1-Full(17B)

  2. 机器分布:

    1. FLUX.1-dev(12B):

      • TextEncoder(fp8) & VAE & DiT(fp8): L20单卡
    2. HiDream-I1-Full(17B)

      • TextEncoder & VAE: H20/A800单卡 或 L20双卡

      • DiT(fp8): L20单卡/双卡/四卡

    3. 备注:

      • 对于FLUX.1-dev模型,在不影响生图质量的情况下,使用fp8量化即可在显存24GB内完成端到端的运行,因此可以无需把TextEncoder和VAE模型进行分图处理。

      • 而对于HiDream-I1-Full模型,在不影响生图质量的情况下,使用fp8量化后,在单张显存24GB的L20上仍然不足以容纳TextEncoder+DiT+VAE。因此需要使用单张H20/A800或是两张L20装载TextEncoder和VAE。不过由于整体生图过程中TextEncoder以及VAE的开销远低于DiT,因此其成本相比 DiT 基本可以忽略。

3.3.1 L20

FLUX.1-dev(12B)模型生图速度

图片描述

画面比例

step

并行
(Dit 部分)

优化

图片生成耗时(单位:s)

1:110241024281开源实现26.22
1:110241024281veFuser6.22

HiDream-I1-Full(17B)模型生图速度

画面比例

step

并行
(Dit 部分)

优化

图片生成耗时(单位:s)

1:110241024501开源实现99.5
1:110241024501veFuser42.74
1:110241024502veFuser20.63
1:110241024504veFuser13.17
4. 使用方法

4.1 火山机器学习平台

4.1.1 创建服务

  1. 在快速入门选择需要部署的模型,并且配置实例规格。


4.1.2 调用服务

  1. 在线服务启动好I2V或者T2V对应的环境,获得调用指南里公网访问的地址,不需要开启token验证。

  1. 本测试在端到端的数据会直接在客户端日志中显示,得到的是客户端发送到接收视频完整的时间,具体每个节点实际运行的时间需要在在线服务的日志中查看每个节点启动该次测试的时间。

  2. 运行下面的脚本

    • 修改SERVICE_URL为你的实际调用地址

    • 修改输入图片(I2V时用到)、输出视频、Prompt的文件地址

    • 修改num_inference_steps和你的视频生成方法一致:如果是I2V,为40;如果是T2V,为50

    • 修改宽高比例和你生成视频的质量一致:

      • 如果是720P视频,height为1280,width为720;
      • 如果是480P视频,height为832,width为480
    • shift需要根据视频质量和视频生成方法选择

      • T2V 720P和480P都是5.0
      • I2V 720P是5.0;480P是3.0
    • 如果想生成5s的视频则"num_frames": 81;如果想生成10s的视频"num_frames": 161

vefuser模型默认生成约 5 秒的视频(81 帧,16 FPS),此场景也是模型官方推荐,但同时支持通过调整采样帧数来扩展时长(效果可能会损失)。若需生成 10 秒视频,可设置帧数为 161(16 FPS × 10 s + 1)。

  1. 测试目录结构
your_script_folder/
├── prompts.txt              ← 每行一个 prompt
├── your_script.sh           ← 你提供的 bash 脚本
├── ../pictures/             ← 图片目录
│   ├── image1.png
│   ├── image2.png
│   └── ...
├── ../output/              ← 输出视频或 JSON 的目录
│   └── video_2.mp4 / response_2.json
  1. 依赖的环境
命令作用
curl向远程 API 发起 POST 请求
base64将图片转为 base64 字符串
jq验证 JSON 格式是否有效
sed, awk, tr, grep标准的文本处理工具
mktemp创建临时目录用于中转数据
#!/bin/bash
set -e

# 服务和接口配置
SERVICE_URL="你的调用地址"
ENDPOINT="/api/v1/generate"

# 输入图片和输出视频的文件夹(请根据实际情况修改)
INPUT_FOLDER="../pictures"     # 存放图片的文件夹(要求图片命名为 image1.png, image2.png, …)
OUTPUT_FOLDER="../output"       # 存放生成视频的文件夹

# prompts 文件,每行对应一张图片的 prompt
PROMPTS_FILE="./prompts.txt"
if [ ! -f "$PROMPTS_FILE" ]; then
  echo "[ERROR] 找不到 prompts 文件:$PROMPTS_FILE"
  exit 1
fi

# 确保输出文件夹存在
mkdir -p "$OUTPUT_FOLDER"

# 指定需要处理的行号(index)
INDEX=1

# 提取第 INDEX 行的 prompt
prompt=$(sed -n "${INDEX}p" "$PROMPTS_FILE")
if [ -z "$prompt" ]; then
  echo "[ERROR] 没有找到第 $INDEX 行的 prompt"
  exit 1
fi

IMAGE_PATH="${INPUT_FOLDER}/image${INDEX}.png"
if [ ! -f "$IMAGE_PATH" ]; then
  echo "[ERROR] 找不到图片文件:$IMAGE_PATH"
  exit 1
fi

echo "正在处理第 $INDEX 张图片: $IMAGE_PATH"
echo "当前 prompt: $prompt"

# 创建临时目录
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

# 将图片转换为 Base64(使用 -i 指定输入文件,并去掉换行符)
base64 -i "$IMAGE_PATH" | tr -d '\n' > "$TMP_DIR/image.base64"

# 生成 JSON payload,将 prompt 动态写入
cat <<EOF > "$TMP_DIR/payload.json"
{
  "image": "$(cat "$TMP_DIR/image.base64")",
  "prompt": "$prompt",
  "num_inference_steps": 40,
  "height": 832,
  "width": 480,
  "num_frames": 81,
  "seed": 100000,
  "shift": 3.0,
  "sample_solver": "unipc",
  "guide_scale": 5.0,
  "return_type": "bytes",
  "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
}
EOF

# 验证 JSON 格式是否有效
if ! jq empty "$TMP_DIR/payload.json" &> /dev/null; then
  echo "[ERROR] 第 $INDEX 张图片生成的 JSON 无效" >&2
  rm -rf "$TMP_DIR"
  exit 1
fi

HEADER_FILE="$TMP_DIR/headers.txt"
RESPONSE_FILE="$TMP_DIR/response.bin"

echo "[INFO] 正在发送请求..."
curl -s -X POST \
  -H "Content-Type: application/json" \
  --data-binary @"$TMP_DIR/payload.json" \
  "${SERVICE_URL}${ENDPOINT}" \
  -w '\nResponse Time: %{time_total}s\n' \
  -D "$HEADER_FILE" \
  --output "$RESPONSE_FILE"

HTTP_STATUS=$(awk '/^HTTP/{status=$2} END{print status}' "$HEADER_FILE")
if [ "$HTTP_STATUS" -ne 200 ]; then
  echo "[ERROR] 第 $INDEX 张图片请求失败,状态码: $HTTP_STATUS" >&2
  rm -rf "$TMP_DIR"
  exit 1
fi

CONTENT_TYPE=$(grep -i 'Content-Type:' "$HEADER_FILE" | head -n1 | sed 's/^Content-Type: //i; s/;.*//' | tr -d '\r')

if [[ "$CONTENT_TYPE" == video/* ]]; then
  echo "[INFO] 第 $INDEX 张图片生成了视频响应。"
  FILE_EXT=$(echo "$CONTENT_TYPE" | cut -d'/' -f2)
  OUTPUT_FILE="${OUTPUT_FOLDER}/video_${INDEX}.${FILE_EXT:-mp4}"
  mv "$RESPONSE_FILE" "$OUTPUT_FILE"
  if [ ! -s "$OUTPUT_FILE" ]; then
    echo "[ERROR] 视频文件 $OUTPUT_FILE 为空,请检查生成过程。"
    exit 1
  fi
  echo "视频保存为:$OUTPUT_FILE"
elif [[ "$CONTENT_TYPE" == application/json* ]]; then
  echo "[INFO] 第 $INDEX 张图片返回的是 JSON 响应。"
  mv "$RESPONSE_FILE" "${OUTPUT_FOLDER}/response_${INDEX}.json"
  echo "JSON 响应保存为:${OUTPUT_FOLDER}/response_${INDEX}.json"
else
  echo "[ERROR] 第 $INDEX 张图片返回的内容类型异常: $CONTENT_TYPE" >&2
  file "$RESPONSE_FILE"
  rm -rf "$TMP_DIR"
  exit 1
fi

# 清理临时目录
rm -rf "$TMP_DIR"

echo "处理完毕!"
exit 0

4.2 火山方舟

veFuser 用于支持火山方舟视频生成模型 Seedance 和 Wan2.1的推理加速。以Seedance 1.0 lite 模型为例,体验火山方舟视频生成模型的具体方式如下:

  • 打开方舟模型广场,找到【Doubao-Seedance-1.0-lite-i2v】或【Doubao-Seedance-1.0-lite-t2v】模型卡片,点击【立即体验】开始体验

  • 设定好分辨率、视频比例(宽高比)、视频时长、生成数量、固定镜头、种子值后,点击【立即生成】,即可体验模型效果

4.3 API

Step1 发起创建视频生成任务请求,请求成功后可返回任务id。更多信息可以查看:https://www.volcengine.com/docs/82379/1520757
请求示例:

curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-1-0-lite-t2v-250428",
    "content": [
        {
            "type": "text",
            "text": "夜晚,一只萨摩耶犬和一只金毛犬在充满未来感的霓虹城市中嬉戏玩耍。附近建筑物发出的霓虹灯光在它们的皮毛上闪闪发光。 --ratio 16:9"
        }
    ]
}'

响应示例:

{"id": "cgt-2025******-****"}

Step2 根据任务id,查询视频生成任务状态和结果,如果任务状态为成功,可返回视频下载的url。更多信息可以查看:https://www.volcengine.com/docs/82379/1521309
请求示例:

curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2025****" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY"

响应示例:

{"id": "cgt-20250331175019-68d9t","model": "doubao-seaweed-241128","status": "succeeded","content": {"video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/doubao-seaweed/doubao-seaweed-2100566469-.mp4?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=AKLTY%2Fcn-beijing%2Ftos%2Frequest&X-Tos-Date=20250331T095113Z&X-Tos-Expires=86400&X-Tos-Signature=***&X-Tos-SignedHeaders=host"
  },"usage": {"completion_tokens": 108900,"total_tokens": 108900
  },"created_at": 1743414619,"updated_at": 1743414673
}

Step3根据url下载视频文件

5. 附录

5.1 Wan2.1 开源项目性能


https://github.com/Wan-Video/Wan2.1?tab=readme-ov-file

5.2 部分生成视频效果

5.2.1 I2V

  • 视频1

    • Prompt:一位白色头发的白人老男人抬起右手抚摸镜面。镜子中反射出他的倒影,他侧面对着镜头。

    • 图片:

    图片描述
    • 尺寸:1280*720(宽*高)

    • Wan2.1 原版视频:

    • 对应 Vefuser 生成视频:

  • 视频2

    • Prompt:一群背着书包的白人学生向前走,站在中间的女生向右转头,看向她身边穿棕色衣服的男孩。男孩走上前来。女孩抬起右手,搭在男孩的右肩膀上。镜头正面拍摄,跟随学生们的移动。

    • 图片:

    图片描述
    • 尺寸:1280*720(宽*高)

    • Wan2.1 原版视频:

    • 对应 Vefuser 生成视频:

5.2.2 T2V

  • 视频1

    • Prompt:一位时尚女性走在东京的街道上,街道上到处都是暖色调的霓虹灯和动画城市标志。她身穿黑色皮夹克、红色长裙和黑色靴子,手拿黑色皮包。她戴着太阳镜,涂着红色唇膏。她走起路来自信而随意。街道潮湿而反光,与五颜六色的灯光形成镜面效果。许多行人走来走去。

    • 尺寸:720*1280(宽*高)

    • Wan2.1 原版视频:

    • 对应 Vefuser 生成视频:
  • 视频2

    • Prompt:在客厅里,一只毛茸茸的、眼睛明亮的小狗正在追逐一个玩具

    • 尺寸:1280*720(宽*高)

    • Wan2.1 原版视频:

    • 对应 Vefuser 生成视频:
  • 视频3

    • Prompt:一位宇航员骑着马,高清,4K

    • 尺寸:720*1280(宽*高)

    • Wan2.1 原版视频:

    • 对应 Vefuser 生成视频:

5.3 部分生成图片效果

5.3.1 FLUX.1-dev

Prompt开源实现 生成图片Vefuser 生成图片
A cat holding a sign that says hello world
A steaming plate of fettuccine Alfredo
Dramatic ocean waves crashing against jagged cliffs under a stormy sky, cinematic lighting, ultra-detailed, 8K resolution.

5.3.2 HiDream-I1-Full

Prompt开源实现 生成图片Vefuser 生成图片
A cat holding a sign that says hello world
A steaming plate of fettuccine Alfredo
Dramatic ocean waves crashing against jagged cliffs under a stormy sky, cinematic lighting, ultra-detailed, 8K resolution.