#!/bin/bash # Complete script to build llama.cpp with Vulkan support and upload to Gitea # This script installs dependencies, builds libraries, packages them, and uploads # # Usage: # export GITEA_TOKEN='your-token' # Or will prompt for credentials # ./scripts/build_and_upload_vulkan_libs.sh set -e # Configuration LLAMA_CPP_COMMIT="d3248d9b6557c75d59954c594bb53cf517591e91" # b6173 release BUILD_DIR="/tmp/llama-cpp-build" OUTPUT_DIR="/root/models" PACKAGE_NAME="llama-cpp-python-v0.3.16-vulkan-libs.tar" GITEA_URL="https://git.nielsgeens.be/api/packages/llm/generic/llama-cpp-python/v0.3.16-vulkan/libs.tar" echo "=========================================" echo "Build & Upload Vulkan Libraries" echo "=========================================" echo "" echo "This will:" echo " 1. Install build dependencies (Vulkan SDK, glslc)" echo " 2. Build llama.cpp with Vulkan support" echo " 3. Package the libraries" echo " 4. Upload to Gitea" echo "" # ============================================================================= # STEP 1: Install build dependencies # ============================================================================= echo "Step 1/5: Installing build dependencies..." echo "" # Check if we have the newer Vulkan SDK if ! dpkg -l | grep -q vulkan-sdk; then echo "Installing LunarG Vulkan SDK..." wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | apt-key add - wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list \ https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list apt-get update apt-get install -y vulkan-sdk echo "✓ Vulkan SDK installed" else echo "✓ Vulkan SDK already installed" fi # Check if glslc is available if ! command -v glslc &> /dev/null; then echo "Building shaderc for glslc..." cd /tmp git clone --depth 1 --branch v2024.3 https://github.com/google/shaderc.git cd shaderc python3 ./utils/git-sync-deps mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DSHADERC_SKIP_TESTS=ON .. make -j$(nproc) glslc_exe cp ./glslc/glslc /usr/local/bin/ rm -rf /tmp/shaderc echo "✓ glslc installed" else echo "✓ glslc already installed at $(which glslc)" fi # ============================================================================= # STEP 2: Build llama.cpp with Vulkan # ============================================================================= mkdir -p "$BUILD_DIR" mkdir -p "$OUTPUT_DIR" cd "$BUILD_DIR" echo "" echo "Step 2/5: Building llama.cpp with Vulkan..." echo "" if [ ! -d "llama.cpp" ]; then git clone https://github.com/ggml-org/llama.cpp.git fi cd llama.cpp git fetch origin "$LLAMA_CPP_COMMIT" git checkout "$LLAMA_CPP_COMMIT" mkdir -p build cd build # Set Vulkan environment to use CPU fallback (LavaPipe) export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json cmake .. \ -DGGML_VULKAN=ON \ -DGGML_VULKAN_VALIDATE=OFF \ -DGGML_VULKAN_RUN_TESTS=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON echo "" echo "Building (this takes ~30-60 minutes)..." echo "Started at: $(date)" make -j$(nproc) echo "Completed at: $(date)" # ============================================================================= # STEP 3: Package the libraries # ============================================================================= echo "" echo "Step 3/5: Packaging libraries..." echo "" STAGING_DIR="/tmp/llama-cpp-libs-staging" mkdir -p "$STAGING_DIR" # Copy all shared libraries find "$BUILD_DIR/llama.cpp/build" -name "*.so*" -type f -exec cp -v {} "$STAGING_DIR/" \; echo "" echo "Libraries to package:" ls -lh "$STAGING_DIR/" # Verify Vulkan library is present if [ -f "$STAGING_DIR/libggml-vulkan.so" ]; then VULKAN_SIZE=$(ls -lh "$STAGING_DIR/libggml-vulkan.so" | awk '{print $5}') echo "" echo "✓ Vulkan backend library found! (size: $VULKAN_SIZE)" else echo "" echo "✗ ERROR: Vulkan backend library NOT found!" exit 1 fi # Create tar package cd "$STAGING_DIR" tar -cvf "$OUTPUT_DIR/$PACKAGE_NAME" *.so* echo "" echo "Package created:" ls -lh "$OUTPUT_DIR/$PACKAGE_NAME" # Cleanup build directory rm -rf "$BUILD_DIR" rm -rf "$STAGING_DIR" # ============================================================================= # STEP 4: Verify package # ============================================================================= echo "" echo "Step 4/5: Verifying package..." echo "" tar -tf "$OUTPUT_DIR/$PACKAGE_NAME" # ============================================================================= # STEP 5: Upload to Gitea # ============================================================================= echo "" echo "Step 5/5: Uploading to Gitea..." echo "" PACKAGE_PATH="$OUTPUT_DIR/$PACKAGE_NAME" PACKAGE_SIZE=$(ls -lh "$PACKAGE_PATH" | awk '{print $5}') echo "Package: $PACKAGE_PATH" echo "Size: $PACKAGE_SIZE" echo "URL: $GITEA_URL" echo "" # Check for authentication if [ -z "$GITEA_TOKEN" ]; then echo "GITEA_TOKEN not set. Please provide credentials:" read -p "Username: " GITEA_USER read -s -p "Password: " GITEA_PASS echo "" # Upload with username/password curl -X PUT \ --upload-file "$PACKAGE_PATH" \ --user "$GITEA_USER:$GITEA_PASS" \ "$GITEA_URL" \ --fail \ --show-error \ --progress-bar else # Upload with token curl -X PUT \ --upload-file "$PACKAGE_PATH" \ -H "Authorization: token $GITEA_TOKEN" \ "$GITEA_URL" \ --fail \ --show-error \ --progress-bar fi echo "" echo "=========================================" echo "SUCCESS!" echo "=========================================" echo "" echo "Package uploaded to:" echo " $GITEA_URL" echo "" echo "The Dockerfile will automatically download this file" echo "during container build." echo "========================================="