Switch to Vulkan
This commit is contained in:
202
scripts/build_and_upload_vulkan_libs.sh
Normal file
202
scripts/build_and_upload_vulkan_libs.sh
Normal file
@@ -0,0 +1,202 @@
|
||||
#!/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 "========================================="
|
||||
@@ -25,7 +25,6 @@ docker run \
|
||||
--init \
|
||||
--rm \
|
||||
-ti \
|
||||
--gpus=all \
|
||||
-p 8080:8080 \
|
||||
-p 8000:8000 \
|
||||
--env-file .env \
|
||||
|
||||
Reference in New Issue
Block a user