diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3d67cf5fa..6211d265f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -372,6 +372,9 @@ jobs: outputs: type=local,dest=dist/${{ matrix.os }}-${{ matrix.arch }} cache-from: type=registry,ref=${{ vars.DOCKER_REPO }}:latest cache-to: type=inline + - name: Deduplicate CUDA libraries + run: | + ./scripts/deduplicate_cuda_libs.sh dist/${{ matrix.os }}-${{ matrix.arch }} - run: | for COMPONENT in bin/* lib/ollama/*; do case "$COMPONENT" in diff --git a/scripts/build_linux.sh b/scripts/build_linux.sh index 11b278cbd..e06ba38b5 100755 --- a/scripts/build_linux.sh +++ b/scripts/build_linux.sh @@ -48,53 +48,12 @@ if echo $PLATFORM | grep "amd64" > /dev/null; then . fi -# Deduplicate CUDA libraries across mlx_* and cuda_* directories -deduplicate_cuda_libs() { - local base_dir="$1" - echo "Deduplicating CUDA libraries in ${base_dir}..." - - # Find all mlx_cuda_* directories - for mlx_dir in "${base_dir}"/lib/ollama/mlx_cuda_*; do - [ -d "${mlx_dir}" ] || continue - - # Extract CUDA version (e.g., v12, v13) - cuda_version=$(basename "${mlx_dir}" | sed 's/mlx_cuda_//') - cuda_dir="${base_dir}/lib/ollama/cuda_${cuda_version}" - - # Skip if corresponding cuda_* directory doesn't exist - [ -d "${cuda_dir}" ] || continue - - echo " Checking ${mlx_dir} against ${cuda_dir}..." - - # Find all .so* files in mlx directory - find "${mlx_dir}" -type f -name "*.so*" | while read mlx_file; do - filename=$(basename "${mlx_file}") - cuda_file="${cuda_dir}/${filename}" - - # Skip if file doesn't exist in cuda directory - [ -f "${cuda_file}" ] || continue - - # Compare checksums - mlx_sum=$(sha256sum "${mlx_file}" | awk '{print $1}') - cuda_sum=$(sha256sum "${cuda_file}" | awk '{print $1}') - - if [ "${mlx_sum}" = "${cuda_sum}" ]; then - echo " Deduplicating ${filename}" - # Calculate relative path from mlx_dir to cuda_dir - rel_path="../cuda_${cuda_version}/${filename}" - rm -f "${mlx_file}" - ln -s "${rel_path}" "${mlx_file}" - fi - done - done -} - # Run deduplication for each platform output directory if echo $PLATFORM | grep "," > /dev/null ; then - deduplicate_cuda_libs "./dist/linux_amd64" - deduplicate_cuda_libs "./dist/linux_arm64" + $(dirname $0)/deduplicate_cuda_libs.sh "./dist/linux_amd64" + $(dirname $0)/deduplicate_cuda_libs.sh "./dist/linux_arm64" elif echo $PLATFORM | grep "amd64\|arm64" > /dev/null ; then - deduplicate_cuda_libs "./dist" + $(dirname $0)/deduplicate_cuda_libs.sh "./dist" fi # buildx behavior changes for single vs. multiplatform diff --git a/scripts/deduplicate_cuda_libs.sh b/scripts/deduplicate_cuda_libs.sh new file mode 100755 index 000000000..f8d13cd3d --- /dev/null +++ b/scripts/deduplicate_cuda_libs.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Deduplicate CUDA libraries across mlx_* and cuda_* directories +# This script finds identical .so* files in mlx_cuda_* directories that exist +# in corresponding cuda_* directories and replaces them with symlinks. +# + +set -eu + +if [ $# -eq 0 ]; then + echo "ERROR: No directory specified" >&2 + echo "Usage: $0 " >&2 + exit 1 +fi + +base_dir="$1" + +if [ ! -d "${base_dir}" ]; then + echo "ERROR: Directory ${base_dir} does not exist" >&2 + exit 1 +fi + +echo "Deduplicating CUDA libraries in ${base_dir}..." + +# Find all mlx_cuda_* directories +for mlx_dir in "${base_dir}"/lib/ollama/mlx_cuda_*; do + [ -d "${mlx_dir}" ] || continue + + # Extract CUDA version (e.g., v12, v13) + cuda_version=$(basename "${mlx_dir}" | sed 's/mlx_cuda_//') + cuda_dir="${base_dir}/lib/ollama/cuda_${cuda_version}" + + # Skip if corresponding cuda_* directory doesn't exist + [ -d "${cuda_dir}" ] || continue + + echo " Checking ${mlx_dir} against ${cuda_dir}..." + + # Find all .so* files in mlx directory + find "${mlx_dir}" -type f -name "*.so*" | while read mlx_file; do + filename=$(basename "${mlx_file}") + cuda_file="${cuda_dir}/${filename}" + + # Skip if file doesn't exist in cuda directory + [ -f "${cuda_file}" ] || continue + + # Compare checksums + mlx_sum=$(sha256sum "${mlx_file}" | awk '{print $1}') + cuda_sum=$(sha256sum "${cuda_file}" | awk '{print $1}') + + if [ "${mlx_sum}" = "${cuda_sum}" ]; then + echo " Deduplicating ${filename}" + # Calculate relative path from mlx_dir to cuda_dir + rel_path="../cuda_${cuda_version}/${filename}" + rm -f "${mlx_file}" + ln -s "${rel_path}" "${mlx_file}" + fi + done +done + +echo "Deduplication complete"