mirror of
https://github.com/dogkeeper886/ollama37.git
synced 2025-12-10 07:46:59 +00:00
* llama: wire up builtin runner This adds a new entrypoint into the ollama CLI to run the cgo built runner. On Mac arm64, this will have GPU support, but on all other platforms it will be the lowest common denominator CPU build. After we fully transition to the new Go runners more tech-debt can be removed and we can stop building the "default" runner via make and rely on the builtin always. * build: Make target improvements Add a few new targets and help for building locally. This also adjusts the runner lookup to favor local builds, then runners relative to the executable, and finally payloads. * Support customized CPU flags for runners This implements a simplified custom CPU flags pattern for the runners. When built without overrides, the runner name contains the vector flag we check for (AVX) to ensure we don't try to run on unsupported systems and crash. If the user builds a customized set, we omit the naming scheme and don't check for compatibility. This avoids checking requirements at runtime, so that logic has been removed as well. This can be used to build GPU runners with no vector flags, or CPU/GPU runners with additional flags (e.g. AVX512) enabled. * Use relative paths If the user checks out the repo in a path that contains spaces, make gets really confused so use relative paths for everything in-repo to avoid breakage. * Remove payloads from main binary * install: clean up prior libraries This removes support for v0.3.6 and older versions (before the tar bundle) and ensures we clean up prior libraries before extracting the bundle(s). Without this change, runners and dependent libraries could leak when we update and lead to subtle runtime errors.
118 lines
4.7 KiB
Makefile
118 lines
4.7 KiB
Makefile
# Build rules for ROCm runner
|
|
#
|
|
# Note: at present we only support a single ROCm version (whichever is default on the build system)
|
|
# unlike CUDA where we'll build both a v11 and v12 variant.
|
|
|
|
include make/common-defs.make
|
|
include make/rocm-defs.make
|
|
|
|
HIP_ARCHS_COMMON := gfx900 gfx940 gfx941 gfx942 gfx1010 gfx1012 gfx1030 gfx1100 gfx1101 gfx1102
|
|
HIP_ARCHS_LINUX := gfx906:xnack- gfx908:xnack- gfx90a:xnack+ gfx90a:xnack-
|
|
|
|
ifeq ($(OS),windows)
|
|
GPU_LIB_DIR := $(shell cygpath -m -s "$(HIP_PATH)/bin")
|
|
CGO_EXTRA_LDFLAGS := -L$(shell cygpath -m -s "$(HIP_PATH)/lib")
|
|
HIP_ARCHS?=$(HIP_ARCHS_COMMON)
|
|
GPU_COMPILER_CFLAGS = $(CFLAGS) -D_WIN32_WINNT=0x602
|
|
GPU_COMPILER_CXXFLAGS = $(CXXFLAGS) -D_WIN32_WINNT=0x602
|
|
else ifeq ($(OS),linux)
|
|
GPU_LIB_DIR := $(strip $(shell ls -d $(HIP_PATH)/lib64 2>/dev/null || ls -d $(HIP_PATH)/lib 2>/dev/null))
|
|
CGO_EXTRA_LDFLAGS := -L$(GPU_LIB_DIR)
|
|
HIP_ARCHS?=$(HIP_ARCHS_COMMON) $(HIP_ARCHS_LINUX)
|
|
GPU_COMPILER_CFLAGS = $(CFLAGS) -fPIC -D_GNU_SOURCE
|
|
GPU_COMPILER_CXXFLAGS = $(CXXFLAGS) -fPIC -D_GNU_SOURCE
|
|
endif
|
|
GPU_COMPILER=$(HIP_COMPILER)
|
|
|
|
# TODO future multi-variant support for ROCm
|
|
# ROCM_VERSION = $(subst $(space),.,$(wordlist 1,2,$(subst .,$(space),$(word 3,$(subst -,$(space),$(filter HIP version: %,$(shell $(GPU_COMPILER) --version)))))))
|
|
# ifneq (,$(ROCM_VERSION))
|
|
# GPU_RUNNER_VARIANT = _v$(ROCM_VERSION)
|
|
# endif
|
|
|
|
GPU_RUNNER_GO_TAGS := rocm
|
|
GPU_RUNNER_NAME := rocm$(GPU_RUNNER_VARIANT)
|
|
GPU_RUNNER_DRIVER_LIB_LINK := -lamdhip64
|
|
GPU_RUNNER_LIBS_SHORT := hipblas rocblas
|
|
|
|
# Note: ROCm requires an extra step of discovering and copying the transitive dependencies on linux
|
|
ifeq ($(OS),windows)
|
|
ROCM_DIST_DEPS_DIR = ./dist/$(OS)-$(ARCH)/lib/ollama
|
|
GPU_LIBS = $(sort $(wildcard $(addsuffix *.$(SHARED_EXT),$(addprefix $(GPU_LIB_DIR)/$(SHARED_PREFIX),$(GPU_RUNNER_LIBS_SHORT)))))
|
|
else ifeq ($(OS),linux)
|
|
ROCM_DIST_DEPS_DIR = ./dist/$(OS)-$(ARCH)-rocm/lib/ollama
|
|
GPU_LIBS = $(sort $(wildcard $(addsuffix *.$(SHARED_EXT).*,$(addprefix $(GPU_LIB_DIR)/$(SHARED_PREFIX),$(GPU_RUNNER_LIBS_SHORT)))))
|
|
ROCM_TRANSITIVE_LIBS_INITIAL = $(sort $(shell ldd $(GPU_LIBS) | grep "=>" | cut -f2 -d= | cut -f2 -d' ' | grep -e rocm -e amdgpu -e libtinfo -e libnuma -e libelf))
|
|
GPU_TRANSITIVE_LIBS = $(sort $(shell readlink -f $(ROCM_TRANSITIVE_LIBS_INITIAL)) $(ROCM_TRANSITIVE_LIBS_INITIAL))
|
|
FILTERED_GPU_TRANSITIVE_LIBS=$(sort $(filter-out $(addprefix %,$(notdir $(GPU_LIBS))), $(GPU_TRANSITIVE_LIBS)))
|
|
GPU_DIST_TRANSITIVE_LIB_DEPS = $(sort $(addprefix $(ROCM_DIST_DEPS_DIR)/,$(notdir $(FILTERED_GPU_TRANSITIVE_LIBS))))
|
|
endif
|
|
GPU_DIST_LIB_DEPS= $(sort $(addprefix $(ROCM_DIST_DEPS_DIR)/,$(notdir $(GPU_LIBS))))
|
|
ROCBLAS_DIST_DEP_MANIFEST = $(ROCM_DIST_DEPS_DIR)/rocblas/library/TensileManifest.txt
|
|
|
|
ifeq ($(OS),linux)
|
|
GPU_COMPILER_FPIC := -fPIC -Wno-unused-function -std=gnu++11
|
|
else ifeq ($(OS),windows)
|
|
GPU_COMPILER_FPIC := -Xclang --dependent-lib=msvcrt
|
|
endif
|
|
GPU_RUNNER_ARCH_FLAGS := $(foreach arch,$(subst ;,$(space),$(HIP_ARCHS)),--offload-arch=$(arch))
|
|
|
|
# HIPCC uses clang which requires avx512 -> -mavx512f -mavx512dq -mavx512bw
|
|
GPU_VECTOR_FLAGS=$(if $(filter avx512,$(GPU_RUNNER_CPU_FLAGS)),avx512f avx512dq avx512bw) $(filter-out avx512,$(GPU_RUNNER_CPU_FLAGS))
|
|
|
|
GPU_COMPILER_CUFLAGS = \
|
|
$(GPU_COMPILER_FPIC) \
|
|
$(addprefix -m,$(GPU_VECTOR_FLAGS)) \
|
|
-mf16c \
|
|
-mfma \
|
|
-c \
|
|
-O3 \
|
|
-DGGML_USE_CUDA \
|
|
-DGGML_BUILD=1 \
|
|
-DGGML_SHARED=1 \
|
|
-DGGML_CUDA_DMMV_X=32 \
|
|
-DGGML_CUDA_MMV_Y=1 \
|
|
-DGGML_SCHED_MAX_COPIES=4 \
|
|
-DGGML_USE_HIPBLAS \
|
|
-DGGML_USE_LLAMAFILE \
|
|
-DHIP_FAST_MATH \
|
|
-D__HIP_PLATFORM_AMD__=1 \
|
|
-D__HIP_ROCclr__=1 \
|
|
-DNDEBUG \
|
|
-DK_QUANTS_PER_ITERATION=2 \
|
|
-D_CRT_SECURE_NO_WARNINGS \
|
|
-D_GNU_SOURCE \
|
|
-D_XOPEN_SOURCE=600 \
|
|
-DUSE_PROF_API=1 \
|
|
-std=gnu++14 \
|
|
-x hip \
|
|
-mllvm=-amdgpu-early-inline-all=true \
|
|
-mllvm=-amdgpu-function-calls=false \
|
|
-Wno-expansion-to-defined \
|
|
-Wno-invalid-noreturn \
|
|
-Wno-ignored-attributes \
|
|
-Wno-pass-failed \
|
|
-Wno-deprecated-declarations \
|
|
-Wno-unused-result \
|
|
-I./llama/
|
|
|
|
# Workaround buggy P2P copy on some windows multi-GPU setups
|
|
# This workaround breaks linux systems with small system RAM, so only enable on windows
|
|
ifeq ($(OS),windows)
|
|
GPU_COMPILER_CUFLAGS += -DGGML_CUDA_NO_PEER_COPY=1
|
|
endif
|
|
|
|
include make/gpu.make
|
|
|
|
# Adjust the rules from gpu.make to handle the ROCm dependencies properly
|
|
$(RUNNERS_DIST_DIR)/$(GPU_RUNNER_NAME)$(GPU_RUNNER_EXTRA_VARIANT)/ollama_llama_server$(EXE_EXT): $(ROCBLAS_DIST_DEP_MANIFEST) $(GPU_DIST_TRANSITIVE_LIB_DEPS)
|
|
$(ROCBLAS_DIST_DEP_MANIFEST):
|
|
@-mkdir -p $(dir $@)
|
|
@echo "Copying rocblas library..."
|
|
(cd $(GPU_LIB_DIR)/rocblas/library/ && tar cf - . ) | (cd $(dir $@) && tar xf - )
|
|
@echo "rocblas library copy complete"
|
|
|
|
$(GPU_DIST_TRANSITIVE_LIB_DEPS):
|
|
@-mkdir -p $(dir $@)
|
|
$(CP) $(dir $(filter %$(notdir $@),$(GPU_TRANSITIVE_LIBS)))/$(notdir $@) $(dir $@)
|