203 lines
5.8 KiB
Bash
203 lines
5.8 KiB
Bash
#!/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 "========================================="
|