/ 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"