Vídeo (experimental)#
Aprende a usar Xinference para generar videos
Introducción#
La API de Video proporciona una forma de interactuar con el video:
El endpoint de texto a video crea un video a partir de un prompt de texto desde cero.
El punto final de imagen a video crea un video desde una imagen desde cero.
La interfaz firstlastframe-to-video genera un video basado en la transición entre el primer y el último fotograma.
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 |
Lista de modelos compatibles#
La API de texto a video en Xinference admite los siguientes modelos:
La API de imagen a video en Xinference admite los siguientes modelos:
En Xinference, se admiten los siguientes modelos para usar la interfaz firstlastframe-to-video:
Guía de inicio rápido#
Generación de video a partir de texto#
Puedes probar a usar la API de text-to-video mediante cURL o Xinference.
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)
Traducción: Figura a video#
Puede probar la API de image-to-video mediante cURL o Xinference.
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)
Video de inicio y fin de cuadros#
Puedes probar la interfaz firstlastframe-to-video mediante cURL o el cliente Python de Xinference:
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)
Optimización de memoria#
La generación de video consume una gran cantidad de memoria de video. Por ejemplo, ejecutar CogVideoX puede utilizar aproximadamente 35 GB de memoria de video.
Xinference soporta varias opciones para optimizar el uso de la memoria de video (VRAM) de los modelos de video.
Descarga de CPU o descarga de agrupación a nivel de bloques.
Conversión por capas (Layerwise casting).
Nota
La descarga de CPU y la descarga por agrupación a nivel de bloque no pueden activarse simultáneamente, pero la conversión de tipos por capas puede utilizarse junto con una de ellas.
Descarga de CPU#
La descarga en CPU mantiene los pesos del modelo en la CPU, cargándolos a la GPU solo cuando se ejecuta la propagación hacia adelante. Es adecuada para escenarios con memoria de video extremadamente limitada, pero tiene un gran impacto en el rendimiento.
Al usar una GPU con menos de 24 GB de memoria de video, se recomienda añadir --cpu_offload True al iniciar el modelo. Para la interfaz web, puede agregar la opción adicional cpu_offload con el valor True.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --cpu_offload True
Descarga de agrupación a nivel de bloque#
La descarga por bloques agrupa múltiples capas internas del modelo (como torch.nn.ModuleList o torch.nn.Sequential) y, según sea necesario, carga estos grupos desde la CPU a la GPU durante la inferencia. En comparación con la descarga desde la CPU, utiliza más memoria, pero tiene un menor impacto en el rendimiento.
Para la línea de comandos, agregue la opción --group_offload True; para la interfaz web, agregue una opción adicional group_offload con el valor establecido en True.
Al habilitar flujos de CUDA, podemos acelerar la inferencia de descarga por grupos. Sin embargo, usar flujos de CUDA requiere mover los parámetros del modelo a memoria fija. Esta asignación es manejada por PyTorch en segundo plano y puede provocar un aumento significativo en el uso de RAM de la CPU. Si su RAM de CPU es al menos el doble del tamaño del modelo, considere usar esta opción. Habilite los flujos de CUDA agregando --use_stream True en la línea de comandos; para la interfaz web, agregue una opción adicional use_stream con el valor True.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --group_offload True --use_stream True
Aplicar la conversión de tipo capa por capa al Transformer.#
La conversión de tipos por capas degradará los pesos de cada capa a torch.float8_e4m3fn, los actualizará temporalmente a torch.bfloat16 durante el avance de la capa, y luego los restaurará a torch.float8_e4m3fn. Este método reduce los requisitos de memoria aproximadamente en un 50%, aunque la calidad del video generado disminuirá ligeramente debido a la compensación de precisión. Para habilitar la conversión de tipos por capas, agregue --layerwise_cast True en la línea de comandos; para la interfaz web, añada una opción adicional layerwise_cast con el valor True.
Este ejemplo requerirá 20 GB de memoria de video.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --layerwise_cast True --cpu_offload True