影片(實驗性質)#
學習如何使用 Xinference 生成影片
Introduction#
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