Video (sperimentale)#
Impara come utilizzare Xinference per generare video
introduzione#
Le API Video forniscono un modo per interagire con i video:
L’endpoint text-to-video crea un video da zero a partire da un prompt testuale.
L’endpoint image-to-video crea un video a partire da un’immagine.
L’interfaccia firstlastframe-to-video genera un video basato sulla transizione tra il primo fotogramma e l’ultimo fotogramma.
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 |
Elenco dei modelli supportati#
L’API text-to-video in Xinference supporta i seguenti modelli:
L’API Image-to-video in Xinference supporta i seguenti modelli:
In Xinference sono supportati i seguenti modelli per l’interfaccia «firstlastframe-to-video»:
Guida rapida#
Traduzione: generazione di video da testo.#
Puoi provare ad utilizzare l’API text-to-video tramite 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)
Generazione di video da immagini#
È possibile provare a utilizzare l’API image-to-video tramite 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 di generazione dei fotogrammi di inizio e fine#
Puoi testare l’interfaccia firstlastframe-to-video tramite cURL o il client Python di 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)
Ottimizzazione della memoria#
La generazione di video occupa una grande quantità di memoria video; ad esempio, l’esecuzione di CogVideoX può utilizzare circa 35 GB di memoria video.
Xinference supporta diverse opzioni per ottimizzare l’uso della memoria VRAM nei modelli video.
Scaricamento CPU o scaricamento a livello di blocco.
Conversione del tipo a livello di layer (Layerwise casting).
Nota
Lo scarico della CPU e lo scarico a livello di blocco non possono essere attivati contemporaneamente, ma la conversione del tipo strato per strato può essere utilizzata in combinazione con uno di essi.
Scaricamento CPU#
La scarica della CPU mantiene i pesi del modello sulla CPU, caricandoli sulla GPU solo durante la propagazione in avanti. È adatta per scenari con memoria video estremamente limitata, ma ha un impatto significativo sulle prestazioni.
Quando si utilizza una GPU con VRAM inferiore a 24 GB, si consiglia di aggiungere --cpu_offload True all’avvio del modello. Per l’interfaccia Web UI, è possibile aggiungere l’opzione aggiuntiva cpu_offload con valore impostato su True.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --cpu_offload True
Scaricamento del raggruppamento a livello di blocco#
Il raggruppamento a livello di blocco raggruppa più livelli interni del modello (come torch.nn.ModuleList o torch.nn.Sequential) e, durante l’inferenza, carica questi gruppi dalla CPU alla GPU secondo necessità. Rispetto allo scaricamento sulla CPU, utilizza più memoria ma ha un impatto minore sulle prestazioni.
Per la riga di comando, aggiungere l’opzione --group_offload True; per l’interfaccia Web UI, aggiungere un’opzione aggiuntiva group_offload con valore impostato su True.
Abilitando CUDA stream, possiamo accelerare l’inferenza di offload in batch. Tuttavia, l’uso di CUDA stream richiede di spostare i parametri del modello nella memoria fissa. Questa allocazione viene gestita da PyTorch in background e può comportare un aumento significativo dell’utilizzo della RAM della CPU. Se la tua RAM della CPU è almeno il doppio delle dimensioni del modello, valuta di utilizzare questa opzione. Per abilitare CUDA stream, aggiungi --use_stream True nella riga di comando; per l’interfaccia Web UI, aggiungi un’opzione aggiuntiva use_stream con valore True.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --group_offload True --use_stream True
Applica la conversione del tipo layer per layer al Transformer#
La conversione per layer degrada i pesi di ogni layer a torch.float8_e4m3fn, li promuove temporaneamente a torch.bfloat16 durante la forward propagation del layer, e successivamente li ripristina a torch.float8_e4m3fn. Questo metodo riduce i requisiti di memoria di circa il 50%, ma comporta una leggera diminuzione della qualità video generata a causa del compromesso sulla precisione. Per abilitare la conversione per layer, aggiungi --layerwise_cast True alla riga di comando; per l’interfaccia Web UI, aggiungi un’opzione aggiuntiva layerwise_cast con valore True.
Questo esempio richiederà 20GB di VRAM.
xinference launch --model-name Wan2.1-i2v-14B-480p --model-type video --layerwise_cast True --cpu_offload True