File size: 6,098 Bytes
5708ff2
589f3a0
 
 
5708ff2
5c9a178
e315cad
5708ff2
589f3a0
5708ff2
589f3a0
81c97ab
 
 
 
 
 
a1ddb51
 
81c97ab
 
 
 
 
 
90ea438
 
81c97ab
90ea438
e315cad
 
 
 
 
 
 
 
81c97ab
 
e315cad
 
 
 
 
 
 
 
 
 
 
33e5da6
589f3a0
 
81c97ab
 
 
 
 
589f3a0
 
81c97ab
 
 
 
 
 
589f3a0
 
 
 
5c9a178
589f3a0
 
5c9a178
81c97ab
589f3a0
5c9a178
589f3a0
 
81c97ab
 
589f3a0
 
 
 
81c97ab
5708ff2
81c97ab
a1ddb51
 
 
 
 
81c97ab
e315cad
81c97ab
a1ddb51
81c97ab
 
 
 
e315cad
81c97ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5708ff2
589f3a0
81c97ab
 
589f3a0
d3b0ec8
81c97ab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/bin/bash
set -e

# --- Configuration ---
BLENDER_VERSION="4.2.0"
BLENDER_MAJOR_MINOR="4.2"
BLENDER_PYTHON_VERSION="python3.11" # Should match the -dev package (e.g., python3.11-dev)
BLENDER_TARBALL="blender-${BLENDER_VERSION}-linux-x64.tar.xz"
BLENDER_URL="https://download.blender.org/release/Blender${BLENDER_MAJOR_MINOR}/blender-${BLENDER_VERSION}-linux-x64.tar.xz"
INSTALL_DIR="/opt/blender-${BLENDER_VERSION}-linux-x64"
BLENDER_PY_EXEC="${INSTALL_DIR}/${BLENDER_MAJOR_MINOR}/python/bin/${BLENDER_PYTHON_VERSION}"

# Path to your Gradio Space's unirig_requirements.txt (copy of UniRig's official)
UNIRIG_REQS_FILE_IN_SPACE="/home/user/app/unirig_requirements.txt"
# Path to the cloned UniRig repository in the Space
UNIRIG_REPO_CLONE_DIR="/home/user/app/UniRig" # Standard path

TORCH_VERSION="2.3.1"
TORCHVISION_VERSION="0.18.1"
NUMPY_VERSION="1.26.4"
TARGET_CUDA_VERSION_SHORT="cu121" # Verify ZeroGPU environment.

TORCH_INDEX_URL="https://download.pytorch.org/whl/${TARGET_CUDA_VERSION_SHORT}"
PYG_FIND_LINKS_URL="https://data.pyg.org/whl/torch-${TORCH_VERSION}+${TARGET_CUDA_VERSION_SHORT}.html"
SPCONV_PACKAGE="spconv-${TARGET_CUDA_VERSION_SHORT}"

# --- Set Environment Variables for Build ---
export CUDA_HOME=${CUDA_HOME:-/usr/local/cuda}
export PATH="${CUDA_HOME}/bin:${PATH}"
export MAX_JOBS=4 # For compilation processes like flash-attn
# ** FIX: Explicitly add Python 3.11 include path for C/C++ header files **
# This assumes python3.11-dev is installed via packages.txt, providing headers here.
PYTHON_INCLUDE_DIR="/usr/include/python${BLENDER_PYTHON_VERSION#python}" # Extracts "3.11" from "python3.11"
export CPATH="${PYTHON_INCLUDE_DIR}:${CPATH}"
export C_INCLUDE_PATH="${PYTHON_INCLUDE_DIR}:${C_INCLUDE_PATH}"
export CPLUS_INCLUDE_PATH="${PYTHON_INCLUDE_DIR}:${CPLUS_INCLUDE_PATH}"

echo "Using CUDA_HOME=${CUDA_HOME}"
echo "Updated PATH: ${PATH}"
echo "CPATH set to: ${CPATH}"
echo "C_INCLUDE_PATH set to: ${C_INCLUDE_PATH}"
echo "CPLUS_INCLUDE_PATH set to: ${CPLUS_INCLUDE_PATH}"
echo "Expected Python include directory: ${PYTHON_INCLUDE_DIR}"
# Check if the Python.h file actually exists where we expect it
if [ -f "${PYTHON_INCLUDE_DIR}/Python.h" ]; then
    echo "Found Python.h at ${PYTHON_INCLUDE_DIR}/Python.h"
else
    echo "WARNING: Python.h NOT FOUND at ${PYTHON_INCLUDE_DIR}/Python.h. Ensure python${BLENDER_PYTHON_VERSION#python}-dev is in packages.txt and installed."
fi


