在当下生视频与生图大模型持续取得重大突破,不断拓展创意产业的边界。字节跳动依托自身强大的技术研发实力,精心构建了基于扩散模型(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 的强大功能。
字节跳动 veFuser 推理框架为 DiT 模型部署提供了有效的解决方案:
高性能算子:高度优化的 Attention 算子,细粒度的通信计算重叠。在 D、A、L、H 不同架构 GPU 对扩散模型常用的算子进行了深度调优,对计算密集算子进行无损的量化和稀疏化。
稀疏 Attention: 打破传统自注意力机制对序列中所有元素进行全局计算的模式。在处理高分辨率图像或长视频的长输入序列时,它基于对数据特征的深入分析,运用特定的算法筛选出与当前计算任务最为相关的关键信息。
分布式架构: 扩散模型工作流往往包含多个独立的角色(Text Encoder、VAE 、LLM等),各个阶段对显存、计算、带宽等不同资源瓶颈。针对这对特点,我们为不同角色选择最适合的并行方法和资源配置,并将工作流看成一张 DAG。将耦合一个工作流中的不同角色(如Encoder、VAE、DiT等),拆分为独立的微服务,统一调度异步执行没有依赖的角色,比如 image encoder 和 text encoder。
异构部署: 同时结合各个阶段对显存、计算、带宽等不同资源瓶颈,利用异构硬件的不同特性,优化部署成本。
灵活可扩展: 支持自定义 pipeline 和服务组件,支持不同类型的模型推理的低成本接入。
内存优化:根据模型结构以最佳方式排布中间结果内存,消除算子激增的临时内存。可以让 24GB 内存轻松运行 720p 视频生成。
高效并行框架:支持混合流水线并行(PipeFusion)、序列并行(USP 并行)和 CFG 并行,显著提升多卡扩展性。
通信效率提升: 通过 veTurbo rpc (支持在 vpc 上实现虚拟 RDMA 传输通信协议)实现多角色的通信,同时针对 tensor 数据做了传输性能优化。
Lora(Low Rank Adaptation)在内容生成任务中是一个常用的插件能力,能够很好地控制生成内容的风格模式。而频繁地切换Lora往往会带来较高的开销,因此veFuser针对这一通用能力,实现了基于请求的多Lora动态切换能力,可以实现几乎无感的切换体验。
速度优化都不会造成精度损失,经过严格的 GSB(Good Same Bad)评测保证。不会为了速度损失生成效果。
测试模型:Wan2.1-14B
机器分布:
或 H20/A800 单卡*3 :放 text encoder bf16 + VAE + image encoder
A800/H20/L20 八卡:放DiT
备注:单卡 VAE/image encoder/text encoder 可以支持上百组 Dit,所以其成本相比 Dit 基本可以忽略
画面比例 | 宽 | 高 | 帧率 | step | 并行 | 视频时长 | 生成类型 | 视频生成耗时(单位:s) | 公式计算的tokens |
---|---|---|---|---|---|---|---|---|---|
16:9 | 1280 | 720 | 16 | 40 | SP8 | 5秒 | I2V | 160 | 74256 |
16:9 | 1280 | 720 | 16 | 50 | SP8 | 5秒 | T2V | 170 | 75600 |
16:9 | 832 | 480 | 16 | 40 | SP8 | 5秒 | I2V | 50 | 32136 |
16:9 | 832 | 480 | 16 | 50 | SP8 | 5秒 | T2V | 53 | 32760 |
画面比例 | 宽 | 高 | 帧率 | step | 并行 | 视频时长 | 生成类型 | 视频生成耗时(单位:s) | 公式计算的tokens |
---|---|---|---|---|---|---|---|---|---|
16:9 | 1280 | 720 | 16 | 40 | SP8 | 5秒 | I2V | 208 | 74256 |
16:9 | 1280 | 720 | 16 | 50 | SP8 | 5秒 | T2V | 212 | 75600 |
16:9 | 832 | 480 | 16 | 40 | SP8 | 5秒 | I2V | 88 | 32136 |
16:9 | 832 | 480 | 16 | 50 | SP8 | 5秒 | T2V | 90 | 32760 |
画面比例 | 宽 | 高 | 帧率 | step | 并行 | 视频时长 | 生成类型 | 视频生成耗时(单位:s) | 公式计算的tokens |
---|---|---|---|---|---|---|---|---|---|
16:9 | 1280 | 720 | 16 | 40 | SP8 | 5秒 | I2V | 295 | 74256 |
16:9 | 1280 | 720 | 16 | 50 | SP8 | 5秒 | T2V | 325 | 75600 |
16:9 | 832 | 480 | 16 | 40 | SP8 | 5秒 | I2V | 113 | 32136 |
16:9 | 832 | 480 | 16 | 50 | SP8 | 5秒 | T2V | 125 | 32760 |
A800 具有 RDMA,这一优势使得计算集群的并行规模能够从 16 卡进一步拓展至 32 卡,显著提升了大规模并行计算的性能与效率。
通过多机部署,可以实现极低的延迟,比如 480P-5秒-T2V 在 A100 上最低耗时可以到 16 秒(32卡并行) ,vefuser 在 RDMA 互联硬件上具有非常好的扩展性。
以 A800 T2V 为例子进行说明,Dit 部分进行并行扩展:
画面比例 | 宽 | 高 | 帧率 | step | 并行 | 视频时长 | 总卡数 | T2V视频生成耗时(单位:s) | Dit 耗时 | Dit 部分加速比(VS A800 单机) | 公式计算的tokens |
---|---|---|---|---|---|---|---|---|---|---|---|
16:9 | 1280 | 720 | 16 | 50 | 8 | 5秒 | 8 | 160 | 154 | 100% | 75600 |
16:9 | 1280 | 720 | 16 | 50 | 16 | 5秒 | 16 | 83 | 77 | 200% | 75600 |
16:9 | 1280 | 720 | 16 | 50 | 32 | 5秒 | 32 | 47 | 41 | 375% | 75600 |
16:9 | 832 | 480 | 16 | 50 | 8 | 5秒 | 8 | 51 | 48 | 100% | 32760 |
16:9 | 832 | 480 | 16 | 50 | 16 | 5秒 | 16 | 27 | 24 | 200% | 32760 |
16:9 | 832 | 480 | 16 | 50 | 32 | 5秒 | 32 | 16 | 14 | 340% | 32760 |
说明
对于FLUX.1-dev模型:在L20上性能相较于开源实现单卡延时降低 76% 左右,1024px下生成单图的时间仅需 6.22s
对于HiDream-I1-Full模型:在L20上性能相较于开源实现单卡延时降低 57% 左右,四卡延时降低 86% 左右,1024px下生成单图的时间仅 13.17s
测试模型:FLUX.1-dev(12B) & HiDream-I1-Full(17B)
机器分布:
FLUX.1-dev(12B):
HiDream-I1-Full(17B)
TextEncoder & VAE: H20/A800单卡 或 L20双卡
DiT(fp8): L20单卡/双卡/四卡
备注:
对于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 基本可以忽略。
FLUX.1-dev(12B)模型生图速度
画面比例 | 宽 | 高 | step | 并行 | 优化 | 图片生成耗时(单位:s) |
---|---|---|---|---|---|---|
1:1 | 1024 | 1024 | 28 | 1 | 开源实现 | 26.22 |
1:1 | 1024 | 1024 | 28 | 1 | veFuser | 6.22 |
HiDream-I1-Full(17B)模型生图速度
画面比例 | 宽 | 高 | step | 并行 | 优化 | 图片生成耗时(单位:s) |
---|---|---|---|---|---|---|
1:1 | 1024 | 1024 | 50 | 1 | 开源实现 | 99.5 |
1:1 | 1024 | 1024 | 50 | 1 | veFuser | 42.74 |
1:1 | 1024 | 1024 | 50 | 2 | veFuser | 20.63 |
1:1 | 1024 | 1024 | 50 | 4 | veFuser | 13.17 |
本测试在端到端的数据会直接在客户端日志中显示,得到的是客户端发送到接收视频完整的时间,具体每个节点实际运行的时间需要在在线服务的日志中查看每个节点启动该次测试的时间。
运行下面的脚本
修改SERVICE_URL为你的实际调用地址
修改输入图片(I2V时用到)、输出视频、Prompt的文件地址
修改num_inference_steps和你的视频生成方法一致:如果是I2V,为40;如果是T2V,为50
修改宽高比例和你生成视频的质量一致:
shift需要根据视频质量和视频生成方法选择
如果想生成5s的视频则"num_frames": 81;如果想生成10s的视频"num_frames": 161
vefuser模型默认生成约 5 秒的视频(81 帧,16 FPS),此场景也是模型官方推荐,但同时支持通过调整采样帧数来扩展时长(效果可能会损失)。若需生成 10 秒视频,可设置帧数为 161(16 FPS × 10 s + 1)。
your_script_folder/ ├── prompts.txt ← 每行一个 prompt ├── your_script.sh ← 你提供的 bash 脚本 ├── ../pictures/ ← 图片目录 │ ├── image1.png │ ├── image2.png │ └── ... ├── ../output/ ← 输出视频或 JSON 的目录 │ └── video_2.mp4 / response_2.json
命令 | 作用 |
---|---|
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
veFuser 用于支持火山方舟视频生成模型 Seedance 和 Wan2.1的推理加速。以Seedance 1.0 lite 模型为例,体验火山方舟视频生成模型的具体方式如下:
设定好分辨率、视频比例(宽高比)、视频时长、生成数量、固定镜头、种子值后,点击【立即生成】,即可体验模型效果
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下载视频文件
https://github.com/Wan-Video/Wan2.1?tab=readme-ov-file
视频1
Prompt:一位白色头发的白人老男人抬起右手抚摸镜面。镜子中反射出他的倒影,他侧面对着镜头。
图片:
尺寸:1280*720(宽*高)
Wan2.1 原版视频:
对应 Vefuser 生成视频:
视频2
Prompt:一群背着书包的白人学生向前走,站在中间的女生向右转头,看向她身边穿棕色衣服的男孩。男孩走上前来。女孩抬起右手,搭在男孩的右肩膀上。镜头正面拍摄,跟随学生们的移动。
图片:
尺寸:1280*720(宽*高)
Wan2.1 原版视频:
视频1
Prompt:一位时尚女性走在东京的街道上,街道上到处都是暖色调的霓虹灯和动画城市标志。她身穿黑色皮夹克、红色长裙和黑色靴子,手拿黑色皮包。她戴着太阳镜,涂着红色唇膏。她走起路来自信而随意。街道潮湿而反光,与五颜六色的灯光形成镜面效果。许多行人走来走去。
尺寸:720*1280(宽*高)
Wan2.1 原版视频:
视频2
Prompt:在客厅里,一只毛茸茸的、眼睛明亮的小狗正在追逐一个玩具
尺寸:1280*720(宽*高)
Wan2.1 原版视频:
视频3
Prompt:一位宇航员骑着马,高清,4K
尺寸:720*1280(宽*高)
Wan2.1 原版视频:
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. | ![]() | ![]() |
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. | ![]() | ![]() |