2023-11-29 19:00:37 +00:00
|
|
|
#!/bin/bash
|
2023-11-14 01:20:34 +00:00
|
|
|
# This script is intended to run inside the go generate
|
2024-01-04 17:40:15 +00:00
|
|
|
# working directory must be llm/generate/
|
2023-12-20 18:36:01 +00:00
|
|
|
|
|
|
|
# First we build our default built-in library which will be linked into the CGO
|
|
|
|
# binary as a normal dependency. This default build is CPU based.
|
|
|
|
#
|
|
|
|
# Then we build a CUDA dynamic library (although statically linked with the CUDA
|
|
|
|
# library dependencies for maximum portability)
|
|
|
|
#
|
|
|
|
# Then if we detect ROCm, we build a dynamically loaded ROCm lib. ROCm is particularly
|
|
|
|
# important to be a dynamic lib even if it's the only GPU library detected because
|
|
|
|
# we can't redistribute the objectfiles but must rely on dynamic libraries at
|
|
|
|
# runtime, which could lead the server not to start if not present.
|
2023-11-14 01:20:34 +00:00
|
|
|
|
|
|
|
set -ex
|
|
|
|
set -o pipefail
|
|
|
|
|
2024-01-03 23:12:29 +00:00
|
|
|
# See https://llvm.org/docs/AMDGPUUsage.html#processors for reference
|
|
|
|
amdGPUs() {
|
|
|
|
GPU_LIST=(
|
|
|
|
"gfx803"
|
|
|
|
"gfx900"
|
|
|
|
"gfx906:xnack-"
|
|
|
|
"gfx908:xnack-"
|
|
|
|
"gfx90a:xnack+"
|
|
|
|
"gfx90a:xnack-"
|
|
|
|
"gfx1010"
|
|
|
|
"gfx1012"
|
|
|
|
"gfx1030"
|
|
|
|
"gfx1100"
|
|
|
|
"gfx1101"
|
|
|
|
"gfx1102"
|
|
|
|
)
|
|
|
|
(
|
|
|
|
IFS=$';'
|
|
|
|
echo "'${GPU_LIST[*]}'"
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2023-11-14 01:20:34 +00:00
|
|
|
echo "Starting linux generate script"
|
2023-12-20 18:36:01 +00:00
|
|
|
if [ -z "${CUDACXX}" -a -x /usr/local/cuda/bin/nvcc ]; then
|
2023-11-29 19:00:37 +00:00
|
|
|
export CUDACXX=/usr/local/cuda/bin/nvcc
|
|
|
|
fi
|
2024-01-04 00:22:15 +00:00
|
|
|
COMMON_CMAKE_DEFS="-DCMAKE_POSITION_INDEPENDENT_CODE=on -DLLAMA_NATIVE=off -DLLAMA_AVX=on -DLLAMA_AVX2=off -DLLAMA_AVX512=off -DLLAMA_FMA=off -DLLAMA_F16C=off"
|
2023-11-14 01:20:34 +00:00
|
|
|
source $(dirname $0)/gen_common.sh
|
|
|
|
init_vars
|
|
|
|
git_module_setup
|
|
|
|
apply_patches
|
2023-12-20 18:36:01 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# CPU first for the default library
|
|
|
|
#
|
|
|
|
CMAKE_DEFS="${COMMON_CMAKE_DEFS} ${CMAKE_DEFS}"
|
2024-01-04 17:40:15 +00:00
|
|
|
BUILD_DIR="${LLAMACPP_DIR}/build/linux/cpu"
|
2023-12-23 19:35:44 +00:00
|
|
|
|
2023-11-14 01:20:34 +00:00
|
|
|
build
|
2023-12-23 19:35:44 +00:00
|
|
|
install
|
2023-12-14 01:26:47 +00:00
|
|
|
|
2024-01-04 00:08:34 +00:00
|
|
|
# Placeholder to keep go embed happy until we start building dynamic CPU lib variants
|
|
|
|
touch ${BUILD_DIR}/lib/dummy.so
|
|
|
|
|
2023-12-20 18:36:01 +00:00
|
|
|
if [ -d /usr/local/cuda/lib64/ ]; then
|
|
|
|
echo "CUDA libraries detected - building dynamic CUDA library"
|
|
|
|
init_vars
|
|
|
|
CMAKE_DEFS="-DLLAMA_CUBLAS=on ${COMMON_CMAKE_DEFS} ${CMAKE_DEFS}"
|
2024-01-04 17:40:15 +00:00
|
|
|
BUILD_DIR="${LLAMACPP_DIR}/build/linux/cuda"
|
2023-12-20 18:36:01 +00:00
|
|
|
CUDA_LIB_DIR=/usr/local/cuda/lib64
|
|
|
|
build
|
2023-12-23 19:35:44 +00:00
|
|
|
install
|
|
|
|
gcc -fPIC -g -shared -o ${BUILD_DIR}/lib/libext_server.so \
|
2023-12-20 18:36:01 +00:00
|
|
|
-Wl,--whole-archive \
|
2023-12-23 19:35:44 +00:00
|
|
|
${BUILD_DIR}/lib/libext_server.a \
|
|
|
|
${BUILD_DIR}/lib/libcommon.a \
|
|
|
|
${BUILD_DIR}/lib/libllama.a \
|
2023-12-20 18:36:01 +00:00
|
|
|
-Wl,--no-whole-archive \
|
|
|
|
${CUDA_LIB_DIR}/libcudart_static.a \
|
|
|
|
${CUDA_LIB_DIR}/libcublas_static.a \
|
|
|
|
${CUDA_LIB_DIR}/libcublasLt_static.a \
|
|
|
|
${CUDA_LIB_DIR}/libcudadevrt.a \
|
|
|
|
${CUDA_LIB_DIR}/libculibos.a \
|
|
|
|
-lrt -lpthread -ldl -lstdc++ -lm
|
2023-12-14 01:26:47 +00:00
|
|
|
fi
|
2023-11-29 19:00:37 +00:00
|
|
|
|
2023-12-20 18:36:01 +00:00
|
|
|
if [ -z "${ROCM_PATH}" ]; then
|
2023-11-29 19:00:37 +00:00
|
|
|
# Try the default location in case it exists
|
|
|
|
ROCM_PATH=/opt/rocm
|
|
|
|
fi
|
|
|
|
|
2023-12-20 18:36:01 +00:00
|
|
|
if [ -z "${CLBlast_DIR}" ]; then
|
2023-11-29 19:00:37 +00:00
|
|
|
# Try the default location in case it exists
|
|
|
|
if [ -d /usr/lib/cmake/CLBlast ]; then
|
|
|
|
export CLBlast_DIR=/usr/lib/cmake/CLBlast
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2023-12-20 18:36:01 +00:00
|
|
|
if [ -d "${ROCM_PATH}" ]; then
|
|
|
|
echo "ROCm libraries detected - building dynamic ROCm library"
|
2023-11-29 19:00:37 +00:00
|
|
|
init_vars
|
2024-01-03 23:12:29 +00:00
|
|
|
CMAKE_DEFS="${COMMON_CMAKE_DEFS} ${CMAKE_DEFS} -DLLAMA_HIPBLAS=on -DCMAKE_C_COMPILER=$ROCM_PATH/llvm/bin/clang -DCMAKE_CXX_COMPILER=$ROCM_PATH/llvm/bin/clang++ -DAMDGPU_TARGETS=$(amdGPUs) -DGPU_TARGETS=$(amdGPUs)"
|
2024-01-04 17:40:15 +00:00
|
|
|
BUILD_DIR="${LLAMACPP_DIR}/build/linux/rocm"
|
2023-11-29 19:00:37 +00:00
|
|
|
build
|
2023-12-23 19:35:44 +00:00
|
|
|
install
|
|
|
|
gcc -fPIC -g -shared -o ${BUILD_DIR}/lib/libext_server.so \
|
2023-11-29 19:00:37 +00:00
|
|
|
-Wl,--whole-archive \
|
2023-12-23 19:35:44 +00:00
|
|
|
${BUILD_DIR}/lib/libext_server.a \
|
|
|
|
${BUILD_DIR}/lib/libcommon.a \
|
|
|
|
${BUILD_DIR}/lib/libllama.a \
|
2023-11-29 19:00:37 +00:00
|
|
|
-Wl,--no-whole-archive \
|
|
|
|
-lrt -lpthread -ldl -lstdc++ -lm \
|
|
|
|
-L/opt/rocm/lib -L/opt/amdgpu/lib/x86_64-linux-gnu/ \
|
|
|
|
-Wl,-rpath,/opt/rocm/lib,-rpath,/opt/amdgpu/lib/x86_64-linux-gnu/ \
|
|
|
|
-lhipblas -lrocblas -lamdhip64 -lrocsolver -lamd_comgr -lhsa-runtime64 -lrocsparse -ldrm -ldrm_amdgpu
|
|
|
|
fi
|
2023-12-22 17:51:53 +00:00
|
|
|
|
|
|
|
cleanup
|