mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-10-04 01:25:18 -07:00
fix: complete Intel XPU support — device-aware seeding, GPU status reporting, and setup detection
Address CodeRabbit review feedback and user-reported GPU acceleration failure: - Use shared manual_seed() in chatterbox, chatterbox_turbo, and luxtts backends so XPU (and future accelerators) get proper device seeding - Add XPU branch to _get_gpu_status() so startup log reports Intel Arc GPUs instead of 'None (CPU only)' - Add XPU VRAM reporting and correct backend_variant fallback in the /health endpoint - Switch justfile GPU detection from Get-WmiObject to Get-CimInstance, simplify the Arc regex to match 'Arc' (not 'Intel.*Arc'), log detected GPUs, and print manual install instructions on miss Resolves the root cause where IPEX was silently not installed due to WMI detection failure, causing CPU-only fallback on Intel Arc systems.
This commit is contained in:
@@ -155,6 +155,20 @@ def _get_gpu_status() -> str:
|
|||||||
return "MPS (Apple Silicon)"
|
return "MPS (Apple Silicon)"
|
||||||
elif backend_type == "mlx":
|
elif backend_type == "mlx":
|
||||||
return "Metal (Apple Silicon via MLX)"
|
return "Metal (Apple Silicon via MLX)"
|
||||||
|
|
||||||
|
# Intel XPU (Arc / Data Center) via IPEX
|
||||||
|
try:
|
||||||
|
import intel_extension_for_pytorch # noqa: F401
|
||||||
|
|
||||||
|
if hasattr(torch, "xpu") and torch.xpu.is_available():
|
||||||
|
try:
|
||||||
|
xpu_name = torch.xpu.get_device_name(0)
|
||||||
|
except Exception:
|
||||||
|
xpu_name = "Intel GPU"
|
||||||
|
return f"XPU ({xpu_name})"
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
return "None (CPU only)"
|
return "None (CPU only)"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from .base import (
|
|||||||
is_model_cached,
|
is_model_cached,
|
||||||
get_torch_device,
|
get_torch_device,
|
||||||
empty_device_cache,
|
empty_device_cache,
|
||||||
|
manual_seed,
|
||||||
combine_voice_prompts as _combine_voice_prompts,
|
combine_voice_prompts as _combine_voice_prompts,
|
||||||
model_load_progress,
|
model_load_progress,
|
||||||
patch_chatterbox_f32,
|
patch_chatterbox_f32,
|
||||||
@@ -198,7 +199,7 @@ class ChatterboxTTSBackend:
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
if seed is not None:
|
if seed is not None:
|
||||||
torch.manual_seed(seed)
|
manual_seed(seed, self._device)
|
||||||
|
|
||||||
logger.info(f"[Chatterbox] Generating: lang={language}")
|
logger.info(f"[Chatterbox] Generating: lang={language}")
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from .base import (
|
|||||||
is_model_cached,
|
is_model_cached,
|
||||||
get_torch_device,
|
get_torch_device,
|
||||||
empty_device_cache,
|
empty_device_cache,
|
||||||
|
manual_seed,
|
||||||
combine_voice_prompts as _combine_voice_prompts,
|
combine_voice_prompts as _combine_voice_prompts,
|
||||||
model_load_progress,
|
model_load_progress,
|
||||||
patch_chatterbox_f32,
|
patch_chatterbox_f32,
|
||||||
@@ -179,7 +180,7 @@ class ChatterboxTurboTTSBackend:
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
if seed is not None:
|
if seed is not None:
|
||||||
torch.manual_seed(seed)
|
manual_seed(seed, self._device)
|
||||||
|
|
||||||
logger.info("[Chatterbox Turbo] Generating (English)")
|
logger.info("[Chatterbox Turbo] Generating (English)")
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from .base import (
|
|||||||
is_model_cached,
|
is_model_cached,
|
||||||
get_torch_device,
|
get_torch_device,
|
||||||
empty_device_cache,
|
empty_device_cache,
|
||||||
|
manual_seed,
|
||||||
combine_voice_prompts as _combine_voice_prompts,
|
combine_voice_prompts as _combine_voice_prompts,
|
||||||
model_load_progress,
|
model_load_progress,
|
||||||
)
|
)
|
||||||
@@ -163,12 +164,8 @@ class LuxTTSBackend:
|
|||||||
await self.load_model()
|
await self.load_model()
|
||||||
|
|
||||||
def _generate_sync():
|
def _generate_sync():
|
||||||
import torch
|
|
||||||
|
|
||||||
if seed is not None:
|
if seed is not None:
|
||||||
torch.manual_seed(seed)
|
manual_seed(seed, self.device)
|
||||||
if torch.cuda.is_available():
|
|
||||||
torch.cuda.manual_seed(seed)
|
|
||||||
|
|
||||||
wav = self.model.generate_speech(
|
wav = self.model.generate_speech(
|
||||||
text=text,
|
text=text,
|
||||||
|
|||||||
@@ -110,6 +110,11 @@ async def health():
|
|||||||
vram_used = None
|
vram_used = None
|
||||||
if has_cuda:
|
if has_cuda:
|
||||||
vram_used = torch.cuda.memory_allocated() / 1024 / 1024
|
vram_used = torch.cuda.memory_allocated() / 1024 / 1024
|
||||||
|
elif has_xpu:
|
||||||
|
try:
|
||||||
|
vram_used = torch.xpu.memory_allocated() / 1024 / 1024
|
||||||
|
except Exception:
|
||||||
|
pass # memory_allocated() may not be available on all IPEX versions
|
||||||
|
|
||||||
model_loaded = False
|
model_loaded = False
|
||||||
model_size = None
|
model_size = None
|
||||||
@@ -162,7 +167,10 @@ async def health():
|
|||||||
gpu_type=gpu_type,
|
gpu_type=gpu_type,
|
||||||
vram_used_mb=vram_used,
|
vram_used_mb=vram_used,
|
||||||
backend_type=backend_type,
|
backend_type=backend_type,
|
||||||
backend_variant=os.environ.get("VOICEBOX_BACKEND_VARIANT", "cuda" if torch.cuda.is_available() else "cpu"),
|
backend_variant=os.environ.get(
|
||||||
|
"VOICEBOX_BACKEND_VARIANT",
|
||||||
|
"cuda" if torch.cuda.is_available() else ("xpu" if has_xpu else "cpu"),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,10 @@ setup-python:
|
|||||||
}
|
}
|
||||||
Write-Host "Installing Python dependencies..."
|
Write-Host "Installing Python dependencies..."
|
||||||
& "{{ python }}" -m pip install --upgrade pip -q
|
& "{{ python }}" -m pip install --upgrade pip -q
|
||||||
$hasNvidia = $null -ne (Get-WmiObject Win32_VideoController | Where-Object { $_.Name -match 'NVIDIA' })
|
$gpus = Get-CimInstance Win32_VideoController | Select-Object -ExpandProperty Name
|
||||||
$hasIntelArc = $null -ne (Get-WmiObject Win32_VideoController | Where-Object { $_.Name -match 'Intel.*Arc' })
|
Write-Host "Detected GPUs: $($gpus -join ', ')"
|
||||||
|
$hasNvidia = ($gpus | Where-Object { $_ -match 'NVIDIA' }).Count -gt 0
|
||||||
|
$hasIntelArc = ($gpus | Where-Object { $_ -match 'Arc' }).Count -gt 0
|
||||||
if ($hasNvidia) { \
|
if ($hasNvidia) { \
|
||||||
Write-Host "NVIDIA GPU detected — installing PyTorch with CUDA support..."; \
|
Write-Host "NVIDIA GPU detected — installing PyTorch with CUDA support..."; \
|
||||||
& "{{ pip }}" install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128; \
|
& "{{ pip }}" install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128; \
|
||||||
@@ -78,6 +80,11 @@ setup-python:
|
|||||||
Write-Host "Intel Arc GPU detected — installing PyTorch with XPU support..."; \
|
Write-Host "Intel Arc GPU detected — installing PyTorch with XPU support..."; \
|
||||||
& "{{ pip }}" install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu; \
|
& "{{ pip }}" install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu; \
|
||||||
& "{{ pip }}" install intel-extension-for-pytorch --index-url https://download.pytorch.org/whl/xpu; \
|
& "{{ pip }}" install intel-extension-for-pytorch --index-url https://download.pytorch.org/whl/xpu; \
|
||||||
|
} else { \
|
||||||
|
Write-Host "No NVIDIA or Intel Arc GPU detected — using CPU-only PyTorch."; \
|
||||||
|
Write-Host "If you have an Intel Arc GPU, install XPU support manually:"; \
|
||||||
|
Write-Host " pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu"; \
|
||||||
|
Write-Host " pip install intel-extension-for-pytorch --index-url https://download.pytorch.org/whl/xpu"; \
|
||||||
}
|
}
|
||||||
& "{{ pip }}" install -r {{ backend_dir }}/requirements.txt
|
& "{{ pip }}" install -r {{ backend_dir }}/requirements.txt
|
||||||
& "{{ pip }}" install --no-deps chatterbox-tts
|
& "{{ pip }}" install --no-deps chatterbox-tts
|
||||||
|
|||||||
Reference in New Issue
Block a user