/ install.sh
install.sh
1 #!/usr/bin/env bash 2 set -euo pipefail 3 4 # brane installer 5 # Usage: ./install.sh [--big] 6 7 BIG=false 8 for arg in "$@"; do 9 case $arg in 10 --big) BIG=true ;; 11 -h|--help) 12 echo "Usage: ./install.sh [--big]" 13 echo "" 14 echo "Install brane and its dependencies." 15 echo "" 16 echo "Options:" 17 echo " --big Also pull the 30B model (~19GB download, needs 24GB+ VRAM)" 18 echo " -h Show this help" 19 exit 0 20 ;; 21 *) 22 echo "Unknown option: $arg" 23 exit 1 24 ;; 25 esac 26 done 27 28 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 29 VENV_DIR="$SCRIPT_DIR/.venv" 30 31 info() { echo -e "\033[1;34m==>\033[0m \033[1m$1\033[0m"; } 32 ok() { echo -e "\033[1;32m==>\033[0m \033[1m$1\033[0m"; } 33 err() { echo -e "\033[1;31m==>\033[0m \033[1m$1\033[0m" >&2; } 34 35 # --- Check prerequisites --- 36 37 info "Checking prerequisites..." 38 39 if ! command -v python3 &>/dev/null; then 40 err "Python 3 is required but not found." 41 err "Install it with: sudo apt install python3 python3-venv" 42 exit 1 43 fi 44 45 PYTHON_VERSION=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") 46 PYTHON_MAJOR=$(echo "$PYTHON_VERSION" | cut -d. -f1) 47 PYTHON_MINOR=$(echo "$PYTHON_VERSION" | cut -d. -f2) 48 49 if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 12 ]; }; then 50 err "Python 3.12+ is required (found $PYTHON_VERSION)." 51 exit 1 52 fi 53 54 if ! command -v nvidia-smi &>/dev/null; then 55 err "NVIDIA GPU drivers not found. brane requires an NVIDIA GPU." 56 exit 1 57 fi 58 59 GPU_MEM=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1) 60 if [ "$GPU_MEM" -lt 8000 ]; then 61 err "GPU has ${GPU_MEM}MB VRAM. The 8B model needs at least 8GB." 62 exit 1 63 fi 64 65 ok "Prerequisites met: Python $PYTHON_VERSION, ${GPU_MEM}MB VRAM" 66 67 # --- Install Ollama --- 68 69 if command -v ollama &>/dev/null; then 70 ok "Ollama already installed: $(ollama --version)" 71 else 72 info "Installing Ollama..." 73 curl -fsSL https://ollama.com/install.sh | sudo sh 74 ok "Ollama installed: $(ollama --version)" 75 fi 76 77 # Wait for Ollama to be ready 78 if ! ollama list &>/dev/null 2>&1; then 79 info "Starting Ollama service..." 80 if command -v systemctl &>/dev/null && systemctl is-enabled ollama &>/dev/null 2>&1; then 81 sudo systemctl start ollama 82 else 83 ollama serve &>/dev/null & 84 sleep 2 85 fi 86 fi 87 88 # --- Pull models --- 89 90 info "Pulling Qwen3-VL 8B model (~6GB)..." 91 ollama pull qwen3-vl:8b 92 93 if [ "$BIG" = true ]; then 94 info "Pulling Qwen3-VL 30B model (~19GB)..." 95 ollama pull qwen3-vl:30b 96 fi 97 98 # --- Set up Python environment --- 99 100 info "Creating virtual environment..." 101 102 if [ -d "$VENV_DIR" ]; then 103 info "Existing .venv found, reusing it." 104 else 105 python3 -m venv "$VENV_DIR" 106 fi 107 108 info "Installing brane..." 109 110 if command -v uv &>/dev/null; then 111 uv pip install --python "$VENV_DIR/bin/python" -e "$SCRIPT_DIR" 112 else 113 "$VENV_DIR/bin/pip" install --upgrade pip 114 "$VENV_DIR/bin/pip" install -e "$SCRIPT_DIR" 115 fi 116 117 # --- Verify --- 118 119 if "$VENV_DIR/bin/brane" --help &>/dev/null; then 120 ok "brane installed successfully!" 121 else 122 err "Installation failed. Check the output above for errors." 123 exit 1 124 fi 125 126 # --- Print usage instructions --- 127 128 SHELL_RC="" 129 if [ -n "${BASH_VERSION:-}" ] || [ "$(basename "$SHELL")" = "bash" ]; then 130 SHELL_RC="$HOME/.bashrc" 131 elif [ -n "${ZSH_VERSION:-}" ] || [ "$(basename "$SHELL")" = "zsh" ]; then 132 SHELL_RC="$HOME/.zshrc" 133 fi 134 135 echo "" 136 ok "Done! To use brane, either:" 137 echo "" 138 echo " 1. Activate the virtual environment:" 139 echo " source $VENV_DIR/bin/activate" 140 echo "" 141 echo " 2. Or add it to your PATH permanently:" 142 if [ -n "$SHELL_RC" ]; then 143 echo " echo 'export PATH=\"$VENV_DIR/bin:\$PATH\"' >> $SHELL_RC" 144 echo " source $SHELL_RC" 145 else 146 echo " Add $VENV_DIR/bin to your PATH" 147 fi 148 echo "" 149 echo " 3. Or run it directly:" 150 echo " $VENV_DIR/bin/brane image.png" 151 echo "" 152 echo " Try it out:" 153 echo " brane --help"