@@ -2,29 +2,16 @@ INCLUDE_PATH := $(abspath ./)
2
2
LIBRARY_PATH := $(abspath ./)
3
3
4
4
ifndef UNAME_S
5
- ifeq ($(OS),Windows_NT)
6
- UNAME_S := $(shell ver)
7
- else
8
- UNAME_S := $(shell uname -s)
9
- endif
5
+ UNAME_S := $(shell uname -s)
10
6
endif
11
-
12
7
ifndef UNAME_P
13
- ifeq ($(OS),Windows_NT)
14
- UNAME_P := $(shell wmic cpu get caption)
15
- else
16
- UNAME_P := $(shell uname -p)
17
- endif
8
+ UNAME_P := $(shell uname -p)
18
9
endif
19
-
20
10
ifndef UNAME_M
21
- ifeq ($(OS),Windows_NT)
22
- UNAME_M := $(PROCESSOR_ARCHITECTURE)
23
- else
24
- UNAME_M := $(shell uname -s)
25
- endif
11
+ UNAME_M := $(shell uname -m)
26
12
endif
27
13
14
+
28
15
CCV := $(shell $(CC ) --version | head -n 1)
29
16
CXXV := $(shell $(CXX ) --version | head -n 1)
30
17
@@ -34,8 +21,8 @@ ifeq ($(UNAME_S),Darwin)
34
21
ifneq ($(UNAME_P),arm)
35
22
SYSCTL_M := $(shell sysctl -n hw.optional.arm64 2>/dev/null)
36
23
ifeq ($(SYSCTL_M),1)
37
- # UNAME_P := arm
38
- # UNAME_M := arm64
24
+ # UNAME_P := arm
25
+ # UNAME_M := arm64
39
26
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)
40
27
endif
41
28
endif
@@ -47,30 +34,25 @@ endif
47
34
48
35
BUILD_TYPE? =
49
36
# keep standard at C17 and C++17
50
- CFLAGS = -I. -O3 -DNDEBUG -std=c17 -fPIC -pthread
51
37
CXXFLAGS = -I. -O3 -DNDEBUG -std=c++17 -fPIC -pthread
52
- LDFLAGS =
53
- CMAKE_ARGS = -DCMAKE_C_COMPILER=$(shell which gcc) -DCMAKE_CXX_COMPILER=$(shell which g++)
54
38
55
39
# warnings
56
- CFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wdouble-promotion -Wshadow -Wstrict-prototypes -Wpointer-arith -Wno-unused-function
57
- CXXFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function
40
+ CXXFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -pedantic-errors
58
41
59
42
# GPGPU specific
60
43
GGML_CUDA_OBJ_PATH =third_party/ggml/src/CMakeFiles/ggml.dir/ggml-cuda.cu.o
61
44
62
45
63
46
# Architecture specific
64
- # TODO: probably these flags need to be tweaked on some architectures
65
- # feel free to update the Makefile for your architecture and send a pull request or issue
47
+ # feel free to update the Makefile for your architecture and send a pull request or issue
66
48
ifeq ($(UNAME_M ) ,$(filter $(UNAME_M ) ,x86_64 i686) )
67
49
# Use all CPU extensions that are available:
68
- CFLAGS += -march=native -mtune=native
50
+ CMAKE_ARGS += -DCMAKE_C_FLAGS=-march=native -DGGML_F16C=OFF -DGGML_AVX2=OFF -DGGML_FMA=OFF
51
+ CXXFLAGS += -march=native -mtune=native
69
52
endif
70
53
ifneq ($(filter ppc64% ,$(UNAME_M ) ) ,)
71
54
POWER9_M := $(shell grep "POWER9" /proc/cpuinfo)
72
55
ifneq (,$(findstring POWER9,$(POWER9_M)))
73
- CFLAGS += -mcpu=power9
74
56
CXXFLAGS += -mcpu=power9
75
57
endif
76
58
# Require c++23's std::byteswap for big-endian support.
@@ -79,61 +61,49 @@ ifneq ($(filter ppc64%,$(UNAME_M)),)
79
61
endif
80
62
endif
81
63
ifdef CHATGLM_GPROF
82
- CFLAGS += -pg
83
64
CXXFLAGS += -pg
84
65
endif
85
66
ifneq ($(filter aarch64% ,$(UNAME_M ) ) ,)
86
- CFLAGS += -mcpu=native
87
67
CXXFLAGS += -mcpu=native
88
68
endif
89
69
ifneq ($(filter armv6% ,$(UNAME_M ) ) ,)
90
70
# Raspberry Pi 1, 2, 3
91
- CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access
71
+ CXXFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access
92
72
endif
93
73
ifneq ($(filter armv7% ,$(UNAME_M ) ) ,)
94
74
# Raspberry Pi 4
95
- CFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access -funsafe-math-optimizations
75
+ CXXFLAGS += -mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access -funsafe-math-optimizations
96
76
endif
97
77
ifneq ($(filter armv8% ,$(UNAME_M ) ) ,)
98
78
# Raspberry Pi 4
99
- CFLAGS += -mfp16-format=ieee -mno-unaligned-access
79
+ CXXFLAGS += -mfp16-format=ieee -mno-unaligned-access
100
80
endif
101
81
102
- # Build Acceleration
103
82
ifeq ($(BUILD_TYPE ) ,cublas)
104
- EXTRA_LIBS=
105
83
CMAKE_ARGS+=-DGGML_CUBLAS=ON
106
- EXTRA_TARGETS+=ggml.dir/ggml-cuda.o
107
84
endif
108
85
ifeq ($(BUILD_TYPE ) ,openblas)
109
- EXTRA_LIBS=
110
86
CMAKE_ARGS+=-DGGML_OPENBLAS=ON
111
- CFLAGS += -DGGML_USE_OPENBLAS -I/usr/local/include/openblas
112
- LDFLAGS += -lopenblas
87
+ CXXFLAGS += -I/usr/local/include/openblas -lopenblas
113
88
CGO_TAGS =-tags openblas
114
89
endif
115
90
ifeq ($(BUILD_TYPE ) ,hipblas)
116
91
ROCM_HOME ?= "/opt/rocm"
117
92
CXX="$(ROCM_HOME)"/llvm/bin/clang++
118
93
CC="$(ROCM_HOME)"/llvm/bin/clang
119
- EXTRA_LIBS=
120
94
GPU_TARGETS ?= gfx900,gfx90a,gfx1030,gfx1031,gfx1100
121
95
AMDGPU_TARGETS ?= "$(GPU_TARGETS)"
122
96
CMAKE_ARGS+=-DGGML_HIPBLAS=ON -DAMDGPU_TARGETS="$(AMDGPU_TARGETS)" -DGPU_TARGETS="$(GPU_TARGETS)"
123
- EXTRA_TARGETS+=ggml.dir/ggml-cuda.o
124
97
GGML_CUDA_OBJ_PATH=CMakeFiles/ggml-rocm.dir/ggml-cuda.cu.o
125
98
endif
126
99
ifeq ($(BUILD_TYPE ) ,clblas)
127
- EXTRA_LIBS=
128
100
CMAKE_ARGS+=-DGGML_CLBLAST=ON
129
- EXTRA_TARGETS+=ggml.dir/ggml-opencl.o
130
101
CGO_TAGS=-tags cublas
131
102
endif
132
103
ifeq ($(BUILD_TYPE ) ,metal)
133
- EXTRA_LIBS=
134
104
CMAKE_ARGS+=-DGGML_METAL=ON
135
- EXTRA_TARGETS+=ggml.dir/ggml-metal.o
136
105
CGO_TAGS=-tags metal
106
+ EXTRA_TARGETS+=ggml-metal
137
107
endif
138
108
139
109
ifdef CLBLAST_DIR
@@ -147,14 +117,13 @@ $(info I chatglm.cpp build info: )
147
117
$(info I UNAME_S : $(UNAME_S ) )
148
118
$(info I UNAME_P : $(UNAME_P ) )
149
119
$(info I UNAME_M : $(UNAME_M ) )
150
- $(info I CFLAGS : $(CFLAGS ) )
151
120
$(info I CXXFLAGS : $(CXXFLAGS ) )
152
- $(info I LDFLAGS : $(LDFLAGS ) )
153
121
$(info I BUILD_TYPE : $(BUILD_TYPE ) )
154
122
$(info I CMAKE_ARGS : $(CMAKE_ARGS ) )
155
123
$(info I EXTRA_TARGETS : $(EXTRA_TARGETS ) )
156
124
$(info I CC : $(CCV ) )
157
125
$(info I CXX : $(CXXV ) )
126
+ $(info I CGO_TAGS : $(CGO_TAGS ) )
158
127
$(info )
159
128
160
129
# Use this if you want to set the default behavior
@@ -164,93 +133,63 @@ prepare:
164
133
165
134
# build chatglm.cpp
166
135
build/chatglm.cpp : prepare
167
- cd build && CC=" $( CC) " CXX=" $( CXX) " cmake ../chatglm.cpp $( CMAKE_ARGS ) && VERBOSE=1 cmake --build . -j --config Release
136
+ cd build && CC=" $( CC) " CXX=" $( CXX) " cmake $( CMAKE_ARGS ) ../chatglm.cpp && VERBOSE=1 cmake --build . -j --config Release
168
137
169
138
# chatglm.dir
170
139
chatglm.dir : build/chatglm.cpp
171
- cd out && mkdir -p chatglm.dir && cd ../build && \
172
- cp -rp CMakeFiles/chatglm.dir/chatglm.cpp.o ../ out/chatglm.dir/chatglm.o
140
+ cd out && mkdir -p chatglm.dir
141
+ cp build/ CMakeFiles/chatglm.dir/chatglm.cpp.o out/chatglm.dir/
173
142
174
143
# ggml.dir
175
144
ggml.dir : build/chatglm.cpp
176
- cd out && mkdir -p ggml.dir && cd ../build && \
177
- cp -rf third_party/ggml/src/CMakeFiles/ggml.dir/ggml.c.o ../out/ggml.dir/ggml.o && \
178
- cp -rf third_party/ggml/src/CMakeFiles/ggml.dir/ggml-alloc.c.o ../out/ggml.dir/ggml-alloc.o
145
+ cd out && mkdir -p ggml.dir
146
+ cp build/third_party/ggml/src/CMakeFiles/ggml.dir/* .o out/ggml.dir/
179
147
180
148
# sentencepiece.dir
181
149
sentencepiece.dir : build/chatglm.cpp
182
- cd out && mkdir -p sentencepiece.dir && cd ../build && \
183
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/sentencepiece_processor.cc.o ../out/sentencepiece.dir/sentencepiece_processor.o && \
184
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/error.cc.o ../out/sentencepiece.dir/error.o && \
185
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/model_factory.cc.o ../out/sentencepiece.dir/model_factory.o && \
186
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/model_interface.cc.o ../out/sentencepiece.dir/model_interface.o && \
187
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/bpe_model.cc.o ../out/sentencepiece.dir/bpe_model.o && \
188
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/char_model.cc.o ../out/sentencepiece.dir/char_model.o && \
189
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/word_model.cc.o ../out/sentencepiece.dir/word_model.o && \
190
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/unigram_model.cc.o ../out/sentencepiece.dir/unigram_model.o && \
191
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/util.cc.o ../out/sentencepiece.dir/util.o && \
192
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/normalizer.cc.o ../out/sentencepiece.dir/normalizer.o && \
193
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/filesystem.cc.o ../out/sentencepiece.dir/filesystem.o && \
194
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/builtin_pb/sentencepiece.pb.cc.o ../out/sentencepiece.dir/sentencepiece.pb.o && \
195
- cp -rf third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/builtin_pb/sentencepiece_model.pb.cc.o ../out/sentencepiece.dir/sentencepiece_model.pb.o
150
+ cd out && mkdir -p sentencepiece.dir
151
+ cp build/third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/* .cc.o out/sentencepiece.dir/
152
+ cp build/third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/builtin_pb/* .cc.o out/sentencepiece.dir/
196
153
197
154
# protobuf-lite.dir
198
155
protobuf-lite.dir : sentencepiece.dir
199
- cd out && mkdir -p protobuf-lite.dir && cd ../build && \
200
- find third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/__/third_party/protobuf-lite -name ' *.cc.o' -exec cp {} ../ out/protobuf-lite.dir/ \;
156
+ cd out && mkdir -p protobuf-lite.dir
157
+ cp build/ third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/__/third_party/protobuf-lite/ * .cc.o out/protobuf-lite.dir/
201
158
202
159
# absl.dir
203
160
absl.dir : sentencepiece.dir
204
- cd out && mkdir -p absl.dir && cd ../build && \
205
- find third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/__/third_party/absl/flags/ -name ' *.cc.o' -exec cp {} ../out/absl.dir/ \;
161
+ cd out && mkdir -p absl.dir
162
+ cp build/third_party/sentencepiece/src/CMakeFiles/sentencepiece-static.dir/__/third_party/absl/flags/flag.cc.o out/absl.dir/
163
+
164
+ # ggml-metal
165
+ ggml-metal : ggml.dir
166
+ cp build/bin/ggml-metal.metal .
206
167
207
168
# binding
208
169
binding.o : prepare build/chatglm.cpp chatglm.dir ggml.dir sentencepiece.dir protobuf-lite.dir absl.dir
209
170
$(CXX ) $(CXXFLAGS ) \
210
171
-I./chatglm.cpp \
211
172
-I./chatglm.cpp/third_party/ggml/include/ggml \
212
173
-I./chatglm.cpp/third_party/sentencepiece/src \
213
- binding.cpp -o binding.o -c $(LDFLAGS )
214
-
215
- # ggml-cuda
216
- ggml.dir/ggml-cuda.o : ggml.dir
217
- cd build && cp -rf " $( GGML_CUDA_OBJ_PATH) " ../out/ggml.dir/ggml-cuda.o
218
-
219
- # ggml-opencl
220
- ggml.dir/ggml-opencl.o : ggml.dir
221
- cd build && cp -rf third_party/ggml/src/CMakeFiles/ggml.dir/ggml-opencl.cpp.o ../out/ggml.dir/ggml-opencl.o
222
-
223
- # ggml-metal
224
- ggml.dir/ggml-metal.o : ggml.dir ggml.dir/ggml-backend.o
225
- cd build && cp -rf bin/ggml-metal.metal ../ggml-metal.metal && \
226
- cp -rf third_party/ggml/src/CMakeFiles/ggml.dir/ggml-metal.m.o ../out/ggml.dir/ggml-metal.o
227
-
228
- # ggml-backend
229
- ggml.dir/ggml-backend.o :
230
- cd build && cp -rf third_party/ggml/src/CMakeFiles/ggml.dir/ggml-backend.c.o ../out/ggml.dir/ggml-backend.o
174
+ binding.cpp -MD -MT binding.o -MF binding.d -o binding.o -c
231
175
232
176
libbinding.a : prepare binding.o $(EXTRA_TARGETS )
233
177
ar src libbinding.a \
234
- out/chatglm.dir/chatglm .o \
178
+ out/chatglm.dir/* .o \
235
179
out/ggml.dir/* .o out/sentencepiece.dir/* .o \
236
180
out/protobuf-lite.dir/* .o out/absl.dir/* .o \
237
181
binding.o
238
182
239
183
clean :
240
184
rm -rf * .o
185
+ rm -rf * .d
241
186
rm -rf * .a
242
187
rm -rf out
243
188
rm -rf build
244
189
245
- DOWNLOAD_TARGETS =ggllm-test-model.bin
246
- ifeq ($(OS ) ,Windows_NT)
247
- DOWNLOAD_TARGETS:=windows/ggllm-test-model.bin
248
- endif
249
-
250
190
ggllm-test-model.bin :
251
191
wget -q -N https://huggingface.co/Xorbits/chatglm3-6B-GGML/resolve/main/chatglm3-ggml-q4_0.bin -O ggllm-test-model.bin
252
- windows/ggllm-test-model.bin :
253
- powershell -Command " Invoke-WebRequest -Uri 'https://huggingface.co/Xorbits/chatglm3-6B-GGML/resolve/main/chatglm3-ggml-q4_0.bin' -OutFile 'ggllm-test-model.bin'"
254
192
255
- test : $(DOWNLOAD_TARGETS ) libbinding.a
256
- TEST_MODEL=ggllm-test-model.bin go test ${CGO_TAGS} .
193
+ test : ggllm-test-model.bin libbinding.a
194
+ go test ${CGO_TAGS} -timeout 1800s -o go-chatglm.cpp.test -c -cover
195
+ TEST_MODEL=ggllm-test-model.bin ./go-chatglm.cpp.test
0 commit comments