| 1 | #!/bin/bash |
| 2 | set -e # Exit immediately if a command exits with a non-zero status. |
| 3 | # Script to build VLLM wheel for TPU with an optional version override. |
| 4 | |
| 5 | SCRIPT_PATH_PARAM="$0" |
| 6 | TOOLS_DIR=$(cd "$(dirname "$SCRIPT_PATH_PARAM")" && pwd) # Absolute path to the script's directory |
| 7 | REPO_ROOT=$(cd "$TOOLS_DIR/../../" && pwd) # Absolute path to the repo root |
| 8 | VLLM_DIR="$REPO_ROOT/" # Path to the vllm sources |
| 9 | |
| 10 | CHANGE_FILE_LIST=( |
| 11 | "vllm/entrypoints/cli/main.py" |
| 12 | "vllm/entrypoints/cli/run_batch.py" |
| 13 | "vllm/utils/__init__.py" |
| 14 | "vllm/platforms/__init__.py" |
| 15 | ) |
| 16 | |
| 17 | # Ensure we are not running from within the vllm directory if SCRIPT_PATH_PARAM is relative like "." |
| 18 | if [ "$TOOLS_DIR" = "$VLLM_DIR" ]; then |
| 19 | echo "Error: This script should not be run from the vllm directory directly if using relative paths." |
| 20 | echo "Place it in a subdirectory like 'tools/vllm-tpu' and run it from the repository root or via its full path." |
| 21 | exit 1 |
| 22 | fi |
| 23 | |
| 24 | # Optional version argument |
| 25 | if [ -n "$1" ]; then |
| 26 | USER_VERSION="$1" |
| 27 | export VLLM_VERSION_OVERRIDE="$USER_VERSION" |
| 28 | echo "User defined version: $USER_VERSION" |
| 29 | else |
| 30 | echo "No version override supplied. Using default version from source." |
| 31 | fi |
| 32 | |
| 33 | PYPROJECT_FILE="$VLLM_DIR/pyproject.toml" |
| 34 | |
| 35 | # Backup and update the project name. |
| 36 | if ! grep -q "name = \"vllm-tpu\"" "$PYPROJECT_FILE"; then |
| 37 | echo "Patching pyproject.toml project name to vllm-tpu..." |
| 38 | cp "$PYPROJECT_FILE" "${PYPROJECT_FILE}.bak" |
| 39 | sed -i '0,/^name = "vllm"/s//name = "vllm-tpu"/' "$PYPROJECT_FILE" |
| 40 | |
| 41 | echo "Patching ${CHANGE_FILE_LIST[*]} vllm to vllm-tpu..." |
| 42 | # patching |
| 43 | # importlib.metadata.version('vllm') -> importlib.metadata.version('vllm-tpu') |
| 44 | # importlib.metadata.version("vllm") -> importlib.metadata.version("vllm-tpu") |
| 45 | # importlib.metadata.metadata('vllm') -> importlib.metadata.metadata('vllm-tpu') |
| 46 | # importlib.metadata.metadata("vllm") -> importlib.metadata.metadata("vllm-tpu") |
| 47 | # version('vllm') -> version('vllm-tpu') |
| 48 | # version("vllm") -> version("vllm-tpu") |
| 49 | sed -i \ |
| 50 | -e "s/importlib.metadata.version(\(['\"]\)vllm\1)/importlib.metadata.version(\1vllm-tpu\1)/" \ |
| 51 | -e "s/importlib.metadata.metadata(\(['\"]\)vllm\1)/importlib.metadata.metadata(\1vllm-tpu\1)/" \ |
| 52 | -e "s/version(\(['\"]\)vllm\1)/version(\1vllm-tpu\1)/" \ |
| 53 | "${CHANGE_FILE_LIST[@]}" |
| 54 | PATCHED=true |
| 55 | else |
| 56 | PATCHED=false |
| 57 | fi |
| 58 | |
| 59 | # Navigate to the vllm directory |
| 60 | cd "$VLLM_DIR" |
| 61 | |
| 62 | # Cleanup function to be called on exit or error |
| 63 | cleanup() { |
| 64 | echo "Cleaning up..." |
| 65 | if [ "$PATCHED" = true ]; then |
| 66 | echo "Restoring original pyproject.toml..." |
| 67 | cp "${PYPROJECT_FILE}.bak" "$PYPROJECT_FILE" |
| 68 | rm -f "${PYPROJECT_FILE}.bak" |
| 69 | |
| 70 | echo "Restoring vllm code..." |
| 71 | sed -i \ |
| 72 | -e "s/importlib.metadata.version(\(['\"]\)vllm-tpu\1)/importlib.metadata.version(\1vllm\1)/" \ |
| 73 | -e "s/importlib.metadata.metadata(\(['\"]\)vllm-tpu\1)/importlib.metadata.metadata(\1vllm\1)/" \ |
| 74 | -e "s/version(\(['\"]\)vllm-tpu\1)/version(\1vllm\1)/" \ |
| 75 | "${CHANGE_FILE_LIST[@]}" |
| 76 | fi |
| 77 | } |
| 78 | trap cleanup EXIT HUP INT QUIT PIPE TERM # Register cleanup function to run on script exit and various signals |
| 79 | |
| 80 | echo "Updating pyproject.toml completed. Proceeding with build..." |
| 81 | |
| 82 | echo "Install dependencies for no-isolation build" |
| 83 | pip install -r "$VLLM_DIR/requirements/build/tpu.txt" |
| 84 | |
| 85 | echo "Building wheel for TPU..." |
| 86 | rm -rf dist/ |
| 87 | mkdir -p dist/ |
| 88 | |
| 89 | # User confirmed to use 'python -m build' directly |
| 90 | if ! VLLM_TARGET_DEVICE=tpu python -m build --no-isolation; then |
| 91 | echo "Error: Python build command failed. Check if 'python -m build' works and the 'build' module is installed." |
| 92 | exit 1 |
| 93 | fi |
| 94 | |
| 95 | trap - EXIT HUP INT QUIT PIPE TERM |
| 96 | cleanup |
| 97 | |
| 98 | exit 0 |