# 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++17 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_BACKEND_BUILD=1 \ -DGGML_SHARED=1 \ -DGGML_BACKEND_SHARED=1 \ -DGGML_CUDA_DMMV_X=32 \ -DGGML_CUDA_MMV_Y=1 \ -DGGML_SCHED_MAX_COPIES=4 \ -DGGML_USE_HIP \ -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++17 \ -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 $@)