mirror of
https://github.com/mudler/LocalAI.git
synced 2024-12-19 04:37:53 +00:00
This PR bundles further libs into the arm64 and x86_64 binaries This can be improved by a lot - it's far from perfect, however in this PR I wanted to collect the required libs, and give a simple baseline to improve later upon. It is quite challenging to do this exercise with CI only - but it's the fastest way I see now. I hope that after the list is initially built we can further improve this down the line and remove some of the technical debt left here to speedup things and do not get stuck in the middle of CI cycles. In this PR: - The x86_64 binary now bundles hipblas, nvidia and intel libraries too to avoid any dependency to be installed in the host - Similarly, for the arm64 we now bundle all the required assets ## What's left We should be also able to cross-compile Nvidia for arm64 - however I didn't succeed so far so I've left that open. Similarly I might have missed some libraries, but we will see with bug reports and testing around with the new binaries. I've tested on my arm64 board and I could finally start things up. An open point still is shipping libraries for e.g. tts and stablediffusion. this is not done yet, however with the same methodology we should be able to extend support also for these two backends in the binary.
309 lines
14 KiB
YAML
309 lines
14 KiB
YAML
name: Build and Release
|
|
|
|
on:
|
|
- push
|
|
- pull_request
|
|
|
|
env:
|
|
GRPC_VERSION: v1.64.0
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
concurrency:
|
|
group: ci-releases-${{ github.head_ref || github.ref }}-${{ github.repository }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
|
|
build-linux-arm:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Clone
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: true
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.21.x'
|
|
cache: false
|
|
|
|
- name: Dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install build-essential ffmpeg protobuf-compiler ccache
|
|
sudo apt-get install -qy binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
|
|
- name: Install CUDA Dependencies
|
|
run: |
|
|
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/cross-linux-aarch64/cuda-keyring_1.1-1_all.deb
|
|
sudo dpkg -i cuda-keyring_1.1-1_all.deb
|
|
sudo apt-get update
|
|
sudo apt-get install -y cuda-cross-aarch64 cuda-nvcc-cross-aarch64-${CUDA_VERSION} libcublas-cross-aarch64-${CUDA_VERSION}
|
|
env:
|
|
CUDA_VERSION: 12-4
|
|
- name: Cache grpc
|
|
id: cache-grpc
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: grpc
|
|
key: ${{ runner.os }}-arm-grpc-${{ env.GRPC_VERSION }}
|
|
- name: Build grpc
|
|
if: steps.cache-grpc.outputs.cache-hit != 'true'
|
|
run: |
|
|
|
|
git clone --recurse-submodules -b ${{ env.GRPC_VERSION }} --depth 1 --shallow-submodules https://github.com/grpc/grpc && \
|
|
cd grpc && mkdir -p cmake/build && cd cmake/build && cmake -DgRPC_INSTALL=ON \
|
|
-DgRPC_BUILD_TESTS=OFF \
|
|
../.. && sudo make --jobs 5 --output-sync=target
|
|
- name: Install gRPC
|
|
run: |
|
|
GNU_HOST=aarch64-linux-gnu
|
|
C_COMPILER_ARM_LINUX=$GNU_HOST-gcc
|
|
CXX_COMPILER_ARM_LINUX=$GNU_HOST-g++
|
|
|
|
CROSS_TOOLCHAIN=/usr/$GNU_HOST
|
|
CROSS_STAGING_PREFIX=$CROSS_TOOLCHAIN/stage
|
|
CMAKE_CROSS_TOOLCHAIN=/tmp/arm.toolchain.cmake
|
|
|
|
# https://cmake.org/cmake/help/v3.13/manual/cmake-toolchains.7.html#cross-compiling-for-linux
|
|
echo "set(CMAKE_SYSTEM_NAME Linux)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_SYSTEM_PROCESSOR arm)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_STAGING_PREFIX $CROSS_STAGING_PREFIX)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_SYSROOT ${CROSS_TOOLCHAIN}/sysroot)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_C_COMPILER /usr/bin/$C_COMPILER_ARM_LINUX)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_CXX_COMPILER /usr/bin/$CXX_COMPILER_ARM_LINUX)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> $CMAKE_CROSS_TOOLCHAIN && \
|
|
echo "set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)" >> $CMAKE_CROSS_TOOLCHAIN
|
|
GRPC_DIR=$PWD/grpc
|
|
cd grpc && cd cmake/build && sudo make --jobs 5 --output-sync=target install && \
|
|
GRPC_CROSS_BUILD_DIR=$GRPC_DIR/cmake/cross_build && \
|
|
mkdir -p $GRPC_CROSS_BUILD_DIR && \
|
|
cd $GRPC_CROSS_BUILD_DIR && \
|
|
cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CROSS_TOOLCHAIN \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=$CROSS_TOOLCHAIN/grpc_install \
|
|
../.. && \
|
|
sudo make -j`nproc` install
|
|
- name: Build
|
|
id: build
|
|
run: |
|
|
GNU_HOST=aarch64-linux-gnu
|
|
C_COMPILER_ARM_LINUX=$GNU_HOST-gcc
|
|
CXX_COMPILER_ARM_LINUX=$GNU_HOST-g++
|
|
|
|
CROSS_TOOLCHAIN=/usr/$GNU_HOST
|
|
CROSS_STAGING_PREFIX=$CROSS_TOOLCHAIN/stage
|
|
CMAKE_CROSS_TOOLCHAIN=/tmp/arm.toolchain.cmake
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@8ba23be9613c672d40ae261d2a1335d639bdd59b
|
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.0
|
|
export PATH=$PATH:$GOPATH/bin
|
|
export PATH=/usr/local/cuda/bin:$PATH
|
|
sudo rm -rf /usr/aarch64-linux-gnu/lib/libstdc++.so.6
|
|
sudo cp -rf /usr/aarch64-linux-gnu/lib/libstdc++.so* /usr/aarch64-linux-gnu/lib/libstdc++.so.6
|
|
GO_TAGS=p2p \
|
|
BACKEND_LIBS="./grpc/cmake/cross_build/third_party/re2/libre2.a ./grpc/cmake/cross_build/libgrpc.a ./grpc/cmake/cross_build/libgrpc++.a ./grpc/cmake/cross_build/third_party/protobuf/libprotobuf.a /usr/aarch64-linux-gnu/lib/libc.so.6 /usr/aarch64-linux-gnu/lib/libstdc++.so.6 /usr/aarch64-linux-gnu/lib/libgomp.so.1 /usr/aarch64-linux-gnu/lib/libm.so.6 /usr/aarch64-linux-gnu/lib/libgcc_s.so.1 /usr/aarch64-linux-gnu/lib/libdl.so.2 /usr/aarch64-linux-gnu/lib/libpthread.so.0" \
|
|
GOOS=linux \
|
|
GOARCH=arm64 \
|
|
CMAKE_ARGS="-DProtobuf_INCLUDE_DIRS=$CROSS_STAGING_PREFIX/include -DProtobuf_DIR=$CROSS_STAGING_PREFIX/lib/cmake/protobuf -DgRPC_DIR=$CROSS_STAGING_PREFIX/lib/cmake/grpc -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CROSS_TOOLCHAIN -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++" make dist-cross-linux-arm64
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: LocalAI-linux-arm64
|
|
path: release/
|
|
- name: Release
|
|
uses: softprops/action-gh-release@v2
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
with:
|
|
files: |
|
|
release/*
|
|
- name: Setup tmate session if tests fail
|
|
if: ${{ failure() }}
|
|
uses: mxschmitt/action-tmate@v3.18
|
|
with:
|
|
detached: true
|
|
connect-timeout-seconds: 180
|
|
limit-access-to-actor: true
|
|
build-linux:
|
|
runs-on: arc-runner-set
|
|
steps:
|
|
- name: Force Install GIT latest
|
|
run: |
|
|
sudo apt-get update \
|
|
&& sudo apt-get install -y software-properties-common \
|
|
&& sudo apt-get update \
|
|
&& sudo add-apt-repository -y ppa:git-core/ppa \
|
|
&& sudo apt-get update \
|
|
&& sudo apt-get install -y git
|
|
- name: Clone
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: true
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.21.x'
|
|
cache: false
|
|
- name: Dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y wget curl build-essential ffmpeg protobuf-compiler ccache cmake
|
|
- name: Intel Dependencies
|
|
run: |
|
|
wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
|
|
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
|
|
sudo apt update
|
|
sudo apt install -y intel-basekit
|
|
- name: Install CUDA Dependencies
|
|
run: |
|
|
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
|
|
sudo dpkg -i cuda-keyring_1.1-1_all.deb
|
|
sudo apt-get update
|
|
sudo apt-get install -y cuda-nvcc-${CUDA_VERSION} libcublas-dev-${CUDA_VERSION}
|
|
env:
|
|
CUDA_VERSION: 12-3
|
|
- name: "Install Hipblas"
|
|
env:
|
|
ROCM_VERSION: "6.1"
|
|
AMDGPU_VERSION: "6.1"
|
|
run: |
|
|
set -ex
|
|
|
|
sudo apt-get update
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates curl libnuma-dev gnupg
|
|
|
|
curl -sL https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add -
|
|
|
|
printf "deb [arch=amd64] https://repo.radeon.com/rocm/apt/$ROCM_VERSION/ jammy main" | sudo tee /etc/apt/sources.list.d/rocm.list
|
|
|
|
printf "deb [arch=amd64] https://repo.radeon.com/amdgpu/$AMDGPU_VERSION/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/amdgpu.list
|
|
printf 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' | sudo tee /etc/apt/preferences.d/rocm-pin-600
|
|
sudo apt-get update
|
|
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
|
hipblas-dev rocm-dev \
|
|
rocblas-dev
|
|
|
|
sudo apt-get clean
|
|
sudo rm -rf /var/lib/apt/lists/*
|
|
sudo ldconfig
|
|
- name: Cache grpc
|
|
id: cache-grpc
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: grpc
|
|
key: ${{ runner.os }}-grpc-${{ env.GRPC_VERSION }}
|
|
- name: Build grpc
|
|
if: steps.cache-grpc.outputs.cache-hit != 'true'
|
|
run: |
|
|
git clone --recurse-submodules -b ${{ env.GRPC_VERSION }} --depth 1 --shallow-submodules https://github.com/grpc/grpc && \
|
|
cd grpc && mkdir -p cmake/build && cd cmake/build && cmake -DgRPC_INSTALL=ON \
|
|
-DgRPC_BUILD_TESTS=OFF \
|
|
../.. && sudo make --jobs 5 --output-sync=target
|
|
- name: Install gRPC
|
|
run: |
|
|
cd grpc && cd cmake/build && sudo make --jobs 5 --output-sync=target install
|
|
- name: Build
|
|
id: build
|
|
run: |
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@8ba23be9613c672d40ae261d2a1335d639bdd59b
|
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.0
|
|
export PATH=$PATH:$GOPATH/bin
|
|
export PATH=/usr/local/cuda/bin:$PATH
|
|
export PATH=/opt/rocm/bin:$PATH
|
|
source /opt/intel/oneapi/setvars.sh
|
|
GO_TAGS=p2p \
|
|
BACKEND_LIBS="/opt/intel/oneapi/*/lib/libiomp5.so /opt/intel/oneapi/*/lib/libmkl_core.so /opt/intel/oneapi/*/lib/libmkl_core.so.2 /opt/intel/oneapi/*/lib/libmkl_intel_ilp64.so /opt/intel/oneapi/*/lib/libmkl_intel_ilp64.so.2 /opt/intel/oneapi/*/lib/libmkl_sycl_blas.so /opt/intel/oneapi/*/lib/libmkl_sycl_blas.so.4 /opt/intel/oneapi/*/lib/libmkl_tbb_thread.so /opt/intel/oneapi/*/lib/libmkl_tbb_thread.so.2 /opt/intel/oneapi/*/lib/libsycl.so /opt/intel/oneapi/*/lib/libsycl.so.7 /opt/intel/oneapi/*/lib/libsycl.so.7.1.0 /opt/rocm-*/lib/libamdhip64.so /opt/rocm-*/lib/libamdhip64.so.5 /opt/rocm-*/lib/libamdhip64.so.6 /opt/rocm-*/lib/libamdhip64.so.6.1.60100 /opt/rocm-*/lib/libhipblas.so /opt/rocm-*/lib/libhipblas.so.2 /opt/rocm-*/lib/libhipblas.so.2.1.60100 /opt/rocm-*/lib/librocblas.so /opt/rocm-*/lib/librocblas.so.4 /opt/rocm-*/lib/librocblas.so.4.1.60100 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 /usr/lib/x86_64-linux-gnu/libm.so.6 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/librt.so.1 /usr/local/cuda-*/targets/x86_64-linux/lib/libcublas.so /usr/local/cuda-*/targets/x86_64-linux/lib/libcublasLt.so /usr/local/cuda-*/targets/x86_64-linux/lib/libcudart.so /usr/local/cuda-*/targets/x86_64-linux/lib/stubs/libcuda.so" \
|
|
make -j4 dist
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: LocalAI-linux
|
|
path: release/
|
|
- name: Release
|
|
uses: softprops/action-gh-release@v2
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
with:
|
|
files: |
|
|
release/*
|
|
- name: Setup tmate session if tests fail
|
|
if: ${{ failure() }}
|
|
uses: mxschmitt/action-tmate@v3.18
|
|
with:
|
|
detached: true
|
|
connect-timeout-seconds: 180
|
|
limit-access-to-actor: true
|
|
build-stablediffusion:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Clone
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: true
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.21.x'
|
|
cache: false
|
|
- name: Dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y --no-install-recommends libopencv-dev protobuf-compiler ccache
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@8ba23be9613c672d40ae261d2a1335d639bdd59b
|
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.0
|
|
- name: Build stablediffusion
|
|
run: |
|
|
export PATH=$PATH:$GOPATH/bin
|
|
make backend-assets/grpc/stablediffusion
|
|
mkdir -p release && cp backend-assets/grpc/stablediffusion release
|
|
env:
|
|
GO_TAGS: stablediffusion
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: stablediffusion
|
|
path: release/
|
|
- name: Release
|
|
uses: softprops/action-gh-release@v2
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
with:
|
|
files: |
|
|
release/*
|
|
|
|
build-macOS-arm64:
|
|
runs-on: macos-14
|
|
steps:
|
|
- name: Clone
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: true
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.21.x'
|
|
cache: false
|
|
- name: Dependencies
|
|
run: |
|
|
brew install protobuf grpc
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@8ba23be9613c672d40ae261d2a1335d639bdd59b
|
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.0
|
|
- name: Build
|
|
id: build
|
|
run: |
|
|
export C_INCLUDE_PATH=/usr/local/include
|
|
export CPLUS_INCLUDE_PATH=/usr/local/include
|
|
export PATH=$PATH:$GOPATH/bin
|
|
|
|
BACKEND_LIBS="$(ls /opt/homebrew/opt/grpc/lib/*.dylib /opt/homebrew/opt/re2/lib/*.dylib /opt/homebrew/opt/openssl@3/lib/*.dylib /opt/homebrew/opt/protobuf/lib/*.dylib /opt/homebrew/opt/abseil/lib/*.dylib | xargs)" GO_TAGS=p2p make dist
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: LocalAI-MacOS-arm64
|
|
path: release/
|
|
- name: Release
|
|
uses: softprops/action-gh-release@v2
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
with:
|
|
files: |
|
|
release/*
|
|
- name: Setup tmate session if tests fail
|
|
if: ${{ failure() }}
|
|
uses: mxschmitt/action-tmate@v3.18
|
|
with:
|
|
detached: true
|
|
connect-timeout-seconds: 180
|
|
limit-access-to-actor: true |