视频(实验性质)#
学习如何使用 Xinference 生成视频
介绍#
Video API 提供了和视频交互的方式:
Text-to-video 端点将一段文本提示词从头开始创建视频
Image-to-video 端点将一张图片从头开始创建视频
firstlastframe-to-video 接口根据首帧和尾帧之间的过渡生成视频。
API |
Endpoint |
|---|---|
Text-to-Video API |
/v1/video/generations |
Image-to-Video API |
/v1/video/generations/image |
FirstLastFrame-to-Video API |
/v1/video/generations/flf |
支持的模型列表#
Text-to-video API 在 Xinference 中支持以下模型:
Image-to-video API 在 Xinference 中支持以下模型:
Xinference 中支持以下模型使用 firstlastframe-to-video 接口:
快速入门#
文生视频#
可以通过 cURL 或 Xinference 的方式尝试使用 text-to-video API
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/video/generations' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "<MODEL_UID>",
"prompt": "<your prompt>"
}'
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
input_text = "an apple"
model.text_to_video(input_text)
图生视频#
可以通过 cURL 或 Xinference 的方式尝试使用 image-to-video API
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/video/generations/image' \
-F model=<MODEL_UID> \
-F image=@xxx.jpg \
-F prompt=<prompt>
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
with open("xxx.jpg", "rb") as f:
prompt = ""
model.image_to_video(image=f.read(), prompt=prompt)
首尾帧生视频#
你可以通过 cURL 或 Xinference 的 Python 客户端来体验 firstlastframe-to-video 接口:
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/video/generations/flf' \
-F model=<MODEL_UID> \
-F first_frame=@xxx.jpg \
-F last_frame=@xxx2.jpg \
-F prompt=<prompt>
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
with open("xxx.jpg", "rb") as f1, open("xxx2.jpg", "rb") as f2:
prompt = ""
model.flf_to_video(first_frame=f1.read(), last_frame=f2.read(), prompt=prompt)
内存优化#
视频生成会占用大量显存,举例来说,运行 CogVideoX 可能会使用到约 35 GB 的显存。
Xinference 支持若干选项,来优化视频模型显存(VRAM)使用。
CPU 卸载或块级分组卸载。
逐层类型转换(Layerwise casting)。
备注
CPU 卸载和块级分组卸载不能同时开启,但逐层类型转换可以与其中之一配合使用。
CPU 卸载#
CPU 卸载会将模型权重保留在 CPU 上,仅在执行前向传播时才加载到 GPU。适用于显存极其有限的场景,但对性能影响较大。
当使用显存小于 24 GB 的 GPU 时,建议在启动模型时添加 --cpu_offload True。对于 Web UI,可添加额外选项 cpu_offload,值设为 True。
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --cpu_offload True
块级分组卸载#
块级分组卸载将模型的多个内部层(如 torch.nn.ModuleList 或 torch.nn.Sequential)分组,并根据需要在推理过程中将这些分组从 CPU 加载到 GPU。与 CPU 卸载相比,它使用更多的内存,但对性能的影响更小。
对于命令行,添加 --group_offload True 选项;对于 Web UI,添加一个额外选项 group_offload,值设为 True。
通过启用 CUDA 流,我们可以加速分组卸载推理。然而,使用 CUDA 流需要将模型参数移动到固定内存中。这项分配由 Pytorch 在后台处理,并可能导致 CPU RAM 使用量显著增加。如果您的 CPU RAM 至少是模型大小的两倍,请考虑使用此选项。通过在命令行中添加 --use_stream True 启用 CUDA 流;对于 Web UI,添加一个额外选项 use_stream,值设为 True。
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --group_offload True --use_stream True
将逐层类型转换应用于 Transformer#
逐层类型转换将把每个层的权重降级为 torch.float8_e4m3fn,在层的前向传播过程中暂时升级为 torch.bfloat16,然后在之后恢复为 torch.float8_e4m3fn。这种方法将内存需求减少约 50%,同时由于精度折衷,生成的视频质量会略有下降。通过在命令行中添加 --layerwise_cast True 来启用逐层类型转换;对于 Web UI,添加一个额外选项 layerwise_cast,值设为 True。
此示例将需要 20GB 的显存。
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --layerwise_cast True --cpu_offload True