trellis-2-mrp-mlx/scripts/setup_macos.sh

119 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PYTHON_BIN="${PYTHON_BIN:-python3.11}"
VENV_DIR="${VENV_DIR:-$ROOT/.venv}"
DEPS_DIR="${TRELLIS_DEPS_DIR:-$HOME/.cache/trellis2/source-deps}"
PRIMARY_TORCH="2.13.0"
PRIMARY_TORCHVISION="0.28.0"
FALLBACK_TORCH="2.11.0"
FALLBACK_TORCHVISION="0.26.0"
MTLGEMM_SHA="867aec8234299a7fe1ede7f802c8debe5a939a82"
MTLDIFFRAST_SHA="4668cd91cb6d27f5e264731f94a06841fbf7aab8"
MTLBVH_SHA="23f441c470ce1f537e1fd836f3ffb5b8245f7975"
MTLMESH_SHA="212079e55772cff3d648a21372392c37e0643f3b"
if [[ "$(uname -s)" != "Darwin" || "$(uname -m)" != "arm64" ]]; then
echo "ERROR: this installer supports Apple Silicon macOS only" >&2
exit 2
fi
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
echo "ERROR: Python 3.11 is required (set PYTHON_BIN if it is installed elsewhere)" >&2
exit 2
fi
if ! "$PYTHON_BIN" -c 'import sys; raise SystemExit(sys.version_info[:2] != (3, 11))'; then
echo "ERROR: $PYTHON_BIN is not Python 3.11" >&2
exit 2
fi
if [[ "${SKIP_METAL:-0}" != "1" ]] && ! xcrun --find metal >/dev/null 2>&1; then
echo "Metal Toolchain is missing; downloading the matching Xcode component..."
xcodebuild -downloadComponent MetalToolchain
fi
if [[ ! -d "$VENV_DIR" ]]; then
"$PYTHON_BIN" -m venv "$VENV_DIR"
fi
PYTHON="$VENV_DIR/bin/python"
PIP=("$PYTHON" -m pip)
"${PIP[@]}" install --upgrade 'pip==26.0.1' 'setuptools==80.9.0' 'wheel==0.46.3' 'ninja==1.13.0' 'pybind11==3.0.1'
"${PIP[@]}" install -r "$ROOT/requirements_macos_core.txt"
install_torch_pair() {
local torch_version="$1"
local torchvision_version="$2"
"${PIP[@]}" uninstall -y torch torchvision mtldiffrast mtlbvh cumesh flex_gemm o_voxel >/dev/null 2>&1 || true
"${PIP[@]}" install "torch==$torch_version" "torchvision==$torchvision_version"
}
checkout_dependency() {
local name="$1"
local url="$2"
local revision="$3"
local destination="$DEPS_DIR/$name-$revision"
local attempt
if [[ -d "$destination/.git" ]] && [[ "$(git -C "$destination" rev-parse HEAD)" == "$revision" ]]; then
DEP_PATH="$destination"
return 0
fi
mkdir -p "$DEPS_DIR"
for attempt in 1 2 3; do
rm -rf "$destination"
if git -c http.version=HTTP/1.1 clone --filter=blob:none "$url" "$destination" \
&& git -C "$destination" -c http.version=HTTP/1.1 fetch --depth 1 origin "$revision" \
&& git -C "$destination" switch --detach "$revision" \
&& git -C "$destination" -c http.version=HTTP/1.1 submodule update --init --recursive; then
DEP_PATH="$destination"
return 0
fi
echo "Dependency checkout failed ($name, attempt $attempt/3); retrying..." >&2
done
echo "ERROR: failed to checkout pinned dependency $name@$revision" >&2
return 1
}
install_metal_stack() {
export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-12.0}"
checkout_dependency mtlbvh https://github.com/pedronaugusto/mtlbvh.git "$MTLBVH_SHA"
"${PIP[@]}" install --no-build-isolation "$DEP_PATH"
checkout_dependency mtldiffrast https://github.com/pedronaugusto/mtldiffrast.git "$MTLDIFFRAST_SHA"
"${PIP[@]}" install --no-build-isolation "$DEP_PATH"
checkout_dependency mtlmesh https://github.com/pedronaugusto/mtlmesh.git "$MTLMESH_SHA"
"${PIP[@]}" install --no-build-isolation "$DEP_PATH"
checkout_dependency mtlgemm https://github.com/pedronaugusto/mtlgemm.git "$MTLGEMM_SHA"
"${PIP[@]}" install --no-build-isolation "$DEP_PATH"
BUILD_TARGET=cpu "${PIP[@]}" install --no-build-isolation -e "$ROOT/o-voxel"
}
install_torch_pair "$PRIMARY_TORCH" "$PRIMARY_TORCHVISION"
resolved_torch="$PRIMARY_TORCH"
resolved_torchvision="$PRIMARY_TORCHVISION"
if [[ "${SKIP_METAL:-0}" == "1" ]]; then
BUILD_TARGET=cpu "${PIP[@]}" install --no-build-isolation -e "$ROOT/o-voxel"
else
install_metal_stack
if ! "$PYTHON" "$ROOT/scripts/probe_macos.py" --require-metal; then
echo "Primary PyTorch pair failed the Metal build/probe; retrying the prescribed ABI fallback..." >&2
install_torch_pair "$FALLBACK_TORCH" "$FALLBACK_TORCHVISION"
install_metal_stack
"$PYTHON" "$ROOT/scripts/probe_macos.py" --require-metal
resolved_torch="$FALLBACK_TORCH"
resolved_torchvision="$FALLBACK_TORCHVISION"
fi
fi
"${PIP[@]}" check
"$PYTHON" "$ROOT/scripts/probe_macos.py"
echo
echo "TRELLIS.2 Apple environment is ready."
echo " source $VENV_DIR/bin/activate"
echo " torch==$resolved_torch torchvision==$resolved_torchvision"
if ! "$PYTHON" -c 'from huggingface_hub import get_token; raise SystemExit(not bool(get_token()))' 2>/dev/null; then
echo " Hugging Face auth is missing: run '$VENV_DIR/bin/hf auth login' before downloading gated weights."
fi