-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 30e8689
Showing
12 changed files
with
14,041 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
*.o | ||
*.a | ||
.cache/ | ||
.vs/ | ||
.vscode/ | ||
.DS_Store | ||
|
||
build/ | ||
build-em/ | ||
build-debug/ | ||
build-release/ | ||
build-static/ | ||
build-no-accel/ | ||
build-sanitize-addr/ | ||
build-sanitize-thread/ | ||
|
||
models | ||
models/* | ||
|
||
/main | ||
/quantize | ||
|
||
arm_neon.h | ||
compile_commands.json | ||
model.safetensors | ||
|
||
adapter_model.bin |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
cmake_minimum_required(VERSION 3.8) | ||
project("llama.cpp") | ||
|
||
set(CMAKE_CXX_STANDARD 20) | ||
set(CMAKE_CXX_STANDARD_REQUIRED true) | ||
set(CMAKE_C_STANDARD 11) | ||
|
||
if (NOT XCODE AND NOT MSVC AND NOT CMAKE_BUILD_TYPE) | ||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) | ||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") | ||
endif() | ||
|
||
option(LLAMA_ALL_WARNINGS "llama: enable all compiler warnings" ON) | ||
option(LLAMA_ALL_WARNINGS_3RD_PARTY "llama: enable all compiler warnings in 3rd party libs" OFF) | ||
|
||
option(LLAMA_SANITIZE_THREAD "llama: enable thread sanitizer" OFF) | ||
option(LLAMA_SANITIZE_ADDRESS "llama: enable address sanitizer" OFF) | ||
option(LLAMA_SANITIZE_UNDEFINED "llama: enable undefined sanitizer" OFF) | ||
|
||
if (APPLE) | ||
option(LLAMA_NO_ACCELERATE "llama: disable Accelerate framework" OFF) | ||
option(LLAMA_NO_AVX "llama: disable AVX" OFF) | ||
option(LLAMA_NO_AVX2 "llama: disable AVX2" OFF) | ||
option(LLAMA_NO_FMA "llama: disable FMA" OFF) | ||
endif() | ||
|
||
if (NOT MSVC) | ||
if (LLAMA_SANITIZE_THREAD) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") | ||
endif() | ||
|
||
if (LLAMA_SANITIZE_ADDRESS) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") | ||
endif() | ||
|
||
if (LLAMA_SANITIZE_UNDEFINED) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") | ||
endif() | ||
endif() | ||
|
||
if (APPLE AND NOT LLAMA_NO_ACCELERATE) | ||
find_library(ACCELERATE_FRAMEWORK Accelerate) | ||
if (ACCELERATE_FRAMEWORK) | ||
message(STATUS "Accelerate framework found") | ||
|
||
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${ACCELERATE_FRAMEWORK}) | ||
set(LLAMA_EXTRA_FLAGS ${LLAMA_EXTRA_FLAGS} -DGGML_USE_ACCELERATE) | ||
else() | ||
message(WARNING "Accelerate framework not found") | ||
endif() | ||
endif() | ||
|
||
if (LLAMA_ALL_WARNINGS) | ||
if (NOT MSVC) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ | ||
-Wall \ | ||
-Wextra \ | ||
-Wpedantic \ | ||
-Wshadow \ | ||
-Wcast-qual \ | ||
-Wstrict-prototypes \ | ||
-Wpointer-arith \ | ||
-Wno-unused-function \ | ||
") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ | ||
-Wall \ | ||
-Wextra \ | ||
-Wpedantic \ | ||
-Wcast-qual \ | ||
") | ||
else() | ||
# todo : msvc | ||
endif() | ||
endif() | ||
|
||
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") | ||
|
||
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") | ||
message(STATUS "ARM detected") | ||
else() | ||
message(STATUS "x86 detected") | ||
if (MSVC) | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2") | ||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:AVX2") | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX2") | ||
else() | ||
if(NOT LLAMA_NO_AVX) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx") | ||
endif() | ||
if(NOT LLAMA_NO_AVX2) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2") | ||
endif() | ||
if(NOT LLAMA_NO_FMA) | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma") | ||
endif() | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mf16c") | ||
endif() | ||
endif() | ||
|
||
# if (LLAMA_PERF) | ||
# set(LLAMA_EXTRA_FLAGS ${LLAMA_EXTRA_FLAGS} -DGGML_PERF) | ||
# endif() | ||
|
||
add_executable(llama | ||
main.cpp | ||
utils.cpp | ||
utils.h) | ||
|
||
add_executable(quantize | ||
quantize.cpp | ||
utils.cpp | ||
utils.h) | ||
|
||
add_library(ggml | ||
ggml.c | ||
ggml.h) | ||
|
||
target_compile_definitions(ggml PUBLIC ${LLAMA_EXTRA_FLAGS}) | ||
target_compile_definitions(llama PUBLIC ${LLAMA_EXTRA_FLAGS}) | ||
target_compile_definitions(quantize PUBLIC ${LLAMA_EXTRA_FLAGS}) | ||
|
||
target_link_libraries(ggml PRIVATE ${LLAMA_EXTRA_LIBS}) | ||
target_include_directories(ggml PUBLIC .) | ||
target_link_libraries(quantize PRIVATE ggml) | ||
target_link_libraries(llama PRIVATE ggml) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
ifndef UNAME_S | ||
UNAME_S := $(shell uname -s) | ||
endif | ||
|
||
ifndef UNAME_P | ||
UNAME_P := $(shell uname -p) | ||
endif | ||
|
||
ifndef UNAME_M | ||
UNAME_M := $(shell uname -m) | ||
endif | ||
|
||
CCV := $(shell $(CC) --version | head -n 1) | ||
CXXV := $(shell $(CXX) --version | head -n 1) | ||
|
||
# Mac OS + Arm can report x86_64 | ||
# ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-1282546789 | ||
ifeq ($(UNAME_S),Darwin) | ||
ifneq ($(UNAME_P),arm) | ||
SYSCTL_M := $(shell sysctl -n hw.optional.arm64) | ||
ifeq ($(SYSCTL_M),1) | ||
# UNAME_P := arm | ||
# UNAME_M := arm64 | ||
warn := $(warning Your arch is announced as x86_64, but it seems to actually be ARM64. Not fixing that can lead to bad performance. For more info see: https://github.com/ggerganov/whisper.cpp/issues/66\#issuecomment-1282546789) | ||
endif | ||
endif | ||
endif | ||
|
||
# | ||
# Compile flags | ||
# | ||
|
||
CFLAGS = -I. -O3 -DNDEBUG -std=c11 -fPIC | ||
CXXFLAGS = -I. -I./examples -O3 -DNDEBUG -std=c++11 -fPIC | ||
LDFLAGS = | ||
|
||
# OS specific | ||
# TODO: support Windows | ||
ifeq ($(UNAME_S),Linux) | ||
CFLAGS += -pthread | ||
CXXFLAGS += -pthread | ||
endif | ||
ifeq ($(UNAME_S),Darwin) | ||
CFLAGS += -pthread | ||
CXXFLAGS += -pthread | ||
endif | ||
ifeq ($(UNAME_S),FreeBSD) | ||
CFLAGS += -pthread | ||
CXXFLAGS += -pthread | ||
endif | ||
ifeq ($(UNAME_S),NetBSD) | ||
CFLAGS += -pthread | ||
CXXFLAGS += -pthread | ||
endif | ||
ifeq ($(UNAME_S),Haiku) | ||
CFLAGS += -pthread | ||
CXXFLAGS += -pthread | ||
endif | ||
|
||
# Architecture specific | ||
# TODO: probably these flags need to be tweaked on some architectures | ||
# feel free to update the Makefile for your architecture and send a pull request or issue | ||
ifeq ($(UNAME_M),$(filter $(UNAME_M),x86_64 i686)) | ||
ifeq ($(UNAME_S),Darwin) | ||
CFLAGS += -mf16c | ||
AVX1_M := $(shell sysctl machdep.cpu.features) | ||
ifneq (,$(findstring FMA,$(AVX1_M))) | ||
CFLAGS += -mfma | ||
endif | ||
ifneq (,$(findstring AVX1.0,$(AVX1_M))) | ||
CFLAGS += -mavx | ||
endif | ||
AVX2_M := $(shell sysctl machdep.cpu.leaf7_features) | ||
ifneq (,$(findstring AVX2,$(AVX2_M))) | ||
CFLAGS += -mavx2 | ||
endif | ||
else ifeq ($(UNAME_S),Linux) | ||
AVX1_M := $(shell grep "avx " /proc/cpuinfo) | ||
ifneq (,$(findstring avx,$(AVX1_M))) | ||
CFLAGS += -mavx | ||
endif | ||
AVX2_M := $(shell grep "avx2 " /proc/cpuinfo) | ||
ifneq (,$(findstring avx2,$(AVX2_M))) | ||
CFLAGS += -mavx2 | ||
endif | ||
FMA_M := $(shell grep "fma " /proc/cpuinfo) | ||
ifneq (,$(findstring fma,$(FMA_M))) | ||
CFLAGS += -mfma | ||
endif | ||
F16C_M := $(shell grep "f16c " /proc/cpuinfo) | ||
ifneq (,$(findstring f16c,$(F16C_M))) | ||
CFLAGS += -mf16c | ||
endif | ||
SSE3_M := $(shell grep "sse3 " /proc/cpuinfo) | ||
ifneq (,$(findstring sse3,$(SSE3_M))) | ||
CFLAGS += -msse3 | ||
endif | ||
else ifeq ($(UNAME_S),Haiku) | ||
AVX1_M := $(shell sysinfo -cpu | grep "AVX ") | ||
ifneq (,$(findstring avx,$(AVX1_M))) | ||
CFLAGS += -mavx | ||
endif | ||
AVX2_M := $(shell sysinfo -cpu | grep "AVX2 ") | ||
ifneq (,$(findstring avx2,$(AVX2_M))) | ||
CFLAGS += -mavx2 | ||
endif | ||
FMA_M := $(shell sysinfo -cpu | grep "FMA ") | ||
ifneq (,$(findstring fma,$(FMA_M))) | ||
CFLAGS += -mfma | ||
endif | ||
F16C_M := $(shell sysinfo -cpu | grep "F16C ") | ||
ifneq (,$(findstring f16c,$(F16C_M))) | ||
CFLAGS += -mf16c | ||
endif | ||
else | ||
CFLAGS += -mfma -mf16c -mavx -mavx2 | ||
endif | ||
endif | ||
ifeq ($(UNAME_M),amd64) | ||
CFLAGS += -mavx -mavx2 -mfma -mf16c | ||
endif | ||
ifneq ($(filter ppc64%,$(UNAME_M)),) | ||
POWER9_M := $(shell grep "POWER9" /proc/cpuinfo) | ||
ifneq (,$(findstring POWER9,$(POWER9_M))) | ||
CFLAGS += -mpower9-vector | ||
endif | ||
# Require c++23's std::byteswap for big-endian support. | ||
ifeq ($(UNAME_M),ppc64) | ||
CXXFLAGS += -std=c++23 -DGGML_BIG_ENDIAN | ||
endif | ||
endif | ||
ifndef LLAMA_NO_ACCELERATE | ||
# Mac M1 - include Accelerate framework | ||
ifeq ($(UNAME_S),Darwin) | ||
CFLAGS += -DGGML_USE_ACCELERATE | ||
LDFLAGS += -framework Accelerate | ||
endif | ||
endif | ||
ifdef LLAMA_OPENBLAS | ||
CFLAGS += -DGGML_USE_OPENBLAS -I/usr/local/include/openblas | ||
LDFLAGS += -lopenblas | ||
endif | ||
ifdef LLAMA_GPROF | ||
CFLAGS += -pg | ||
CXXFLAGS += -pg | ||
endif | ||
ifneq ($(filter aarch64%,$(UNAME_M)),) | ||
CFLAGS += -mcpu=native | ||
CXXFLAGS += -mcpu=native | ||
endif | ||
ifneq ($(filter armv6%,$(UNAME_M)),) | ||
# Raspberry Pi 1, 2, 3 | ||
CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access | ||
endif | ||
ifneq ($(filter armv7%,$(UNAME_M)),) | ||
# Raspberry Pi 4 | ||
CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access -funsafe-math-optimizations | ||
endif | ||
ifneq ($(filter armv8%,$(UNAME_M)),) | ||
# Raspberry Pi 4 | ||
CFLAGS += -mfp16-format=ieee -mno-unaligned-access | ||
endif | ||
|
||
# | ||
# Print build information | ||
# | ||
|
||
$(info I llama.cpp build info: ) | ||
$(info I UNAME_S: $(UNAME_S)) | ||
$(info I UNAME_P: $(UNAME_P)) | ||
$(info I UNAME_M: $(UNAME_M)) | ||
$(info I CFLAGS: $(CFLAGS)) | ||
$(info I CXXFLAGS: $(CXXFLAGS)) | ||
$(info I LDFLAGS: $(LDFLAGS)) | ||
$(info I CC: $(CCV)) | ||
$(info I CXX: $(CXXV)) | ||
$(info ) | ||
|
||
default: main quantize | ||
|
||
# | ||
# Build library | ||
# | ||
|
||
ggml.o: ggml.c ggml.h | ||
$(CC) $(CFLAGS) -c ggml.c -o ggml.o | ||
|
||
utils.o: utils.cpp utils.h | ||
$(CXX) $(CXXFLAGS) -c utils.cpp -o utils.o | ||
|
||
clean: | ||
rm -f *.o main quantize | ||
|
||
main: main.cpp ggml.o utils.o | ||
$(CXX) $(CXXFLAGS) main.cpp ggml.o utils.o -o main $(LDFLAGS) | ||
./main -h | ||
|
||
quantize: quantize.cpp ggml.o utils.o | ||
$(CXX) $(CXXFLAGS) quantize.cpp ggml.o utils.o -o quantize $(LDFLAGS) | ||
|
||
# | ||
# Tests | ||
# | ||
|
||
.PHONY: tests | ||
tests: | ||
bash ./tests/run-tests.sh |
Oops, something went wrong.