mirror of
https://github.com/mudler/LocalAI.git
synced 2026-07-30 09:57:57 -04:00
* fix(backends): choose the protoc generator from the protobuf runtime, and regenerate stubs after late installs The vLLM backends still crash on startup with VersionError: Detected incompatible Protobuf Gencode/Runtime versions when loading backend.proto: gencode 7.35.0 runtime 6.33.6 despite #10735 and #10944. Three separate defects kept it alive. 1. runProtogen picked the generator from the installed *grpcio* version. grpcio-tools' version tracks grpcio, but the gencode its bundled protoc emits tracks *protobuf*, and the two move independently: grpcio-tools 1.82.1 (the version #10735 pins to, matching grpcio 1.82.1) requires protobuf>=7.35.1 and stamps gencode 7.35.0. Pinning to grpcio could therefore never constrain the gencode. Constrain the install to the protobuf already in the venv instead and let the resolver pick the newest compatible grpcio-tools. That both selects a generator the runtime accepts and stops protogen from moving the runtime under the backend's other deps. This is self-correcting, so the hardcoded GRPCIO_TOOLS_VERSION=1.78.0 escape hatch from #10944 is no longer needed and is removed. 2. The stubs were generated too early. Most branches of vllm/install.sh (and vllm-omni) install vllm *after* installRequirements, and vllm re-resolves the protobuf runtime as it lands. Stubs generated against the pre-vllm runtime can end up newer than the runtime that finally ships, which is the ROCm failure exactly. Regenerate once the dependency set is final. 3. rm -f of the .py sources left __pycache__ behind. CPython validates a .pyc against source mtime and size, both of which can be unchanged across a regeneration (the gencode triple is the same width whether it reads 7.35.0 or 6.33.5), so a stale backend_pb2.pyc could shadow the stub just written. Also fail the build when the generated stub cannot be imported, so a gencode/runtime mismatch surfaces at image build time instead of reaching users as an opaque "grpc service not ready". Verified by driving the real runProtogen through the ROCm install sequence in a venv harness: before, gencode 7.35.0 against runtime 6.33.6 (reproducing the reported error verbatim); after, gencode 6.33.5 against runtime 6.33.6 and the stub imports cleanly. Closes #10940 Closes #10718 Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-4-8[1m] [Bash] [Edit] * fix(backends): regenerate protobuf stubs in the other backends that install after installRequirements Same defect as the vllm change: installRequirements generates the stubs at the end of its own run, so any backend that installs further packages afterwards can have the protobuf runtime moved out from under stubs that were already written. The gencode stamped into backend_pb2.py then exceeds the runtime that ships and the backend dies at model load with "grpc service not ready". fish-speech already had this bug and worked around the symptom: it forces protobuf>=5.29.0 after installRequirements precisely because "transitive deps (wandb, tensorboard) may downgrade protobuf to 3.x but our generated backend_pb2.py requires protobuf 5+". Regenerating after the pin addresses the cause rather than propping up the runtime to match stale stubs. Applied to the backends whose post-installRequirements step resolves a dependency graph and can therefore move protobuf: fish-speech -e . plus an explicit protobuf install vibevoice pip install . (with deps) llama-cpp-quantization gguf / GGUF_PIP_SPEC trl gguf / GGUF_PIP_SPEC Deliberately not applied to ace-step and chatterbox (both --no-deps, so the dependency graph cannot change) or voxcpm (pins setuptools only). gguf does not depend on protobuf today, but it resolves dependencies, and "this package does not touch protobuf right now" is exactly the assumption that made the earlier fix ineffective. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-4-8[1m] [Bash] [Edit] * fix(backends): resolve the protoc generator in a throwaway env so it cannot edit the backend's pinned deps Installing grpcio-tools into the backend's own venv to generate the stubs also drags its dependencies in: grpcio-tools 1.82.1 requires grpcio>=1.82.1, so a backend that pinned grpcio==1.78.1 silently shipped 1.82.1 instead. Caught by building the llama-cpp-quantization image and reading the versions back out of the artifact: before grpcio 1.82.1 (requirements.txt pins grpcio==1.78.1) after grpcio 1.78.1 grpcio-tools absent from the venv entirely Resolve the generator in a throwaway environment instead, still constrained to the protobuf the backend ships so the gencode stays compatible. The backend's dependency set is then exactly what its requirements files declared. protoc's output is plain Python and carries no dependency on the interpreter that produced it, so generating from a different env is safe; the import check still runs under the backend's python, since that is the interpreter that has to load the stubs at model load. Verified on the rebuilt image: gencode 7.35.0, runtime protobuf 7.35.1, grpcio back at its pinned 1.78.1, and the shipped stub imports cleanly against 7.35.1. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-4-8[1m] [Bash] [Edit] * fix(backends): bound the protoc generator by BOTH the installed grpcio and protobuf The generated stubs impose two independent constraints, and every fix so far, including the previous commit on this branch, satisfied one while violating the other: backend_pb2.py needs protobuf runtime >= gencode backend_pb2_grpc.py needs installed grpcio >= grpcio-tools Resolving the generator against protobuf alone picked grpcio-tools 1.82.1 for a backend holding grpcio at 1.78.1, so the gencode was fine but the gRPC stub was not: RuntimeError: The grpc package installed is at version 1.78.1, but the generated code in backend_pb2_grpc.py depends on grpcio>=1.82.1. That is also why installing grpcio-tools into the backend venv appeared to work earlier: it dragged grpcio up to match, which was load-bearing rather than the regression it looked like. Isolating the generator removed the accidental fix and exposed the missing constraint. Bound grpcio-tools from both sides instead and let the resolver find the newest version satisfying both. The protobuf ceiling makes it back off to an older generator when the runtime trails, bounding the gencode; the grpcio ceiling keeps the _grpc stub loadable. Resolved against the four real runtime pairs observed in built images: grpcio 1.78.1 / protobuf 7.35.1 -> grpcio-tools 1.78.0, gencode 6.31.1 OK grpcio 1.78.0 / protobuf 6.33.6 -> grpcio-tools 1.78.0, gencode 6.31.1 OK grpcio 1.82.1 / protobuf 6.33.6 -> grpcio-tools 1.81.1, gencode 6.33.5 OK grpcio 1.82.1 / protobuf 7.35.1 -> grpcio-tools 1.82.1, gencode 7.35.0 OK Also restore the import check to cover backend_pb2_grpc as well as backend_pb2. Narrowing it to backend_pb2 is why the image build passed while CI failed: the guard could not see the constraint that was actually broken. Verified by running the CI sequence locally for llama-cpp-quantization, the backend whose test failed: make -C backend/python/llama-cpp-quantization -> exit 0 make -C backend/python/llama-cpp-quantization test -> exit 0, OK Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-4-8[1m] [Bash] [Edit] --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
270 lines
14 KiB
Bash
Executable File
270 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
EXTRA_PIP_INSTALL_FLAGS="--no-build-isolation"
|
|
|
|
# Avoid to overcommit the CPU during build
|
|
# https://github.com/vllm-project/vllm/issues/20079
|
|
# https://docs.vllm.ai/en/v0.8.3/serving/env_vars.html
|
|
# https://docs.redhat.com/it/documentation/red_hat_ai_inference_server/3.0/html/vllm_server_arguments/environment_variables-server-arguments
|
|
export NVCC_THREADS=2
|
|
export MAX_JOBS=1
|
|
|
|
backend_dir=$(dirname $0)
|
|
|
|
if [ -d $backend_dir/common ]; then
|
|
source $backend_dir/common/libbackend.sh
|
|
else
|
|
source $backend_dir/../common/libbackend.sh
|
|
fi
|
|
|
|
# Intel XPU: torch==2.11.0+xpu lives on the PyTorch XPU index, transitive
|
|
# deps on PyPI — unsafe-best-match lets uv mix both. vllm-xpu-kernels only
|
|
# ships a python3.12 wheel per upstream docs, so bump the portable Python
|
|
# before installRequirements (matches the l4t13 pattern below).
|
|
# https://github.com/vllm-project/vllm/blob/main/docs/getting_started/installation/gpu.xpu.inc.md
|
|
if [ "x${BUILD_PROFILE}" == "xintel" ]; then
|
|
PYTHON_VERSION="3.12"
|
|
PYTHON_PATCH="11"
|
|
EXTRA_PIP_INSTALL_FLAGS+=" --index-strategy=unsafe-best-match"
|
|
fi
|
|
|
|
# CPU builds need unsafe-best-match to pull torch==2.10.0+cpu from the
|
|
# pytorch test channel while still resolving transformers/vllm from pypi.
|
|
if [ "x${BUILD_PROFILE}" == "xcpu" ]; then
|
|
EXTRA_PIP_INSTALL_FLAGS+=" --index-strategy=unsafe-best-match"
|
|
fi
|
|
|
|
# AMD ROCm: vLLM ships prebuilt ROCm wheels, but on a DEDICATED index
|
|
# (https://wheels.vllm.ai/rocm/), NOT PyPI, and ONLY for CPython 3.12. On any
|
|
# other Python the installer silently falls back to the CUDA-only PyPI wheel,
|
|
# which is unusable on an AMD GPU (import fails, so the backend never finds the
|
|
# vllm module). Force Python 3.12 before the venv is created (matches the
|
|
# intel/l4t13 cp312 bump); the hipblas branch below pulls vllm from the ROCm
|
|
# wheel index. unsafe-best-match lets uv consult that index and PyPI together.
|
|
# https://docs.vllm.ai/en/latest/getting_started/installation/gpu.html?device=rocm
|
|
if [ "x${BUILD_TYPE}" == "xhipblas" ]; then
|
|
PYTHON_VERSION="3.12"
|
|
PYTHON_PATCH="12"
|
|
PY_STANDALONE_TAG="20251120"
|
|
EXTRA_PIP_INSTALL_FLAGS+=" --index-strategy=unsafe-best-match"
|
|
fi
|
|
|
|
# cublas13 pulls the vLLM wheel from a per-tag cu130 index (PyPI's vllm wheel
|
|
# is built against CUDA 12 and won't load on cu130). uv's default per-package
|
|
# first-match strategy would still pick the PyPI wheel, so allow it to consult
|
|
# every configured index when resolving.
|
|
if [ "x${BUILD_PROFILE}" == "xcublas13" ]; then
|
|
EXTRA_PIP_INSTALL_FLAGS+=" --index-strategy=unsafe-best-match"
|
|
fi
|
|
|
|
# Apple Silicon (Metal/MLX) via vllm-metal.
|
|
# vllm-metal (github.com/vllm-project/vllm-metal) brings vLLM to macOS on Apple
|
|
# Silicon: it registers through vLLM's platform-plugin entry point
|
|
# (metal -> vllm_metal:register), MetalPlatform activates, and the vLLM v1
|
|
# AsyncLLM engine runs on the GPU through MLX. LocalAI's backend.py is UNCHANGED
|
|
# on darwin — AsyncEngineArgs(...) -> AsyncLLMEngine.from_engine_args transparently
|
|
# resolves to the MLX engine (proven on a real M4 / macOS 26.5 against Qwen3-0.6B).
|
|
#
|
|
# vllm-metal REQUIRES Python 3.12, so force the portable CPython before the venv
|
|
# is created (ensureVenv reads PYTHON_VERSION/PYTHON_PATCH/PY_STANDALONE_TAG).
|
|
# The patch + standalone tag mirror the l4t13 cp312 pin — a known-good
|
|
# python-build-standalone release that also ships an aarch64-apple-darwin asset.
|
|
if [ "$(uname -s)" = "Darwin" ]; then
|
|
PYTHON_VERSION="3.12"
|
|
PYTHON_PATCH="12"
|
|
PY_STANDALONE_TAG="20251120"
|
|
fi
|
|
|
|
# JetPack 7 / L4T arm64 vllm + torch wheels come straight from PyPI now
|
|
# (torch 2.11+ ships aarch64 + cu130 manylinux wheels and vllm 0.20+ ships
|
|
# an aarch64 wheel pinned to that torch). They're cp312-only, so bump the
|
|
# venv Python accordingly. JetPack 6 keeps cp310 + USE_PIP=true.
|
|
# https://pytorch.org/blog/vllm-and-pytorch-work-together-to-improve-the-developer-experience-on-aarch64/
|
|
if [ "x${BUILD_PROFILE}" == "xl4t12" ]; then
|
|
USE_PIP=true
|
|
fi
|
|
if [ "x${BUILD_PROFILE}" == "xl4t13" ]; then
|
|
PYTHON_VERSION="3.12"
|
|
PYTHON_PATCH="12"
|
|
PY_STANDALONE_TAG="20251120"
|
|
fi
|
|
|
|
# ===================== Apple Silicon (Metal/MLX) =====================
|
|
# Reproduce vllm-metal's upstream installer
|
|
# (curl -fsSL https://raw.githubusercontent.com/vllm-project/vllm-metal/main/install.sh)
|
|
# but INTO LocalAI's managed venv (ensureVenv) instead of a throwaway
|
|
# ~/.venv-vllm-metal, so the backend integrates with LocalAI's venv lifecycle
|
|
# (portable CPython, _makeVenvPortable relocation, runtime activation). The
|
|
# normal CUDA/CPU installRequirements is skipped on darwin — there is no
|
|
# macOS/arm64 vLLM wheel on PyPI; vLLM is built from source and the MLX engine
|
|
# is layered on by the vllm-metal wheel.
|
|
if [ "$(uname -s)" = "Darwin" ]; then
|
|
# Create/activate the portable 3.12 venv. On darwin USE_PIP=true and
|
|
# PORTABLE_PYTHON=true (set by scripts/build/python-darwin.sh), so this is a
|
|
# `python -m venv` based, relocatable venv.
|
|
ensureVenv
|
|
|
|
# vllm-metal's installer drives everything through `uv`: building vLLM from
|
|
# the CPU requirements needs `--index-strategy unsafe-best-match` (mixes the
|
|
# pytorch CPU channel with PyPI), a flag plain pip does not have. The darwin
|
|
# venv is pip-based, so bootstrap uv into it. uv honours $VIRTUAL_ENV (set by
|
|
# libbackend's _activateVenv) and installs into THIS venv — same pattern the
|
|
# intel branch below relies on.
|
|
pip install uv
|
|
|
|
# The ONLY darwin version pin -- AUTO-BUMPED by .github/bump_vllm_metal.sh,
|
|
# which tracks vllm-project/vllm-metal releases (NOT vllm/vllm latest). Keep
|
|
# it as a plain double-quoted assignment on its own line so the bumper's sed
|
|
# can rewrite it. Darwin therefore follows vllm-metal and can lag the Linux
|
|
# vllm pin (requirements-cublas13-after.txt, bumped independently against
|
|
# vllm/vllm) until vllm-metal supports a newer vLLM.
|
|
VLLM_METAL_VERSION="v0.3.0.dev20260722081849"
|
|
|
|
# The coupled vLLM source version is whatever this vllm-metal release builds
|
|
# against -- it declares it in its own installer as `vllm_v=`. Derive it from
|
|
# the PINNED tag rather than hardcoding a second value that could drift. The
|
|
# tag is immutable, so this stays reproducible across rebuilds.
|
|
VLLM_VERSION=$(curl -fsSL "https://raw.githubusercontent.com/vllm-project/vllm-metal/${VLLM_METAL_VERSION}/install.sh" \
|
|
| grep -oE 'vllm_v="[0-9]+\.[0-9]+\.[0-9]+"' | head -n1 | cut -d'"' -f2)
|
|
if [ -z "${VLLM_VERSION}" ]; then
|
|
echo "ERROR: could not derive the vLLM version from vllm-metal ${VLLM_METAL_VERSION}" >&2
|
|
exit 1
|
|
fi
|
|
echo "vllm-metal ${VLLM_METAL_VERSION} builds against vLLM ${VLLM_VERSION}"
|
|
|
|
_vllm_src=$(mktemp -d)
|
|
trap 'rm -rf "${_vllm_src}"' EXIT
|
|
pushd "${_vllm_src}"
|
|
# 1) Build vLLM ${VLLM_VERSION} from the release source tarball against
|
|
# the CPU requirements. vllm-metal layers its MLX platform plugin on
|
|
# top of this exact build.
|
|
curl -fsSL -o "vllm-${VLLM_VERSION}.tar.gz" \
|
|
"https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}.tar.gz"
|
|
tar -xzf "vllm-${VLLM_VERSION}.tar.gz"
|
|
pushd "vllm-${VLLM_VERSION}"
|
|
uv pip install -r requirements/cpu.txt --index-strategy unsafe-best-match
|
|
# -Wno-parentheses: clang on macOS treats one of vLLM's C++ warnings
|
|
# as an error without it (matches the upstream installer's CXXFLAGS).
|
|
CXXFLAGS="-Wno-parentheses" uv pip install .
|
|
popd
|
|
popd
|
|
|
|
# 2) Install the prebuilt vllm-metal wheel for the PINNED release. It pulls
|
|
# mlx / mlx-metal as deps and registers the `metal` platform plugin that
|
|
# backend.py resolves to at engine-init time. Build the release-asset URL
|
|
# deterministically (tag + the cp312/arm64 wheel name) rather than querying
|
|
# api.github.com, whose unauthenticated rate limit (60/hr per IP) 403s on
|
|
# shared CI runners. The wheel version is the tag without its leading 'v'.
|
|
_metal_wheel="vllm_metal-${VLLM_METAL_VERSION#v}-cp312-cp312-macosx_11_0_arm64.whl"
|
|
_metal_wheel_url="https://github.com/vllm-project/vllm-metal/releases/download/${VLLM_METAL_VERSION}/${_metal_wheel}"
|
|
echo "Installing vllm-metal wheel: ${_metal_wheel_url}"
|
|
uv pip install "${_metal_wheel_url}"
|
|
|
|
# Generate the gRPC stubs (backend_pb2*). installRequirements normally does
|
|
# this via runProtogen at the end; we skipped installRequirements on darwin,
|
|
# so call it explicitly here.
|
|
runProtogen
|
|
|
|
# Intel XPU has no upstream-published vllm wheels, so we always build vllm
|
|
# from source against torch-xpu and replace the default triton with
|
|
# triton-xpu (matching torch 2.11). Mirrors the upstream procedure:
|
|
# https://github.com/vllm-project/vllm/blob/main/docs/getting_started/installation/gpu.xpu.inc.md
|
|
elif [ "x${BUILD_TYPE}" == "xintel" ]; then
|
|
# Hide requirements-intel-after.txt so installRequirements doesn't
|
|
# try `pip install vllm` (would either fail or grab a non-XPU wheel).
|
|
_intel_after="${backend_dir}/requirements-intel-after.txt"
|
|
_intel_after_bak=""
|
|
if [ -f "${_intel_after}" ]; then
|
|
_intel_after_bak="${_intel_after}.xpu.bak"
|
|
mv "${_intel_after}" "${_intel_after_bak}"
|
|
fi
|
|
installRequirements
|
|
if [ -n "${_intel_after_bak}" ]; then
|
|
mv "${_intel_after_bak}" "${_intel_after}"
|
|
fi
|
|
|
|
# vllm's CMake build needs the Intel oneAPI dpcpp/sycl compiler — the
|
|
# base image (intel/oneapi-basekit) has it but the env isn't sourced.
|
|
if [ -f /opt/intel/oneapi/setvars.sh ]; then
|
|
set +u
|
|
source /opt/intel/oneapi/setvars.sh --force
|
|
set -u
|
|
fi
|
|
|
|
_vllm_src=$(mktemp -d)
|
|
trap 'rm -rf "${_vllm_src}"' EXIT
|
|
git clone --depth 1 https://github.com/vllm-project/vllm "${_vllm_src}/vllm"
|
|
pushd "${_vllm_src}/vllm"
|
|
# Install vllm's own runtime deps (torch-xpu, vllm_xpu_kernels,
|
|
# pydantic, fastapi, …) from upstream's requirements/xpu.txt — the
|
|
# canonical source of truth. Avoids re-pinning everything ourselves.
|
|
uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} -r requirements/xpu.txt
|
|
# Stock triton (NVIDIA-only) may have come in transitively; replace
|
|
# with triton-xpu==3.7.0 which matches torch 2.11.
|
|
uv pip uninstall triton triton-xpu 2>/dev/null || true
|
|
uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} \
|
|
--extra-index-url https://download.pytorch.org/whl/xpu \
|
|
triton-xpu==3.7.0
|
|
export CMAKE_PREFIX_PATH="$(python -c 'import site; print(site.getsitepackages()[0])'):${CMAKE_PREFIX_PATH:-}"
|
|
VLLM_TARGET_DEVICE=xpu uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} --no-deps .
|
|
popd
|
|
# AMD ROCm: install vllm from its dedicated ROCm wheel index instead of the
|
|
# CUDA-only PyPI wheel. installRequirements brings the base ROCm
|
|
# torch/transformers (requirements-hipblas.txt), then we pull vllm (plus the
|
|
# matching ROCm torch, via --upgrade) from wheels.vllm.ai/rocm. This is the
|
|
# method upstream prescribes for AMD; the Python-3.12 pin is set above.
|
|
# There is intentionally no requirements-hipblas-after.txt: a bare `vllm`
|
|
# there would resolve to the CUDA wheel, and installRequirements never loads
|
|
# a ${BUILD_TYPE}-after file for hipblas anyway (BUILD_TYPE == BUILD_PROFILE).
|
|
# https://docs.vllm.ai/en/latest/getting_started/installation/gpu.html?device=rocm
|
|
elif [ "x${BUILD_TYPE}" == "xhipblas" ]; then
|
|
installRequirements
|
|
|
|
# --upgrade reconciles the base ROCm torch to whatever the vllm ROCm wheel
|
|
# pins; --extra-index-url adds the ROCm wheel repository on top of PyPI.
|
|
uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} \
|
|
--extra-index-url https://wheels.vllm.ai/rocm/ --upgrade vllm
|
|
# FROM_SOURCE=true on a CPU build skips the prebuilt vllm wheel in
|
|
# requirements-cpu-after.txt and compiles vllm locally against the host's
|
|
# actual CPU. Not used by default because it takes ~30-40 minutes, but
|
|
# kept here for hosts where the prebuilt wheel SIGILLs (CPU without the
|
|
# required SIMD baseline, e.g. AVX-512 VNNI/BF16). Default CI uses a
|
|
# bigger-runner with compatible hardware instead.
|
|
elif [ "x${BUILD_TYPE}" == "x" ] && [ "x${FROM_SOURCE:-}" == "xtrue" ]; then
|
|
# Temporarily hide the prebuilt wheel so installRequirements doesn't
|
|
# pull it — the rest of the requirements files (base deps, torch,
|
|
# transformers) are still installed normally.
|
|
_cpu_after="${backend_dir}/requirements-cpu-after.txt"
|
|
_cpu_after_bak=""
|
|
if [ -f "${_cpu_after}" ]; then
|
|
_cpu_after_bak="${_cpu_after}.from-source.bak"
|
|
mv "${_cpu_after}" "${_cpu_after_bak}"
|
|
fi
|
|
installRequirements
|
|
if [ -n "${_cpu_after_bak}" ]; then
|
|
mv "${_cpu_after_bak}" "${_cpu_after}"
|
|
fi
|
|
|
|
# Build vllm from source against the installed torch.
|
|
# https://docs.vllm.ai/en/latest/getting_started/installation/cpu/
|
|
_vllm_src=$(mktemp -d)
|
|
trap 'rm -rf "${_vllm_src}"' EXIT
|
|
git clone --depth 1 https://github.com/vllm-project/vllm "${_vllm_src}/vllm"
|
|
pushd "${_vllm_src}/vllm"
|
|
uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} wheel packaging ninja "setuptools>=49.4.0" numpy typing-extensions pillow setuptools-scm
|
|
# Respect pre-installed torch version — skip vllm's own requirements-build.txt torch pin.
|
|
VLLM_TARGET_DEVICE=cpu uv pip install ${EXTRA_PIP_INSTALL_FLAGS:-} --no-deps .
|
|
popd
|
|
else
|
|
installRequirements
|
|
fi
|
|
|
|
# installRequirements generates the protobuf stubs at the end of its own run, but
|
|
# most branches above install vllm *after* it, and vllm re-resolves the protobuf
|
|
# runtime when it lands. Stubs generated against the pre-vllm runtime can end up
|
|
# newer than the runtime that finally ships, which is exactly the gencode 7.35.0 /
|
|
# runtime 6.33.6 crash in mudler/LocalAI#10718. Regenerate once the dependency set
|
|
# is final; runProtogen clears the previous stubs first, so this is idempotent.
|
|
runProtogen
|