mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-06-28 02:53:30 +00:00
# What does this PR do? When building providers in a virtual environment or containers, special pip dependencies may not always be provided (e.g., for Ollama). The check should only fail if the required number of arguments is missing. Currently, two arguments are mandatory: 1. Environment name 2. Pip dependencies Additionally, return statements were replaced with sys.exit(1) in error conditions to ensure immediate termination on critical failures. Error handling in the stack build process was also improved to guarantee the program exits with status 1 when facing configuration issues or build failures. Signed-off-by: Sébastien Han <seb@redhat.com> [//]: # (If resolving an issue, uncomment and update the line below) [//]: # (Closes #[issue-number]) ## Test Plan This command shouldn't fail: ``` llama stack build --template ollama --image-type venv ``` [//]: # (## Documentation) Signed-off-by: Sébastien Han <seb@redhat.com>
152 lines
4.8 KiB
Bash
Executable file
152 lines
4.8 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
# the root directory of this source tree.
|
|
|
|
# TODO: combine this with build_conda_env.sh since it is almost identical
|
|
# the only difference is that we don't do any conda-specific setup
|
|
|
|
LLAMA_MODELS_DIR=${LLAMA_MODELS_DIR:-}
|
|
LLAMA_STACK_DIR=${LLAMA_STACK_DIR:-}
|
|
TEST_PYPI_VERSION=${TEST_PYPI_VERSION:-}
|
|
# This timeout (in seconds) is necessary when installing PyTorch via uv since it's likely to time out
|
|
# Reference: https://github.com/astral-sh/uv/pull/1694
|
|
UV_HTTP_TIMEOUT=${UV_HTTP_TIMEOUT:-500}
|
|
UV_SYSTEM_PYTHON=${UV_SYSTEM_PYTHON:-}
|
|
VIRTUAL_ENV=${VIRTUAL_ENV:-}
|
|
|
|
if [ -n "$LLAMA_STACK_DIR" ]; then
|
|
echo "Using llama-stack-dir=$LLAMA_STACK_DIR"
|
|
fi
|
|
if [ -n "$LLAMA_MODELS_DIR" ]; then
|
|
echo "Using llama-models-dir=$LLAMA_MODELS_DIR"
|
|
fi
|
|
|
|
if [ "$#" -lt 2 ]; then
|
|
echo "Usage: $0 <distribution_type> <env_name> <pip_dependencies> [<special_pip_deps>]" >&2
|
|
echo "Example: $0 <distribution_type> mybuild ./my-stack-build.yaml 'numpy pandas scipy'" >&2
|
|
exit 1
|
|
fi
|
|
|
|
special_pip_deps="$3"
|
|
|
|
set -euo pipefail
|
|
|
|
env_name="$1"
|
|
pip_dependencies="$2"
|
|
|
|
# Define color codes
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# this is set if we actually create a new conda in which case we need to clean up
|
|
ENVNAME=""
|
|
|
|
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
|
|
source "$SCRIPT_DIR/common.sh"
|
|
|
|
# pre-run checks to make sure we can proceed with the installation
|
|
pre_run_checks() {
|
|
local env_name="$1"
|
|
|
|
if ! is_command_available uv; then
|
|
echo "uv is not installed, trying to install it."
|
|
if ! is_command_available pip; then
|
|
echo "pip is not installed, cannot automatically install 'uv'."
|
|
echo "Follow this link to install it:"
|
|
echo "https://docs.astral.sh/uv/getting-started/installation/"
|
|
exit 1
|
|
else
|
|
pip install uv
|
|
fi
|
|
fi
|
|
|
|
# checking if an environment with the same name already exists
|
|
if [ -d "$env_name" ]; then
|
|
echo "Environment '$env_name' already exists, re-using it."
|
|
fi
|
|
}
|
|
|
|
run() {
|
|
local env_name="$1"
|
|
local pip_dependencies="$2"
|
|
local special_pip_deps="$3"
|
|
|
|
if [ -n "$UV_SYSTEM_PYTHON" ] || [ "$env_name" == "__system__" ]; then
|
|
echo "Installing dependencies in system Python environment"
|
|
# if env == __system__, ensure we set UV_SYSTEM_PYTHON
|
|
export UV_SYSTEM_PYTHON=1
|
|
elif [ "$VIRTUAL_ENV" == "$env_name" ]; then
|
|
echo "Virtual environment $env_name is already active"
|
|
else
|
|
echo "Using virtual environment $env_name"
|
|
uv venv "$env_name"
|
|
# shellcheck source=/dev/null
|
|
source "$env_name/bin/activate"
|
|
fi
|
|
|
|
if [ -n "$TEST_PYPI_VERSION" ]; then
|
|
# these packages are damaged in test-pypi, so install them first
|
|
uv pip install fastapi libcst
|
|
# shellcheck disable=SC2086
|
|
# we are building a command line so word splitting is expected
|
|
uv pip install --extra-index-url https://test.pypi.org/simple/ \
|
|
--index-strategy unsafe-best-match \
|
|
llama-models=="$TEST_PYPI_VERSION" llama-stack=="$TEST_PYPI_VERSION" \
|
|
$pip_dependencies
|
|
if [ -n "$special_pip_deps" ]; then
|
|
IFS='#' read -ra parts <<<"$special_pip_deps"
|
|
for part in "${parts[@]}"; do
|
|
echo "$part"
|
|
# shellcheck disable=SC2086
|
|
# we are building a command line so word splitting is expected
|
|
uv pip install $part
|
|
done
|
|
fi
|
|
else
|
|
# Re-installing llama-stack in the new virtual environment
|
|
if [ -n "$LLAMA_STACK_DIR" ]; then
|
|
if [ ! -d "$LLAMA_STACK_DIR" ]; then
|
|
printf "${RED}Warning: LLAMA_STACK_DIR is set but directory does not exist: %s${NC}\n" "$LLAMA_STACK_DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
printf "Installing from LLAMA_STACK_DIR: %s\n" "$LLAMA_STACK_DIR"
|
|
uv pip install --no-cache-dir -e "$LLAMA_STACK_DIR"
|
|
else
|
|
uv pip install --no-cache-dir llama-stack
|
|
fi
|
|
|
|
if [ -n "$LLAMA_MODELS_DIR" ]; then
|
|
if [ ! -d "$LLAMA_MODELS_DIR" ]; then
|
|
printf "${RED}Warning: LLAMA_MODELS_DIR is set but directory does not exist: %s${NC}\n" "$LLAMA_MODELS_DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
printf "Installing from LLAMA_MODELS_DIR: %s\n" "$LLAMA_MODELS_DIR"
|
|
uv pip uninstall llama-models
|
|
uv pip install --no-cache-dir -e "$LLAMA_MODELS_DIR"
|
|
fi
|
|
|
|
# Install pip dependencies
|
|
printf "Installing pip dependencies\n"
|
|
# shellcheck disable=SC2086
|
|
# we are building a command line so word splitting is expected
|
|
uv pip install $pip_dependencies
|
|
if [ -n "$special_pip_deps" ]; then
|
|
IFS='#' read -ra parts <<<"$special_pip_deps"
|
|
for part in "${parts[@]}"; do
|
|
echo "$part"
|
|
# shellcheck disable=SC2086
|
|
# we are building a command line so word splitting is expected
|
|
uv pip install $part
|
|
done
|
|
fi
|
|
fi
|
|
}
|
|
|
|
pre_run_checks "$env_name"
|
|
run "$env_name" "$pip_dependencies" "$special_pip_deps"
|