install_offline_env.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/bin/sh
  2. # Install the bundled Kylin ARM64 CPU wheels into a new project environment.
  3. set -eu
  4. if [ "$#" -ne 1 ]; then
  5. echo 'Usage: sh install_offline_env.sh /absolute/project/path' >&2
  6. exit 2
  7. fi
  8. case "$1" in
  9. /*) PROJECT_ROOT=$1 ;;
  10. *) echo 'Project path must be absolute.' >&2; exit 2 ;;
  11. esac
  12. case "$0" in
  13. */*) BUNDLE_DIR=${0%/*} ;;
  14. *) BUNDLE_DIR=. ;;
  15. esac
  16. BUNDLE_DIR=$(CDPATH= cd -- "$BUNDLE_DIR" && pwd)
  17. PROJECT_ROOT=$(CDPATH= cd -- "$PROJECT_ROOT" && pwd)
  18. [ -f "$PROJECT_ROOT/pyproject.toml" ] && [ -f "$PROJECT_ROOT/uv.lock" ] || {
  19. echo 'Project pyproject.toml and uv.lock are required.' >&2
  20. exit 1
  21. }
  22. [ ! -e "$PROJECT_ROOT/.venv" ] || {
  23. echo 'Project .venv already exists; inspect it before retrying.' >&2
  24. exit 1
  25. }
  26. PYTHON_BIN=${PYTHON_BIN:-python3.14}
  27. command -v "$PYTHON_BIN" >/dev/null 2>&1 || {
  28. echo 'Python 3.14 is required; set PYTHON_BIN to its executable path if needed.' >&2
  29. exit 1
  30. }
  31. "$PYTHON_BIN" - <<'PY'
  32. import platform
  33. import sys
  34. import sysconfig
  35. libc, version = platform.libc_ver()
  36. if (sys.version_info[:2] != (3, 14) or platform.machine().lower() != 'aarch64'
  37. or libc != 'glibc' or tuple(map(int, version.split('.')[:2])) < (2, 28)
  38. or sysconfig.get_config_var('Py_GIL_DISABLED')):
  39. raise SystemExit('Requires standard CPython 3.14 on aarch64 with glibc >= 2.28.')
  40. print('Target Python and platform preflight passed.')
  41. PY
  42. (cd "$BUNDLE_DIR" && sha256sum -c SHA256SUMS >/dev/null)
  43. echo 'Bundle SHA256 checks passed.'
  44. chmod +x "$BUNDLE_DIR/uv"
  45. export UV_CACHE_DIR="$PROJECT_ROOT/.uv-cache"
  46. export UV_LINK_MODE=copy
  47. "$BUNDLE_DIR/uv" --no-config --offline venv --no-python-downloads \
  48. --python "$(command -v "$PYTHON_BIN")" "$PROJECT_ROOT/.venv"
  49. "$BUNDLE_DIR/uv" --no-config --offline pip install \
  50. --python "$PROJECT_ROOT/.venv/bin/python" --no-index \
  51. --find-links "$BUNDLE_DIR/wheelhouse" \
  52. --requirement "$BUNDLE_DIR/requirements-arm64-cpu.txt"
  53. "$BUNDLE_DIR/uv" --no-config --offline pip check \
  54. --python "$PROJECT_ROOT/.venv/bin/python"
  55. "$PROJECT_ROOT/.venv/bin/python" "$PROJECT_ROOT/scripts/check-runtime.py"
  56. "$PROJECT_ROOT/.venv/bin/python" -c \
  57. 'import torch, transformers, pymilvus, redis, langgraph, starlette, uvicorn; print("torch:", torch.__version__, "cuda:", torch.cuda.is_available())'
  58. HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
  59. "$PROJECT_ROOT/.venv/bin/python" "$PROJECT_ROOT/scripts/deploy_models.py" --check-only
  60. echo 'Offline Python environment and local model checks passed.'