Update api/ltx_server.py
Browse files- api/ltx_server.py +47 -41
api/ltx_server.py
CHANGED
|
@@ -13,7 +13,8 @@ from huggingface_hub import logging
|
|
| 13 |
logging.set_verbosity_error()
|
| 14 |
logging.set_verbosity_warning()
|
| 15 |
logging.set_verbosity_info()
|
| 16 |
-
logging.
|
|
|
|
| 17 |
|
| 18 |
|
| 19 |
LTXV_DEBUG=1
|
|
@@ -399,53 +400,58 @@ class VideoService:
|
|
| 399 |
def _dividir_latentes_em_partes(self, latents_brutos, quantidade: int):
|
| 400 |
"""
|
| 401 |
Divide um tensor de latentes em `quantidade` partes e retorna uma lista de clones.
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
latents_brutos: tensor [B, C, T, H, W]
|
| 405 |
-
quantidade: número de partes que queremos dividir
|
| 406 |
-
|
| 407 |
Returns:
|
| 408 |
List[Tensor]: lista de `quantidade` partes, cada uma cloneada
|
| 409 |
"""
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
|
|
|
|
|
|
| 415 |
|
| 416 |
# calcular tamanho aproximado de cada parte
|
| 417 |
-
step =
|
| 418 |
-
overlap =
|
| 419 |
-
|
|
|
|
|
|
|
|
|
|
| 420 |
for i in range(quantidade):
|
| 421 |
start = i * step
|
| 422 |
end = start + step
|
| 423 |
if i == quantidade - 1:
|
| 424 |
-
end = total
|
| 425 |
else:
|
| 426 |
-
end += overlap
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
|
|
|
|
|
|
| 431 |
|
| 432 |
|
| 433 |
-
def
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
|
|
|
| 449 |
|
| 450 |
def _concat_mp4s_no_reencode(self, mp4_list: List[str], out_path: str):
|
| 451 |
"""
|
|
@@ -654,11 +660,11 @@ class VideoService:
|
|
| 654 |
pass
|
| 655 |
|
| 656 |
# 2) Divide em duas partes
|
| 657 |
-
lat_a, lat_b = self._dividir_latentes(latents_cpu)
|
| 658 |
-
lat_a1, lat_a2 = self._dividir_latentes(lat_a)
|
| 659 |
-
lat_b1, lat_b2 = self._dividir_latentes(lat_b)
|
| 660 |
-
|
| 661 |
-
latents_parts =
|
| 662 |
|
| 663 |
temp_dir = tempfile.mkdtemp(prefix="ltxv_"); self._register_tmp_dir(temp_dir)
|
| 664 |
results_dir = "/app/output"; os.makedirs(results_dir, exist_ok=True)
|
|
|
|
| 13 |
logging.set_verbosity_error()
|
| 14 |
logging.set_verbosity_warning()
|
| 15 |
logging.set_verbosity_info()
|
| 16 |
+
logging.set_verbosity_debu
|
| 17 |
+
g()
|
| 18 |
|
| 19 |
|
| 20 |
LTXV_DEBUG=1
|
|
|
|
| 400 |
def _dividir_latentes_em_partes(self, latents_brutos, quantidade: int):
|
| 401 |
"""
|
| 402 |
Divide um tensor de latentes em `quantidade` partes e retorna uma lista de clones.
|
| 403 |
+
Args: latents_brutos: tensor [B, C, T, H, W]
|
| 404 |
+
quantidade: número de partes que queremos dividir
|
|
|
|
|
|
|
|
|
|
| 405 |
Returns:
|
| 406 |
List[Tensor]: lista de `quantidade` partes, cada uma cloneada
|
| 407 |
"""
|
| 408 |
+
sum_latent = latents_brutos.shape[2] # dimensão temporal (latentes)
|
| 409 |
+
chunks = []
|
| 410 |
+
|
| 411 |
+
# minimo 5 latentes para dividir
|
| 412 |
+
#min = 5
|
| 413 |
+
#if sum_latent < min or sum_latent//quantidade < min :
|
| 414 |
+
# return [latents_brutos.clone()]
|
| 415 |
|
| 416 |
# calcular tamanho aproximado de cada parte
|
| 417 |
+
step = sum_latent // quantidade
|
| 418 |
+
overlap = 1
|
| 419 |
+
|
| 420 |
+
print(f"================PODA CAUSAL=================")
|
| 421 |
+
print(f"[DEBUG] TOTAL LATENTES A DIVIDIR /{quantidade} = {sum_latent}")
|
| 422 |
+
|
| 423 |
for i in range(quantidade):
|
| 424 |
start = i * step
|
| 425 |
end = start + step
|
| 426 |
if i == quantidade - 1:
|
| 427 |
+
end = total
|
| 428 |
else:
|
| 429 |
+
end += overlap
|
| 430 |
+
chunk = latents_brutos[:, :, start:end, :, :].clone()
|
| 431 |
+
chunks.append(chunk)
|
| 432 |
+
chunk_sum = chunk.shape[2]
|
| 433 |
+
print(f"[DEBUG] chunk{i+1}[:, :, start:end, :, :] = {chunk_sum}")
|
| 434 |
+
|
| 435 |
+
return chunks
|
| 436 |
|
| 437 |
|
| 438 |
+
def dividir_latentes(latents_brutos):
|
| 439 |
+
sum_latent = latents_brutos.shape[2] # dimensão temporal (latentes)
|
| 440 |
+
cut1 = sum_latent // 2
|
| 441 |
+
cut2 = sum_latent-cut1-1
|
| 442 |
+
chunk1 = latents_brutos[:, :, :cut1, :, :].clone()
|
| 443 |
+
chunk2 = latents_brutos[:, :, cut2:, :, :].clone()
|
| 444 |
+
chunk1_sum = primeir.shape[2] # dimensão temporal (latentes1)
|
| 445 |
+
chunk2_sum = segunda.shape[2] # dimensão temporal (latentes2)
|
| 446 |
+
|
| 447 |
+
print(f"==============PODA CAUSAL==================")
|
| 448 |
+
print(f"[DEBUG] TOTAL LATENTES A DIVIDIR = {sum_latent}")
|
| 449 |
+
print(f"[DEBUG] chunk1[:, :, :{cut1}, :, :] = {chunk1_sum}")
|
| 450 |
+
print(f"[DEBUG] chunk2[:, :, :{cut2}, :, :] = {chunk2_sum}")
|
| 451 |
+
print(f"===========================================")
|
| 452 |
+
|
| 453 |
+
return primeira, segunda
|
| 454 |
+
|
| 455 |
|
| 456 |
def _concat_mp4s_no_reencode(self, mp4_list: List[str], out_path: str):
|
| 457 |
"""
|
|
|
|
| 660 |
pass
|
| 661 |
|
| 662 |
# 2) Divide em duas partes
|
| 663 |
+
#lat_a, lat_b = self._dividir_latentes(latents_cpu)
|
| 664 |
+
#lat_a1, lat_a2 = self._dividir_latentes(lat_a)
|
| 665 |
+
#lat_b1, lat_b2 = self._dividir_latentes(lat_b)
|
| 666 |
+
#latents_parts = [lat_a1, lat_a2, lat_b1, lat_b2]
|
| 667 |
+
latents_parts = self._dividir_latentes_em_partes(latents_cpu,4)
|
| 668 |
|
| 669 |
temp_dir = tempfile.mkdtemp(prefix="ltxv_"); self._register_tmp_dir(temp_dir)
|
| 670 |
results_dir = "/app/output"; os.makedirs(results_dir, exist_ok=True)
|