# --- Download and Extract Blender ---
echo "Downloading Blender ${BLENDER_VERSION}..."
if [ ! -f "/tmp/${BLENDER_TARBALL}" ]; then
    wget -nv -O /tmp/${BLENDER_TARBALL} ${BLENDER_URL}
else
    echo "Blender tarball /tmp/${BLENDER_TARBALL} already downloaded."
fi

echo "Extracting Blender to ${INSTALL_DIR}..."
if [ ! -d "${INSTALL_DIR}/${BLENDER_MAJOR_MINOR}" ]; then
    mkdir -p /opt
    tar -xJf /tmp/${BLENDER_TARBALL} -C /opt
else
    echo "Blender already extracted to ${INSTALL_DIR}."
fi
echo "Extraction complete."

# --- Create Blender Symlink ---
echo "Creating symlink for Blender executable..."
ln -sf ${INSTALL_DIR}/blender /usr/local/bin/blender
echo "Symlink created."

# --- Install Dependencies into Blender's Python ---
echo "Installing dependencies into Blender's Python (${BLENDER_PY_EXEC})..."
if [ ! -f "${BLENDER_PY_EXEC}" ]; then
    echo "ERROR: Blender Python executable not found at ${BLENDER_PY_EXEC}!"
    exit 1
fi
if [ ! -f "${UNIRIG_REQS_FILE_IN_SPACE}" ]; then
    echo "ERROR: UniRig requirements file not found at ${UNIRIG_REQS_FILE_IN_SPACE}!"
    exit 1
fi

echo "Upgrading pip for Blender Python..."
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir --upgrade pip setuptools wheel

echo "1. Installing PyTorch ${TORCH_VERSION} and Torchvision ${TORCHVISION_VERSION}..."
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir \
    torch==${TORCH_VERSION} \
    torchvision==${TORCHVISION_VERSION} \
    --index-url ${TORCH_INDEX_URL}

echo "2. Installing dependencies from ${UNIRIG_REQS_FILE_IN_SPACE} (includes bpy, flash_attn)..."
# flash-attn compilation might also benefit from CPATH
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir -r "${UNIRIG_REQS_FILE_IN_SPACE}"

echo "3. Installing ${SPCONV_PACKAGE}..."
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir ${SPCONV_PACKAGE}

echo "4. Installing torch-scatter and torch-cluster..."
# The CPATH, C_INCLUDE_PATH, CPLUS_INCLUDE_PATH set above should help this step
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir \
    torch-scatter \
    torch-cluster \
    -f "${PYG_FIND_LINKS_URL}"

echo "5. Installing numpy==${NUMPY_VERSION}..."
"${BLENDER_PY_EXEC}" -m pip install --no-cache-dir numpy==${NUMPY_VERSION}

echo "Dependency installation for Blender's Python complete."

# --- FIX: Ensure UniRig/src is treated as a package ---
UNIRIG_SRC_DIR="${UNIRIG_REPO_CLONE_DIR}/src"
INIT_PY_PATH="${UNIRIG_SRC_DIR}/__init__.py"
if [ -d "${UNIRIG_SRC_DIR}" ]; then
  if [ ! -f "${INIT_PY_PATH}" ]; then
    echo "Creating missing __init__.py in ${UNIRIG_SRC_DIR} to make it a package..."
    touch "${INIT_PY_PATH}"
    echo "__init__.py created."
  else
    echo "${INIT_PY_PATH} already exists."
  fi
else
  echo "WARNING: UniRig src directory not found at ${UNIRIG_SRC_DIR}. Cannot create __init__.py."
fi
# --- END FIX ---

# (Optional) VRM Addon installation
VRM_ADDON_REL_PATH="blender/add-on-vrm-v2.20.77_modified.zip"
ABSOLUTE_ADDON_PATH="${UNIRIG_REPO_CLONE_DIR}/${VRM_ADDON_REL_PATH}"
if [ -f "${ABSOLUTE_ADDON_PATH}" ]; then
    echo "Installing optional VRM addon for Blender..."
    (cd "${UNIRIG_REPO_CLONE_DIR}" && \
     "${BLENDER_PY_EXEC}" -c "import bpy, os; bpy.ops.preferences.addon_install(overwrite=True, filepath=os.path.abspath('${VRM_ADDON_REL_PATH}')); bpy.ops.preferences.addon_enable(module='io_scene_vrm'); print('VRM Addon installed and enabled.')")
    echo "VRM addon installation attempted."
else
    echo "VRM addon zip not found at ${ABSOLUTE_ADDON_PATH}, skipping addon installation."
fi

# --- Cleanup ---
echo "Cleaning up downloaded Blender tarball..."
rm -f /tmp/${BLENDER_TARBALL}
echo "Cleanup complete."
echo "Blender setup finished successfully."