mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-15 04:40:40 -07:00
The distributed macOS aarch64 binary shipped without MLX acceleration despite the model and backend code supporting it. Two root causes: 1. **OSError not caught in platform_detect.py** PyInstaller bundles isolate the filesystem, so when MLX tries to load its Metal shader libraries (.metallib) it raises OSError, not ImportError. platform_detect.get_backend_type() only caught ImportError, causing a silent fallback to PyTorch even on Apple Silicon hardware. Fix: broaden the except clause to (ImportError, OSError, RuntimeError) and import mlx.core instead of mlx (forces native lib loading eagerly). 2. **collect_data_files used instead of collect_all for MLX** build_binary.py and voicebox-server.spec used --collect-data / collect_data_files for mlx and mlx_audio. This copies Python source and pure-Python data, but NOT native shared libraries (.dylib, .metallib). Fix: switch to --collect-all / collect_all which captures binaries too, then pass them to Analysis(binaries=...) in the spec. Result: macOS Apple Silicon users now get MLX inference (~4-5x faster than PyTorch CPU), matching the performance documented in the README.
36 lines
1000 B
Python
36 lines
1000 B
Python
"""
|
|
Platform detection for backend selection.
|
|
"""
|
|
|
|
import platform
|
|
from typing import Literal
|
|
|
|
|
|
def is_apple_silicon() -> bool:
|
|
"""
|
|
Check if running on Apple Silicon (arm64 macOS).
|
|
|
|
Returns:
|
|
True if on Apple Silicon, False otherwise
|
|
"""
|
|
return platform.system() == "Darwin" and platform.machine() == "arm64"
|
|
|
|
|
|
def get_backend_type() -> Literal["mlx", "pytorch"]:
|
|
"""
|
|
Detect the best backend for the current platform.
|
|
|
|
Returns:
|
|
"mlx" on Apple Silicon (if MLX is available and functional), "pytorch" otherwise
|
|
"""
|
|
if is_apple_silicon():
|
|
try:
|
|
import mlx.core # noqa: F401 — triggers native lib loading
|
|
return "mlx"
|
|
except (ImportError, OSError, RuntimeError):
|
|
# MLX not installed, or native libraries failed to load inside a
|
|
# PyInstaller bundle (OSError on missing .dylib / .metallib).
|
|
# Fall through to PyTorch.
|
|
return "pytorch"
|
|
return "pytorch"
|