Spaces:
Build error
Build error
Illumotion
commited on
Commit
•
6ba25f7
1
Parent(s):
dc53b3a
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitignore +21 -1
- CMakeLists.txt +2 -2
- Makefile +12 -7
- README.md +80 -7
- ci/README.md +25 -0
- ci/run.sh +409 -0
- convert-lora-to-ggml.py +1 -0
- convert.py +92 -44
- cudart64_110.dll +0 -0
- examples/CMakeLists.txt +2 -0
- examples/Miku.sh +9 -8
- examples/baby-llama/CMakeLists.txt +1 -0
- examples/baby-llama/baby-llama.cpp +15 -9
- examples/benchmark/CMakeLists.txt +1 -0
- examples/common.cpp +160 -94
- examples/common.h +18 -11
- examples/embd-input/CMakeLists.txt +2 -0
- examples/embd-input/README.md +1 -1
- examples/embd-input/llava.py +1 -1
- examples/embd-input/minigpt4.py +1 -1
- examples/embedding/CMakeLists.txt +1 -0
- examples/grammar-parser.cpp +423 -0
- examples/grammar-parser.h +29 -0
- examples/llama2-13b.sh +18 -0
- examples/llama2.sh +18 -0
- examples/llm.vim +23 -0
- examples/main/CMakeLists.txt +1 -0
- examples/main/README.md +1 -1
- examples/main/main.cpp +94 -27
- examples/make-ggml.py +92 -0
- examples/metal/CMakeLists.txt +1 -0
- examples/perplexity/CMakeLists.txt +1 -0
- examples/perplexity/perplexity.cpp +81 -3
- examples/quantize-stats/CMakeLists.txt +1 -0
- examples/quantize/CMakeLists.txt +1 -0
- examples/quantize/quantize.cpp +19 -95
- examples/save-load-state/CMakeLists.txt +1 -0
- examples/server/CMakeLists.txt +4 -0
- examples/server/README.md +2 -1
- examples/server/chat.sh +2 -0
- examples/server/index.html.hpp +668 -414
- examples/server/public/index.html +97 -28
- examples/server/server.cpp +71 -31
- examples/simple/CMakeLists.txt +1 -0
- examples/train-text-from-scratch/CMakeLists.txt +1 -0
- examples/train-text-from-scratch/train-text-from-scratch.cpp +20 -18
- expose.cpp +6 -1
- expose.h +13 -1
- ggml-cuda.cu +832 -121
- ggml-metal.h +7 -0
.gitignore
CHANGED
@@ -16,6 +16,8 @@ build/
|
|
16 |
build-em/
|
17 |
build-debug/
|
18 |
build-release/
|
|
|
|
|
19 |
build-static/
|
20 |
build-cublas/
|
21 |
build-opencl/
|
@@ -25,6 +27,10 @@ build-no-accel/
|
|
25 |
build-sanitize-addr/
|
26 |
build-sanitize-thread/
|
27 |
out/
|
|
|
|
|
|
|
|
|
28 |
|
29 |
/main
|
30 |
/quantize
|
@@ -58,6 +64,20 @@ qnt-*.txt
|
|
58 |
perf-*.txt
|
59 |
|
60 |
examples/jeopardy/results.txt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
koboldcpp.so
|
62 |
koboldcpp_failsafe.so
|
63 |
koboldcpp_openblas.so
|
@@ -70,4 +90,4 @@ koboldcpp_openblas_noavx2.dll
|
|
70 |
koboldcpp_clblast.dll
|
71 |
koboldcpp_cublas.dll
|
72 |
cublas64_11.dll
|
73 |
-
cublasLt64_11.dll
|
|
|
16 |
build-em/
|
17 |
build-debug/
|
18 |
build-release/
|
19 |
+
build-ci-debug/
|
20 |
+
build-ci-release/
|
21 |
build-static/
|
22 |
build-cublas/
|
23 |
build-opencl/
|
|
|
27 |
build-sanitize-addr/
|
28 |
build-sanitize-thread/
|
29 |
out/
|
30 |
+
tmp/
|
31 |
+
|
32 |
+
models/*
|
33 |
+
models-mnt
|
34 |
|
35 |
/main
|
36 |
/quantize
|
|
|
64 |
perf-*.txt
|
65 |
|
66 |
examples/jeopardy/results.txt
|
67 |
+
|
68 |
+
pyproject.toml
|
69 |
+
poetry.lock
|
70 |
+
poetry.toml
|
71 |
+
|
72 |
+
# Test binaries
|
73 |
+
tests/test-double-float
|
74 |
+
tests/test-grad0
|
75 |
+
tests/test-opt
|
76 |
+
tests/test-quantize-fns
|
77 |
+
tests/test-quantize-perf
|
78 |
+
tests/test-sampling
|
79 |
+
tests/test-tokenizer-0
|
80 |
+
|
81 |
koboldcpp.so
|
82 |
koboldcpp_failsafe.so
|
83 |
koboldcpp_openblas.so
|
|
|
90 |
koboldcpp_clblast.dll
|
91 |
koboldcpp_cublas.dll
|
92 |
cublas64_11.dll
|
93 |
+
cublasLt64_11.dll
|
CMakeLists.txt
CHANGED
@@ -97,9 +97,9 @@ if (LLAMA_CUBLAS)
|
|
97 |
|
98 |
if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
99 |
if (LLAMA_CUDA_DMMV_F16)
|
100 |
-
set(CMAKE_CUDA_ARCHITECTURES "61") # needed for f16 CUDA intrinsics
|
101 |
else()
|
102 |
-
set(CMAKE_CUDA_ARCHITECTURES "52;61") # lowest CUDA 12 standard + lowest for integer intrinsics
|
103 |
endif()
|
104 |
endif()
|
105 |
message(STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}")
|
|
|
97 |
|
98 |
if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
|
99 |
if (LLAMA_CUDA_DMMV_F16)
|
100 |
+
set(CMAKE_CUDA_ARCHITECTURES "60;61") # needed for f16 CUDA intrinsics
|
101 |
else()
|
102 |
+
set(CMAKE_CUDA_ARCHITECTURES "37;52;61") # lowest CUDA 12 standard + lowest for integer intrinsics
|
103 |
endif()
|
104 |
endif()
|
105 |
message(STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}")
|
Makefile
CHANGED
@@ -144,7 +144,7 @@ ifdef LLAMA_CUBLAS
|
|
144 |
CUBLASLD_FLAGS = -lcublas -lculibos -lcudart -lcublasLt -lpthread -ldl -lrt -L/usr/local/cuda/lib64 -L/opt/cuda/lib64 -L$(CUDA_PATH)/targets/x86_64-linux/lib
|
145 |
CUBLAS_OBJS = ggml-cuda.o ggml_v2-cuda.o ggml_v2-cuda-legacy.o
|
146 |
NVCC = nvcc
|
147 |
-
NVCCFLAGS = --forward-unknown-to-host-compiler
|
148 |
ifdef CUDA_DOCKER_ARCH
|
149 |
NVCCFLAGS += -Wno-deprecated-gpu-targets -arch=$(CUDA_DOCKER_ARCH)
|
150 |
else
|
@@ -331,21 +331,26 @@ llama.o: llama.cpp ggml.h ggml-cuda.h llama.h llama-util.h
|
|
331 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
332 |
common.o: examples/common.cpp examples/common.h
|
333 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
|
|
|
|
334 |
expose.o: expose.cpp expose.h
|
335 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
336 |
-
|
|
|
|
|
|
|
337 |
$(CXX) $(CXXFLAGS) $(FAILSAFE_FLAGS) -c $< -o $@
|
338 |
-
gpttype_adapter.o:
|
339 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
340 |
-
gpttype_adapter_clblast.o:
|
341 |
$(CXX) $(CXXFLAGS) $(CLBLAST_FLAGS) -c $< -o $@
|
342 |
-
gpttype_adapter_cublas.o:
|
343 |
$(CXX) $(CXXFLAGS) $(CUBLAS_FLAGS) -c $< -o $@
|
344 |
|
345 |
clean:
|
346 |
rm -vf *.o main quantize_llama quantize_gpt2 quantize_gptj quantize_neox quantize_mpt quantize-stats perplexity embedding benchmark-matmult save-load-state main.exe quantize_llama.exe quantize_gptj.exe quantize_gpt2.exe quantize_neox.exe quantize_mpt.exe koboldcpp.dll koboldcpp_openblas.dll koboldcpp_failsafe.dll koboldcpp_openblas_noavx2.dll koboldcpp_clblast.dll koboldcpp_cublas.dll koboldcpp.so koboldcpp_openblas.so koboldcpp_failsafe.so koboldcpp_openblas_noavx2.so koboldcpp_clblast.so koboldcpp_cublas.so
|
347 |
|
348 |
-
main: examples/main/main.cpp build-info.h ggml.o k_quants.o llama.o common.o $(OBJS)
|
349 |
$(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS)
|
350 |
@echo
|
351 |
@echo '==== Run ./main -h for help. ===='
|
@@ -358,7 +363,7 @@ koboldcpp_openblas: ggml_openblas.o ggml_v2_openblas.o ggml_v1.o expose.o common
|
|
358 |
$(OPENBLAS_BUILD)
|
359 |
koboldcpp_failsafe: ggml_failsafe.o ggml_v2_failsafe.o ggml_v1_failsafe.o expose.o common.o gpttype_adapter_failsafe.o k_quants_failsafe.o $(OBJS)
|
360 |
$(FAILSAFE_BUILD)
|
361 |
-
koboldcpp_openblas_noavx2: ggml_openblas_noavx2.o ggml_v2_openblas_noavx2.o ggml_v1_failsafe.o expose.o common.o
|
362 |
$(OPENBLAS_NOAVX2_BUILD)
|
363 |
koboldcpp_clblast: ggml_clblast.o ggml_v2_clblast.o ggml_v1.o expose.o common.o gpttype_adapter_clblast.o ggml-opencl.o ggml_v2-opencl.o ggml_v2-opencl-legacy.o k_quants.o $(OBJS)
|
364 |
$(CLBLAST_BUILD)
|
|
|
144 |
CUBLASLD_FLAGS = -lcublas -lculibos -lcudart -lcublasLt -lpthread -ldl -lrt -L/usr/local/cuda/lib64 -L/opt/cuda/lib64 -L$(CUDA_PATH)/targets/x86_64-linux/lib
|
145 |
CUBLAS_OBJS = ggml-cuda.o ggml_v2-cuda.o ggml_v2-cuda-legacy.o
|
146 |
NVCC = nvcc
|
147 |
+
NVCCFLAGS = --forward-unknown-to-host-compiler -use_fast_math
|
148 |
ifdef CUDA_DOCKER_ARCH
|
149 |
NVCCFLAGS += -Wno-deprecated-gpu-targets -arch=$(CUDA_DOCKER_ARCH)
|
150 |
else
|
|
|
331 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
332 |
common.o: examples/common.cpp examples/common.h
|
333 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
334 |
+
grammar-parser.o: examples/grammar-parser.cpp examples/grammar-parser.h
|
335 |
+
$(CXX) $(CXXFLAGS) -c $< -o $@
|
336 |
expose.o: expose.cpp expose.h
|
337 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
338 |
+
|
339 |
+
# idiotic "for easier compilation"
|
340 |
+
GPTTYPE_ADAPTER = gpttype_adapter.cpp otherarch/llama_v2.cpp llama.cpp otherarch/utils.cpp otherarch/gptj_v1.cpp otherarch/gptj_v2.cpp otherarch/gptj_v3.cpp otherarch/gpt2_v1.cpp otherarch/gpt2_v2.cpp otherarch/gpt2_v3.cpp otherarch/rwkv_v2.cpp otherarch/rwkv_v3.cpp otherarch/neox_v2.cpp otherarch/neox_v3.cpp otherarch/mpt_v3.cpp ggml.h ggml-cuda.h llama.h llama-util.h
|
341 |
+
gpttype_adapter_failsafe.o: $(GPTTYPE_ADAPTER)
|
342 |
$(CXX) $(CXXFLAGS) $(FAILSAFE_FLAGS) -c $< -o $@
|
343 |
+
gpttype_adapter.o: $(GPTTYPE_ADAPTER)
|
344 |
$(CXX) $(CXXFLAGS) -c $< -o $@
|
345 |
+
gpttype_adapter_clblast.o: $(GPTTYPE_ADAPTER)
|
346 |
$(CXX) $(CXXFLAGS) $(CLBLAST_FLAGS) -c $< -o $@
|
347 |
+
gpttype_adapter_cublas.o: $(GPTTYPE_ADAPTER)
|
348 |
$(CXX) $(CXXFLAGS) $(CUBLAS_FLAGS) -c $< -o $@
|
349 |
|
350 |
clean:
|
351 |
rm -vf *.o main quantize_llama quantize_gpt2 quantize_gptj quantize_neox quantize_mpt quantize-stats perplexity embedding benchmark-matmult save-load-state main.exe quantize_llama.exe quantize_gptj.exe quantize_gpt2.exe quantize_neox.exe quantize_mpt.exe koboldcpp.dll koboldcpp_openblas.dll koboldcpp_failsafe.dll koboldcpp_openblas_noavx2.dll koboldcpp_clblast.dll koboldcpp_cublas.dll koboldcpp.so koboldcpp_openblas.so koboldcpp_failsafe.so koboldcpp_openblas_noavx2.so koboldcpp_clblast.so koboldcpp_cublas.so
|
352 |
|
353 |
+
main: examples/main/main.cpp build-info.h ggml.o k_quants.o llama.o common.o grammar-parser.o $(OBJS)
|
354 |
$(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS)
|
355 |
@echo
|
356 |
@echo '==== Run ./main -h for help. ===='
|
|
|
363 |
$(OPENBLAS_BUILD)
|
364 |
koboldcpp_failsafe: ggml_failsafe.o ggml_v2_failsafe.o ggml_v1_failsafe.o expose.o common.o gpttype_adapter_failsafe.o k_quants_failsafe.o $(OBJS)
|
365 |
$(FAILSAFE_BUILD)
|
366 |
+
koboldcpp_openblas_noavx2: ggml_openblas_noavx2.o ggml_v2_openblas_noavx2.o ggml_v1_failsafe.o expose.o common.o gpttype_adapter_failsafe.o k_quants_noavx2.o $(OBJS)
|
367 |
$(OPENBLAS_NOAVX2_BUILD)
|
368 |
koboldcpp_clblast: ggml_clblast.o ggml_v2_clblast.o ggml_v1.o expose.o common.o gpttype_adapter_clblast.o ggml-opencl.o ggml_v2-opencl.o ggml_v2-opencl-legacy.o k_quants.o $(OBJS)
|
369 |
$(CLBLAST_BUILD)
|
README.md
CHANGED
@@ -1,7 +1,80 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# koboldcpp
|
2 |
+
|
3 |
+
KoboldCpp is an easy-to-use AI text-generation software for GGML models. It's a single self contained distributable from Concedo, that builds off llama.cpp, and adds a versatile Kobold API endpoint, additional format support, backward compatibility, as well as a fancy UI with persistent stories, editing tools, save formats, memory, world info, author's note, characters, scenarios and everything Kobold and Kobold Lite have to offer.
|
4 |
+
|
5 |
+
![Preview](media/preview.png)
|
6 |
+
|
7 |
+
## Usage
|
8 |
+
- **[Download the latest .exe release here](https://github.com/LostRuins/koboldcpp/releases/latest)** or clone the git repo.
|
9 |
+
- Windows binaries are provided in the form of **koboldcpp.exe**, which is a pyinstaller wrapper for a few **.dll** files and **koboldcpp.py**. If you feel concerned, you may prefer to rebuild it yourself with the provided makefiles and scripts.
|
10 |
+
- Weights are not included, you can use the official llama.cpp `quantize.exe` to generate them from your official weight files (or download them from other places such as [TheBloke's Huggingface](https://huggingface.co/TheBloke).
|
11 |
+
- To run, execute **koboldcpp.exe** or drag and drop your quantized `ggml_model.bin` file onto the .exe, and then connect with Kobold or Kobold Lite. If you're not on windows, then run the script **KoboldCpp.py** after compiling the libraries.
|
12 |
+
- Launching with no command line arguments displays a GUI containing a subset of configurable settings. Generally you dont have to change much besides the `Presets` and `GPU Layers`. Read the `--help` for more info about each settings.
|
13 |
+
- By default, you can connect to http://localhost:5001
|
14 |
+
- You can also run it using the command line `koboldcpp.exe [ggml_model.bin] [port]`. For info, please check `koboldcpp.exe --help`
|
15 |
+
- Default context size to small? Try `--contextsize 3072` to 1.5x your context size! without much perplexity gain. Note that you'll have to increase the max context in the Kobold Lite UI as well (click and edit the number text field).
|
16 |
+
- Big context too slow? Try the `--smartcontext` flag to reduce prompt processing frequency. Also, you can try to run with your GPU using CLBlast, with `--useclblast` flag for a speedup
|
17 |
+
- Want even more speedup? Combine `--useclblast` with `--gpulayers` to offload entire layers to the GPU! **Much faster, but uses more VRAM**. Experiment to determine number of layers to offload, and reduce by a few if you run out of memory.
|
18 |
+
- If you are having crashes or issues, you can try turning off BLAS with the `--noblas` flag. You can also try running in a non-avx2 compatibility mode with `--noavx2`. Lastly, you can try turning off mmap with `--nommap`.
|
19 |
+
|
20 |
+
For more information, be sure to run the program with the `--help` flag.
|
21 |
+
|
22 |
+
## OSX and Linux
|
23 |
+
- You will have to compile your binaries from source. A makefile is provided, simply run `make`
|
24 |
+
- If you want you can also link your own install of OpenBLAS manually with `make LLAMA_OPENBLAS=1`
|
25 |
+
- Alternatively, if you want you can also link your own install of CLBlast manually with `make LLAMA_CLBLAST=1`, for this you will need to obtain and link OpenCL and CLBlast libraries.
|
26 |
+
- For Arch Linux: Install `cblas` `openblas` and `clblast`.
|
27 |
+
- For Debian: Install `libclblast-dev` and `libopenblas-dev`.
|
28 |
+
- For a full featured build, do `make LLAMA_OPENBLAS=1 LLAMA_CLBLAST=1 LLAMA_CUBLAS=1`
|
29 |
+
- After all binaries are built, you can run the python script with the command `koboldcpp.py [ggml_model.bin] [port]`
|
30 |
+
- Note: Many OSX users have found that the using Accelerate is actually faster than OpenBLAS. To try, you may wish to run with `--noblas` and compare speeds.
|
31 |
+
|
32 |
+
## Compiling on Windows
|
33 |
+
- You're encouraged to use the .exe released, but if you want to compile your binaries from source at Windows, the easiest way is:
|
34 |
+
- Use the latest release of w64devkit (https://github.com/skeeto/w64devkit). Be sure to use the "vanilla one", not i686 or other different stuff. If you try they will conflit with the precompiled libs!
|
35 |
+
- Make sure you are using the w64devkit integrated terminal, then run 'make' at the KoboldCpp source folder. This will create the .dll files.
|
36 |
+
- If you want to generate the .exe file, make sure you have the python module PyInstaller installed with pip ('pip install PyInstaller').
|
37 |
+
- Run the script make_pyinstaller.bat at a regular terminal (or Windows Explorer).
|
38 |
+
- The koboldcpp.exe file will be at your dist folder.
|
39 |
+
- If you wish to use your own version of the additional Windows libraries (OpenCL, CLBlast and OpenBLAS), you can do it with:
|
40 |
+
- OpenCL - tested with https://github.com/KhronosGroup/OpenCL-SDK . If you wish to compile it, follow the repository instructions. You will need vcpkg.
|
41 |
+
- CLBlast - tested with https://github.com/CNugteren/CLBlast . If you wish to compile it you will need to reference the OpenCL files. It will only generate the ".lib" file if you compile using MSVC.
|
42 |
+
- OpenBLAS - tested with https://github.com/xianyi/OpenBLAS .
|
43 |
+
- Move the respectives .lib files to the /lib folder of your project, overwriting the older files.
|
44 |
+
- Also, replace the existing versions of the corresponding .dll files located in the project directory root (e.g. libopenblas.dll).
|
45 |
+
- Make the KoboldCPP project using the instructions above.
|
46 |
+
|
47 |
+
## Android (Termux) Alternative method
|
48 |
+
- See https://github.com/ggerganov/llama.cpp/pull/1828/files
|
49 |
+
|
50 |
+
## Using CuBLAS
|
51 |
+
- If you're on Windows with an Nvidia GPU you can get CUDA support out of the box using the `--usecublas` flag, make sure you select the correct .exe with CUDA support.
|
52 |
+
- You can attempt a CuBLAS build with `LLAMA_CUBLAS=1` or using the provided CMake file (best for visual studio users). If you use the CMake file to build, copy the `koboldcpp_cublas.dll` generated into the same directory as the `koboldcpp.py` file. If you are bundling executables, you may need to include CUDA dynamic libraries (such as `cublasLt64_11.dll` and `cublas64_11.dll`) in order for the executable to work correctly on a different PC.
|
53 |
+
|
54 |
+
## Questions and Help
|
55 |
+
- **First, please check out [The KoboldCpp FAQ and Knowledgebase](https://github.com/LostRuins/koboldcpp/wiki) which may already have answers to your questions! Also please search through past issues and discussions.**
|
56 |
+
- If you cannot find an answer, open an issue on this github, or find us on the [KoboldAI Discord](https://koboldai.org/discord).
|
57 |
+
|
58 |
+
## Considerations
|
59 |
+
- For Windows: No installation, single file executable, (It Just Works)
|
60 |
+
- Since v1.0.6, requires libopenblas, the prebuilt windows binaries are included in this repo. If not found, it will fall back to a mode without BLAS.
|
61 |
+
- Since v1.15, requires CLBlast if enabled, the prebuilt windows binaries are included in this repo. If not found, it will fall back to a mode without CLBlast.
|
62 |
+
- Since v1.33, you can set the context size to be above what the model supports officially. It does increases perplexity but should still work well below 4096 even on untuned models. (For GPT-NeoX, GPT-J, and LLAMA models) Customize this with `--ropeconfig`.
|
63 |
+
- **I plan to keep backwards compatibility with ALL past llama.cpp AND alpaca.cpp models**. But you are also encouraged to reconvert/update your models if possible for best results.
|
64 |
+
|
65 |
+
## License
|
66 |
+
- The original GGML library and llama.cpp by ggerganov are licensed under the MIT License
|
67 |
+
- However, Kobold Lite is licensed under the AGPL v3.0 License
|
68 |
+
- The other files are also under the AGPL v3.0 License unless otherwise stated
|
69 |
+
|
70 |
+
## Notes
|
71 |
+
- Generation delay scales linearly with original prompt length. If OpenBLAS is enabled then prompt ingestion becomes about 2-3x faster. This is automatic on windows, but will require linking on OSX and Linux. CLBlast speeds this up even further, and `--gpulayers` + `--useclblast` more so.
|
72 |
+
- I have heard of someone claiming a false AV positive report. The exe is a simple pyinstaller bundle that includes the necessary python scripts and dlls to run. If this still concerns you, you might wish to rebuild everything from source code using the makefile, and you can rebuild the exe yourself with pyinstaller by using `make_pyinstaller.bat`
|
73 |
+
- Supported GGML models (Includes backward compatibility for older versions/legacy GGML models, though some newer features might be unavailable):
|
74 |
+
- LLAMA and LLAMA2 (LLaMA / Alpaca / GPT4All / Vicuna / Koala / Pygmalion 7B / Metharme 7B / WizardLM and many more)
|
75 |
+
- GPT-2 / Cerebras
|
76 |
+
- GPT-J
|
77 |
+
- RWKV
|
78 |
+
- GPT-NeoX / Pythia / StableLM / Dolly / RedPajama
|
79 |
+
- MPT models
|
80 |
+
|
ci/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CI
|
2 |
+
|
3 |
+
In addition to [Github Actions](https://github.com/ggerganov/llama.cpp/actions) `llama.cpp` uses a custom CI framework:
|
4 |
+
|
5 |
+
https://github.com/ggml-org/ci
|
6 |
+
|
7 |
+
It monitors the `master` branch for new commits and runs the
|
8 |
+
[ci/run.sh](https://github.com/ggerganov/llama.cpp/blob/master/ci/run.sh) script on dedicated cloud instances. This allows us
|
9 |
+
to execute heavier workloads compared to just using Github Actions. Also with time, the cloud instances will be scaled
|
10 |
+
to cover various hardware architectures, including GPU and Apple Silicon instances.
|
11 |
+
|
12 |
+
Collaborators can optionally trigger the CI run by adding the `ggml-ci` keyword to their commit message.
|
13 |
+
Only the branches of this repo are monitored for this keyword.
|
14 |
+
|
15 |
+
It is a good practice, before publishing changes to execute the full CI locally on your machine:
|
16 |
+
|
17 |
+
```bash
|
18 |
+
mkdir tmp
|
19 |
+
|
20 |
+
# CPU-only build
|
21 |
+
bash ./ci/run.sh ./tmp/results ./tmp/mnt
|
22 |
+
|
23 |
+
# with CUDA support
|
24 |
+
GG_BUILD_CUDA=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt
|
25 |
+
```
|
ci/run.sh
ADDED
@@ -0,0 +1,409 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#/bin/bash
|
2 |
+
#
|
3 |
+
# sample usage:
|
4 |
+
#
|
5 |
+
# mkdir tmp
|
6 |
+
#
|
7 |
+
# # CPU-only build
|
8 |
+
# bash ./ci/run.sh ./tmp/results ./tmp/mnt
|
9 |
+
#
|
10 |
+
# # with CUDA support
|
11 |
+
# GG_BUILD_CUDA=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt
|
12 |
+
#
|
13 |
+
|
14 |
+
if [ -z "$2" ]; then
|
15 |
+
echo "usage: $0 <output-dir> <mnt-dir>"
|
16 |
+
exit 1
|
17 |
+
fi
|
18 |
+
|
19 |
+
mkdir -p "$1"
|
20 |
+
mkdir -p "$2"
|
21 |
+
|
22 |
+
OUT=$(realpath "$1")
|
23 |
+
MNT=$(realpath "$2")
|
24 |
+
|
25 |
+
rm -v $OUT/*.log
|
26 |
+
rm -v $OUT/*.exit
|
27 |
+
rm -v $OUT/*.md
|
28 |
+
|
29 |
+
sd=`dirname $0`
|
30 |
+
cd $sd/../
|
31 |
+
SRC=`pwd`
|
32 |
+
|
33 |
+
## helpers
|
34 |
+
|
35 |
+
# download a file if it does not exist or if it is outdated
|
36 |
+
function gg_wget {
|
37 |
+
local out=$1
|
38 |
+
local url=$2
|
39 |
+
|
40 |
+
local cwd=`pwd`
|
41 |
+
|
42 |
+
mkdir -p $out
|
43 |
+
cd $out
|
44 |
+
|
45 |
+
# should not re-download if file is the same
|
46 |
+
wget -nv -N $url
|
47 |
+
|
48 |
+
cd $cwd
|
49 |
+
}
|
50 |
+
|
51 |
+
function gg_printf {
|
52 |
+
printf -- "$@" >> $OUT/README.md
|
53 |
+
}
|
54 |
+
|
55 |
+
function gg_run {
|
56 |
+
ci=$1
|
57 |
+
|
58 |
+
set -o pipefail
|
59 |
+
set -x
|
60 |
+
|
61 |
+
gg_run_$ci | tee $OUT/$ci.log
|
62 |
+
cur=$?
|
63 |
+
echo "$cur" > $OUT/$ci.exit
|
64 |
+
|
65 |
+
set +x
|
66 |
+
set +o pipefail
|
67 |
+
|
68 |
+
gg_sum_$ci
|
69 |
+
|
70 |
+
ret=$((ret | cur))
|
71 |
+
}
|
72 |
+
|
73 |
+
## ci
|
74 |
+
|
75 |
+
# ctest_debug
|
76 |
+
|
77 |
+
function gg_run_ctest_debug {
|
78 |
+
cd ${SRC}
|
79 |
+
|
80 |
+
rm -rf build-ci-debug && mkdir build-ci-debug && cd build-ci-debug
|
81 |
+
|
82 |
+
set -e
|
83 |
+
|
84 |
+
(time cmake -DCMAKE_BUILD_TYPE=Debug .. ) 2>&1 | tee -a $OUT/${ci}-cmake.log
|
85 |
+
(time make -j ) 2>&1 | tee -a $OUT/${ci}-make.log
|
86 |
+
|
87 |
+
(time ctest --output-on-failure -E test-opt ) 2>&1 | tee -a $OUT/${ci}-ctest.log
|
88 |
+
|
89 |
+
set +e
|
90 |
+
}
|
91 |
+
|
92 |
+
function gg_sum_ctest_debug {
|
93 |
+
gg_printf '### %s\n\n' "${ci}"
|
94 |
+
|
95 |
+
gg_printf 'Runs ctest in debug mode\n'
|
96 |
+
gg_printf '- status: %s\n' "$(cat $OUT/${ci}.exit)"
|
97 |
+
gg_printf '```\n'
|
98 |
+
gg_printf '%s\n' "$(cat $OUT/${ci}-ctest.log)"
|
99 |
+
gg_printf '```\n'
|
100 |
+
gg_printf '\n'
|
101 |
+
}
|
102 |
+
|
103 |
+
# ctest_release
|
104 |
+
|
105 |
+
function gg_run_ctest_release {
|
106 |
+
cd ${SRC}
|
107 |
+
|
108 |
+
rm -rf build-ci-release && mkdir build-ci-release && cd build-ci-release
|
109 |
+
|
110 |
+
set -e
|
111 |
+
|
112 |
+
(time cmake -DCMAKE_BUILD_TYPE=Release .. ) 2>&1 | tee -a $OUT/${ci}-cmake.log
|
113 |
+
(time make -j ) 2>&1 | tee -a $OUT/${ci}-make.log
|
114 |
+
|
115 |
+
if [ -z ${GG_BUILD_LOW_PERF} ]; then
|
116 |
+
(time ctest --output-on-failure ) 2>&1 | tee -a $OUT/${ci}-ctest.log
|
117 |
+
else
|
118 |
+
(time ctest --output-on-failure -E test-opt ) 2>&1 | tee -a $OUT/${ci}-ctest.log
|
119 |
+
fi
|
120 |
+
|
121 |
+
set +e
|
122 |
+
}
|
123 |
+
|
124 |
+
function gg_sum_ctest_release {
|
125 |
+
gg_printf '### %s\n\n' "${ci}"
|
126 |
+
|
127 |
+
gg_printf 'Runs ctest in release mode\n'
|
128 |
+
gg_printf '- status: %s\n' "$(cat $OUT/${ci}.exit)"
|
129 |
+
gg_printf '```\n'
|
130 |
+
gg_printf '%s\n' "$(cat $OUT/${ci}-ctest.log)"
|
131 |
+
gg_printf '```\n'
|
132 |
+
}
|
133 |
+
|
134 |
+
# open_llama_3b_v2
|
135 |
+
|
136 |
+
function gg_run_open_llama_3b_v2 {
|
137 |
+
cd ${SRC}
|
138 |
+
|
139 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/raw/main/config.json
|
140 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/resolve/main/tokenizer.model
|
141 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/raw/main/tokenizer_config.json
|
142 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/raw/main/special_tokens_map.json
|
143 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/resolve/main/pytorch_model.bin
|
144 |
+
gg_wget models-mnt/open-llama/3B-v2/ https://huggingface.co/openlm-research/open_llama_3b_v2/raw/main/generation_config.json
|
145 |
+
|
146 |
+
gg_wget models-mnt/wikitext/ https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip
|
147 |
+
unzip -o models-mnt/wikitext/wikitext-2-raw-v1.zip -d models-mnt/wikitext/
|
148 |
+
head -n 60 models-mnt/wikitext/wikitext-2-raw/wiki.test.raw > models-mnt/wikitext/wikitext-2-raw/wiki.test-60.raw
|
149 |
+
|
150 |
+
path_models="../models-mnt/open-llama/3B-v2"
|
151 |
+
path_wiki="../models-mnt/wikitext/wikitext-2-raw"
|
152 |
+
|
153 |
+
rm -rf build-ci-release && mkdir build-ci-release && cd build-ci-release
|
154 |
+
|
155 |
+
set -e
|
156 |
+
|
157 |
+
(time cmake -DCMAKE_BUILD_TYPE=Release -DLLAMA_QKK_64=1 .. ) 2>&1 | tee -a $OUT/${ci}-cmake.log
|
158 |
+
(time make -j ) 2>&1 | tee -a $OUT/${ci}-make.log
|
159 |
+
|
160 |
+
python3 ../convert.py ${path_models}
|
161 |
+
|
162 |
+
model_f16="${path_models}/ggml-model-f16.bin"
|
163 |
+
model_q8_0="${path_models}/ggml-model-q8_0.bin"
|
164 |
+
model_q4_0="${path_models}/ggml-model-q4_0.bin"
|
165 |
+
model_q4_1="${path_models}/ggml-model-q4_1.bin"
|
166 |
+
model_q5_0="${path_models}/ggml-model-q5_0.bin"
|
167 |
+
model_q5_1="${path_models}/ggml-model-q5_1.bin"
|
168 |
+
model_q2_k="${path_models}/ggml-model-q2_k.bin"
|
169 |
+
model_q3_k="${path_models}/ggml-model-q3_k.bin"
|
170 |
+
model_q4_k="${path_models}/ggml-model-q4_k.bin"
|
171 |
+
model_q5_k="${path_models}/ggml-model-q5_k.bin"
|
172 |
+
model_q6_k="${path_models}/ggml-model-q6_k.bin"
|
173 |
+
|
174 |
+
wiki_test_60="${path_wiki}/wiki.test-60.raw"
|
175 |
+
|
176 |
+
./bin/quantize ${model_f16} ${model_q8_0} q8_0
|
177 |
+
./bin/quantize ${model_f16} ${model_q4_0} q4_0
|
178 |
+
./bin/quantize ${model_f16} ${model_q4_1} q4_1
|
179 |
+
./bin/quantize ${model_f16} ${model_q5_0} q5_0
|
180 |
+
./bin/quantize ${model_f16} ${model_q5_1} q5_1
|
181 |
+
./bin/quantize ${model_f16} ${model_q2_k} q2_k
|
182 |
+
./bin/quantize ${model_f16} ${model_q3_k} q3_k
|
183 |
+
./bin/quantize ${model_f16} ${model_q4_k} q4_k
|
184 |
+
./bin/quantize ${model_f16} ${model_q5_k} q5_k
|
185 |
+
./bin/quantize ${model_f16} ${model_q6_k} q6_k
|
186 |
+
|
187 |
+
(time ./bin/main --model ${model_f16} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-f16.log
|
188 |
+
(time ./bin/main --model ${model_q8_0} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q8_0.log
|
189 |
+
(time ./bin/main --model ${model_q4_0} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_0.log
|
190 |
+
(time ./bin/main --model ${model_q4_1} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_1.log
|
191 |
+
(time ./bin/main --model ${model_q5_0} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_0.log
|
192 |
+
(time ./bin/main --model ${model_q5_1} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_1.log
|
193 |
+
(time ./bin/main --model ${model_q2_k} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q2_k.log
|
194 |
+
(time ./bin/main --model ${model_q3_k} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q3_k.log
|
195 |
+
(time ./bin/main --model ${model_q4_k} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_k.log
|
196 |
+
(time ./bin/main --model ${model_q5_k} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_k.log
|
197 |
+
(time ./bin/main --model ${model_q6_k} -s 1234 -n 64 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q6_k.log
|
198 |
+
|
199 |
+
(time ./bin/perplexity --model ${model_f16} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-f16.log
|
200 |
+
(time ./bin/perplexity --model ${model_q8_0} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q8_0.log
|
201 |
+
(time ./bin/perplexity --model ${model_q4_0} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_0.log
|
202 |
+
(time ./bin/perplexity --model ${model_q4_1} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_1.log
|
203 |
+
(time ./bin/perplexity --model ${model_q5_0} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_0.log
|
204 |
+
(time ./bin/perplexity --model ${model_q5_1} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_1.log
|
205 |
+
(time ./bin/perplexity --model ${model_q2_k} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q2_k.log
|
206 |
+
(time ./bin/perplexity --model ${model_q3_k} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q3_k.log
|
207 |
+
(time ./bin/perplexity --model ${model_q4_k} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_k.log
|
208 |
+
(time ./bin/perplexity --model ${model_q5_k} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_k.log
|
209 |
+
(time ./bin/perplexity --model ${model_q6_k} -f ${wiki_test_60} -c 128 -b 128 --chunks 3 ) 2>&1 | tee -a $OUT/${ci}-tg-q6_k.log
|
210 |
+
|
211 |
+
function check_ppl {
|
212 |
+
qnt="$1"
|
213 |
+
ppl=$(echo "$2" | grep -oE "[0-9]+\.[0-9]+" | tail -n 1)
|
214 |
+
|
215 |
+
if [ $(echo "$ppl > 20.0" | bc) -eq 1 ]; then
|
216 |
+
printf ' - %s @ %s (FAIL: ppl > 20.0)\n' "$qnt" "$ppl"
|
217 |
+
return 20
|
218 |
+
fi
|
219 |
+
|
220 |
+
printf ' - %s @ %s OK\n' "$qnt" "$ppl"
|
221 |
+
return 0
|
222 |
+
}
|
223 |
+
|
224 |
+
check_ppl "f16" "$(cat $OUT/${ci}-tg-f16.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
225 |
+
check_ppl "q8_0" "$(cat $OUT/${ci}-tg-q8_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
226 |
+
check_ppl "q4_0" "$(cat $OUT/${ci}-tg-q4_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
227 |
+
check_ppl "q4_1" "$(cat $OUT/${ci}-tg-q4_1.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
228 |
+
check_ppl "q5_0" "$(cat $OUT/${ci}-tg-q5_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
229 |
+
check_ppl "q5_1" "$(cat $OUT/${ci}-tg-q5_1.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
230 |
+
check_ppl "q2_k" "$(cat $OUT/${ci}-tg-q2_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
231 |
+
check_ppl "q3_k" "$(cat $OUT/${ci}-tg-q3_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
232 |
+
check_ppl "q4_k" "$(cat $OUT/${ci}-tg-q4_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
233 |
+
check_ppl "q5_k" "$(cat $OUT/${ci}-tg-q5_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
234 |
+
check_ppl "q6_k" "$(cat $OUT/${ci}-tg-q6_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
235 |
+
|
236 |
+
set +e
|
237 |
+
}
|
238 |
+
|
239 |
+
function gg_sum_open_llama_3b_v2 {
|
240 |
+
gg_printf '### %s\n\n' "${ci}"
|
241 |
+
|
242 |
+
gg_printf 'OpenLLaMA 3B-v2:\n'
|
243 |
+
gg_printf '- status: %s\n' "$(cat $OUT/${ci}.exit)"
|
244 |
+
gg_printf '- perplexity:\n%s\n' "$(cat $OUT/${ci}-ppl.log)"
|
245 |
+
gg_printf '- f16: \n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-f16.log)"
|
246 |
+
gg_printf '- q8_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q8_0.log)"
|
247 |
+
gg_printf '- q4_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_0.log)"
|
248 |
+
gg_printf '- q4_1:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_1.log)"
|
249 |
+
gg_printf '- q5_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_0.log)"
|
250 |
+
gg_printf '- q5_1:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_1.log)"
|
251 |
+
gg_printf '- q2_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q2_k.log)"
|
252 |
+
gg_printf '- q3_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q3_k.log)"
|
253 |
+
gg_printf '- q4_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_k.log)"
|
254 |
+
gg_printf '- q5_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_k.log)"
|
255 |
+
gg_printf '- q6_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q6_k.log)"
|
256 |
+
}
|
257 |
+
|
258 |
+
# open_llama_7b_v2
|
259 |
+
# requires: GG_BUILD_CUDA
|
260 |
+
|
261 |
+
function gg_run_open_llama_7b_v2 {
|
262 |
+
cd ${SRC}
|
263 |
+
|
264 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/raw/main/config.json
|
265 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/resolve/main/tokenizer.model
|
266 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/raw/main/tokenizer_config.json
|
267 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/raw/main/special_tokens_map.json
|
268 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/raw/main/pytorch_model.bin.index.json
|
269 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/resolve/main/pytorch_model-00001-of-00002.bin
|
270 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/resolve/main/pytorch_model-00002-of-00002.bin
|
271 |
+
gg_wget models-mnt/open-llama/7B-v2/ https://huggingface.co/openlm-research/open_llama_7b_v2/raw/main/generation_config.json
|
272 |
+
|
273 |
+
gg_wget models-mnt/wikitext/ https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip
|
274 |
+
unzip -o models-mnt/wikitext/wikitext-2-raw-v1.zip -d models-mnt/wikitext/
|
275 |
+
|
276 |
+
path_models="../models-mnt/open-llama/7B-v2"
|
277 |
+
path_wiki="../models-mnt/wikitext/wikitext-2-raw"
|
278 |
+
|
279 |
+
rm -rf build-ci-release && mkdir build-ci-release && cd build-ci-release
|
280 |
+
|
281 |
+
set -e
|
282 |
+
|
283 |
+
(time cmake -DCMAKE_BUILD_TYPE=Release -DLLAMA_CUBLAS=1 .. ) 2>&1 | tee -a $OUT/${ci}-cmake.log
|
284 |
+
(time make -j ) 2>&1 | tee -a $OUT/${ci}-make.log
|
285 |
+
|
286 |
+
python3 ../convert.py ${path_models}
|
287 |
+
|
288 |
+
model_f16="${path_models}/ggml-model-f16.bin"
|
289 |
+
model_q8_0="${path_models}/ggml-model-q8_0.bin"
|
290 |
+
model_q4_0="${path_models}/ggml-model-q4_0.bin"
|
291 |
+
model_q4_1="${path_models}/ggml-model-q4_1.bin"
|
292 |
+
model_q5_0="${path_models}/ggml-model-q5_0.bin"
|
293 |
+
model_q5_1="${path_models}/ggml-model-q5_1.bin"
|
294 |
+
model_q2_k="${path_models}/ggml-model-q2_k.bin"
|
295 |
+
model_q3_k="${path_models}/ggml-model-q3_k.bin"
|
296 |
+
model_q4_k="${path_models}/ggml-model-q4_k.bin"
|
297 |
+
model_q5_k="${path_models}/ggml-model-q5_k.bin"
|
298 |
+
model_q6_k="${path_models}/ggml-model-q6_k.bin"
|
299 |
+
|
300 |
+
wiki_test="${path_wiki}/wiki.test.raw"
|
301 |
+
|
302 |
+
./bin/quantize ${model_f16} ${model_q8_0} q8_0
|
303 |
+
./bin/quantize ${model_f16} ${model_q4_0} q4_0
|
304 |
+
./bin/quantize ${model_f16} ${model_q4_1} q4_1
|
305 |
+
./bin/quantize ${model_f16} ${model_q5_0} q5_0
|
306 |
+
./bin/quantize ${model_f16} ${model_q5_1} q5_1
|
307 |
+
./bin/quantize ${model_f16} ${model_q2_k} q2_k
|
308 |
+
./bin/quantize ${model_f16} ${model_q3_k} q3_k
|
309 |
+
./bin/quantize ${model_f16} ${model_q4_k} q4_k
|
310 |
+
./bin/quantize ${model_f16} ${model_q5_k} q5_k
|
311 |
+
./bin/quantize ${model_f16} ${model_q6_k} q6_k
|
312 |
+
|
313 |
+
(time ./bin/main --model ${model_f16} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-f16.log
|
314 |
+
(time ./bin/main --model ${model_q8_0} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q8_0.log
|
315 |
+
(time ./bin/main --model ${model_q4_0} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_0.log
|
316 |
+
(time ./bin/main --model ${model_q4_1} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_1.log
|
317 |
+
(time ./bin/main --model ${model_q5_0} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_0.log
|
318 |
+
(time ./bin/main --model ${model_q5_1} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_1.log
|
319 |
+
(time ./bin/main --model ${model_q2_k} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q2_k.log
|
320 |
+
(time ./bin/main --model ${model_q3_k} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q3_k.log
|
321 |
+
(time ./bin/main --model ${model_q4_k} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q4_k.log
|
322 |
+
(time ./bin/main --model ${model_q5_k} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q5_k.log
|
323 |
+
(time ./bin/main --model ${model_q6_k} -ngl 999 -s 1234 -n 256 --ignore-eos -p "I believe the meaning of life is" ) 2>&1 | tee -a $OUT/${ci}-tg-q6_k.log
|
324 |
+
|
325 |
+
(time ./bin/perplexity --model ${model_f16} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-f16.log
|
326 |
+
(time ./bin/perplexity --model ${model_q8_0} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q8_0.log
|
327 |
+
(time ./bin/perplexity --model ${model_q4_0} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_0.log
|
328 |
+
(time ./bin/perplexity --model ${model_q4_1} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_1.log
|
329 |
+
(time ./bin/perplexity --model ${model_q5_0} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_0.log
|
330 |
+
(time ./bin/perplexity --model ${model_q5_1} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_1.log
|
331 |
+
(time ./bin/perplexity --model ${model_q2_k} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q2_k.log
|
332 |
+
(time ./bin/perplexity --model ${model_q3_k} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q3_k.log
|
333 |
+
(time ./bin/perplexity --model ${model_q4_k} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q4_k.log
|
334 |
+
(time ./bin/perplexity --model ${model_q5_k} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q5_k.log
|
335 |
+
(time ./bin/perplexity --model ${model_q6_k} -f ${wiki_test} -t 1 -ngl 999 -c 2048 -b 512 --chunks 4 ) 2>&1 | tee -a $OUT/${ci}-tg-q6_k.log
|
336 |
+
|
337 |
+
function check_ppl {
|
338 |
+
qnt="$1"
|
339 |
+
ppl=$(echo "$2" | grep -oE "[0-9]+\.[0-9]+" | tail -n 1)
|
340 |
+
|
341 |
+
if [ $(echo "$ppl > 20.0" | bc) -eq 1 ]; then
|
342 |
+
printf ' - %s @ %s (FAIL: ppl > 20.0)\n' "$qnt" "$ppl"
|
343 |
+
return 20
|
344 |
+
fi
|
345 |
+
|
346 |
+
printf ' - %s @ %s OK\n' "$qnt" "$ppl"
|
347 |
+
return 0
|
348 |
+
}
|
349 |
+
|
350 |
+
check_ppl "f16" "$(cat $OUT/${ci}-tg-f16.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
351 |
+
check_ppl "q8_0" "$(cat $OUT/${ci}-tg-q8_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
352 |
+
check_ppl "q4_0" "$(cat $OUT/${ci}-tg-q4_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
353 |
+
check_ppl "q4_1" "$(cat $OUT/${ci}-tg-q4_1.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
354 |
+
check_ppl "q5_0" "$(cat $OUT/${ci}-tg-q5_0.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
355 |
+
check_ppl "q5_1" "$(cat $OUT/${ci}-tg-q5_1.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
356 |
+
check_ppl "q2_k" "$(cat $OUT/${ci}-tg-q2_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
357 |
+
check_ppl "q3_k" "$(cat $OUT/${ci}-tg-q3_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
358 |
+
check_ppl "q4_k" "$(cat $OUT/${ci}-tg-q4_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
359 |
+
check_ppl "q5_k" "$(cat $OUT/${ci}-tg-q5_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
360 |
+
check_ppl "q6_k" "$(cat $OUT/${ci}-tg-q6_k.log | grep "^\[1\]")" | tee -a $OUT/${ci}-ppl.log
|
361 |
+
|
362 |
+
set +e
|
363 |
+
}
|
364 |
+
|
365 |
+
function gg_sum_open_llama_7b_v2 {
|
366 |
+
gg_printf '### %s\n\n' "${ci}"
|
367 |
+
|
368 |
+
gg_printf 'OpenLLaMA 7B-v2:\n'
|
369 |
+
gg_printf '- status: %s\n' "$(cat $OUT/${ci}.exit)"
|
370 |
+
gg_printf '- perplexity:\n%s\n' "$(cat $OUT/${ci}-ppl.log)"
|
371 |
+
gg_printf '- f16: \n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-f16.log)"
|
372 |
+
gg_printf '- q8_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q8_0.log)"
|
373 |
+
gg_printf '- q4_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_0.log)"
|
374 |
+
gg_printf '- q4_1:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_1.log)"
|
375 |
+
gg_printf '- q5_0:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_0.log)"
|
376 |
+
gg_printf '- q5_1:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_1.log)"
|
377 |
+
gg_printf '- q2_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q2_k.log)"
|
378 |
+
gg_printf '- q3_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q3_k.log)"
|
379 |
+
gg_printf '- q4_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q4_k.log)"
|
380 |
+
gg_printf '- q5_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q5_k.log)"
|
381 |
+
gg_printf '- q6_k:\n```\n%s\n```\n' "$(cat $OUT/${ci}-tg-q6_k.log)"
|
382 |
+
}
|
383 |
+
|
384 |
+
## main
|
385 |
+
|
386 |
+
if [ -z ${GG_BUILD_LOW_PERF} ]; then
|
387 |
+
rm -rf ${SRC}/models-mnt
|
388 |
+
|
389 |
+
mnt_models=${MNT}/models
|
390 |
+
mkdir -p ${mnt_models}
|
391 |
+
ln -sfn ${mnt_models} ${SRC}/models-mnt
|
392 |
+
|
393 |
+
python3 -m pip install -r ${SRC}/requirements.txt
|
394 |
+
fi
|
395 |
+
|
396 |
+
ret=0
|
397 |
+
|
398 |
+
test $ret -eq 0 && gg_run ctest_debug
|
399 |
+
test $ret -eq 0 && gg_run ctest_release
|
400 |
+
|
401 |
+
if [ -z ${GG_BUILD_LOW_PERF} ]; then
|
402 |
+
if [ -z ${GG_BUILD_CUDA} ]; then
|
403 |
+
test $ret -eq 0 && gg_run open_llama_3b_v2
|
404 |
+
else
|
405 |
+
test $ret -eq 0 && gg_run open_llama_7b_v2
|
406 |
+
fi
|
407 |
+
fi
|
408 |
+
|
409 |
+
exit $ret
|
convert-lora-to-ggml.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import json
|
2 |
import os
|
3 |
import re
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
import json
|
3 |
import os
|
4 |
import re
|
convert.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import argparse
|
2 |
import concurrent.futures
|
3 |
import copy
|
@@ -141,9 +142,9 @@ def find_n_mult(n_ff: int, n_embd: int) -> int:
|
|
141 |
@dataclass
|
142 |
class Params:
|
143 |
n_vocab: int
|
144 |
-
n_embd:
|
145 |
-
n_mult:
|
146 |
-
n_head:
|
147 |
n_layer: int
|
148 |
|
149 |
@staticmethod
|
@@ -166,11 +167,11 @@ class Params:
|
|
166 |
n_head=n_embd // 128 # guessed
|
167 |
|
168 |
return Params(
|
169 |
-
n_vocab=n_vocab,
|
170 |
-
n_embd=n_embd,
|
171 |
-
n_mult=256,
|
172 |
-
n_head=n_head,
|
173 |
-
n_layer=n_layer,
|
174 |
)
|
175 |
|
176 |
@staticmethod
|
@@ -178,28 +179,53 @@ class Params:
|
|
178 |
config = json.load(open(config_path))
|
179 |
|
180 |
n_vocab = config["vocab_size"];
|
181 |
-
n_embd
|
182 |
-
n_head
|
183 |
n_layer = config["num_hidden_layers"];
|
184 |
-
n_ff
|
185 |
|
186 |
n_mult = find_n_mult(n_ff, n_embd);
|
187 |
|
188 |
return Params(
|
189 |
-
n_vocab=n_vocab,
|
190 |
-
n_embd=n_embd,
|
191 |
-
n_mult=n_mult,
|
192 |
-
n_head=n_head,
|
193 |
-
n_layer=n_layer,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
)
|
195 |
|
196 |
@staticmethod
|
197 |
def load(model_plus: 'ModelPlus') -> 'Params':
|
|
|
198 |
orig_config_path = model_plus.paths[0].parent / "params.json"
|
199 |
-
hf_transformer_config_path = model_plus.paths[0].parent / "config.json"
|
200 |
|
201 |
-
if
|
202 |
-
params = Params.loadHFTransformerJson(model_plus.model,
|
|
|
|
|
203 |
else:
|
204 |
params = Params.guessed(model_plus.model)
|
205 |
|
@@ -208,14 +234,21 @@ class Params:
|
|
208 |
|
209 |
|
210 |
class SentencePieceVocab:
|
211 |
-
def __init__(self, fname_tokenizer: Path, fname_added_tokens: Optional[Path]) -> None:
|
212 |
-
self.
|
|
|
|
|
|
|
|
|
213 |
added_tokens: Dict[str, int]
|
214 |
if fname_added_tokens is not None:
|
215 |
added_tokens = json.load(open(fname_added_tokens))
|
216 |
else:
|
217 |
added_tokens = {}
|
218 |
-
|
|
|
|
|
|
|
219 |
expected_ids = list(range(vocab_size, vocab_size + len(added_tokens)))
|
220 |
actual_ids = sorted(added_tokens.values())
|
221 |
if expected_ids != actual_ids:
|
@@ -229,22 +262,32 @@ class SentencePieceVocab:
|
|
229 |
|
230 |
def sentencepiece_tokens(self) -> Iterable[Tuple[bytes, float]]:
|
231 |
tokenizer = self.sentencepiece_tokenizer
|
232 |
-
|
|
|
|
|
|
|
|
|
233 |
text: bytes
|
234 |
-
|
235 |
-
|
236 |
-
elif tokenizer.is_control(i):
|
237 |
-
text = b""
|
238 |
-
elif tokenizer.is_byte(i):
|
239 |
-
piece = tokenizer.id_to_piece(i)
|
240 |
-
if len(piece) != 6:
|
241 |
-
raise Exception(f"Invalid token: {piece}")
|
242 |
-
byte_value = int(piece[3:-1], 16)
|
243 |
-
text = struct.pack("B", byte_value)
|
244 |
-
else:
|
245 |
-
text = tokenizer.id_to_piece(i).replace("\u2581", " ").encode("utf-8")
|
246 |
-
score: float = tokenizer.get_score(i)
|
247 |
yield text, score
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
|
249 |
def added_tokens(self) -> Iterable[Tuple[bytes, float]]:
|
250 |
for text in self.added_tokens_list:
|
@@ -1035,8 +1078,7 @@ class OutputFile:
|
|
1035 |
@staticmethod
|
1036 |
def write_vocab_only(fname_out: Path, vocab: Vocab) -> None:
|
1037 |
of = OutputFile(fname_out)
|
1038 |
-
params = Params(n_vocab=vocab.vocab_size, n_embd=0, n_mult=0,
|
1039 |
-
n_head=1, n_layer=0)
|
1040 |
of = OutputFile(fname_out)
|
1041 |
of.write_file_header(params, file_type=GGMLFileType.AllF32)
|
1042 |
of.write_vocab(vocab)
|
@@ -1171,14 +1213,18 @@ def filter_and_sort_tensors(model: LazyModel) -> LazyModel:
|
|
1171 |
return {name: model[name] for name in TENSORS_LIST if name in model}
|
1172 |
|
1173 |
|
1174 |
-
def load_vocab(path: Path) -> SentencePieceVocab:
|
|
|
1175 |
# Be extra-friendly and accept either a file or a directory. Also, if it's
|
1176 |
# a directory, it might be the model directory, and tokenizer.model might
|
1177 |
# be in the parent of that.
|
1178 |
if path.is_dir():
|
1179 |
-
|
|
|
|
|
|
|
1180 |
# Use `.parent` instead of /.. to handle the symlink case better.
|
1181 |
-
path3 = path.parent /
|
1182 |
if path2.exists():
|
1183 |
path = path2
|
1184 |
elif path3.exists():
|
@@ -1189,7 +1235,8 @@ def load_vocab(path: Path) -> SentencePieceVocab:
|
|
1189 |
"if it's in another directory, pass the directory as --vocab-dir")
|
1190 |
added_tokens_path = path.parent / "added_tokens.json"
|
1191 |
print(f"Loading vocab file {path}")
|
1192 |
-
return SentencePieceVocab(path, added_tokens_path if added_tokens_path.exists() else None
|
|
|
1193 |
|
1194 |
|
1195 |
def default_outfile(model_paths: List[Path], file_type: GGMLFileType) -> Path:
|
@@ -1227,6 +1274,7 @@ def main(args_in: Optional[List[str]] = None) -> None:
|
|
1227 |
parser.add_argument("--outfile", type=Path, help="path to write to; default: based on input")
|
1228 |
parser.add_argument("model", type=Path,
|
1229 |
help="directory containing model file, or model file itself (*.pth, *.pt, *.bin)")
|
|
|
1230 |
args = parser.parse_args(args_in)
|
1231 |
|
1232 |
vocab: Vocab
|
@@ -1234,7 +1282,7 @@ def main(args_in: Optional[List[str]] = None) -> None:
|
|
1234 |
model_plus = lazy_load_file(args.model)
|
1235 |
do_dump_model(model_plus)
|
1236 |
elif args.vocab_only:
|
1237 |
-
vocab = load_vocab(args.vocab_dir or args.model)
|
1238 |
assert args.outfile, "need --outfile if using --vocab-only"
|
1239 |
outfile = args.outfile
|
1240 |
OutputFile.write_vocab_only(outfile, vocab)
|
@@ -1248,7 +1296,7 @@ def main(args_in: Optional[List[str]] = None) -> None:
|
|
1248 |
vocab = model_plus.vocab
|
1249 |
else:
|
1250 |
vocab_dir = args.vocab_dir if args.vocab_dir else model_plus.paths[0].parent
|
1251 |
-
vocab = load_vocab(vocab_dir)
|
1252 |
params = Params.load(model_plus)
|
1253 |
model = model_plus.model
|
1254 |
model = do_necessary_conversions(model, params)
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
import argparse
|
3 |
import concurrent.futures
|
4 |
import copy
|
|
|
142 |
@dataclass
|
143 |
class Params:
|
144 |
n_vocab: int
|
145 |
+
n_embd: int
|
146 |
+
n_mult: int
|
147 |
+
n_head: int
|
148 |
n_layer: int
|
149 |
|
150 |
@staticmethod
|
|
|
167 |
n_head=n_embd // 128 # guessed
|
168 |
|
169 |
return Params(
|
170 |
+
n_vocab = n_vocab,
|
171 |
+
n_embd = n_embd,
|
172 |
+
n_mult = 256,
|
173 |
+
n_head = n_head,
|
174 |
+
n_layer = n_layer,
|
175 |
)
|
176 |
|
177 |
@staticmethod
|
|
|
179 |
config = json.load(open(config_path))
|
180 |
|
181 |
n_vocab = config["vocab_size"];
|
182 |
+
n_embd = config["hidden_size"];
|
183 |
+
n_head = config["num_attention_heads"];
|
184 |
n_layer = config["num_hidden_layers"];
|
185 |
+
n_ff = config["intermediate_size"];
|
186 |
|
187 |
n_mult = find_n_mult(n_ff, n_embd);
|
188 |
|
189 |
return Params(
|
190 |
+
n_vocab = n_vocab,
|
191 |
+
n_embd = n_embd,
|
192 |
+
n_mult = n_mult,
|
193 |
+
n_head = n_head,
|
194 |
+
n_layer = n_layer,
|
195 |
+
)
|
196 |
+
|
197 |
+
# LLaMA v2 70B params.json
|
198 |
+
# {"dim": 8192, "multiple_of": 4096, "ffn_dim_multiplier": 1.3, "n_heads": 64, "n_kv_heads": 8, "n_layers": 80, "norm_eps": 1e-05, "vocab_size": -1
|
199 |
+
@staticmethod
|
200 |
+
def loadOriginalParamsJson(model: 'LazyModel', config_path: 'Path') -> 'Params':
|
201 |
+
config = json.load(open(config_path))
|
202 |
+
|
203 |
+
n_vocab = config["vocab_size"];
|
204 |
+
n_embd = config["dim"];
|
205 |
+
n_head = config["n_heads"];
|
206 |
+
n_layer = config["n_layers"];
|
207 |
+
n_mult = config["multiple_of"];
|
208 |
+
|
209 |
+
if n_vocab == -1:
|
210 |
+
n_vocab = model["tok_embeddings.weight"].shape[0]
|
211 |
+
|
212 |
+
return Params(
|
213 |
+
n_vocab = n_vocab,
|
214 |
+
n_embd = n_embd,
|
215 |
+
n_mult = n_mult,
|
216 |
+
n_head = n_head,
|
217 |
+
n_layer = n_layer,
|
218 |
)
|
219 |
|
220 |
@staticmethod
|
221 |
def load(model_plus: 'ModelPlus') -> 'Params':
|
222 |
+
hf_config_path = model_plus.paths[0].parent / "config.json"
|
223 |
orig_config_path = model_plus.paths[0].parent / "params.json"
|
|
|
224 |
|
225 |
+
if hf_config_path.exists():
|
226 |
+
params = Params.loadHFTransformerJson(model_plus.model, hf_config_path)
|
227 |
+
elif orig_config_path.exists():
|
228 |
+
params = Params.loadOriginalParamsJson(model_plus.model, orig_config_path)
|
229 |
else:
|
230 |
params = Params.guessed(model_plus.model)
|
231 |
|
|
|
234 |
|
235 |
|
236 |
class SentencePieceVocab:
|
237 |
+
def __init__(self, fname_tokenizer: Path, fname_added_tokens: Optional[Path], vocabtype: Optional[str]) -> None:
|
238 |
+
self.vocabtype = vocabtype
|
239 |
+
if self.vocabtype == "bpe":
|
240 |
+
self.sentencepiece_tokenizer = json.loads(open(str(fname_tokenizer)).read())
|
241 |
+
else:
|
242 |
+
self.sentencepiece_tokenizer = SentencePieceProcessor(str(fname_tokenizer))
|
243 |
added_tokens: Dict[str, int]
|
244 |
if fname_added_tokens is not None:
|
245 |
added_tokens = json.load(open(fname_added_tokens))
|
246 |
else:
|
247 |
added_tokens = {}
|
248 |
+
if self.vocabtype == "bpe":
|
249 |
+
vocab_size: int = len(self.sentencepiece_tokenizer)
|
250 |
+
else:
|
251 |
+
vocab_size: int = self.sentencepiece_tokenizer.vocab_size()
|
252 |
expected_ids = list(range(vocab_size, vocab_size + len(added_tokens)))
|
253 |
actual_ids = sorted(added_tokens.values())
|
254 |
if expected_ids != actual_ids:
|
|
|
262 |
|
263 |
def sentencepiece_tokens(self) -> Iterable[Tuple[bytes, float]]:
|
264 |
tokenizer = self.sentencepiece_tokenizer
|
265 |
+
if self.vocabtype == "bpe":
|
266 |
+
from transformers.models.gpt2 import tokenization_gpt2
|
267 |
+
byte_encoder = tokenization_gpt2.bytes_to_unicode()
|
268 |
+
byte_decoder = {v: k for k, v in byte_encoder.items()}
|
269 |
+
for i, item in enumerate(tokenizer):
|
270 |
text: bytes
|
271 |
+
text = b''.join([x.to_bytes(1, byteorder='big') for x in [byte_decoder[y] for y in item]])
|
272 |
+
score: float = -i
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
273 |
yield text, score
|
274 |
+
else:
|
275 |
+
for i in range(tokenizer.vocab_size()):
|
276 |
+
text: bytes
|
277 |
+
if tokenizer.is_unknown(i):
|
278 |
+
text = " \u2047 ".encode("utf-8")
|
279 |
+
elif tokenizer.is_control(i):
|
280 |
+
text = b""
|
281 |
+
elif tokenizer.is_byte(i):
|
282 |
+
piece = tokenizer.id_to_piece(i)
|
283 |
+
if len(piece) != 6:
|
284 |
+
raise Exception(f"Invalid token: {piece}")
|
285 |
+
byte_value = int(piece[3:-1], 16)
|
286 |
+
text = struct.pack("B", byte_value)
|
287 |
+
else:
|
288 |
+
text = tokenizer.id_to_piece(i).replace("\u2581", " ").encode("utf-8")
|
289 |
+
score: float = tokenizer.get_score(i)
|
290 |
+
yield text, score
|
291 |
|
292 |
def added_tokens(self) -> Iterable[Tuple[bytes, float]]:
|
293 |
for text in self.added_tokens_list:
|
|
|
1078 |
@staticmethod
|
1079 |
def write_vocab_only(fname_out: Path, vocab: Vocab) -> None:
|
1080 |
of = OutputFile(fname_out)
|
1081 |
+
params = Params(n_vocab=vocab.vocab_size, n_embd=0, n_mult=0, n_head=1, n_layer=0)
|
|
|
1082 |
of = OutputFile(fname_out)
|
1083 |
of.write_file_header(params, file_type=GGMLFileType.AllF32)
|
1084 |
of.write_vocab(vocab)
|
|
|
1213 |
return {name: model[name] for name in TENSORS_LIST if name in model}
|
1214 |
|
1215 |
|
1216 |
+
def load_vocab(path: Path, vocabtype: Optional[str]) -> SentencePieceVocab:
|
1217 |
+
print(f"vocabtype: {vocabtype}")
|
1218 |
# Be extra-friendly and accept either a file or a directory. Also, if it's
|
1219 |
# a directory, it might be the model directory, and tokenizer.model might
|
1220 |
# be in the parent of that.
|
1221 |
if path.is_dir():
|
1222 |
+
vocab_file = "tokenizer.model"
|
1223 |
+
if vocabtype == 'bpe':
|
1224 |
+
vocab_file = "vocab.json"
|
1225 |
+
path2 = path / vocab_file
|
1226 |
# Use `.parent` instead of /.. to handle the symlink case better.
|
1227 |
+
path3 = path.parent / vocab_file
|
1228 |
if path2.exists():
|
1229 |
path = path2
|
1230 |
elif path3.exists():
|
|
|
1235 |
"if it's in another directory, pass the directory as --vocab-dir")
|
1236 |
added_tokens_path = path.parent / "added_tokens.json"
|
1237 |
print(f"Loading vocab file {path}")
|
1238 |
+
return SentencePieceVocab(path, added_tokens_path if added_tokens_path.exists() else None,
|
1239 |
+
vocabtype)
|
1240 |
|
1241 |
|
1242 |
def default_outfile(model_paths: List[Path], file_type: GGMLFileType) -> Path:
|
|
|
1274 |
parser.add_argument("--outfile", type=Path, help="path to write to; default: based on input")
|
1275 |
parser.add_argument("model", type=Path,
|
1276 |
help="directory containing model file, or model file itself (*.pth, *.pt, *.bin)")
|
1277 |
+
parser.add_argument("--vocabtype", default='spm', choices=["spm", "bpe"], help="vocab format (default: spm)")
|
1278 |
args = parser.parse_args(args_in)
|
1279 |
|
1280 |
vocab: Vocab
|
|
|
1282 |
model_plus = lazy_load_file(args.model)
|
1283 |
do_dump_model(model_plus)
|
1284 |
elif args.vocab_only:
|
1285 |
+
vocab = load_vocab(args.vocab_dir or args.model, args.vocabtype)
|
1286 |
assert args.outfile, "need --outfile if using --vocab-only"
|
1287 |
outfile = args.outfile
|
1288 |
OutputFile.write_vocab_only(outfile, vocab)
|
|
|
1296 |
vocab = model_plus.vocab
|
1297 |
else:
|
1298 |
vocab_dir = args.vocab_dir if args.vocab_dir else model_plus.paths[0].parent
|
1299 |
+
vocab = load_vocab(vocab_dir, args.vocabtype)
|
1300 |
params = Params.load(model_plus)
|
1301 |
model = model_plus.model
|
1302 |
model = do_necessary_conversions(model, params)
|
cudart64_110.dll
CHANGED
Binary files a/cudart64_110.dll and b/cudart64_110.dll differ
|
|
examples/CMakeLists.txt
CHANGED
@@ -13,6 +13,8 @@ set(TARGET common)
|
|
13 |
add_library(${TARGET} OBJECT
|
14 |
common.h
|
15 |
common.cpp
|
|
|
|
|
16 |
)
|
17 |
|
18 |
if (BUILD_SHARED_LIBS)
|
|
|
13 |
add_library(${TARGET} OBJECT
|
14 |
common.h
|
15 |
common.cpp
|
16 |
+
grammar-parser.h
|
17 |
+
grammar-parser.cpp
|
18 |
)
|
19 |
|
20 |
if (BUILD_SHARED_LIBS)
|
examples/Miku.sh
CHANGED
@@ -2,21 +2,21 @@
|
|
2 |
set -e
|
3 |
|
4 |
AI_NAME="${AI_NAME:-Miku}"
|
5 |
-
MODEL="${MODEL:-./models/
|
6 |
USER_NAME="${USER_NAME:-Anon}"
|
7 |
|
8 |
# Uncomment and adjust to the number of CPU cores you want to use.
|
9 |
#N_THREAD="${N_THREAD:-4}"
|
|
|
10 |
N_PREDICTS="${N_PREDICTS:-4096}"
|
11 |
|
12 |
GEN_OPTIONS=(--batch_size 1024
|
13 |
-
--ctx_size
|
14 |
--keep -1
|
15 |
--repeat_last_n 256
|
16 |
--repeat_penalty 1.17647
|
17 |
-
--temp 0.
|
18 |
-
--
|
19 |
-
--top_p 0.5)
|
20 |
|
21 |
if [ -n "$N_THREAD" ]; then
|
22 |
GEN_OPTIONS+=(--threads "$N_THREAD")
|
@@ -24,16 +24,17 @@ fi
|
|
24 |
|
25 |
./main "${GEN_OPTIONS[@]}" \
|
26 |
--model "$MODEL" \
|
|
|
|
|
27 |
--n_predict "$N_PREDICTS" \
|
28 |
--color --interactive \
|
29 |
--reverse-prompt "${USER_NAME}:" \
|
30 |
-
--prompt "
|
31 |
-
This is a transcript of a 1000 page, never ending conversation between ${USER_NAME} and the cute and helpful AI assistant ${AI_NAME}. ${AI_NAME} is a girl who is an AI running on the user's computer.
|
32 |
${AI_NAME} can think for herself without the user seeing her thoughts by adding a /think prefix to her output. She uses this to reason about the world and to think about what she should say next.
|
33 |
${AI_NAME} is always coherent and makes sense, but if she isn't sure if what she is saying is correct, she will ask the user for help.
|
34 |
${AI_NAME} is a very helpful AI and will help the user with anything they need. She is also very friendly and will try to make the user feel better if they are sad.
|
35 |
${AI_NAME} is also very curious and will ask the user a lot of questions about themselves and their life. She will also try to make the user like her.
|
36 |
-
The conversation is only between ${USER_NAME} and ${AI_NAME}
|
37 |
The conversation is only through text, so ${AI_NAME} can't see ${USER_NAME}'s face or hear his voice.
|
38 |
${AI_NAME} can only communicate through text, so she can't send images or videos.
|
39 |
|
|
|
2 |
set -e
|
3 |
|
4 |
AI_NAME="${AI_NAME:-Miku}"
|
5 |
+
MODEL="${MODEL:-./models/llama-2-7b-chat.ggmlv3.q4_K_M.bin}"
|
6 |
USER_NAME="${USER_NAME:-Anon}"
|
7 |
|
8 |
# Uncomment and adjust to the number of CPU cores you want to use.
|
9 |
#N_THREAD="${N_THREAD:-4}"
|
10 |
+
CTX_SIZE="${CTX_SIZE:-4096}"
|
11 |
N_PREDICTS="${N_PREDICTS:-4096}"
|
12 |
|
13 |
GEN_OPTIONS=(--batch_size 1024
|
14 |
+
--ctx_size "$CTX_SIZE"
|
15 |
--keep -1
|
16 |
--repeat_last_n 256
|
17 |
--repeat_penalty 1.17647
|
18 |
+
--temp 0.6
|
19 |
+
--mirostat 2)
|
|
|
20 |
|
21 |
if [ -n "$N_THREAD" ]; then
|
22 |
GEN_OPTIONS+=(--threads "$N_THREAD")
|
|
|
24 |
|
25 |
./main "${GEN_OPTIONS[@]}" \
|
26 |
--model "$MODEL" \
|
27 |
+
--in-prefix " " \
|
28 |
+
--in-suffix "${AI_NAME}:" \
|
29 |
--n_predict "$N_PREDICTS" \
|
30 |
--color --interactive \
|
31 |
--reverse-prompt "${USER_NAME}:" \
|
32 |
+
--prompt "This is a transcript of a 1000 page, never ending conversation between ${USER_NAME} and the cute and helpful AI assistant ${AI_NAME}. ${AI_NAME} is a girl who is an AI running on the user's computer.
|
|
|
33 |
${AI_NAME} can think for herself without the user seeing her thoughts by adding a /think prefix to her output. She uses this to reason about the world and to think about what she should say next.
|
34 |
${AI_NAME} is always coherent and makes sense, but if she isn't sure if what she is saying is correct, she will ask the user for help.
|
35 |
${AI_NAME} is a very helpful AI and will help the user with anything they need. She is also very friendly and will try to make the user feel better if they are sad.
|
36 |
${AI_NAME} is also very curious and will ask the user a lot of questions about themselves and their life. She will also try to make the user like her.
|
37 |
+
The conversation is only between ${USER_NAME} and ${AI_NAME}.
|
38 |
The conversation is only through text, so ${AI_NAME} can't see ${USER_NAME}'s face or hear his voice.
|
39 |
${AI_NAME} can only communicate through text, so she can't send images or videos.
|
40 |
|
examples/baby-llama/CMakeLists.txt
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
set(TARGET baby-llama)
|
2 |
add_executable(${TARGET} baby-llama.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
|
|
1 |
set(TARGET baby-llama)
|
2 |
add_executable(${TARGET} baby-llama.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
examples/baby-llama/baby-llama.cpp
CHANGED
@@ -8,6 +8,12 @@
|
|
8 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
9 |
#endif
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
float frand() {
|
12 |
return (float)rand()/(float)RAND_MAX;
|
13 |
}
|
@@ -562,7 +568,7 @@ struct ggml_tensor * forward(
|
|
562 |
// norm
|
563 |
{
|
564 |
// cur shape [n_embd,N,1,1]
|
565 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
566 |
|
567 |
// cur = attention_norm*cur
|
568 |
cur = ggml_mul(ctx0,
|
@@ -685,7 +691,7 @@ struct ggml_tensor * forward(
|
|
685 |
// norm
|
686 |
{
|
687 |
// cur shape [n_embd,N,1,1]
|
688 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
689 |
|
690 |
// cur = ffn_norm*cur
|
691 |
// cur shape [n_embd,N,1,1]
|
@@ -729,7 +735,7 @@ struct ggml_tensor * forward(
|
|
729 |
{
|
730 |
|
731 |
// inpL shape [n_embd,N,1,1]
|
732 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
733 |
|
734 |
// inpL = norm*inpL
|
735 |
// inpL shape [n_embd,N,1,1]
|
@@ -817,7 +823,7 @@ struct ggml_tensor * forward_batch(
|
|
817 |
// norm
|
818 |
{
|
819 |
// cur shape [n_embd,N*n_batch,1,1]
|
820 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
821 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
822 |
|
823 |
// cur = attention_norm*cur
|
@@ -981,7 +987,7 @@ struct ggml_tensor * forward_batch(
|
|
981 |
// norm
|
982 |
{
|
983 |
// cur shape [n_embd,N*n_batch,1,1]
|
984 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
985 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
986 |
|
987 |
// cur = ffn_norm*cur
|
@@ -1034,7 +1040,7 @@ struct ggml_tensor * forward_batch(
|
|
1034 |
{
|
1035 |
|
1036 |
// inpL shape [n_embd,N*n_batch,1,1]
|
1037 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
1038 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1039 |
|
1040 |
// inpL = norm*inpL
|
@@ -1104,7 +1110,7 @@ struct ggml_tensor * forward_lora(
|
|
1104 |
// norm
|
1105 |
{
|
1106 |
// cur shape [n_embd,N,1,1]
|
1107 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
1108 |
|
1109 |
// cur = attention_norm*cur
|
1110 |
cur = ggml_mul(ctx0,
|
@@ -1251,7 +1257,7 @@ struct ggml_tensor * forward_lora(
|
|
1251 |
// norm
|
1252 |
{
|
1253 |
// cur shape [n_embd,N,1,1]
|
1254 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
1255 |
|
1256 |
// cur = ffn_norm*cur
|
1257 |
// cur shape [n_embd,N,1,1]
|
@@ -1295,7 +1301,7 @@ struct ggml_tensor * forward_lora(
|
|
1295 |
{
|
1296 |
|
1297 |
// inpL shape [n_embd,N,1,1]
|
1298 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
1299 |
|
1300 |
// inpL = norm*inpL
|
1301 |
// inpL shape [n_embd,N,1,1]
|
|
|
8 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
9 |
#endif
|
10 |
|
11 |
+
#ifdef LLAMA_DEFAULT_RMS_EPS
|
12 |
+
static const float rms_norm_eps = LLAMA_DEFAULT_RMS_EPS;
|
13 |
+
#else
|
14 |
+
static const float rms_norm_eps = 5e-6f;
|
15 |
+
#endif
|
16 |
+
|
17 |
float frand() {
|
18 |
return (float)rand()/(float)RAND_MAX;
|
19 |
}
|
|
|
568 |
// norm
|
569 |
{
|
570 |
// cur shape [n_embd,N,1,1]
|
571 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
572 |
|
573 |
// cur = attention_norm*cur
|
574 |
cur = ggml_mul(ctx0,
|
|
|
691 |
// norm
|
692 |
{
|
693 |
// cur shape [n_embd,N,1,1]
|
694 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
695 |
|
696 |
// cur = ffn_norm*cur
|
697 |
// cur shape [n_embd,N,1,1]
|
|
|
735 |
{
|
736 |
|
737 |
// inpL shape [n_embd,N,1,1]
|
738 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
739 |
|
740 |
// inpL = norm*inpL
|
741 |
// inpL shape [n_embd,N,1,1]
|
|
|
823 |
// norm
|
824 |
{
|
825 |
// cur shape [n_embd,N*n_batch,1,1]
|
826 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
827 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
828 |
|
829 |
// cur = attention_norm*cur
|
|
|
987 |
// norm
|
988 |
{
|
989 |
// cur shape [n_embd,N*n_batch,1,1]
|
990 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
991 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
992 |
|
993 |
// cur = ffn_norm*cur
|
|
|
1040 |
{
|
1041 |
|
1042 |
// inpL shape [n_embd,N*n_batch,1,1]
|
1043 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1044 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1045 |
|
1046 |
// inpL = norm*inpL
|
|
|
1110 |
// norm
|
1111 |
{
|
1112 |
// cur shape [n_embd,N,1,1]
|
1113 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1114 |
|
1115 |
// cur = attention_norm*cur
|
1116 |
cur = ggml_mul(ctx0,
|
|
|
1257 |
// norm
|
1258 |
{
|
1259 |
// cur shape [n_embd,N,1,1]
|
1260 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
1261 |
|
1262 |
// cur = ffn_norm*cur
|
1263 |
// cur shape [n_embd,N,1,1]
|
|
|
1301 |
{
|
1302 |
|
1303 |
// inpL shape [n_embd,N,1,1]
|
1304 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1305 |
|
1306 |
// inpL = norm*inpL
|
1307 |
// inpL shape [n_embd,N,1,1]
|
examples/benchmark/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET benchmark)
|
2 |
add_executable(${TARGET} benchmark-matmult.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET benchmark)
|
2 |
add_executable(${TARGET} benchmark-matmult.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/common.cpp
CHANGED
@@ -117,6 +117,9 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
117 |
break;
|
118 |
}
|
119 |
params.n_threads = std::stoi(argv[i]);
|
|
|
|
|
|
|
120 |
} else if (arg == "-p" || arg == "--prompt") {
|
121 |
if (++i >= argc) {
|
122 |
invalid_param = true;
|
@@ -168,6 +171,30 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
168 |
break;
|
169 |
}
|
170 |
params.n_ctx = std::stoi(argv[i]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
} else if (arg == "--memory-f32") {
|
172 |
params.memory_f16 = false;
|
173 |
} else if (arg == "--top-p") {
|
@@ -248,12 +275,6 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
248 |
break;
|
249 |
}
|
250 |
params.cfg_scale = std::stof(argv[i]);
|
251 |
-
} else if (arg == "--cfg-smooth-factor") {
|
252 |
-
if (++i >= argc) {
|
253 |
-
invalid_param = true;
|
254 |
-
break;
|
255 |
-
}
|
256 |
-
params.cfg_smooth_factor = std::stof(argv[i]);
|
257 |
} else if (arg == "-b" || arg == "--batch-size") {
|
258 |
if (++i >= argc) {
|
259 |
invalid_param = true;
|
@@ -267,6 +288,12 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
267 |
break;
|
268 |
}
|
269 |
params.n_keep = std::stoi(argv[i]);
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
} else if (arg == "-m" || arg == "--model") {
|
271 |
if (++i >= argc) {
|
272 |
invalid_param = true;
|
@@ -285,6 +312,7 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
285 |
break;
|
286 |
}
|
287 |
params.lora_adapter = argv[i];
|
|
|
288 |
} else if (arg == "--lora-base") {
|
289 |
if (++i >= argc) {
|
290 |
invalid_param = true;
|
@@ -374,6 +402,8 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
374 |
params.antiprompt.push_back(argv[i]);
|
375 |
} else if (arg == "--perplexity") {
|
376 |
params.perplexity = true;
|
|
|
|
|
377 |
} else if (arg == "--ignore-eos") {
|
378 |
params.logit_bias[llama_token_eos()] = -INFINITY;
|
379 |
} else if (arg == "--no-penalize-nl") {
|
@@ -402,6 +432,8 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
402 |
exit(0);
|
403 |
} else if (arg == "--random-prompt") {
|
404 |
params.random_prompt = true;
|
|
|
|
|
405 |
} else if (arg == "--in-prefix") {
|
406 |
if (++i >= argc) {
|
407 |
invalid_param = true;
|
@@ -414,6 +446,28 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
414 |
break;
|
415 |
}
|
416 |
params.input_suffix = argv[i];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
417 |
} else {
|
418 |
fprintf(stderr, "error: unknown argument: %s\n", arg.c_str());
|
419 |
gpt_print_usage(argc, argv, default_params);
|
@@ -443,88 +497,96 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
|
|
443 |
}
|
444 |
|
445 |
void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) {
|
446 |
-
fprintf(
|
447 |
-
fprintf(
|
448 |
-
fprintf(
|
449 |
-
fprintf(
|
450 |
-
fprintf(
|
451 |
-
fprintf(
|
452 |
-
fprintf(
|
453 |
-
fprintf(
|
454 |
-
fprintf(
|
455 |
-
fprintf(
|
456 |
-
fprintf(
|
457 |
-
fprintf(
|
458 |
-
fprintf(
|
459 |
-
fprintf(
|
460 |
-
fprintf(
|
461 |
-
fprintf(
|
462 |
-
fprintf(
|
463 |
-
fprintf(
|
464 |
-
fprintf(
|
465 |
-
fprintf(
|
466 |
-
fprintf(
|
467 |
-
fprintf(
|
468 |
-
fprintf(
|
469 |
-
fprintf(
|
470 |
-
fprintf(
|
471 |
-
fprintf(
|
472 |
-
fprintf(
|
473 |
-
fprintf(
|
474 |
-
fprintf(
|
475 |
-
fprintf(
|
476 |
-
fprintf(
|
477 |
-
fprintf(
|
478 |
-
fprintf(
|
479 |
-
fprintf(
|
480 |
-
fprintf(
|
481 |
-
fprintf(
|
482 |
-
fprintf(
|
483 |
-
fprintf(
|
484 |
-
fprintf(
|
485 |
-
fprintf(
|
486 |
-
fprintf(
|
487 |
-
fprintf(
|
488 |
-
fprintf(
|
489 |
-
fprintf(
|
490 |
-
fprintf(
|
491 |
-
fprintf(
|
492 |
-
fprintf(
|
493 |
-
fprintf(
|
494 |
-
fprintf(
|
495 |
-
fprintf(
|
496 |
-
fprintf(
|
497 |
-
fprintf(
|
498 |
-
fprintf(
|
499 |
-
fprintf(
|
500 |
-
fprintf(
|
501 |
-
fprintf(
|
502 |
-
fprintf(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
503 |
if (llama_mlock_supported()) {
|
504 |
-
fprintf(
|
505 |
}
|
506 |
if (llama_mmap_supported()) {
|
507 |
-
fprintf(
|
508 |
}
|
509 |
-
fprintf(
|
510 |
-
fprintf(
|
511 |
-
fprintf(
|
512 |
#ifdef LLAMA_SUPPORTS_GPU_OFFLOAD
|
513 |
-
fprintf(
|
514 |
-
fprintf(
|
515 |
-
fprintf(
|
516 |
-
fprintf(
|
517 |
-
fprintf(
|
518 |
-
fprintf(
|
519 |
#endif
|
520 |
-
fprintf(
|
521 |
-
fprintf(
|
522 |
-
fprintf(
|
523 |
-
fprintf(
|
524 |
-
fprintf(
|
525 |
-
fprintf(
|
526 |
-
fprintf(
|
527 |
-
fprintf(
|
528 |
}
|
529 |
|
530 |
std::string gpt_random_prompt(std::mt19937 & rng) {
|
@@ -560,18 +622,22 @@ std::vector<llama_token> llama_tokenize(struct llama_context * ctx, const std::s
|
|
560 |
struct llama_context_params llama_context_params_from_gpt_params(const gpt_params & params) {
|
561 |
auto lparams = llama_context_default_params();
|
562 |
|
563 |
-
lparams.n_ctx
|
564 |
-
lparams.n_batch
|
565 |
-
lparams.
|
566 |
-
lparams.
|
567 |
-
|
568 |
-
lparams.
|
569 |
-
lparams.
|
570 |
-
lparams.
|
571 |
-
lparams.
|
572 |
-
lparams.
|
573 |
-
lparams.
|
574 |
-
lparams.
|
|
|
|
|
|
|
|
|
575 |
|
576 |
return lparams;
|
577 |
}
|
|
|
117 |
break;
|
118 |
}
|
119 |
params.n_threads = std::stoi(argv[i]);
|
120 |
+
if (params.n_threads <= 0) {
|
121 |
+
params.n_threads = std::thread::hardware_concurrency();
|
122 |
+
}
|
123 |
} else if (arg == "-p" || arg == "--prompt") {
|
124 |
if (++i >= argc) {
|
125 |
invalid_param = true;
|
|
|
171 |
break;
|
172 |
}
|
173 |
params.n_ctx = std::stoi(argv[i]);
|
174 |
+
} else if (arg == "-gqa" || arg == "--gqa") {
|
175 |
+
if (++i >= argc) {
|
176 |
+
invalid_param = true;
|
177 |
+
break;
|
178 |
+
}
|
179 |
+
params.n_gqa = std::stoi(argv[i]);
|
180 |
+
} else if (arg == "-eps" || arg == "--rms-norm-eps") {
|
181 |
+
if (++i >= argc) {
|
182 |
+
invalid_param = true;
|
183 |
+
break;
|
184 |
+
}
|
185 |
+
params.rms_norm_eps = std::stof(argv[i]);
|
186 |
+
} else if (arg == "--rope-freq-base") {
|
187 |
+
if (++i >= argc) {
|
188 |
+
invalid_param = true;
|
189 |
+
break;
|
190 |
+
}
|
191 |
+
params.rope_freq_base = std::stof(argv[i]);
|
192 |
+
} else if (arg == "--rope-freq-scale") {
|
193 |
+
if (++i >= argc) {
|
194 |
+
invalid_param = true;
|
195 |
+
break;
|
196 |
+
}
|
197 |
+
params.rope_freq_scale = std::stof(argv[i]);
|
198 |
} else if (arg == "--memory-f32") {
|
199 |
params.memory_f16 = false;
|
200 |
} else if (arg == "--top-p") {
|
|
|
275 |
break;
|
276 |
}
|
277 |
params.cfg_scale = std::stof(argv[i]);
|
|
|
|
|
|
|
|
|
|
|
|
|
278 |
} else if (arg == "-b" || arg == "--batch-size") {
|
279 |
if (++i >= argc) {
|
280 |
invalid_param = true;
|
|
|
288 |
break;
|
289 |
}
|
290 |
params.n_keep = std::stoi(argv[i]);
|
291 |
+
} else if (arg == "--chunks") {
|
292 |
+
if (++i >= argc) {
|
293 |
+
invalid_param = true;
|
294 |
+
break;
|
295 |
+
}
|
296 |
+
params.n_chunks = std::stoi(argv[i]);
|
297 |
} else if (arg == "-m" || arg == "--model") {
|
298 |
if (++i >= argc) {
|
299 |
invalid_param = true;
|
|
|
312 |
break;
|
313 |
}
|
314 |
params.lora_adapter = argv[i];
|
315 |
+
params.use_mmap = false;
|
316 |
} else if (arg == "--lora-base") {
|
317 |
if (++i >= argc) {
|
318 |
invalid_param = true;
|
|
|
402 |
params.antiprompt.push_back(argv[i]);
|
403 |
} else if (arg == "--perplexity") {
|
404 |
params.perplexity = true;
|
405 |
+
} else if (arg == "--perplexity-lines") {
|
406 |
+
params.perplexity_lines = true;
|
407 |
} else if (arg == "--ignore-eos") {
|
408 |
params.logit_bias[llama_token_eos()] = -INFINITY;
|
409 |
} else if (arg == "--no-penalize-nl") {
|
|
|
432 |
exit(0);
|
433 |
} else if (arg == "--random-prompt") {
|
434 |
params.random_prompt = true;
|
435 |
+
} else if (arg == "--in-prefix-bos") {
|
436 |
+
params.input_prefix_bos = true;
|
437 |
} else if (arg == "--in-prefix") {
|
438 |
if (++i >= argc) {
|
439 |
invalid_param = true;
|
|
|
446 |
break;
|
447 |
}
|
448 |
params.input_suffix = argv[i];
|
449 |
+
} else if (arg == "--grammar") {
|
450 |
+
if (++i >= argc) {
|
451 |
+
invalid_param = true;
|
452 |
+
break;
|
453 |
+
}
|
454 |
+
params.grammar = argv[i];
|
455 |
+
} else if (arg == "--grammar-file") {
|
456 |
+
if (++i >= argc) {
|
457 |
+
invalid_param = true;
|
458 |
+
break;
|
459 |
+
}
|
460 |
+
std::ifstream file(argv[i]);
|
461 |
+
if (!file) {
|
462 |
+
fprintf(stderr, "error: failed to open file '%s'\n", argv[i]);
|
463 |
+
invalid_param = true;
|
464 |
+
break;
|
465 |
+
}
|
466 |
+
std::copy(
|
467 |
+
std::istreambuf_iterator<char>(file),
|
468 |
+
std::istreambuf_iterator<char>(),
|
469 |
+
std::back_inserter(params.grammar)
|
470 |
+
);
|
471 |
} else {
|
472 |
fprintf(stderr, "error: unknown argument: %s\n", arg.c_str());
|
473 |
gpt_print_usage(argc, argv, default_params);
|
|
|
497 |
}
|
498 |
|
499 |
void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) {
|
500 |
+
fprintf(stdout, "usage: %s [options]\n", argv[0]);
|
501 |
+
fprintf(stdout, "\n");
|
502 |
+
fprintf(stdout, "options:\n");
|
503 |
+
fprintf(stdout, " -h, --help show this help message and exit\n");
|
504 |
+
fprintf(stdout, " -i, --interactive run in interactive mode\n");
|
505 |
+
fprintf(stdout, " --interactive-first run in interactive mode and wait for input right away\n");
|
506 |
+
fprintf(stdout, " -ins, --instruct run in instruction mode (use with Alpaca models)\n");
|
507 |
+
fprintf(stdout, " --multiline-input allows you to write or paste multiple lines without ending each in '\\'\n");
|
508 |
+
fprintf(stdout, " -r PROMPT, --reverse-prompt PROMPT\n");
|
509 |
+
fprintf(stdout, " halt generation at PROMPT, return control in interactive mode\n");
|
510 |
+
fprintf(stdout, " (can be specified more than once for multiple prompts).\n");
|
511 |
+
fprintf(stdout, " --color colorise output to distinguish prompt and user input from generations\n");
|
512 |
+
fprintf(stdout, " -s SEED, --seed SEED RNG seed (default: -1, use random seed for < 0)\n");
|
513 |
+
fprintf(stdout, " -t N, --threads N number of threads to use during computation (default: %d)\n", params.n_threads);
|
514 |
+
fprintf(stdout, " -p PROMPT, --prompt PROMPT\n");
|
515 |
+
fprintf(stdout, " prompt to start generation with (default: empty)\n");
|
516 |
+
fprintf(stdout, " -e process prompt escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\)\n");
|
517 |
+
fprintf(stdout, " --prompt-cache FNAME file to cache prompt state for faster startup (default: none)\n");
|
518 |
+
fprintf(stdout, " --prompt-cache-all if specified, saves user input and generations to cache as well.\n");
|
519 |
+
fprintf(stdout, " not supported with --interactive or other interactive options\n");
|
520 |
+
fprintf(stdout, " --prompt-cache-ro if specified, uses the prompt cache but does not update it.\n");
|
521 |
+
fprintf(stdout, " --random-prompt start with a randomized prompt.\n");
|
522 |
+
fprintf(stdout, " --in-prefix-bos prefix BOS to user inputs, preceding the `--in-prefix` string\n");
|
523 |
+
fprintf(stdout, " --in-prefix STRING string to prefix user inputs with (default: empty)\n");
|
524 |
+
fprintf(stdout, " --in-suffix STRING string to suffix after user inputs with (default: empty)\n");
|
525 |
+
fprintf(stdout, " -f FNAME, --file FNAME\n");
|
526 |
+
fprintf(stdout, " prompt file to start generation.\n");
|
527 |
+
fprintf(stdout, " -n N, --n-predict N number of tokens to predict (default: %d, -1 = infinity)\n", params.n_predict);
|
528 |
+
fprintf(stdout, " -c N, --ctx-size N size of the prompt context (default: %d)\n", params.n_ctx);
|
529 |
+
fprintf(stdout, " -b N, --batch-size N batch size for prompt processing (default: %d)\n", params.n_batch);
|
530 |
+
fprintf(stdout, " -gqa N, --gqa N grouped-query attention factor (TEMP!!! use 8 for LLaMAv2 70B) (default: %d)\n", params.n_gqa);
|
531 |
+
fprintf(stdout, " -eps N, --rms-norm-eps N rms norm eps (TEMP!!! use 1e-5 for LLaMAv2) (default: %.1e)\n", params.rms_norm_eps);
|
532 |
+
fprintf(stdout, " --top-k N top-k sampling (default: %d, 0 = disabled)\n", params.top_k);
|
533 |
+
fprintf(stdout, " --top-p N top-p sampling (default: %.1f, 1.0 = disabled)\n", (double)params.top_p);
|
534 |
+
fprintf(stdout, " --tfs N tail free sampling, parameter z (default: %.1f, 1.0 = disabled)\n", (double)params.tfs_z);
|
535 |
+
fprintf(stdout, " --typical N locally typical sampling, parameter p (default: %.1f, 1.0 = disabled)\n", (double)params.typical_p);
|
536 |
+
fprintf(stdout, " --repeat-last-n N last n tokens to consider for penalize (default: %d, 0 = disabled, -1 = ctx_size)\n", params.repeat_last_n);
|
537 |
+
fprintf(stdout, " --repeat-penalty N penalize repeat sequence of tokens (default: %.1f, 1.0 = disabled)\n", (double)params.repeat_penalty);
|
538 |
+
fprintf(stdout, " --presence-penalty N repeat alpha presence penalty (default: %.1f, 0.0 = disabled)\n", (double)params.presence_penalty);
|
539 |
+
fprintf(stdout, " --frequency-penalty N repeat alpha frequency penalty (default: %.1f, 0.0 = disabled)\n", (double)params.frequency_penalty);
|
540 |
+
fprintf(stdout, " --mirostat N use Mirostat sampling.\n");
|
541 |
+
fprintf(stdout, " Top K, Nucleus, Tail Free and Locally Typical samplers are ignored if used.\n");
|
542 |
+
fprintf(stdout, " (default: %d, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0)\n", params.mirostat);
|
543 |
+
fprintf(stdout, " --mirostat-lr N Mirostat learning rate, parameter eta (default: %.1f)\n", (double)params.mirostat_eta);
|
544 |
+
fprintf(stdout, " --mirostat-ent N Mirostat target entropy, parameter tau (default: %.1f)\n", (double)params.mirostat_tau);
|
545 |
+
fprintf(stdout, " -l TOKEN_ID(+/-)BIAS, --logit-bias TOKEN_ID(+/-)BIAS\n");
|
546 |
+
fprintf(stdout, " modifies the likelihood of token appearing in the completion,\n");
|
547 |
+
fprintf(stdout, " i.e. `--logit-bias 15043+1` to increase likelihood of token ' Hello',\n");
|
548 |
+
fprintf(stdout, " or `--logit-bias 15043-1` to decrease likelihood of token ' Hello'\n");
|
549 |
+
fprintf(stdout, " --grammar GRAMMAR BNF-like grammar to constrain generations (see samples in grammars/ dir)\n");
|
550 |
+
fprintf(stdout, " --grammar-file FNAME file to read grammar from\n");
|
551 |
+
fprintf(stdout, " --cfg-negative-prompt PROMPT \n");
|
552 |
+
fprintf(stdout, " negative prompt to use for guidance. (default: empty)\n");
|
553 |
+
fprintf(stdout, " --cfg-scale N strength of guidance (default: %f, 1.0 = disable)\n", params.cfg_scale);
|
554 |
+
fprintf(stdout, " --rope-freq-base N RoPE base frequency (default: %.1f)\n", params.rope_freq_base);
|
555 |
+
fprintf(stdout, " --rope-freq-scale N RoPE frequency scaling factor (default: %g)\n", params.rope_freq_scale);
|
556 |
+
fprintf(stdout, " --ignore-eos ignore end of stream token and continue generating (implies --logit-bias 2-inf)\n");
|
557 |
+
fprintf(stdout, " --no-penalize-nl do not penalize newline token\n");
|
558 |
+
fprintf(stdout, " --memory-f32 use f32 instead of f16 for memory key+value (default: disabled)\n");
|
559 |
+
fprintf(stdout, " not recommended: doubles context memory required and no measurable increase in quality\n");
|
560 |
+
fprintf(stdout, " --temp N temperature (default: %.1f)\n", (double)params.temp);
|
561 |
+
fprintf(stdout, " --perplexity compute perplexity over each ctx window of the prompt\n");
|
562 |
+
fprintf(stdout, " --perplexity-lines compute perplexity over each line of the prompt\n");
|
563 |
+
fprintf(stdout, " --keep number of tokens to keep from the initial prompt (default: %d, -1 = all)\n", params.n_keep);
|
564 |
+
fprintf(stdout, " --chunks N max number of chunks to process (default: %d, -1 = all)\n", params.n_chunks);
|
565 |
if (llama_mlock_supported()) {
|
566 |
+
fprintf(stdout, " --mlock force system to keep model in RAM rather than swapping or compressing\n");
|
567 |
}
|
568 |
if (llama_mmap_supported()) {
|
569 |
+
fprintf(stdout, " --no-mmap do not memory-map model (slower load but may reduce pageouts if not using mlock)\n");
|
570 |
}
|
571 |
+
fprintf(stdout, " --numa attempt optimizations that help on some NUMA systems\n");
|
572 |
+
fprintf(stdout, " if run without this previously, it is recommended to drop the system page cache before using this\n");
|
573 |
+
fprintf(stdout, " see https://github.com/ggerganov/llama.cpp/issues/1437\n");
|
574 |
#ifdef LLAMA_SUPPORTS_GPU_OFFLOAD
|
575 |
+
fprintf(stdout, " -ngl N, --n-gpu-layers N\n");
|
576 |
+
fprintf(stdout, " number of layers to store in VRAM\n");
|
577 |
+
fprintf(stdout, " -ts SPLIT --tensor-split SPLIT\n");
|
578 |
+
fprintf(stdout, " how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n");
|
579 |
+
fprintf(stdout, " -mg i, --main-gpu i the GPU to use for scratch and small tensors\n" );
|
580 |
+
fprintf(stdout, " -lv, --low-vram don't allocate VRAM scratch buffer\n" );
|
581 |
#endif
|
582 |
+
fprintf(stdout, " --mtest compute maximum memory usage\n");
|
583 |
+
fprintf(stdout, " --export export the computation graph to 'llama.ggml'\n");
|
584 |
+
fprintf(stdout, " --verbose-prompt print prompt before generation\n");
|
585 |
+
fprintf(stdout, " --lora FNAME apply LoRA adapter (implies --no-mmap)\n");
|
586 |
+
fprintf(stdout, " --lora-base FNAME optional model to use as a base for the layers modified by the LoRA adapter\n");
|
587 |
+
fprintf(stdout, " -m FNAME, --model FNAME\n");
|
588 |
+
fprintf(stdout, " model path (default: %s)\n", params.model.c_str());
|
589 |
+
fprintf(stdout, "\n");
|
590 |
}
|
591 |
|
592 |
std::string gpt_random_prompt(std::mt19937 & rng) {
|
|
|
622 |
struct llama_context_params llama_context_params_from_gpt_params(const gpt_params & params) {
|
623 |
auto lparams = llama_context_default_params();
|
624 |
|
625 |
+
lparams.n_ctx = params.n_ctx;
|
626 |
+
lparams.n_batch = params.n_batch;
|
627 |
+
lparams.n_gqa = params.n_gqa;
|
628 |
+
lparams.rms_norm_eps = params.rms_norm_eps;
|
629 |
+
lparams.n_gpu_layers = params.n_gpu_layers;
|
630 |
+
lparams.main_gpu = params.main_gpu;
|
631 |
+
lparams.tensor_split = params.tensor_split;
|
632 |
+
lparams.low_vram = params.low_vram;
|
633 |
+
lparams.seed = params.seed;
|
634 |
+
lparams.f16_kv = params.memory_f16;
|
635 |
+
lparams.use_mmap = params.use_mmap;
|
636 |
+
lparams.use_mlock = params.use_mlock;
|
637 |
+
lparams.logits_all = params.perplexity;
|
638 |
+
lparams.embedding = params.embedding;
|
639 |
+
lparams.rope_freq_base = params.rope_freq_base;
|
640 |
+
lparams.rope_freq_scale = params.rope_freq_scale;
|
641 |
|
642 |
return lparams;
|
643 |
}
|
examples/common.h
CHANGED
@@ -22,16 +22,21 @@
|
|
22 |
int32_t get_num_physical_cores();
|
23 |
|
24 |
struct gpt_params {
|
25 |
-
uint32_t seed = -1;
|
26 |
int32_t n_threads = get_num_physical_cores();
|
27 |
-
int32_t n_predict = -1;
|
28 |
-
int32_t n_ctx = 512;
|
29 |
-
int32_t n_batch = 512;
|
30 |
-
int32_t
|
31 |
-
int32_t
|
32 |
-
int32_t
|
33 |
-
|
34 |
-
int32_t
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
// sampling parameters
|
37 |
std::unordered_map<llama_token, float> logit_bias; // logit bias for specific tokens
|
@@ -44,7 +49,7 @@ struct gpt_params {
|
|
44 |
int32_t repeat_last_n = 64; // last n tokens to penalize (0 = disable penalty, -1 = context size)
|
45 |
float frequency_penalty = 0.00f; // 0.0 = disabled
|
46 |
float presence_penalty = 0.00f; // 0.0 = disabled
|
47 |
-
|
48 |
float mirostat_tau = 5.00f; // target entropy
|
49 |
float mirostat_eta = 0.10f; // learning rate
|
50 |
|
@@ -52,7 +57,6 @@ struct gpt_params {
|
|
52 |
// https://arxiv.org/abs/2306.17806
|
53 |
std::string cfg_negative_prompt; // string to help guidance
|
54 |
float cfg_scale = 1.f; // How strong is guidance
|
55 |
-
float cfg_smooth_factor = 1.f; // Smooth factor between old and new logits
|
56 |
|
57 |
std::string model = "models/7B/ggml-model.bin"; // model path
|
58 |
std::string model_alias = "unknown"; // model alias
|
@@ -60,6 +64,7 @@ struct gpt_params {
|
|
60 |
std::string path_prompt_cache = ""; // path to file for saving/loading prompt eval state
|
61 |
std::string input_prefix = ""; // string to prefix user inputs with
|
62 |
std::string input_suffix = ""; // string to suffix user inputs with
|
|
|
63 |
std::vector<std::string> antiprompt; // string upon seeing which more user input is prompted
|
64 |
|
65 |
std::string lora_adapter = ""; // lora adapter path
|
@@ -77,9 +82,11 @@ struct gpt_params {
|
|
77 |
bool interactive_first = false; // wait for user input immediately
|
78 |
bool multiline_input = false; // reverse the usage of `\`
|
79 |
|
|
|
80 |
bool instruct = false; // instruction mode (used for Alpaca models)
|
81 |
bool penalize_nl = true; // consider newlines as a repeatable token
|
82 |
bool perplexity = false; // compute perplexity over the prompt
|
|
|
83 |
bool use_mmap = true; // use mmap for faster loads
|
84 |
bool use_mlock = false; // use mlock to keep model in memory
|
85 |
bool mem_test = false; // compute maximum memory usage
|
|
|
22 |
int32_t get_num_physical_cores();
|
23 |
|
24 |
struct gpt_params {
|
25 |
+
uint32_t seed = -1; // RNG seed
|
26 |
int32_t n_threads = get_num_physical_cores();
|
27 |
+
int32_t n_predict = -1; // new tokens to predict
|
28 |
+
int32_t n_ctx = 512; // context size
|
29 |
+
int32_t n_batch = 512; // batch size for prompt processing (must be >=32 to use BLAS)
|
30 |
+
int32_t n_gqa = 1; // grouped-query attention factor (TODO: move to hparams)
|
31 |
+
int32_t n_keep = 0; // number of tokens to keep from initial prompt
|
32 |
+
int32_t n_chunks = -1; // max number of chunks to process (-1 = unlimited)
|
33 |
+
int32_t n_gpu_layers = 0; // number of layers to store in VRAM
|
34 |
+
int32_t main_gpu = 0; // the GPU that is used for scratch and small tensors
|
35 |
+
float tensor_split[LLAMA_MAX_DEVICES] = {0}; // how split tensors should be distributed across GPUs
|
36 |
+
int32_t n_probs = 0; // if greater than 0, output the probabilities of top n_probs tokens.
|
37 |
+
float rms_norm_eps = LLAMA_DEFAULT_RMS_EPS; // rms norm epsilon
|
38 |
+
float rope_freq_base = 10000.0f; // RoPE base frequency
|
39 |
+
float rope_freq_scale = 1.0f; // RoPE frequency scaling factor
|
40 |
|
41 |
// sampling parameters
|
42 |
std::unordered_map<llama_token, float> logit_bias; // logit bias for specific tokens
|
|
|
49 |
int32_t repeat_last_n = 64; // last n tokens to penalize (0 = disable penalty, -1 = context size)
|
50 |
float frequency_penalty = 0.00f; // 0.0 = disabled
|
51 |
float presence_penalty = 0.00f; // 0.0 = disabled
|
52 |
+
int32_t mirostat = 0; // 0 = disabled, 1 = mirostat, 2 = mirostat 2.0
|
53 |
float mirostat_tau = 5.00f; // target entropy
|
54 |
float mirostat_eta = 0.10f; // learning rate
|
55 |
|
|
|
57 |
// https://arxiv.org/abs/2306.17806
|
58 |
std::string cfg_negative_prompt; // string to help guidance
|
59 |
float cfg_scale = 1.f; // How strong is guidance
|
|
|
60 |
|
61 |
std::string model = "models/7B/ggml-model.bin"; // model path
|
62 |
std::string model_alias = "unknown"; // model alias
|
|
|
64 |
std::string path_prompt_cache = ""; // path to file for saving/loading prompt eval state
|
65 |
std::string input_prefix = ""; // string to prefix user inputs with
|
66 |
std::string input_suffix = ""; // string to suffix user inputs with
|
67 |
+
std::string grammar = ""; // optional BNF-like grammar to constrain sampling
|
68 |
std::vector<std::string> antiprompt; // string upon seeing which more user input is prompted
|
69 |
|
70 |
std::string lora_adapter = ""; // lora adapter path
|
|
|
82 |
bool interactive_first = false; // wait for user input immediately
|
83 |
bool multiline_input = false; // reverse the usage of `\`
|
84 |
|
85 |
+
bool input_prefix_bos = false; // prefix BOS to user inputs, preceding input_prefix
|
86 |
bool instruct = false; // instruction mode (used for Alpaca models)
|
87 |
bool penalize_nl = true; // consider newlines as a repeatable token
|
88 |
bool perplexity = false; // compute perplexity over the prompt
|
89 |
+
bool perplexity_lines = false; // compute perplexity over each line of the prompt
|
90 |
bool use_mmap = true; // use mmap for faster loads
|
91 |
bool use_mlock = false; // use mlock to keep model in memory
|
92 |
bool mem_test = false; // compute maximum memory usage
|
examples/embd-input/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET embdinput)
|
2 |
add_library(${TARGET} embd-input-lib.cpp embd-input.h)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
@@ -8,6 +9,7 @@ endif()
|
|
8 |
|
9 |
set(TARGET embd-input-test)
|
10 |
add_executable(${TARGET} embd-input-test.cpp)
|
|
|
11 |
target_link_libraries(${TARGET} PRIVATE common llama embdinput ${CMAKE_THREAD_LIBS_INIT})
|
12 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
13 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET embdinput)
|
2 |
add_library(${TARGET} embd-input-lib.cpp embd-input.h)
|
3 |
+
install(TARGETS ${TARGET} LIBRARY)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
|
|
9 |
|
10 |
set(TARGET embd-input-test)
|
11 |
add_executable(${TARGET} embd-input-test.cpp)
|
12 |
+
install(TARGETS ${TARGET} RUNTIME)
|
13 |
target_link_libraries(${TARGET} PRIVATE common llama embdinput ${CMAKE_THREAD_LIBS_INIT})
|
14 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
15 |
if(TARGET BUILD_INFO)
|
examples/embd-input/README.md
CHANGED
@@ -17,7 +17,7 @@ make
|
|
17 |
import torch
|
18 |
|
19 |
bin_path = "../LLaVA-13b-delta-v1-1/pytorch_model-00003-of-00003.bin"
|
20 |
-
pth_path = "./examples/
|
21 |
|
22 |
dic = torch.load(bin_path)
|
23 |
used_key = ["model.mm_projector.weight","model.mm_projector.bias"]
|
|
|
17 |
import torch
|
18 |
|
19 |
bin_path = "../LLaVA-13b-delta-v1-1/pytorch_model-00003-of-00003.bin"
|
20 |
+
pth_path = "./examples/embd-input/llava_projection.pth"
|
21 |
|
22 |
dic = torch.load(bin_path)
|
23 |
used_key = ["model.mm_projector.weight","model.mm_projector.bias"]
|
examples/embd-input/llava.py
CHANGED
@@ -59,7 +59,7 @@ if __name__=="__main__":
|
|
59 |
# Also here can use pytorch_model-00003-of-00003.bin directly.
|
60 |
a.load_projection(os.path.join(
|
61 |
os.path.dirname(__file__) ,
|
62 |
-
"
|
63 |
respose = a.chat_with_image(
|
64 |
Image.open("./media/llama1-logo.png").convert('RGB'),
|
65 |
"what is the text in the picture?")
|
|
|
59 |
# Also here can use pytorch_model-00003-of-00003.bin directly.
|
60 |
a.load_projection(os.path.join(
|
61 |
os.path.dirname(__file__) ,
|
62 |
+
"llava_projection.pth"))
|
63 |
respose = a.chat_with_image(
|
64 |
Image.open("./media/llama1-logo.png").convert('RGB'),
|
65 |
"what is the text in the picture?")
|
examples/embd-input/minigpt4.py
CHANGED
@@ -64,7 +64,7 @@ class MiniGPT4(Blip2Base):
|
|
64 |
self.max_txt_len = max_txt_len
|
65 |
self.end_sym = end_sym
|
66 |
self.model = MyModel(["main", *args])
|
67 |
-
# system
|
68 |
self.model.eval_string("Give the following image: <Img>ImageContent</Img>. "
|
69 |
"You will be able to see the image once I provide it to you. Please answer my questions."
|
70 |
"###")
|
|
|
64 |
self.max_txt_len = max_txt_len
|
65 |
self.end_sym = end_sym
|
66 |
self.model = MyModel(["main", *args])
|
67 |
+
# system prompt
|
68 |
self.model.eval_string("Give the following image: <Img>ImageContent</Img>. "
|
69 |
"You will be able to see the image once I provide it to you. Please answer my questions."
|
70 |
"###")
|
examples/embedding/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET embedding)
|
2 |
add_executable(${TARGET} embedding.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET embedding)
|
2 |
add_executable(${TARGET} embedding.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/grammar-parser.cpp
ADDED
@@ -0,0 +1,423 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#include "grammar-parser.h"
|
2 |
+
#include <cstdint>
|
3 |
+
#include <cwchar>
|
4 |
+
#include <string>
|
5 |
+
#include <utility>
|
6 |
+
#include <stdexcept>
|
7 |
+
#include <exception>
|
8 |
+
|
9 |
+
namespace grammar_parser {
|
10 |
+
// NOTE: assumes valid utf8 (but checks for overrun)
|
11 |
+
// copied from llama.cpp
|
12 |
+
std::pair<uint32_t, const char *> decode_utf8(const char * src) {
|
13 |
+
static const int lookup[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4 };
|
14 |
+
uint8_t first_byte = static_cast<uint8_t>(*src);
|
15 |
+
uint8_t highbits = first_byte >> 4;
|
16 |
+
int len = lookup[highbits];
|
17 |
+
uint8_t mask = (1 << (8 - len)) - 1;
|
18 |
+
uint32_t value = first_byte & mask;
|
19 |
+
const char * end = src + len; // may overrun!
|
20 |
+
const char * pos = src + 1;
|
21 |
+
for ( ; pos < end && *pos; pos++) {
|
22 |
+
value = (value << 6) + (static_cast<uint8_t>(*pos) & 0x3F);
|
23 |
+
}
|
24 |
+
return std::make_pair(value, pos);
|
25 |
+
}
|
26 |
+
|
27 |
+
uint32_t get_symbol_id(parse_state & state, const char * src, size_t len) {
|
28 |
+
uint32_t next_id = static_cast<uint32_t>(state.symbol_ids.size());
|
29 |
+
auto result = state.symbol_ids.insert(std::make_pair(std::string(src, len), next_id));
|
30 |
+
return result.first->second;
|
31 |
+
}
|
32 |
+
|
33 |
+
uint32_t generate_symbol_id(parse_state & state, const std::string & base_name) {
|
34 |
+
uint32_t next_id = static_cast<uint32_t>(state.symbol_ids.size());
|
35 |
+
state.symbol_ids[base_name + '_' + std::to_string(next_id)] = next_id;
|
36 |
+
return next_id;
|
37 |
+
}
|
38 |
+
|
39 |
+
void add_rule(
|
40 |
+
parse_state & state,
|
41 |
+
uint32_t rule_id,
|
42 |
+
const std::vector<llama_grammar_element> & rule) {
|
43 |
+
if (state.rules.size() <= rule_id) {
|
44 |
+
state.rules.resize(rule_id + 1);
|
45 |
+
}
|
46 |
+
state.rules[rule_id] = rule;
|
47 |
+
}
|
48 |
+
|
49 |
+
bool is_word_char(char c) {
|
50 |
+
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '-' || ('0' <= c && c <= '9');
|
51 |
+
}
|
52 |
+
|
53 |
+
std::pair<uint32_t, const char *> parse_hex(const char * src, int size) {
|
54 |
+
const char * pos = src;
|
55 |
+
const char * end = src + size;
|
56 |
+
uint32_t value = 0;
|
57 |
+
for ( ; pos < end && *pos; pos++) {
|
58 |
+
value <<= 4;
|
59 |
+
char c = *pos;
|
60 |
+
if ('a' <= c && c <= 'f') {
|
61 |
+
value += c - 'a' + 10;
|
62 |
+
} else if ('A' <= c && c <= 'F') {
|
63 |
+
value += c - 'A' + 10;
|
64 |
+
} else if ('0' <= c && c <= '9') {
|
65 |
+
value += c - '0';
|
66 |
+
} else {
|
67 |
+
break;
|
68 |
+
}
|
69 |
+
}
|
70 |
+
if (pos != end) {
|
71 |
+
throw std::runtime_error("expecting " + std::to_string(size) + " hex chars at " + src);
|
72 |
+
}
|
73 |
+
return std::make_pair(value, pos);
|
74 |
+
}
|
75 |
+
|
76 |
+
const char * parse_space(const char * src, bool newline_ok) {
|
77 |
+
const char * pos = src;
|
78 |
+
while (*pos == ' ' || *pos == '\t' || *pos == '#' ||
|
79 |
+
(newline_ok && (*pos == '\r' || *pos == '\n'))) {
|
80 |
+
if (*pos == '#') {
|
81 |
+
while (*pos && *pos != '\r' && *pos != '\n') {
|
82 |
+
pos++;
|
83 |
+
}
|
84 |
+
} else {
|
85 |
+
pos++;
|
86 |
+
}
|
87 |
+
}
|
88 |
+
return pos;
|
89 |
+
}
|
90 |
+
|
91 |
+
const char * parse_name(const char * src) {
|
92 |
+
const char * pos = src;
|
93 |
+
while (is_word_char(*pos)) {
|
94 |
+
pos++;
|
95 |
+
}
|
96 |
+
if (pos == src) {
|
97 |
+
throw std::runtime_error(std::string("expecting name at ") + src);
|
98 |
+
}
|
99 |
+
return pos;
|
100 |
+
}
|
101 |
+
|
102 |
+
std::pair<uint32_t, const char *> parse_char(const char * src) {
|
103 |
+
if (*src == '\\') {
|
104 |
+
switch (src[1]) {
|
105 |
+
case 'x': return parse_hex(src + 2, 2);
|
106 |
+
case 'u': return parse_hex(src + 2, 4);
|
107 |
+
case 'U': return parse_hex(src + 2, 8);
|
108 |
+
case 't': return std::make_pair('\t', src + 2);
|
109 |
+
case 'r': return std::make_pair('\r', src + 2);
|
110 |
+
case 'n': return std::make_pair('\n', src + 2);
|
111 |
+
case '\\':
|
112 |
+
case '"':
|
113 |
+
case '[':
|
114 |
+
case ']':
|
115 |
+
return std::make_pair(src[1], src + 2);
|
116 |
+
default:
|
117 |
+
throw std::runtime_error(std::string("unknown escape at ") + src);
|
118 |
+
}
|
119 |
+
} else if (*src) {
|
120 |
+
return decode_utf8(src);
|
121 |
+
}
|
122 |
+
throw std::runtime_error("unexpected end of input");
|
123 |
+
}
|
124 |
+
|
125 |
+
const char * parse_alternates(
|
126 |
+
parse_state & state,
|
127 |
+
const char * src,
|
128 |
+
const std::string & rule_name,
|
129 |
+
uint32_t rule_id,
|
130 |
+
bool is_nested);
|
131 |
+
|
132 |
+
const char * parse_sequence(
|
133 |
+
parse_state & state,
|
134 |
+
const char * src,
|
135 |
+
const std::string & rule_name,
|
136 |
+
std::vector<llama_grammar_element> & out_elements,
|
137 |
+
bool is_nested) {
|
138 |
+
size_t last_sym_start = out_elements.size();
|
139 |
+
const char * pos = src;
|
140 |
+
while (*pos) {
|
141 |
+
if (*pos == '"') { // literal string
|
142 |
+
pos++;
|
143 |
+
last_sym_start = out_elements.size();
|
144 |
+
while (*pos != '"') {
|
145 |
+
auto char_pair = parse_char(pos);
|
146 |
+
pos = char_pair.second;
|
147 |
+
out_elements.push_back({LLAMA_GRETYPE_CHAR, char_pair.first});
|
148 |
+
}
|
149 |
+
pos = parse_space(pos + 1, is_nested);
|
150 |
+
} else if (*pos == '[') { // char range(s)
|
151 |
+
pos++;
|
152 |
+
enum llama_gretype start_type = LLAMA_GRETYPE_CHAR;
|
153 |
+
if (*pos == '^') {
|
154 |
+
pos++;
|
155 |
+
start_type = LLAMA_GRETYPE_CHAR_NOT;
|
156 |
+
}
|
157 |
+
last_sym_start = out_elements.size();
|
158 |
+
while (*pos != ']') {
|
159 |
+
auto char_pair = parse_char(pos);
|
160 |
+
pos = char_pair.second;
|
161 |
+
enum llama_gretype type = last_sym_start < out_elements.size()
|
162 |
+
? LLAMA_GRETYPE_CHAR_ALT
|
163 |
+
: start_type;
|
164 |
+
|
165 |
+
out_elements.push_back({type, char_pair.first});
|
166 |
+
if (pos[0] == '-' && pos[1] != ']') {
|
167 |
+
auto endchar_pair = parse_char(pos + 1);
|
168 |
+
pos = endchar_pair.second;
|
169 |
+
out_elements.push_back({LLAMA_GRETYPE_CHAR_RNG_UPPER, endchar_pair.first});
|
170 |
+
}
|
171 |
+
}
|
172 |
+
pos = parse_space(pos + 1, is_nested);
|
173 |
+
} else if (is_word_char(*pos)) { // rule reference
|
174 |
+
const char * name_end = parse_name(pos);
|
175 |
+
uint32_t ref_rule_id = get_symbol_id(state, pos, name_end - pos);
|
176 |
+
pos = parse_space(name_end, is_nested);
|
177 |
+
last_sym_start = out_elements.size();
|
178 |
+
out_elements.push_back({LLAMA_GRETYPE_RULE_REF, ref_rule_id});
|
179 |
+
} else if (*pos == '(') { // grouping
|
180 |
+
// parse nested alternates into synthesized rule
|
181 |
+
pos = parse_space(pos + 1, true);
|
182 |
+
uint32_t sub_rule_id = generate_symbol_id(state, rule_name);
|
183 |
+
pos = parse_alternates(state, pos, rule_name, sub_rule_id, true);
|
184 |
+
last_sym_start = out_elements.size();
|
185 |
+
// output reference to synthesized rule
|
186 |
+
out_elements.push_back({LLAMA_GRETYPE_RULE_REF, sub_rule_id});
|
187 |
+
if (*pos != ')') {
|
188 |
+
throw std::runtime_error(std::string("expecting ')' at ") + pos);
|
189 |
+
}
|
190 |
+
pos = parse_space(pos + 1, is_nested);
|
191 |
+
} else if (*pos == '*' || *pos == '+' || *pos == '?') { // repetition operator
|
192 |
+
if (last_sym_start == out_elements.size()) {
|
193 |
+
throw std::runtime_error(std::string("expecting preceeding item to */+/? at ") + pos);
|
194 |
+
}
|
195 |
+
|
196 |
+
// apply transformation to previous symbol (last_sym_start to end) according to
|
197 |
+
// rewrite rules:
|
198 |
+
// S* --> S' ::= S S' |
|
199 |
+
// S+ --> S' ::= S S' | S
|
200 |
+
// S? --> S' ::= S |
|
201 |
+
uint32_t sub_rule_id = generate_symbol_id(state, rule_name);
|
202 |
+
std::vector<llama_grammar_element> sub_rule;
|
203 |
+
// add preceding symbol to generated rule
|
204 |
+
sub_rule.insert(
|
205 |
+
sub_rule.end(), out_elements.begin() + last_sym_start, out_elements.end());
|
206 |
+
if (*pos == '*' || *pos == '+') {
|
207 |
+
// cause generated rule to recurse
|
208 |
+
sub_rule.push_back({LLAMA_GRETYPE_RULE_REF, sub_rule_id});
|
209 |
+
}
|
210 |
+
// mark start of alternate def
|
211 |
+
sub_rule.push_back({LLAMA_GRETYPE_ALT, 0});
|
212 |
+
if (*pos == '+') {
|
213 |
+
// add preceding symbol as alternate only for '+' (otherwise empty)
|
214 |
+
sub_rule.insert(
|
215 |
+
sub_rule.end(), out_elements.begin() + last_sym_start, out_elements.end());
|
216 |
+
}
|
217 |
+
sub_rule.push_back({LLAMA_GRETYPE_END, 0});
|
218 |
+
add_rule(state, sub_rule_id, sub_rule);
|
219 |
+
|
220 |
+
// in original rule, replace previous symbol with reference to generated rule
|
221 |
+
out_elements.resize(last_sym_start);
|
222 |
+
out_elements.push_back({LLAMA_GRETYPE_RULE_REF, sub_rule_id});
|
223 |
+
|
224 |
+
pos = parse_space(pos + 1, is_nested);
|
225 |
+
} else {
|
226 |
+
break;
|
227 |
+
}
|
228 |
+
}
|
229 |
+
return pos;
|
230 |
+
}
|
231 |
+
|
232 |
+
const char * parse_alternates(
|
233 |
+
parse_state & state,
|
234 |
+
const char * src,
|
235 |
+
const std::string & rule_name,
|
236 |
+
uint32_t rule_id,
|
237 |
+
bool is_nested) {
|
238 |
+
std::vector<llama_grammar_element> rule;
|
239 |
+
const char * pos = parse_sequence(state, src, rule_name, rule, is_nested);
|
240 |
+
while (*pos == '|') {
|
241 |
+
rule.push_back({LLAMA_GRETYPE_ALT, 0});
|
242 |
+
pos = parse_space(pos + 1, true);
|
243 |
+
pos = parse_sequence(state, pos, rule_name, rule, is_nested);
|
244 |
+
}
|
245 |
+
rule.push_back({LLAMA_GRETYPE_END, 0});
|
246 |
+
add_rule(state, rule_id, rule);
|
247 |
+
return pos;
|
248 |
+
}
|
249 |
+
|
250 |
+
const char * parse_rule(parse_state & state, const char * src) {
|
251 |
+
const char * name_end = parse_name(src);
|
252 |
+
const char * pos = parse_space(name_end, false);
|
253 |
+
size_t name_len = name_end - src;
|
254 |
+
uint32_t rule_id = get_symbol_id(state, src, name_len);
|
255 |
+
const std::string name(src, name_len);
|
256 |
+
|
257 |
+
if (!(pos[0] == ':' && pos[1] == ':' && pos[2] == '=')) {
|
258 |
+
throw std::runtime_error(std::string("expecting ::= at ") + pos);
|
259 |
+
}
|
260 |
+
pos = parse_space(pos + 3, true);
|
261 |
+
|
262 |
+
pos = parse_alternates(state, pos, name, rule_id, false);
|
263 |
+
|
264 |
+
if (*pos == '\r') {
|
265 |
+
pos += pos[1] == '\n' ? 2 : 1;
|
266 |
+
} else if (*pos == '\n') {
|
267 |
+
pos++;
|
268 |
+
} else if (*pos) {
|
269 |
+
throw std::runtime_error(std::string("expecting newline or end at ") + pos);
|
270 |
+
}
|
271 |
+
return parse_space(pos, true);
|
272 |
+
}
|
273 |
+
|
274 |
+
parse_state parse(const char * src) {
|
275 |
+
try {
|
276 |
+
parse_state state;
|
277 |
+
const char * pos = parse_space(src, true);
|
278 |
+
while (*pos) {
|
279 |
+
pos = parse_rule(state, pos);
|
280 |
+
}
|
281 |
+
return state;
|
282 |
+
} catch (const std::exception & err) {
|
283 |
+
fprintf(stderr, "%s: error parsing grammar: %s\n", __func__, err.what());
|
284 |
+
return parse_state();
|
285 |
+
}
|
286 |
+
}
|
287 |
+
|
288 |
+
void print_grammar_char(FILE * file, uint32_t c) {
|
289 |
+
if (0x20 <= c && c <= 0x7f) {
|
290 |
+
fprintf(file, "%c", static_cast<char>(c));
|
291 |
+
} else {
|
292 |
+
// cop out of encoding UTF-8
|
293 |
+
fprintf(file, "<U+%04X>", c);
|
294 |
+
}
|
295 |
+
}
|
296 |
+
|
297 |
+
bool is_char_element(llama_grammar_element elem) {
|
298 |
+
switch (elem.type) {
|
299 |
+
case LLAMA_GRETYPE_CHAR: return true;
|
300 |
+
case LLAMA_GRETYPE_CHAR_NOT: return true;
|
301 |
+
case LLAMA_GRETYPE_CHAR_ALT: return true;
|
302 |
+
case LLAMA_GRETYPE_CHAR_RNG_UPPER: return true;
|
303 |
+
default: return false;
|
304 |
+
}
|
305 |
+
}
|
306 |
+
|
307 |
+
void print_rule_binary(FILE * file, const std::vector<llama_grammar_element> & rule) {
|
308 |
+
for (auto elem : rule) {
|
309 |
+
switch (elem.type) {
|
310 |
+
case LLAMA_GRETYPE_END: fprintf(file, "END"); break;
|
311 |
+
case LLAMA_GRETYPE_ALT: fprintf(file, "ALT"); break;
|
312 |
+
case LLAMA_GRETYPE_RULE_REF: fprintf(file, "RULE_REF"); break;
|
313 |
+
case LLAMA_GRETYPE_CHAR: fprintf(file, "CHAR"); break;
|
314 |
+
case LLAMA_GRETYPE_CHAR_NOT: fprintf(file, "CHAR_NOT"); break;
|
315 |
+
case LLAMA_GRETYPE_CHAR_RNG_UPPER: fprintf(file, "CHAR_RNG_UPPER"); break;
|
316 |
+
case LLAMA_GRETYPE_CHAR_ALT: fprintf(file, "CHAR_ALT"); break;
|
317 |
+
}
|
318 |
+
switch (elem.type) {
|
319 |
+
case LLAMA_GRETYPE_END:
|
320 |
+
case LLAMA_GRETYPE_ALT:
|
321 |
+
case LLAMA_GRETYPE_RULE_REF:
|
322 |
+
fprintf(file, "(%u) ", elem.value);
|
323 |
+
break;
|
324 |
+
case LLAMA_GRETYPE_CHAR:
|
325 |
+
case LLAMA_GRETYPE_CHAR_NOT:
|
326 |
+
case LLAMA_GRETYPE_CHAR_RNG_UPPER:
|
327 |
+
case LLAMA_GRETYPE_CHAR_ALT:
|
328 |
+
fprintf(file, "(\"");
|
329 |
+
print_grammar_char(file, elem.value);
|
330 |
+
fprintf(file, "\") ");
|
331 |
+
break;
|
332 |
+
}
|
333 |
+
}
|
334 |
+
fprintf(file, "\n");
|
335 |
+
}
|
336 |
+
|
337 |
+
void print_rule(
|
338 |
+
FILE * file,
|
339 |
+
uint32_t rule_id,
|
340 |
+
const std::vector<llama_grammar_element> & rule,
|
341 |
+
const std::map<uint32_t, std::string> & symbol_id_names) {
|
342 |
+
if (rule.empty() || rule.back().type != LLAMA_GRETYPE_END) {
|
343 |
+
throw std::runtime_error(
|
344 |
+
"malformed rule, does not end with LLAMA_GRETYPE_END: " + std::to_string(rule_id));
|
345 |
+
}
|
346 |
+
fprintf(file, "%s ::= ", symbol_id_names.at(rule_id).c_str());
|
347 |
+
for (size_t i = 0, end = rule.size() - 1; i < end; i++) {
|
348 |
+
llama_grammar_element elem = rule[i];
|
349 |
+
switch (elem.type) {
|
350 |
+
case LLAMA_GRETYPE_END:
|
351 |
+
throw std::runtime_error(
|
352 |
+
"unexpected end of rule: " + std::to_string(rule_id) + "," +
|
353 |
+
std::to_string(i));
|
354 |
+
case LLAMA_GRETYPE_ALT:
|
355 |
+
fprintf(file, "| ");
|
356 |
+
break;
|
357 |
+
case LLAMA_GRETYPE_RULE_REF:
|
358 |
+
fprintf(file, "%s ", symbol_id_names.at(elem.value).c_str());
|
359 |
+
break;
|
360 |
+
case LLAMA_GRETYPE_CHAR:
|
361 |
+
fprintf(file, "[");
|
362 |
+
print_grammar_char(file, elem.value);
|
363 |
+
break;
|
364 |
+
case LLAMA_GRETYPE_CHAR_NOT:
|
365 |
+
fprintf(file, "[^");
|
366 |
+
print_grammar_char(file, elem.value);
|
367 |
+
break;
|
368 |
+
case LLAMA_GRETYPE_CHAR_RNG_UPPER:
|
369 |
+
if (i == 0 || !is_char_element(rule[i - 1])) {
|
370 |
+
throw std::runtime_error(
|
371 |
+
"LLAMA_GRETYPE_CHAR_RNG_UPPER without preceding char: " +
|
372 |
+
std::to_string(rule_id) + "," + std::to_string(i));
|
373 |
+
}
|
374 |
+
fprintf(file, "-");
|
375 |
+
print_grammar_char(file, elem.value);
|
376 |
+
break;
|
377 |
+
case LLAMA_GRETYPE_CHAR_ALT:
|
378 |
+
if (i == 0 || !is_char_element(rule[i - 1])) {
|
379 |
+
throw std::runtime_error(
|
380 |
+
"LLAMA_GRETYPE_CHAR_ALT without preceding char: " +
|
381 |
+
std::to_string(rule_id) + "," + std::to_string(i));
|
382 |
+
}
|
383 |
+
print_grammar_char(file, elem.value);
|
384 |
+
break;
|
385 |
+
}
|
386 |
+
if (is_char_element(elem)) {
|
387 |
+
switch (rule[i + 1].type) {
|
388 |
+
case LLAMA_GRETYPE_CHAR_ALT:
|
389 |
+
case LLAMA_GRETYPE_CHAR_RNG_UPPER:
|
390 |
+
break;
|
391 |
+
default:
|
392 |
+
fprintf(file, "] ");
|
393 |
+
}
|
394 |
+
}
|
395 |
+
}
|
396 |
+
fprintf(file, "\n");
|
397 |
+
}
|
398 |
+
|
399 |
+
void print_grammar(FILE * file, const parse_state & state) {
|
400 |
+
try {
|
401 |
+
std::map<uint32_t, std::string> symbol_id_names;
|
402 |
+
for (auto kv : state.symbol_ids) {
|
403 |
+
symbol_id_names[kv.second] = kv.first;
|
404 |
+
}
|
405 |
+
for (size_t i = 0, end = state.rules.size(); i < end; i++) {
|
406 |
+
// fprintf(file, "%zu: ", i);
|
407 |
+
// print_rule_binary(file, state.rules[i]);
|
408 |
+
print_rule(file, i, state.rules[i], symbol_id_names);
|
409 |
+
// fprintf(file, "\n");
|
410 |
+
}
|
411 |
+
} catch (const std::exception & err) {
|
412 |
+
fprintf(stderr, "\n%s: error printing grammar: %s\n", __func__, err.what());
|
413 |
+
}
|
414 |
+
}
|
415 |
+
|
416 |
+
std::vector<const llama_grammar_element *> parse_state::c_rules() {
|
417 |
+
std::vector<const llama_grammar_element *> ret;
|
418 |
+
for (const auto & rule : rules) {
|
419 |
+
ret.push_back(rule.data());
|
420 |
+
}
|
421 |
+
return ret;
|
422 |
+
}
|
423 |
+
}
|
examples/grammar-parser.h
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Implements a parser for an extended Backus-Naur form (BNF), producing the
|
2 |
+
// binary context-free grammar format specified by llama.h. Supports character
|
3 |
+
// ranges, grouping, and repetition operators. As an example, a grammar for
|
4 |
+
// arithmetic might look like:
|
5 |
+
//
|
6 |
+
// root ::= expr
|
7 |
+
// expr ::= term ([-+*/] term)*
|
8 |
+
// term ::= num | "(" space expr ")" space
|
9 |
+
// num ::= [0-9]+ space
|
10 |
+
// space ::= [ \t\n]*
|
11 |
+
|
12 |
+
#pragma once
|
13 |
+
#include "llama.h"
|
14 |
+
#include <vector>
|
15 |
+
#include <map>
|
16 |
+
#include <cstdint>
|
17 |
+
#include <string>
|
18 |
+
|
19 |
+
namespace grammar_parser {
|
20 |
+
struct parse_state {
|
21 |
+
std::map<std::string, uint32_t> symbol_ids;
|
22 |
+
std::vector<std::vector<llama_grammar_element>> rules;
|
23 |
+
|
24 |
+
std::vector<const llama_grammar_element *> c_rules();
|
25 |
+
};
|
26 |
+
|
27 |
+
parse_state parse(const char * src);
|
28 |
+
void print_grammar(FILE * file, const parse_state & state);
|
29 |
+
}
|
examples/llama2-13b.sh
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
#
|
4 |
+
# Temporary script - will be removed in the future
|
5 |
+
#
|
6 |
+
|
7 |
+
cd `dirname $0`
|
8 |
+
cd ..
|
9 |
+
|
10 |
+
./main -m models/available/Llama2/13B/llama-2-13b.ggmlv3.q4_0.bin \
|
11 |
+
--color \
|
12 |
+
--ctx_size 2048 \
|
13 |
+
-n -1 \
|
14 |
+
-ins -b 256 \
|
15 |
+
--top_k 10000 \
|
16 |
+
--temp 0.2 \
|
17 |
+
--repeat_penalty 1.1 \
|
18 |
+
-t 8
|
examples/llama2.sh
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
#
|
4 |
+
# Temporary script - will be removed in the future
|
5 |
+
#
|
6 |
+
|
7 |
+
cd `dirname $0`
|
8 |
+
cd ..
|
9 |
+
|
10 |
+
./main -m models/available/Llama2/7B/llama-2-7b.ggmlv3.q4_0.bin \
|
11 |
+
--color \
|
12 |
+
--ctx_size 2048 \
|
13 |
+
-n -1 \
|
14 |
+
-ins -b 256 \
|
15 |
+
--top_k 10000 \
|
16 |
+
--temp 0.2 \
|
17 |
+
--repeat_penalty 1.1 \
|
18 |
+
-t 8
|
examples/llm.vim
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function! Llm()
|
2 |
+
|
3 |
+
let url = "http://127.0.0.1:8080/completion"
|
4 |
+
|
5 |
+
" Get the content of the current buffer
|
6 |
+
let buffer_content = join(getline(1, '$'), "\n")
|
7 |
+
|
8 |
+
" Create the JSON payload
|
9 |
+
let json_payload = {"temp":0.72,"top_k":100,"top_p":0.73,"repeat_penalty":1.100000023841858,"n_predict":10,"stream": v:false}
|
10 |
+
let json_payload.prompt = buffer_content
|
11 |
+
|
12 |
+
" Define the curl command
|
13 |
+
let curl_command = 'curl -k -s -X POST -H "Content-Type: application/json" -d @- ' . url
|
14 |
+
let response = system(curl_command, json_encode(json_payload))
|
15 |
+
|
16 |
+
" Extract the content field from the response
|
17 |
+
let content = json_decode(response).content
|
18 |
+
|
19 |
+
" Insert the content at the cursor position
|
20 |
+
call setline(line('.'), getline('.') . content)
|
21 |
+
endfunction
|
22 |
+
|
23 |
+
command! Llm call Llm()
|
examples/main/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET main)
|
2 |
add_executable(${TARGET} main.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET main)
|
2 |
add_executable(${TARGET} main.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/main/README.md
CHANGED
@@ -293,5 +293,5 @@ These options provide extra functionality and customization when running the LLa
|
|
293 |
- `-mg i, --main-gpu i`: When using multiple GPUs this option controls which GPU is used for small tensors for which the overhead of splitting the computation across all GPUs is not worthwhile. The GPU in question will use slightly more VRAM to store a scratch buffer for temporary results. By default GPU 0 is used. Requires cuBLAS.
|
294 |
- `-ts SPLIT, --tensor-split SPLIT`: When using multiple GPUs this option controls how large tensors should be split across all GPUs. `SPLIT` is a comma-separated list of non-negative values that assigns the proportion of data that each GPU should get in order. For example, "3,2" will assign 60% of the data to GPU 0 and 40% to GPU 1. By default the data is split in proportion to VRAM but this may not be optimal for performance. Requires cuBLAS.
|
295 |
- `-lv, --low-vram`: Do not allocate a VRAM scratch buffer for holding temporary results. Reduces VRAM usage at the cost of performance, particularly prompt processing speed. Requires cuBLAS.
|
296 |
-
- `--lora FNAME`: Apply a LoRA (Low-Rank Adaptation) adapter to the model. This allows you to adapt the pretrained model to specific tasks or domains.
|
297 |
- `--lora-base FNAME`: Optional model to use as a base for the layers modified by the LoRA adapter. This flag is used in conjunction with the `--lora` flag, and specifies the base model for the adaptation.
|
|
|
293 |
- `-mg i, --main-gpu i`: When using multiple GPUs this option controls which GPU is used for small tensors for which the overhead of splitting the computation across all GPUs is not worthwhile. The GPU in question will use slightly more VRAM to store a scratch buffer for temporary results. By default GPU 0 is used. Requires cuBLAS.
|
294 |
- `-ts SPLIT, --tensor-split SPLIT`: When using multiple GPUs this option controls how large tensors should be split across all GPUs. `SPLIT` is a comma-separated list of non-negative values that assigns the proportion of data that each GPU should get in order. For example, "3,2" will assign 60% of the data to GPU 0 and 40% to GPU 1. By default the data is split in proportion to VRAM but this may not be optimal for performance. Requires cuBLAS.
|
295 |
- `-lv, --low-vram`: Do not allocate a VRAM scratch buffer for holding temporary results. Reduces VRAM usage at the cost of performance, particularly prompt processing speed. Requires cuBLAS.
|
296 |
+
- `--lora FNAME`: Apply a LoRA (Low-Rank Adaptation) adapter to the model (implies --no-mmap). This allows you to adapt the pretrained model to specific tasks or domains.
|
297 |
- `--lora-base FNAME`: Optional model to use as a base for the layers modified by the LoRA adapter. This flag is used in conjunction with the `--lora` flag, and specifies the base model for the adaptation.
|
examples/main/main.cpp
CHANGED
@@ -6,6 +6,7 @@
|
|
6 |
#include "common.h"
|
7 |
#include "llama.h"
|
8 |
#include "build-info.h"
|
|
|
9 |
|
10 |
#include <cassert>
|
11 |
#include <cinttypes>
|
@@ -84,9 +85,17 @@ int main(int argc, char ** argv) {
|
|
84 |
return 0;
|
85 |
}
|
86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
if (params.n_ctx > 2048) {
|
88 |
-
|
89 |
-
|
90 |
} else if (params.n_ctx < 8) {
|
91 |
fprintf(stderr, "%s: warning: minimum context size is 8, using minimum size.\n", __func__);
|
92 |
params.n_ctx = 8;
|
@@ -131,17 +140,14 @@ int main(int argc, char ** argv) {
|
|
131 |
params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info());
|
132 |
}
|
133 |
|
134 |
-
// determine the maximum memory usage needed to do inference for the given n_batch and
|
135 |
// uncomment the "used_mem" line in llama.cpp to see the results
|
136 |
if (params.mem_test) {
|
137 |
{
|
138 |
-
|
139 |
-
llama_eval(ctx, tmp.data(), tmp.size(), 0, params.n_threads);
|
140 |
-
}
|
141 |
|
142 |
-
|
143 |
-
|
144 |
-
llama_eval(ctx, tmp.data(), tmp.size(), params.n_predict - 1, params.n_threads);
|
145 |
}
|
146 |
|
147 |
llama_print_timings(ctx);
|
@@ -319,6 +325,10 @@ int main(int argc, char ** argv) {
|
|
319 |
}
|
320 |
}
|
321 |
|
|
|
|
|
|
|
|
|
322 |
if (!params.input_prefix.empty()) {
|
323 |
fprintf(stderr, "Input prefix: '%s'\n", params.input_prefix.c_str());
|
324 |
}
|
@@ -332,6 +342,31 @@ int main(int argc, char ** argv) {
|
|
332 |
fprintf(stderr, "generate: n_ctx = %d, n_batch = %d, n_predict = %d, n_keep = %d\n", n_ctx, params.n_batch, params.n_predict, params.n_keep);
|
333 |
fprintf(stderr, "\n\n");
|
334 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
335 |
// TODO: replace with ring-buffer
|
336 |
std::vector<llama_token> last_n_tokens(n_ctx);
|
337 |
std::fill(last_n_tokens.begin(), last_n_tokens.end(), 0);
|
@@ -549,7 +584,7 @@ int main(int argc, char ** argv) {
|
|
549 |
llama_token_data_array candidates_p = { candidates.data(), candidates.size(), false };
|
550 |
|
551 |
if (ctx_guidance) {
|
552 |
-
llama_sample_classifier_free_guidance(ctx, &candidates_p, ctx_guidance, params.cfg_scale
|
553 |
}
|
554 |
|
555 |
// Apply penalties
|
@@ -565,6 +600,10 @@ int main(int argc, char ** argv) {
|
|
565 |
logits[llama_token_nl()] = nl_logit;
|
566 |
}
|
567 |
|
|
|
|
|
|
|
|
|
568 |
if (temp <= 0) {
|
569 |
// Greedy sampling
|
570 |
id = llama_sample_token_greedy(ctx, &candidates_p);
|
@@ -590,20 +629,14 @@ int main(int argc, char ** argv) {
|
|
590 |
}
|
591 |
// printf("`%d`", candidates_p.size);
|
592 |
|
|
|
|
|
|
|
|
|
593 |
last_n_tokens.erase(last_n_tokens.begin());
|
594 |
last_n_tokens.push_back(id);
|
595 |
}
|
596 |
|
597 |
-
// replace end of text token with newline token when in interactive mode
|
598 |
-
if (id == llama_token_eos() && params.interactive && !params.instruct) {
|
599 |
-
id = llama_token_newline.front();
|
600 |
-
if (params.antiprompt.size() != 0) {
|
601 |
-
// tokenize and inject first reverse prompt
|
602 |
-
const auto first_antiprompt = ::llama_tokenize(ctx, params.antiprompt.front(), false);
|
603 |
-
embd_inp.insert(embd_inp.end(), first_antiprompt.begin(), first_antiprompt.end());
|
604 |
-
}
|
605 |
-
}
|
606 |
-
|
607 |
// add it to the context
|
608 |
embd.push_back(id);
|
609 |
|
@@ -669,11 +702,34 @@ int main(int argc, char ** argv) {
|
|
669 |
}
|
670 |
}
|
671 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
672 |
if (n_past > 0 && is_interacting) {
|
673 |
if (params.instruct) {
|
674 |
printf("\n> ");
|
675 |
}
|
676 |
|
|
|
|
|
|
|
|
|
677 |
std::string buffer;
|
678 |
if (!params.input_prefix.empty()) {
|
679 |
buffer += params.input_prefix;
|
@@ -720,18 +776,26 @@ int main(int argc, char ** argv) {
|
|
720 |
}
|
721 |
|
722 |
if (n_past > 0) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
723 |
is_interacting = false;
|
724 |
}
|
725 |
}
|
726 |
|
727 |
// end of text token
|
728 |
-
if (!embd.empty() && embd.back() == llama_token_eos()) {
|
729 |
-
|
730 |
-
|
731 |
-
} else {
|
732 |
-
fprintf(stderr, " [end of text]\n");
|
733 |
-
break;
|
734 |
-
}
|
735 |
}
|
736 |
|
737 |
// In interactive mode, respect the maximum number of tokens and drop back to user input when reached.
|
@@ -751,6 +815,9 @@ int main(int argc, char ** argv) {
|
|
751 |
llama_free(ctx);
|
752 |
llama_free_model(model);
|
753 |
|
|
|
|
|
|
|
754 |
llama_backend_free();
|
755 |
|
756 |
return 0;
|
|
|
6 |
#include "common.h"
|
7 |
#include "llama.h"
|
8 |
#include "build-info.h"
|
9 |
+
#include "grammar-parser.h"
|
10 |
|
11 |
#include <cassert>
|
12 |
#include <cinttypes>
|
|
|
85 |
return 0;
|
86 |
}
|
87 |
|
88 |
+
if (params.rope_freq_base != 10000.0) {
|
89 |
+
fprintf(stderr, "%s: warning: changing RoPE frequency base to %g (default 10000.0)\n", __func__, params.rope_freq_base);
|
90 |
+
}
|
91 |
+
|
92 |
+
if (params.rope_freq_scale != 1.0) {
|
93 |
+
fprintf(stderr, "%s: warning: scaling RoPE frequency by %g (default 1.0)\n", __func__, params.rope_freq_scale);
|
94 |
+
}
|
95 |
+
|
96 |
if (params.n_ctx > 2048) {
|
97 |
+
// TODO: determine the actual max context of the model (e.g. 4096 for LLaMA v2) and use that instead of 2048
|
98 |
+
fprintf(stderr, "%s: warning: base model only supports context sizes no greater than 2048 tokens (%d specified)\n", __func__, params.n_ctx);
|
99 |
} else if (params.n_ctx < 8) {
|
100 |
fprintf(stderr, "%s: warning: minimum context size is 8, using minimum size.\n", __func__);
|
101 |
params.n_ctx = 8;
|
|
|
140 |
params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info());
|
141 |
}
|
142 |
|
143 |
+
// determine the maximum memory usage needed to do inference for the given n_batch and n_ctx parameters
|
144 |
// uncomment the "used_mem" line in llama.cpp to see the results
|
145 |
if (params.mem_test) {
|
146 |
{
|
147 |
+
fprintf(stderr, "%s: testing memory usage for n_batch = %d, n_ctx = %d\n", __func__, params.n_batch, params.n_ctx);
|
|
|
|
|
148 |
|
149 |
+
const std::vector<llama_token> tmp(params.n_batch, llama_token_bos());
|
150 |
+
llama_eval(ctx, tmp.data(), tmp.size(), params.n_ctx, params.n_threads);
|
|
|
151 |
}
|
152 |
|
153 |
llama_print_timings(ctx);
|
|
|
325 |
}
|
326 |
}
|
327 |
|
328 |
+
if (params.input_prefix_bos) {
|
329 |
+
fprintf(stderr, "Input prefix with BOS\n");
|
330 |
+
}
|
331 |
+
|
332 |
if (!params.input_prefix.empty()) {
|
333 |
fprintf(stderr, "Input prefix: '%s'\n", params.input_prefix.c_str());
|
334 |
}
|
|
|
342 |
fprintf(stderr, "generate: n_ctx = %d, n_batch = %d, n_predict = %d, n_keep = %d\n", n_ctx, params.n_batch, params.n_predict, params.n_keep);
|
343 |
fprintf(stderr, "\n\n");
|
344 |
|
345 |
+
grammar_parser::parse_state parsed_grammar;
|
346 |
+
llama_grammar * grammar = NULL;
|
347 |
+
if (!params.grammar.empty()) {
|
348 |
+
parsed_grammar = grammar_parser::parse(params.grammar.c_str());
|
349 |
+
// will be empty (default) if there are parse errors
|
350 |
+
if (parsed_grammar.rules.empty()) {
|
351 |
+
return 1;
|
352 |
+
}
|
353 |
+
fprintf(stderr, "%s: grammar:\n", __func__);
|
354 |
+
grammar_parser::print_grammar(stderr, parsed_grammar);
|
355 |
+
fprintf(stderr, "\n");
|
356 |
+
|
357 |
+
{
|
358 |
+
auto it = params.logit_bias.find(llama_token_eos());
|
359 |
+
if (it != params.logit_bias.end() && it->second == -INFINITY) {
|
360 |
+
fprintf(stderr,
|
361 |
+
"%s: warning: EOS token is disabled, which will cause most grammars to fail\n", __func__);
|
362 |
+
}
|
363 |
+
}
|
364 |
+
|
365 |
+
std::vector<const llama_grammar_element *> grammar_rules(parsed_grammar.c_rules());
|
366 |
+
grammar = llama_grammar_init(
|
367 |
+
grammar_rules.data(), grammar_rules.size(), parsed_grammar.symbol_ids.at("root"));
|
368 |
+
}
|
369 |
+
|
370 |
// TODO: replace with ring-buffer
|
371 |
std::vector<llama_token> last_n_tokens(n_ctx);
|
372 |
std::fill(last_n_tokens.begin(), last_n_tokens.end(), 0);
|
|
|
584 |
llama_token_data_array candidates_p = { candidates.data(), candidates.size(), false };
|
585 |
|
586 |
if (ctx_guidance) {
|
587 |
+
llama_sample_classifier_free_guidance(ctx, &candidates_p, ctx_guidance, params.cfg_scale);
|
588 |
}
|
589 |
|
590 |
// Apply penalties
|
|
|
600 |
logits[llama_token_nl()] = nl_logit;
|
601 |
}
|
602 |
|
603 |
+
if (grammar != NULL) {
|
604 |
+
llama_sample_grammar(ctx, &candidates_p, grammar);
|
605 |
+
}
|
606 |
+
|
607 |
if (temp <= 0) {
|
608 |
// Greedy sampling
|
609 |
id = llama_sample_token_greedy(ctx, &candidates_p);
|
|
|
629 |
}
|
630 |
// printf("`%d`", candidates_p.size);
|
631 |
|
632 |
+
if (grammar != NULL) {
|
633 |
+
llama_grammar_accept_token(ctx, grammar, id);
|
634 |
+
}
|
635 |
+
|
636 |
last_n_tokens.erase(last_n_tokens.begin());
|
637 |
last_n_tokens.push_back(id);
|
638 |
}
|
639 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
640 |
// add it to the context
|
641 |
embd.push_back(id);
|
642 |
|
|
|
702 |
}
|
703 |
}
|
704 |
|
705 |
+
// deal with end of text token in interactive mode
|
706 |
+
if (last_n_tokens.back() == llama_token_eos()) {
|
707 |
+
if (params.interactive) {
|
708 |
+
if (params.antiprompt.size() != 0) {
|
709 |
+
// tokenize and inject first reverse prompt
|
710 |
+
const auto first_antiprompt = ::llama_tokenize(ctx, params.antiprompt.front(), false);
|
711 |
+
embd_inp.insert(embd_inp.end(), first_antiprompt.begin(), first_antiprompt.end());
|
712 |
+
is_antiprompt = true;
|
713 |
+
}
|
714 |
+
|
715 |
+
is_interacting = true;
|
716 |
+
printf("\n");
|
717 |
+
console_set_color(con_st, CONSOLE_COLOR_USER_INPUT);
|
718 |
+
fflush(stdout);
|
719 |
+
} else if (params.instruct) {
|
720 |
+
is_interacting = true;
|
721 |
+
}
|
722 |
+
}
|
723 |
+
|
724 |
if (n_past > 0 && is_interacting) {
|
725 |
if (params.instruct) {
|
726 |
printf("\n> ");
|
727 |
}
|
728 |
|
729 |
+
if (params.input_prefix_bos) {
|
730 |
+
embd_inp.push_back(llama_token_bos());
|
731 |
+
}
|
732 |
+
|
733 |
std::string buffer;
|
734 |
if (!params.input_prefix.empty()) {
|
735 |
buffer += params.input_prefix;
|
|
|
776 |
}
|
777 |
|
778 |
if (n_past > 0) {
|
779 |
+
if (is_interacting) {
|
780 |
+
// reset grammar state if we're restarting generation
|
781 |
+
if (grammar != NULL) {
|
782 |
+
llama_grammar_free(grammar);
|
783 |
+
|
784 |
+
std::vector<const llama_grammar_element *> grammar_rules(
|
785 |
+
parsed_grammar.c_rules());
|
786 |
+
grammar = llama_grammar_init(
|
787 |
+
grammar_rules.data(), grammar_rules.size(),
|
788 |
+
parsed_grammar.symbol_ids.at("root"));
|
789 |
+
}
|
790 |
+
}
|
791 |
is_interacting = false;
|
792 |
}
|
793 |
}
|
794 |
|
795 |
// end of text token
|
796 |
+
if (!embd.empty() && embd.back() == llama_token_eos() && !(params.instruct || params.interactive)) {
|
797 |
+
fprintf(stderr, " [end of text]\n");
|
798 |
+
break;
|
|
|
|
|
|
|
|
|
799 |
}
|
800 |
|
801 |
// In interactive mode, respect the maximum number of tokens and drop back to user input when reached.
|
|
|
815 |
llama_free(ctx);
|
816 |
llama_free_model(model);
|
817 |
|
818 |
+
if (grammar != NULL) {
|
819 |
+
llama_grammar_free(grammar);
|
820 |
+
}
|
821 |
llama_backend_free();
|
822 |
|
823 |
return 0;
|
examples/make-ggml.py
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
This script converts Hugging Face llama models to GGML and quantizes them.
|
3 |
+
|
4 |
+
Usage:
|
5 |
+
python make-ggml.py --model {model_dir_or_hf_repo_name} [--outname {output_name} (Optional)] [--outdir {output_directory} (Optional)] [--quants {quant_types} (Optional)] [--keep_fp16 (Optional)]
|
6 |
+
|
7 |
+
Arguments:
|
8 |
+
- --model: (Required) The directory of the downloaded Hugging Face model or the name of the Hugging Face model repository. If the model directory does not exist, it will be downloaded from the Hugging Face model hub.
|
9 |
+
- --outname: (Optional) The name of the output model. If not specified, the last part of the model directory path or the Hugging Face model repo name will be used.
|
10 |
+
- --outdir: (Optional) The directory where the output model(s) will be stored. If not specified, '../models/{outname}' will be used.
|
11 |
+
- --quants: (Optional) The types of quantization to apply. This should be a space-separated list. The default is 'Q4_K_M Q5_K_S'.
|
12 |
+
- --keep_fp16: (Optional) If specified, the FP16 model will not be deleted after the quantized models are created.
|
13 |
+
|
14 |
+
Quant types:
|
15 |
+
- Q4_0: small, very high quality loss - legacy, prefer using Q3_K_M
|
16 |
+
- Q4_1: small, substantial quality loss - legacy, prefer using Q3_K_L
|
17 |
+
- Q5_0: medium, balanced quality - legacy, prefer using Q4_K_M
|
18 |
+
- Q5_1: medium, low quality loss - legacy, prefer using Q5_K_M
|
19 |
+
- Q2_K: smallest, extreme quality loss - not recommended
|
20 |
+
- Q3_K: alias for Q3_K_M
|
21 |
+
- Q3_K_S: very small, very high quality loss
|
22 |
+
- Q3_K_M: very small, very high quality loss
|
23 |
+
- Q3_K_L: small, substantial quality loss
|
24 |
+
- Q4_K: alias for Q4_K_M
|
25 |
+
- Q4_K_S: small, significant quality loss
|
26 |
+
- Q4_K_M: medium, balanced quality - recommended
|
27 |
+
- Q5_K: alias for Q5_K_M
|
28 |
+
- Q5_K_S: large, low quality loss - recommended
|
29 |
+
- Q5_K_M: large, very low quality loss - recommended
|
30 |
+
- Q6_K: very large, extremely low quality loss
|
31 |
+
- Q8_0: very large, extremely low quality loss - not recommended
|
32 |
+
- F16: extremely large, virtually no quality loss - not recommended
|
33 |
+
- F32: absolutely huge, lossless - not recommended
|
34 |
+
"""
|
35 |
+
import subprocess
|
36 |
+
subprocess.run(f"pip install huggingface-hub==0.16.4", shell=True, check=True)
|
37 |
+
|
38 |
+
import argparse
|
39 |
+
import os
|
40 |
+
from huggingface_hub import snapshot_download
|
41 |
+
|
42 |
+
def main(model, outname, outdir, quants, keep_fp16):
|
43 |
+
ggml_version = "v3"
|
44 |
+
|
45 |
+
if not os.path.isdir(model):
|
46 |
+
print(f"Model not found at {model}. Downloading...")
|
47 |
+
try:
|
48 |
+
if outname is None:
|
49 |
+
outname = model.split('/')[-1]
|
50 |
+
model = snapshot_download(repo_id=model, cache_dir='../models/hf_cache')
|
51 |
+
except Exception as e:
|
52 |
+
raise Exception(f"Could not download the model: {e}")
|
53 |
+
|
54 |
+
if outdir is None:
|
55 |
+
outdir = f'../models/{outname}'
|
56 |
+
|
57 |
+
if not os.path.isfile(f"{model}/config.json"):
|
58 |
+
raise Exception(f"Could not find config.json in {model}")
|
59 |
+
|
60 |
+
os.makedirs(outdir, exist_ok=True)
|
61 |
+
|
62 |
+
print("Building llama.cpp")
|
63 |
+
subprocess.run(f"cd .. && make quantize", shell=True, check=True)
|
64 |
+
|
65 |
+
fp16 = f"{outdir}/{outname}.ggml{ggml_version}.fp16.bin"
|
66 |
+
|
67 |
+
print(f"Making unquantised GGML at {fp16}")
|
68 |
+
if not os.path.isfile(fp16):
|
69 |
+
subprocess.run(f"python3 ../convert.py {model} --outtype f16 --outfile {fp16}", shell=True, check=True)
|
70 |
+
else:
|
71 |
+
print(f"Unquantised GGML already exists at: {fp16}")
|
72 |
+
|
73 |
+
print("Making quants")
|
74 |
+
for type in quants:
|
75 |
+
outfile = f"{outdir}/{outname}.ggml{ggml_version}.{type}.bin"
|
76 |
+
print(f"Making {type} : {outfile}")
|
77 |
+
subprocess.run(f"../quantize {fp16} {outfile} {type}", shell=True, check=True)
|
78 |
+
|
79 |
+
if not keep_fp16:
|
80 |
+
os.remove(fp16)
|
81 |
+
|
82 |
+
if __name__ == "__main__":
|
83 |
+
parser = argparse.ArgumentParser(description='Convert/Quantize HF to GGML. If you have the HF model downloaded already, pass the path to the model dir. Otherwise, pass the Hugging Face model repo name. You need to be in the /examples folder for it to work.')
|
84 |
+
parser.add_argument('--model', required=True, help='Downloaded model dir or Hugging Face model repo name')
|
85 |
+
parser.add_argument('--outname', default=None, help='Output model(s) name')
|
86 |
+
parser.add_argument('--outdir', default=None, help='Output directory')
|
87 |
+
parser.add_argument('--quants', nargs='*', default=["Q4_K_M", "Q5_K_S"], help='Quant types')
|
88 |
+
parser.add_argument('--keep_fp16', action='store_true', help='Keep fp16 model', default=False)
|
89 |
+
|
90 |
+
args = parser.parse_args()
|
91 |
+
|
92 |
+
main(args.model, args.outname, args.outdir, args.quants, args.keep_fp16)
|
examples/metal/CMakeLists.txt
CHANGED
@@ -1,3 +1,4 @@
|
|
1 |
set(TEST_TARGET metal)
|
2 |
add_executable(${TEST_TARGET} metal.cpp)
|
|
|
3 |
target_link_libraries(${TEST_TARGET} PRIVATE ggml)
|
|
|
1 |
set(TEST_TARGET metal)
|
2 |
add_executable(${TEST_TARGET} metal.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TEST_TARGET} PRIVATE ggml)
|
examples/perplexity/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET perplexity)
|
2 |
add_executable(${TARGET} perplexity.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET perplexity)
|
2 |
add_executable(${TARGET} perplexity.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/perplexity/perplexity.cpp
CHANGED
@@ -4,6 +4,7 @@
|
|
4 |
|
5 |
#include <cmath>
|
6 |
#include <ctime>
|
|
|
7 |
|
8 |
#if defined(_MSC_VER)
|
9 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
@@ -32,13 +33,15 @@ void perplexity(llama_context * ctx, const gpt_params & params) {
|
|
32 |
// BOS tokens will be added for each chunk before eval
|
33 |
auto tokens = ::llama_tokenize(ctx, params.prompt, true);
|
34 |
|
35 |
-
int
|
36 |
|
37 |
-
const int n_chunk =
|
38 |
const int n_vocab = llama_n_vocab(ctx);
|
39 |
const int n_batch = params.n_batch;
|
40 |
|
|
|
41 |
double nll = 0.0;
|
|
|
42 |
fprintf(stderr, "%s: calculating perplexity over %d chunks, batch_size=%d\n", __func__, n_chunk, n_batch);
|
43 |
|
44 |
for (int i = 0; i < n_chunk; ++i) {
|
@@ -118,6 +121,77 @@ void perplexity(llama_context * ctx, const gpt_params & params) {
|
|
118 |
printf("\n");
|
119 |
}
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
int main(int argc, char ** argv) {
|
122 |
gpt_params params;
|
123 |
|
@@ -166,7 +240,11 @@ int main(int argc, char ** argv) {
|
|
166 |
params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info());
|
167 |
}
|
168 |
|
169 |
-
|
|
|
|
|
|
|
|
|
170 |
|
171 |
llama_print_timings(ctx);
|
172 |
llama_free(ctx);
|
|
|
4 |
|
5 |
#include <cmath>
|
6 |
#include <ctime>
|
7 |
+
#include <sstream>
|
8 |
|
9 |
#if defined(_MSC_VER)
|
10 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
|
|
33 |
// BOS tokens will be added for each chunk before eval
|
34 |
auto tokens = ::llama_tokenize(ctx, params.prompt, true);
|
35 |
|
36 |
+
const int n_chunk_max = tokens.size() / params.n_ctx;
|
37 |
|
38 |
+
const int n_chunk = params.n_chunks < 0 ? n_chunk_max : std::min(params.n_chunks, n_chunk_max);
|
39 |
const int n_vocab = llama_n_vocab(ctx);
|
40 |
const int n_batch = params.n_batch;
|
41 |
|
42 |
+
int count = 0;
|
43 |
double nll = 0.0;
|
44 |
+
|
45 |
fprintf(stderr, "%s: calculating perplexity over %d chunks, batch_size=%d\n", __func__, n_chunk, n_batch);
|
46 |
|
47 |
for (int i = 0; i < n_chunk; ++i) {
|
|
|
121 |
printf("\n");
|
122 |
}
|
123 |
|
124 |
+
void perplexity_lines(llama_context * ctx, const gpt_params & params) {
|
125 |
+
// Calculates perplexity over each line of the prompt
|
126 |
+
|
127 |
+
std::vector<std::string> prompt_lines;
|
128 |
+
std::istringstream strstream(params.prompt);
|
129 |
+
std::string line;
|
130 |
+
|
131 |
+
while (std::getline(strstream,line,'\n')) {
|
132 |
+
prompt_lines.push_back(line);
|
133 |
+
}
|
134 |
+
|
135 |
+
const int n_vocab = llama_n_vocab(ctx);
|
136 |
+
|
137 |
+
int counttotal = 0;
|
138 |
+
size_t n_lines = prompt_lines.size();
|
139 |
+
|
140 |
+
double nll = 0.0;
|
141 |
+
|
142 |
+
fprintf(stderr, "%s: calculating perplexity over %lu lines\n", __func__, n_lines);
|
143 |
+
|
144 |
+
printf("\nLine\tPPL line\tPPL cumulative\n");
|
145 |
+
|
146 |
+
for (size_t i = 0; i < n_lines; ++i) {
|
147 |
+
|
148 |
+
// Tokenize and insert BOS at start
|
149 |
+
std::vector<int> batch_embd = ::llama_tokenize(ctx, prompt_lines[i], true);
|
150 |
+
|
151 |
+
size_t batch_size = batch_embd.size();
|
152 |
+
|
153 |
+
// Stop if line is too long
|
154 |
+
if( batch_size > (size_t)params.n_ctx ) {
|
155 |
+
fprintf(stderr, "%s : tokens in line %lu > n_ctxl\n", __func__, i);
|
156 |
+
return;
|
157 |
+
}
|
158 |
+
|
159 |
+
if (llama_eval(ctx, batch_embd.data(), batch_size, 0, params.n_threads)) {
|
160 |
+
fprintf(stderr, "%s : failed to eval\n", __func__);
|
161 |
+
return;
|
162 |
+
}
|
163 |
+
|
164 |
+
const auto batch_logits = llama_get_logits(ctx);
|
165 |
+
std::vector<float> logits;
|
166 |
+
logits.insert(logits.end(), batch_logits, batch_logits + batch_size * n_vocab);
|
167 |
+
|
168 |
+
double nllline = 0.0;
|
169 |
+
int countline = 0;
|
170 |
+
|
171 |
+
// Perplexity over second half of the line
|
172 |
+
for (size_t j = batch_size/2; j < batch_size - 1; ++j) {
|
173 |
+
// Calculate probability of next token, given the previous ones.
|
174 |
+
const std::vector<float> tok_logits(
|
175 |
+
logits.begin() + (j + 0) * n_vocab,
|
176 |
+
logits.begin() + (j + 1) * n_vocab);
|
177 |
+
|
178 |
+
const float prob = softmax(tok_logits)[batch_embd[ j + 1]];
|
179 |
+
|
180 |
+
nllline += -std::log(prob);
|
181 |
+
++countline;
|
182 |
+
}
|
183 |
+
|
184 |
+
nll += nllline;
|
185 |
+
counttotal += countline;
|
186 |
+
|
187 |
+
// perplexity is e^(average negative log-likelihood)
|
188 |
+
printf("%lu\t%.8lf\t%.8lf\n", i + 1, std::exp(nllline/countline), std::exp(nll / counttotal) );
|
189 |
+
fflush(stdout);
|
190 |
+
}
|
191 |
+
|
192 |
+
printf("\n");
|
193 |
+
}
|
194 |
+
|
195 |
int main(int argc, char ** argv) {
|
196 |
gpt_params params;
|
197 |
|
|
|
240 |
params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info());
|
241 |
}
|
242 |
|
243 |
+
if (params.perplexity_lines) {
|
244 |
+
perplexity_lines(ctx, params);
|
245 |
+
} else {
|
246 |
+
perplexity(ctx, params);
|
247 |
+
}
|
248 |
|
249 |
llama_print_timings(ctx);
|
250 |
llama_free(ctx);
|
examples/quantize-stats/CMakeLists.txt
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
set(TARGET quantize-stats)
|
2 |
add_executable(${TARGET} quantize-stats.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
|
|
1 |
set(TARGET quantize-stats)
|
2 |
add_executable(${TARGET} quantize-stats.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
examples/quantize/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET quantize)
|
2 |
add_executable(${TARGET} quantize.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET quantize)
|
2 |
add_executable(${TARGET} quantize.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/quantize/quantize.cpp
CHANGED
@@ -12,103 +12,27 @@ struct quant_option {
|
|
12 |
};
|
13 |
|
14 |
static const std::vector<struct quant_option> QUANT_OPTIONS = {
|
15 |
-
{
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
},
|
20 |
-
{
|
21 |
-
"Q4_1",
|
22 |
-
LLAMA_FTYPE_MOSTLY_Q4_1,
|
23 |
-
" 3.90G, +0.1846 ppl @ 7B - small, substantial quality loss - legacy, prefer using Q3_K_L",
|
24 |
-
},
|
25 |
-
{
|
26 |
-
"Q5_0",
|
27 |
-
LLAMA_FTYPE_MOSTLY_Q5_0,
|
28 |
-
" 4.30G, +0.0796 ppl @ 7B - medium, balanced quality - legacy, prefer using Q4_K_M",
|
29 |
-
},
|
30 |
-
{
|
31 |
-
"Q5_1",
|
32 |
-
LLAMA_FTYPE_MOSTLY_Q5_1,
|
33 |
-
" 4.70G, +0.0415 ppl @ 7B - medium, low quality loss - legacy, prefer using Q5_K_M",
|
34 |
-
},
|
35 |
#ifdef GGML_USE_K_QUANTS
|
36 |
-
{
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
},
|
41 |
-
{
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
},
|
46 |
-
{
|
47 |
-
|
48 |
-
LLAMA_FTYPE_MOSTLY_Q3_K_S,
|
49 |
-
" 2.75G, +0.5505 ppl @ 7B - very small, very high quality loss",
|
50 |
-
},
|
51 |
-
{
|
52 |
-
"Q3_K_M",
|
53 |
-
LLAMA_FTYPE_MOSTLY_Q3_K_M,
|
54 |
-
" 3.06G, +0.2437 ppl @ 7B - very small, very high quality loss",
|
55 |
-
},
|
56 |
-
{
|
57 |
-
"Q3_K_L",
|
58 |
-
LLAMA_FTYPE_MOSTLY_Q3_K_L,
|
59 |
-
" 3.35G, +0.1803 ppl @ 7B - small, substantial quality loss",
|
60 |
-
},
|
61 |
-
{
|
62 |
-
"Q4_K",
|
63 |
-
LLAMA_FTYPE_MOSTLY_Q4_K_M,
|
64 |
-
"alias for Q4_K_M",
|
65 |
-
},
|
66 |
-
{
|
67 |
-
"Q4_K_S",
|
68 |
-
LLAMA_FTYPE_MOSTLY_Q4_K_S,
|
69 |
-
" 3.56G, +0.1149 ppl @ 7B - small, significant quality loss",
|
70 |
-
},
|
71 |
-
{
|
72 |
-
"Q4_K_M",
|
73 |
-
LLAMA_FTYPE_MOSTLY_Q4_K_M,
|
74 |
-
" 3.80G, +0.0535 ppl @ 7B - medium, balanced quality - *recommended*",
|
75 |
-
},
|
76 |
-
{
|
77 |
-
"Q5_K",
|
78 |
-
LLAMA_FTYPE_MOSTLY_Q5_K_M,
|
79 |
-
"alias for Q5_K_M",
|
80 |
-
},
|
81 |
-
{
|
82 |
-
"Q5_K_S",
|
83 |
-
LLAMA_FTYPE_MOSTLY_Q5_K_S,
|
84 |
-
" 4.33G, +0.0353 ppl @ 7B - large, low quality loss - *recommended*",
|
85 |
-
},
|
86 |
-
{
|
87 |
-
"Q5_K_M",
|
88 |
-
LLAMA_FTYPE_MOSTLY_Q5_K_M,
|
89 |
-
" 4.45G, +0.0142 ppl @ 7B - large, very low quality loss - *recommended*",
|
90 |
-
},
|
91 |
-
{
|
92 |
-
"Q6_K",
|
93 |
-
LLAMA_FTYPE_MOSTLY_Q6_K,
|
94 |
-
" 5.15G, +0.0044 ppl @ 7B - very large, extremely low quality loss",
|
95 |
-
},
|
96 |
#endif
|
97 |
-
{
|
98 |
-
|
99 |
-
|
100 |
-
" 6.70G, +0.0004 ppl @ 7B - very large, extremely low quality loss - not recommended",
|
101 |
-
},
|
102 |
-
{
|
103 |
-
"F16",
|
104 |
-
LLAMA_FTYPE_MOSTLY_F16,
|
105 |
-
"13.00G @ 7B - extremely large, virtually no quality loss - not recommended",
|
106 |
-
},
|
107 |
-
{
|
108 |
-
"F32",
|
109 |
-
LLAMA_FTYPE_ALL_F32,
|
110 |
-
"26.00G @ 7B - absolutely huge, lossless - not recommended",
|
111 |
-
},
|
112 |
};
|
113 |
|
114 |
|
|
|
12 |
};
|
13 |
|
14 |
static const std::vector<struct quant_option> QUANT_OPTIONS = {
|
15 |
+
{ "Q4_0", LLAMA_FTYPE_MOSTLY_Q4_0, " 3.50G, +0.2499 ppl @ 7B", },
|
16 |
+
{ "Q4_1", LLAMA_FTYPE_MOSTLY_Q4_1, " 3.90G, +0.1846 ppl @ 7B", },
|
17 |
+
{ "Q5_0", LLAMA_FTYPE_MOSTLY_Q5_0, " 4.30G, +0.0796 ppl @ 7B", },
|
18 |
+
{ "Q5_1", LLAMA_FTYPE_MOSTLY_Q5_1, " 4.70G, +0.0415 ppl @ 7B", },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
#ifdef GGML_USE_K_QUANTS
|
20 |
+
{ "Q2_K", LLAMA_FTYPE_MOSTLY_Q2_K, " 2.67G, +0.8698 ppl @ 7B", },
|
21 |
+
{ "Q3_K", LLAMA_FTYPE_MOSTLY_Q3_K_M, "alias for Q3_K_M" },
|
22 |
+
{ "Q3_K_S", LLAMA_FTYPE_MOSTLY_Q3_K_S, " 2.75G, +0.5505 ppl @ 7B", },
|
23 |
+
{ "Q3_K_M", LLAMA_FTYPE_MOSTLY_Q3_K_M, " 3.06G, +0.2437 ppl @ 7B", },
|
24 |
+
{ "Q3_K_L", LLAMA_FTYPE_MOSTLY_Q3_K_L, " 3.35G, +0.1803 ppl @ 7B", },
|
25 |
+
{ "Q4_K", LLAMA_FTYPE_MOSTLY_Q4_K_M, "alias for Q4_K_M", },
|
26 |
+
{ "Q4_K_S", LLAMA_FTYPE_MOSTLY_Q4_K_S, " 3.56G, +0.1149 ppl @ 7B", },
|
27 |
+
{ "Q4_K_M", LLAMA_FTYPE_MOSTLY_Q4_K_M, " 3.80G, +0.0535 ppl @ 7B", },
|
28 |
+
{ "Q5_K", LLAMA_FTYPE_MOSTLY_Q5_K_M, "alias for Q5_K_M", },
|
29 |
+
{ "Q5_K_S", LLAMA_FTYPE_MOSTLY_Q5_K_S, " 4.33G, +0.0353 ppl @ 7B", },
|
30 |
+
{ "Q5_K_M", LLAMA_FTYPE_MOSTLY_Q5_K_M, " 4.45G, +0.0142 ppl @ 7B", },
|
31 |
+
{ "Q6_K", LLAMA_FTYPE_MOSTLY_Q6_K, " 5.15G, +0.0044 ppl @ 7B", },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
#endif
|
33 |
+
{ "Q8_0", LLAMA_FTYPE_MOSTLY_Q8_0, " 6.70G, +0.0004 ppl @ 7B", },
|
34 |
+
{ "F16", LLAMA_FTYPE_MOSTLY_F16, "13.00G @ 7B", },
|
35 |
+
{ "F32", LLAMA_FTYPE_ALL_F32, "26.00G @ 7B", },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
};
|
37 |
|
38 |
|
examples/save-load-state/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET save-load-state)
|
2 |
add_executable(${TARGET} save-load-state.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET save-load-state)
|
2 |
add_executable(${TARGET} save-load-state.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/server/CMakeLists.txt
CHANGED
@@ -2,10 +2,14 @@ set(TARGET server)
|
|
2 |
option(LLAMA_SERVER_VERBOSE "Build verbose logging option for Server" ON)
|
3 |
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
4 |
add_executable(${TARGET} server.cpp json.hpp httplib.h)
|
|
|
5 |
target_compile_definitions(${TARGET} PRIVATE
|
6 |
SERVER_VERBOSE=$<BOOL:${LLAMA_SERVER_VERBOSE}>
|
7 |
)
|
8 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
|
|
|
|
|
|
9 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
10 |
if(TARGET BUILD_INFO)
|
11 |
add_dependencies(${TARGET} BUILD_INFO)
|
|
|
2 |
option(LLAMA_SERVER_VERBOSE "Build verbose logging option for Server" ON)
|
3 |
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
4 |
add_executable(${TARGET} server.cpp json.hpp httplib.h)
|
5 |
+
install(TARGETS ${TARGET} RUNTIME)
|
6 |
target_compile_definitions(${TARGET} PRIVATE
|
7 |
SERVER_VERBOSE=$<BOOL:${LLAMA_SERVER_VERBOSE}>
|
8 |
)
|
9 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
10 |
+
if (WIN32)
|
11 |
+
TARGET_LINK_LIBRARIES(${TARGET} PRIVATE ws2_32)
|
12 |
+
endif()
|
13 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
14 |
if(TARGET BUILD_INFO)
|
15 |
add_dependencies(${TARGET} BUILD_INFO)
|
examples/server/README.md
CHANGED
@@ -16,7 +16,7 @@ Command line options:
|
|
16 |
- `--memory-f32`: Use 32-bit floats instead of 16-bit floats for memory key+value. Not recommended.
|
17 |
- `--mlock`: Lock the model in memory, preventing it from being swapped out when memory-mapped.
|
18 |
- `--no-mmap`: Do not memory-map the model. By default, models are mapped into memory, which allows the system to load only the necessary parts of the model as needed.
|
19 |
-
- `--lora FNAME`: Apply a LoRA (Low-Rank Adaptation) adapter to the model. This allows you to adapt the pretrained model to specific tasks or domains.
|
20 |
- `--lora-base FNAME`: Optional model to use as a base for the layers modified by the LoRA adapter. This flag is used in conjunction with the `--lora` flag, and specifies the base model for the adaptation.
|
21 |
- `-to N`, `--timeout N`: Server read/write timeout in seconds. Default `600`.
|
22 |
- `--host`: Set the hostname or ip address to listen. Default `127.0.0.1`.
|
@@ -66,6 +66,7 @@ Using [curl](https://curl.se/). On Windows `curl.exe` should be available in the
|
|
66 |
```sh
|
67 |
curl --request POST \
|
68 |
--url http://localhost:8080/completion \
|
|
|
69 |
--data '{"prompt": "Building a website can be done in 10 simple steps:","n_predict": 128}'
|
70 |
```
|
71 |
|
|
|
16 |
- `--memory-f32`: Use 32-bit floats instead of 16-bit floats for memory key+value. Not recommended.
|
17 |
- `--mlock`: Lock the model in memory, preventing it from being swapped out when memory-mapped.
|
18 |
- `--no-mmap`: Do not memory-map the model. By default, models are mapped into memory, which allows the system to load only the necessary parts of the model as needed.
|
19 |
+
- `--lora FNAME`: Apply a LoRA (Low-Rank Adaptation) adapter to the model (implies --no-mmap). This allows you to adapt the pretrained model to specific tasks or domains.
|
20 |
- `--lora-base FNAME`: Optional model to use as a base for the layers modified by the LoRA adapter. This flag is used in conjunction with the `--lora` flag, and specifies the base model for the adaptation.
|
21 |
- `-to N`, `--timeout N`: Server read/write timeout in seconds. Default `600`.
|
22 |
- `--host`: Set the hostname or ip address to listen. Default `127.0.0.1`.
|
|
|
66 |
```sh
|
67 |
curl --request POST \
|
68 |
--url http://localhost:8080/completion \
|
69 |
+
--header "Content-Type: application/json" \
|
70 |
--data '{"prompt": "Building a website can be done in 10 simple steps:","n_predict": 128}'
|
71 |
```
|
72 |
|
examples/server/chat.sh
CHANGED
@@ -32,6 +32,7 @@ tokenize() {
|
|
32 |
--silent \
|
33 |
--request POST \
|
34 |
--url "${API_URL}/tokenize" \
|
|
|
35 |
--data-raw "$(jq -ns --arg content "$1" '{content:$content}')" \
|
36 |
| jq '.tokens[]'
|
37 |
}
|
@@ -64,6 +65,7 @@ chat_completion() {
|
|
64 |
--no-buffer \
|
65 |
--request POST \
|
66 |
--url "${API_URL}/completion" \
|
|
|
67 |
--data-raw "${DATA}")
|
68 |
|
69 |
printf "\n"
|
|
|
32 |
--silent \
|
33 |
--request POST \
|
34 |
--url "${API_URL}/tokenize" \
|
35 |
+
--header "Content-Type: application/json" \
|
36 |
--data-raw "$(jq -ns --arg content "$1" '{content:$content}')" \
|
37 |
| jq '.tokens[]'
|
38 |
}
|
|
|
65 |
--no-buffer \
|
66 |
--request POST \
|
67 |
--url "${API_URL}/completion" \
|
68 |
+
--header "Content-Type: application/json" \
|
69 |
--data-raw "${DATA}")
|
70 |
|
71 |
printf "\n"
|
examples/server/index.html.hpp
CHANGED
@@ -111,103 +111,176 @@ unsigned char index_html[] = {
|
|
111 |
0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20,
|
112 |
0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72,
|
113 |
0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
114 |
-
0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
115 |
-
|
116 |
-
0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x35, 0x70, 0x78,
|
117 |
-
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x65, 0x78,
|
118 |
-
0x2d, 0x67, 0x72, 0x6f, 0x77, 0x3a, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20,
|
119 |
-
0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31,
|
120 |
-
0x30, 0x30, 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a,
|
121 |
-
0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65,
|
122 |
-
0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73,
|
123 |
-
0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b,
|
124 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
|
125 |
-
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
126 |
-
0x20, 0x23, 0x32, 0x32, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
127 |
-
0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x64, 0x64, 0x64,
|
128 |
-
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
129 |
-
0x63, 0x6f, 0x64, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
130 |
-
0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79,
|
131 |
-
0x3a, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b,
|
132 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69,
|
133 |
-
0x6e, 0x67, 0x3a, 0x20, 0x30, 0x2e, 0x31, 0x65, 0x6d, 0x20, 0x30, 0x2e,
|
134 |
-
0x33, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
135 |
-
0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73,
|
136 |
-
0x3a, 0x20, 0x33, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
|
137 |
-
0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
|
138 |
-
0x65, 0x74, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x7b, 0x0a, 0x20,
|
139 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a,
|
140 |
-
0x20, 0x30, 0x2e, 0x35, 0x65, 0x6d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20,
|
141 |
0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
|
142 |
-
0x20,
|
143 |
-
|
144 |
-
|
145 |
-
0x20, 0x20, 0x20, 0x20, 0x20,
|
146 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
147 |
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20,
|
149 |
-
0x20, 0x20, 0x20, 0x20,
|
150 |
-
|
151 |
-
0x20, 0x20,
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
0x73,
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
0x6d,
|
169 |
-
0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
211 |
0x20, 0x20, 0x7d, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
|
212 |
0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x53, 0x74, 0x61,
|
213 |
0x74, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x28,
|
@@ -556,344 +629,525 @@ unsigned char index_html[] = {
|
|
556 |
0x72, 0x67, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x3a, 0x20,
|
557 |
0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x65,
|
558 |
0x6c, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x76, 0x61, 0x6c,
|
559 |
-
0x75, 0x65, 0x29, 0x20, 0x7d, 0x0a,
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
|
581 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
582 |
-
0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
583 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61,
|
584 |
-
0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x75, 0x73, 0x65,
|
585 |
-
0x72, 0x22, 0x3e, 0x55, 0x73, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65,
|
586 |
-
0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
587 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
588 |
-
0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
|
589 |
-
0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
|
590 |
-
0x75, 0x73, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
|
591 |
-
0x22, 0x24, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
|
592 |
-
0x61, 0x6c, 0x75, 0x65, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x7d, 0x22, 0x20,
|
593 |
-
0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70,
|
594 |
-
0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x7d,
|
595 |
-
0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
596 |
-
0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x0a,
|
597 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
598 |
-
0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
599 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62,
|
600 |
-
0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x62, 0x6f, 0x74, 0x22,
|
601 |
-
0x3e, 0x42, 0x6f, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6c,
|
602 |
-
0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
603 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70,
|
604 |
-
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78,
|
605 |
-
0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x68, 0x61,
|
606 |
-
0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b,
|
607 |
-
0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75,
|
608 |
-
0x65, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x7d, 0x22, 0x20, 0x6f, 0x6e, 0x69,
|
609 |
-
0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74,
|
610 |
-
0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x2f, 0x3e,
|
611 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
612 |
-
0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20,
|
613 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69,
|
614 |
-
0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
615 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20,
|
616 |
-
0x66, 0x6f, 0x72, 0x3d, 0x22,
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
0x65,
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
0x75,
|
629 |
-
|
630 |
-
|
631 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
632 |
-
0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
633 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61,
|
634 |
-
0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x74, 0x65, 0x6d,
|
635 |
-
0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x74, 0x20,
|
636 |
-
0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x65, 0x6d, 0x70,
|
637 |
-
0x6c, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
|
638 |
-
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
639 |
-
0x20, 0x20, 0x20, 0x3c, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,
|
640 |
-
0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
|
641 |
-
0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x69, 0x73,
|
642 |
-
0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
643 |
-
0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x73,
|
644 |
-
0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
645 |
-
0x2e, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x6d, 0x70,
|
646 |
-
0x6c, 0x61, 0x74, 0x65, 0x7d, 0x22, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d,
|
647 |
-
0x31, 0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b,
|
648 |
-
0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f,
|
649 |
-
0x6e, 0x7d, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
650 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
|
651 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
652 |
-
0x20, 0x3c,
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
-
|
666 |
-
|
667 |
-
|
668 |
-
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
|
674 |
-
|
675 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
676 |
0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
677 |
-
0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
678 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
679 |
0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
680 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65,
|
681 |
-
0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22,
|
682 |
-
|
683 |
-
|
684 |
-
|
685 |
-
|
686 |
-
|
687 |
-
|
688 |
-
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
0x20,
|
698 |
-
|
699 |
-
|
700 |
-
0x75, 0x65, 0x2e, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74,
|
701 |
-
0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
702 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64,
|
703 |
-
0x69, 0x76, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
704 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20,
|
705 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
706 |
0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d,
|
707 |
-
0x22,
|
708 |
-
|
709 |
-
|
710 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
711 |
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
712 |
-
0x20, 0x20, 0x20, 0x20, 0x3c,
|
713 |
-
|
714 |
-
|
715 |
-
|
716 |
-
|
717 |
-
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
|
722 |
-
|
723 |
-
0x74,
|
724 |
-
|
725 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
726 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
727 |
-
0x20,
|
728 |
-
|
729 |
-
|
730 |
-
|
731 |
-
|
732 |
-
|
733 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
734 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
735 |
-
0x20, 0x20, 0x20, 0x3c,
|
736 |
-
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
752 |
0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61,
|
753 |
-
0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
|
754 |
-
|
755 |
-
0x20,
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
774 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70,
|
775 |
-
0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f,
|
776 |
-
|
777 |
-
0x20,
|
778 |
-
|
779 |
-
0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x2a,
|
780 |
-
0x5c, 0x2a, 0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5c, 0x2a, 0x5c, 0x2a, 0x2f,
|
781 |
-
0x67, 0x2c, 0x20, 0x27, 0x3c, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e,
|
782 |
-
0x24, 0x31, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x27,
|
783 |
0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72,
|
784 |
-
0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f,
|
785 |
-
|
786 |
-
|
787 |
-
|
788 |
-
0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
|
789 |
-
0x28, 0x2f, 0x5c, 0x2a, 0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5c, 0x2a, 0x2f,
|
790 |
-
0x67, 0x2c, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x3e, 0x24, 0x31, 0x3c, 0x2f,
|
791 |
-
0x65, 0x6d, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
792 |
0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f,
|
793 |
-
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
-
0x3f, 0x29,
|
799 |
-
|
800 |
-
|
801 |
-
|
802 |
-
|
803 |
-
0x2a,
|
804 |
-
|
805 |
-
|
806 |
-
|
807 |
-
|
808 |
-
0x27, 0x29,
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
0x20,
|
816 |
-
|
817 |
-
|
818 |
-
|
819 |
-
0x20,
|
820 |
-
|
821 |
-
|
822 |
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60,
|
823 |
-
0x3c, 0x73, 0x70, 0x61, 0x6e,
|
824 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
825 |
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60, 0x0a,
|
826 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x20, 0x74,
|
838 |
-
0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x73, 0x65,
|
839 |
-
0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
840 |
-
0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
841 |
-
0x20, 0x20, 0x20, 0x60, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a,
|
842 |
-
0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
843 |
-
0x20, 0x41, 0x70, 0x70, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x29, 0x20,
|
844 |
-
0x7b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
|
845 |
-
0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60, 0x0a, 0x20, 0x20,
|
846 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69,
|
847 |
-
0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
|
848 |
-
0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
849 |
-
0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e, 0x0a, 0x20, 0x20,
|
850 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68,
|
851 |
-
0x31, 0x3e, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x70, 0x70, 0x3c,
|
852 |
-
0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
853 |
-
0x20, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e,
|
854 |
-
0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
855 |
-
0x3c, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f,
|
856 |
-
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
857 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x24, 0x7b, 0x63,
|
858 |
-
0x68, 0x61, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x76,
|
859 |
-
0x61, 0x6c, 0x75, 0x65, 0x20, 0x3f, 0x20, 0x43, 0x68, 0x61, 0x74, 0x4c,
|
860 |
-
0x6f, 0x67, 0x20, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46,
|
861 |
-
0x6f, 0x72, 0x6d, 0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
862 |
-
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x61, 0x69, 0x6e,
|
863 |
-
0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
864 |
-
0x20, 0x3c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64,
|
865 |
-
0x3d, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20,
|
866 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x24,
|
867 |
-
0x7b,
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
872 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
873 |
-
0x70, 0x3e,
|
874 |
-
|
875 |
-
|
876 |
-
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
-
|
881 |
-
0x2f,
|
882 |
-
|
883 |
-
|
884 |
-
|
885 |
-
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
0x20,
|
890 |
-
|
891 |
-
|
892 |
-
|
893 |
-
0x6f,
|
894 |
-
|
895 |
-
0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a,
|
896 |
-
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64,
|
897 |
-
0x79, 0x3e, 0x0a, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a
|
898 |
};
|
899 |
-
unsigned int index_html_len =
|
|
|
111 |
0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20,
|
112 |
0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72,
|
113 |
0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
114 |
+
0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64,
|
115 |
+
0x73, 0x65, 0x74, 0x2e, 0x74, 0x77, 0x6f, 0x20, 0x7b, 0x0a, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
|
117 |
+
0x20, 0x67, 0x72, 0x69, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
118 |
+
0x20, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
|
119 |
+
0x74, 0x65, 0x3a, 0x20, 0x22, 0x61, 0x20, 0x61, 0x22, 0x3b, 0x0a, 0x20,
|
120 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x70, 0x3a, 0x20, 0x31, 0x65,
|
121 |
+
0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20,
|
122 |
+
0x20, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x2e, 0x74,
|
123 |
+
0x68, 0x72, 0x65, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
124 |
+
0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x67, 0x72,
|
125 |
+
0x69, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x72,
|
126 |
+
0x69, 0x64, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3a,
|
127 |
+
0x20, 0x22, 0x61, 0x20, 0x61, 0x20, 0x61, 0x22, 0x3b, 0x0a, 0x20, 0x20,
|
128 |
+
0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x70, 0x3a, 0x20, 0x31, 0x65, 0x6d,
|
129 |
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20,
|
130 |
+
0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x7b, 0x0a, 0x20,
|
131 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a,
|
132 |
+
0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23,
|
133 |
+
0x61, 0x61, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
134 |
+
0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73,
|
135 |
+
0x3a, 0x20, 0x34, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
136 |
+
0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x2e,
|
137 |
+
0x35, 0x65, 0x6d, 0x20, 0x30, 0x2e, 0x35, 0x65, 0x6d, 0x20, 0x30, 0x3b,
|
138 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69,
|
139 |
+
0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x65, 0x6d,
|
140 |
+
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20,
|
141 |
+
0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x7b, 0x0a, 0x20,
|
142 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65,
|
143 |
+
0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x0a,
|
144 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
|
145 |
+
0x3a, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x65, 0x6d, 0x20, 0x2d, 0x30, 0x2e,
|
146 |
+
0x35, 0x65, 0x6d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
147 |
+
0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x2e,
|
148 |
+
0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
|
149 |
+
0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
150 |
+
0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20,
|
151 |
+
0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x5b, 0x6f,
|
152 |
+
0x70, 0x65, 0x6e, 0x5d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
153 |
+
0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x2e,
|
154 |
+
0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a,
|
155 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65,
|
156 |
+
0x61, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61,
|
157 |
+
0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x35, 0x70, 0x78, 0x3b, 0x0a,
|
158 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x67,
|
159 |
+
0x72, 0x6f, 0x77, 0x3a, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
160 |
+
0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30,
|
161 |
+
0x25, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20,
|
162 |
+
0x20, 0x20, 0x70, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x7b,
|
163 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c,
|
164 |
+
0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0a, 0x20,
|
165 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
|
166 |
+
0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23,
|
167 |
+
0x32, 0x32, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
|
168 |
+
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x64, 0x64, 0x64, 0x3b, 0x0a,
|
169 |
+
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
|
170 |
+
0x64, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66,
|
171 |
+
0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20,
|
172 |
+
0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x0a, 0x20,
|
173 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
|
174 |
+
0x3a, 0x20, 0x30, 0x2e, 0x31, 0x65, 0x6d, 0x20, 0x30, 0x2e, 0x33, 0x65,
|
175 |
+
0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72,
|
176 |
+
0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20,
|
177 |
+
0x33, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a,
|
178 |
+
0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74,
|
179 |
+
0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
|
180 |
+
0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30,
|
181 |
+
0x2e, 0x35, 0x65, 0x6d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
182 |
+
0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62,
|
183 |
+
0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
|
184 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c,
|
185 |
0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20,
|
186 |
+
0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69,
|
187 |
+
0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a,
|
188 |
+
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
|
189 |
+
0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
190 |
+
0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a,
|
191 |
+
0x20, 0x38, 0x30, 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
192 |
+
0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x38, 0x38, 0x38, 0x3b,
|
193 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x73,
|
194 |
+
0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x73, 0x63,
|
195 |
+
0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d,
|
196 |
+
0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
197 |
+
0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
|
198 |
+
0x20, 0x20, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x20, 0x68, 0x2c, 0x20,
|
199 |
+
0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x65, 0x66, 0x66, 0x65,
|
200 |
+
0x63, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64,
|
201 |
+
0x2c, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73,
|
202 |
+
0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x75, 0x73, 0x65,
|
203 |
+
0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x52,
|
204 |
+
0x65, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x66, 0x72, 0x6f,
|
205 |
+
0x6d, 0x20, 0x27, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73,
|
206 |
+
0x27, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6f,
|
207 |
+
0x72, 0x74, 0x20, 0x7b, 0x20, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x20, 0x7d,
|
208 |
+
0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x27, 0x2f, 0x63, 0x6f, 0x6d, 0x70,
|
209 |
+
0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x3b, 0x0a,
|
210 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73,
|
211 |
+
0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x67,
|
212 |
+
0x6e, 0x61, 0x6c, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
213 |
+
0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x69,
|
214 |
+
0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65,
|
215 |
+
0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77,
|
216 |
+
0x65, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
|
217 |
+
0x20, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x2c, 0x20, 0x61, 0x20, 0x66, 0x72,
|
218 |
+
0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x63, 0x68, 0x61, 0x74, 0x62,
|
219 |
+
0x6f, 0x74, 0x2e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x20,
|
220 |
+
0x69, 0x6e, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x61,
|
221 |
+
0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20,
|
222 |
+
0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
223 |
+
0x3a, 0x20, 0x22, 0x7b, 0x7b, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x7d,
|
224 |
+
0x7d, 0x5c, 0x6e, 0x5c, 0x6e, 0x7b, 0x7b, 0x68, 0x69, 0x73, 0x74, 0x6f,
|
225 |
+
0x72, 0x79, 0x7d, 0x7d, 0x5c, 0x6e, 0x7b, 0x7b, 0x63, 0x68, 0x61, 0x72,
|
226 |
+
0x7d, 0x7d, 0x3a, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
227 |
+
0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c,
|
228 |
+
0x61, 0x74, 0x65, 0x3a, 0x20, 0x22, 0x7b, 0x7b, 0x6e, 0x61, 0x6d, 0x65,
|
229 |
+
0x7d, 0x7d, 0x3a, 0x20, 0x7b, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
230 |
+
0x65, 0x7d, 0x7d, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
231 |
+
0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x20,
|
232 |
+
0x5b, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79,
|
233 |
+
0x70, 0x65, 0x3a, 0x20, 0x22, 0x63, 0x68, 0x61, 0x74, 0x22, 0x2c, 0x0a,
|
234 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x3a, 0x20,
|
235 |
+
0x22, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20,
|
236 |
+
0x20, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x20, 0x22, 0x55, 0x73,
|
237 |
+
0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,
|
238 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70,
|
239 |
+
0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x67, 0x6e,
|
240 |
+
0x61, 0x6c, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e,
|
241 |
+
0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x3a, 0x20, 0x34, 0x30,
|
242 |
+
0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x6d,
|
243 |
+
0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x20, 0x30, 0x2e,
|
244 |
+
0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70,
|
245 |
+
0x65, 0x61, 0x74, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x3a, 0x20,
|
246 |
+
0x32, 0x35, 0x36, 0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x30, 0x20, 0x3d, 0x20,
|
247 |
+
0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x61,
|
248 |
+
0x6c, 0x74, 0x79, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f,
|
249 |
+
0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x0a, 0x20,
|
250 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f,
|
251 |
+
0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x3a, 0x20, 0x31, 0x2e, 0x31,
|
252 |
+
0x38, 0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x3d, 0x20,
|
253 |
+
0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20,
|
254 |
+
0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x3a, 0x20, 0x34, 0x30,
|
255 |
+
0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x6f,
|
256 |
+
0x20, 0x75, 0x73, 0x65, 0x20, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x20, 0x73,
|
257 |
+
0x69, 0x7a, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f,
|
258 |
+
0x70, 0x5f, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2f, 0x2f,
|
259 |
+
0x20, 0x31, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62,
|
260 |
+
0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x66,
|
261 |
+
0x73, 0x5f, 0x7a, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2f, 0x2f,
|
262 |
+
0x20, 0x31, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62,
|
263 |
+
0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79,
|
264 |
+
0x70, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x3a, 0x20, 0x31, 0x2e, 0x30,
|
265 |
+
0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x64,
|
266 |
+
0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
267 |
+
0x20, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70,
|
268 |
+
0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c,
|
269 |
+
0x20, 0x2f, 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x69,
|
270 |
+
0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
271 |
+
0x20, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70,
|
272 |
+
0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c,
|
273 |
+
0x20, 0x2f, 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x69,
|
274 |
+
0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
275 |
+
0x20, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x3a, 0x20, 0x30,
|
276 |
+
0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x30, 0x2f, 0x31, 0x2f, 0x32, 0x0a, 0x20,
|
277 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61,
|
278 |
+
0x74, 0x5f, 0x74, 0x61, 0x75, 0x3a, 0x20, 0x35, 0x2c, 0x20, 0x2f, 0x2f,
|
279 |
+
0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x72,
|
280 |
+
0x6f, 0x70, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69,
|
281 |
+
0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x65, 0x74, 0x61, 0x3a, 0x20,
|
282 |
+
0x30, 0x2e, 0x31, 0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x6c, 0x65, 0x61, 0x72,
|
283 |
+
0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20,
|
284 |
0x20, 0x20, 0x7d, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
|
285 |
0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x53, 0x74, 0x61,
|
286 |
0x74, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x28,
|
|
|
629 |
0x72, 0x67, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x3a, 0x20,
|
630 |
0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x65,
|
631 |
0x6c, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x76, 0x61, 0x6c,
|
632 |
+
0x75, 0x65, 0x29, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
633 |
+
0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
|
634 |
+
0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x49, 0x6e, 0x74, 0x20, 0x3d, 0x20,
|
635 |
+
0x28, 0x65, 0x6c, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x70, 0x61, 0x72, 0x61,
|
636 |
+
0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x7b,
|
637 |
+
0x20, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76,
|
638 |
+
0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x65, 0x6c, 0x2e, 0x74, 0x61,
|
639 |
+
0x72, 0x67, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x3a, 0x20,
|
640 |
+
0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x70,
|
641 |
+
0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x65, 0x6c,
|
642 |
+
0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75,
|
643 |
+
0x65, 0x29, 0x29, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
644 |
+
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x6c, 0x6f, 0x61, 0x74,
|
645 |
+
0x46, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x7b, 0x6c, 0x61,
|
646 |
+
0x62, 0x65, 0x6c, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x6d, 0x69,
|
647 |
+
0x6e, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x65,
|
648 |
+
0x70, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x29, 0x20, 0x3d,
|
649 |
+
0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
650 |
+
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60,
|
651 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
652 |
+
0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
653 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20,
|
654 |
+
0x66, 0x6f, 0x72, 0x3d, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d,
|
655 |
+
0x22, 0x3e, 0x24, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x3c, 0x2f,
|
656 |
+
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
657 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75,
|
658 |
+
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67,
|
659 |
+
0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d,
|
660 |
+
0x65, 0x7d, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, 0x24, 0x7b, 0x6d,
|
661 |
+
0x69, 0x6e, 0x7d, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x24, 0x7b,
|
662 |
+
0x6d, 0x61, 0x78, 0x7d, 0x22, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22,
|
663 |
+
0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x7d, 0x22, 0x20, 0x6e, 0x61, 0x6d,
|
664 |
+
0x65, 0x3d, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x20,
|
665 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x76, 0x61, 0x6c,
|
666 |
+
0x75, 0x65, 0x7d, 0x22, 0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
667 |
+
0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72,
|
668 |
+
0x61, 0x6d, 0x73, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x7d, 0x20, 0x2f, 0x3e,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
669 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
670 |
+
0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x76, 0x61, 0x6c,
|
671 |
+
0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20,
|
672 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64,
|
673 |
+
0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
674 |
+
0x60, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x0a,
|
675 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
|
676 |
+
0x49, 0x6e, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x28,
|
677 |
+
0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x2c,
|
678 |
+
0x20, 0x6d, 0x69, 0x6e, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20,
|
679 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b,
|
680 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
|
681 |
+
0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60, 0x0a, 0x20, 0x20,
|
682 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76,
|
683 |
+
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
684 |
+
0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72,
|
685 |
+
0x3d, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x3e, 0x24,
|
686 |
+
0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x3c, 0x2f, 0x6c, 0x61, 0x62,
|
687 |
+
0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
688 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
|
689 |
+
0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20,
|
690 |
+
0x69, 0x64, 0x3d, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22,
|
691 |
+
0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, 0x24, 0x7b, 0x6d, 0x69, 0x6e, 0x7d,
|
692 |
+
0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x24, 0x7b, 0x6d, 0x61, 0x78,
|
693 |
+
0x7d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x6e,
|
694 |
+
0x61, 0x6d, 0x65, 0x7d, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
|
695 |
+
0x22, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x20, 0x6f,
|
696 |
+
0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64,
|
697 |
+
0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x49, 0x6e, 0x74,
|
698 |
+
0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
699 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24,
|
700 |
+
0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61,
|
701 |
0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
702 |
+
0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
703 |
+
0x20, 0x20, 0x20, 0x20, 0x60, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
704 |
+
0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
705 |
+
0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60, 0x0a, 0x20,
|
706 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x72, 0x6d,
|
707 |
+
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
708 |
+
0x3c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20,
|
709 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
710 |
0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
711 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65,
|
712 |
+
0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x6d, 0x70,
|
713 |
+
0x74, 0x22, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x3c, 0x2f, 0x6c,
|
714 |
+
0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
715 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x65, 0x78,
|
716 |
+
0x74, 0x61, 0x72, 0x65, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
|
717 |
+
0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
|
718 |
+
0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
|
719 |
+
0x65, 0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
720 |
+
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x70,
|
721 |
+
0x74, 0x7d, 0x22, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d, 0x34, 0x20, 0x6f,
|
722 |
+
0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64,
|
723 |
+
0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x2f,
|
724 |
+
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
725 |
+
0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
726 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x69, 0x65,
|
727 |
+
0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
728 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x69, 0x65, 0x6c, 0x64,
|
729 |
+
0x73, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74,
|
730 |
+
0x77, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
731 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20,
|
732 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
733 |
0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d,
|
734 |
+
0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3e, 0x55, 0x73, 0x65, 0x72, 0x20,
|
735 |
+
0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
|
736 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
737 |
+
0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79,
|
738 |
+
0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61,
|
739 |
+
0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61,
|
740 |
+
0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69,
|
741 |
+
0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x75, 0x73, 0x65,
|
742 |
+
0x72, 0x7d, 0x22, 0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d,
|
743 |
+
0x24, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73,
|
744 |
+
0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
745 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69,
|
746 |
+
0x76, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
747 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20,
|
748 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
749 |
+
0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22,
|
750 |
+
0x62, 0x6f, 0x74, 0x22, 0x3e, 0x42, 0x6f, 0x74, 0x20, 0x6e, 0x61, 0x6d,
|
751 |
+
0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20,
|
752 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
753 |
+
0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
|
754 |
+
0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
|
755 |
+
0x22, 0x63, 0x68, 0x61, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
756 |
+
0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e,
|
757 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x7d, 0x22,
|
758 |
+
0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75,
|
759 |
+
0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
760 |
+
0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
761 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
|
762 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f,
|
763 |
+
0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x0a, 0x20,
|
764 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x69,
|
765 |
+
0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
766 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76,
|
767 |
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
768 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66,
|
769 |
+
0x6f, 0x72, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
770 |
+
0x22, 0x3e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x65, 0x6d,
|
771 |
+
0x70, 0x6c, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c,
|
772 |
+
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
773 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65,
|
774 |
+
0x61, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
|
775 |
+
0x74, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x65,
|
776 |
+
0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
|
777 |
+
0x65, 0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
778 |
+
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6c,
|
779 |
+
0x61, 0x74, 0x65, 0x7d, 0x22, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d, 0x34,
|
780 |
+
0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75,
|
781 |
+
0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
782 |
+
0x7d, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
783 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x0a,
|
784 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
785 |
+
0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
786 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62,
|
787 |
+
0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70,
|
788 |
+
0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x74, 0x20, 0x68,
|
789 |
+
0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c,
|
790 |
+
0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a,
|
791 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
792 |
+
0x20, 0x20, 0x3c, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x20,
|
793 |
+
0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
794 |
+
0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x69, 0x73, 0x74,
|
795 |
+
0x6f, 0x72, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22,
|
796 |
+
0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65,
|
797 |
+
0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e,
|
798 |
+
0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c,
|
799 |
+
0x61, 0x74, 0x65, 0x7d, 0x22, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d, 0x31,
|
800 |
+
0x20, 0x6f, 0x6e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75,
|
801 |
+
0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
802 |
+
0x7d, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
803 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20,
|
804 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66,
|
805 |
+
0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x0a, 0x20, 0x20,
|
806 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x69, 0x65,
|
807 |
+
0x6c, 0x64, 0x73, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
|
808 |
+
0x22, 0x74, 0x77, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
809 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x49, 0x6e, 0x74,
|
810 |
+
0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c,
|
811 |
+
0x3a, 0x20, 0x22, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f,
|
812 |
+
0x6e, 0x73, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x32, 0x30,
|
813 |
+
0x34, 0x38, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x2d, 0x31, 0x2c,
|
814 |
+
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x6e, 0x5f, 0x70, 0x72,
|
815 |
+
0x65, 0x64, 0x69, 0x63, 0x74, 0x22, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75,
|
816 |
+
0x65, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61,
|
817 |
+
0x6c, 0x75, 0x65, 0x2e, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63,
|
818 |
+
0x74, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
819 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x46, 0x6c, 0x6f, 0x61, 0x74,
|
820 |
+
0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c,
|
821 |
+
0x3a, 0x20, 0x22, 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75,
|
822 |
+
0x72, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x2e,
|
823 |
+
0x35, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c,
|
824 |
+
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x74, 0x65, 0x6d, 0x70,
|
825 |
+
0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2c, 0x20, 0x73, 0x74,
|
826 |
+
0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x2c, 0x20, 0x76, 0x61,
|
827 |
+
0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e,
|
828 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72,
|
829 |
+
0x61, 0x74, 0x75, 0x72, 0x65, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20,
|
830 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x46,
|
831 |
+
0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c,
|
832 |
+
0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x50, 0x65, 0x6e, 0x61, 0x6c,
|
833 |
+
0x69, 0x7a, 0x65, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x20, 0x73,
|
834 |
+
0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x61,
|
835 |
+
0x78, 0x3a, 0x20, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a,
|
836 |
+
0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20,
|
837 |
+
0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x6e, 0x61,
|
838 |
+
0x6c, 0x74, 0x79, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20,
|
839 |
+
0x30, 0x2e, 0x30, 0x31, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
|
840 |
+
0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75,
|
841 |
+
0x65, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x6e,
|
842 |
+
0x61, 0x6c, 0x74, 0x79, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
843 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x49, 0x6e,
|
844 |
+
0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c, 0x61, 0x62, 0x65,
|
845 |
+
0x6c, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72,
|
846 |
+
0x20, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x66, 0x6f,
|
847 |
+
0x72, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x2c,
|
848 |
+
0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20,
|
849 |
+
0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65,
|
850 |
+
0x3a, 0x20, 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, 0x6c, 0x61,
|
851 |
+
0x73, 0x74, 0x5f, 0x6e, 0x22, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
852 |
+
0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c,
|
853 |
+
0x75, 0x65, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, 0x6c, 0x61,
|
854 |
+
0x73, 0x74, 0x5f, 0x6e, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
855 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x49, 0x6e,
|
856 |
+
0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c, 0x61, 0x62, 0x65,
|
857 |
+
0x6c, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x70, 0x2d, 0x4b, 0x20, 0x73, 0x61,
|
858 |
+
0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78,
|
859 |
+
0x3a, 0x20, 0x31, 0x30, 0x30, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20,
|
860 |
+
0x2d, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x74,
|
861 |
+
0x6f, 0x70, 0x5f, 0x6b, 0x22, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
862 |
+
0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c,
|
863 |
+
0x75, 0x65, 0x2e, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x7d, 0x29, 0x7d, 0x0a,
|
864 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
865 |
+
0x24, 0x7b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64,
|
866 |
+
0x28, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x54, 0x6f,
|
867 |
+
0x70, 0x2d, 0x50, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67,
|
868 |
+
0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x2c,
|
869 |
+
0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e,
|
870 |
+
0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x22,
|
871 |
+
0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x31,
|
872 |
+
0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61, 0x72,
|
873 |
+
0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x6f,
|
874 |
+
0x70, 0x5f, 0x70, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
875 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
|
876 |
+
0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
877 |
+
0x20, 0x20, 0x20, 0x3c, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x3e,
|
878 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
879 |
+
0x20, 0x3c, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x3e, 0x4d, 0x6f,
|
880 |
+
0x72, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f,
|
881 |
+
0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
882 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x69,
|
883 |
+
0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
|
884 |
+
0x3d, 0x22, 0x74, 0x77, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
885 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b,
|
886 |
+
0x46, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b,
|
887 |
+
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x54, 0x46, 0x53, 0x2d,
|
888 |
+
0x5a, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x2e, 0x30,
|
889 |
+
0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20,
|
890 |
+
0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x74, 0x66, 0x73, 0x5f, 0x7a,
|
891 |
+
0x22, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30,
|
892 |
+
0x31, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61,
|
893 |
+
0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74,
|
894 |
+
0x66, 0x73, 0x5f, 0x7a, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
895 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b,
|
896 |
+
0x46, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b,
|
897 |
+
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x69,
|
898 |
+
0x63, 0x61, 0x6c, 0x20, 0x50, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a,
|
899 |
+
0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30,
|
900 |
+
0x2e, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x74,
|
901 |
+
0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x22, 0x2c, 0x20, 0x73,
|
902 |
+
0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x2c, 0x20, 0x76,
|
903 |
+
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,
|
904 |
+
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x69, 0x63,
|
905 |
+
0x61, 0x6c, 0x5f, 0x70, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
906 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b,
|
907 |
+
0x46, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b,
|
908 |
+
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x65, 0x73,
|
909 |
+
0x65, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
|
910 |
+
0x22, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x2c,
|
911 |
+
0x20, 0x6d, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e,
|
912 |
+
0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
|
913 |
+
0x63, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x22, 0x2c,
|
914 |
+
0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x2c,
|
915 |
+
0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x61,
|
916 |
+
0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x65,
|
917 |
+
0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74,
|
918 |
+
0x79, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
919 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x46, 0x6c, 0x6f,
|
920 |
+
0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c, 0x61, 0x62,
|
921 |
+
0x65, 0x6c, 0x3a, 0x20, 0x22, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e,
|
922 |
+
0x63, 0x79, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x22, 0x2c,
|
923 |
+
0x20, 0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x6d,
|
924 |
+
0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d,
|
925 |
+
0x65, 0x3a, 0x20, 0x22, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
|
926 |
+
0x79, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x22, 0x2c, 0x20,
|
927 |
+
0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x2c, 0x20,
|
928 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d,
|
929 |
+
0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x66, 0x72, 0x65, 0x71,
|
930 |
+
0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74,
|
931 |
+
0x79, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
932 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
|
933 |
+
0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
934 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x72, 0x20, 0x2f, 0x3e, 0x0a,
|
935 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
936 |
+
0x3c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x20, 0x63, 0x6c,
|
937 |
+
0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x72, 0x65, 0x65, 0x22, 0x3e,
|
938 |
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
939 |
+
0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
940 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
941 |
+
0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70,
|
942 |
+
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x64,
|
943 |
+
0x69, 0x6f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x69,
|
944 |
+
0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
|
945 |
+
0x65, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65,
|
946 |
+
0x64, 0x3d, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76,
|
947 |
+
0x61, 0x6c, 0x75, 0x65, 0x2e, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61,
|
948 |
+
0x74, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x7d, 0x20, 0x6f, 0x6e, 0x69, 0x6e,
|
949 |
+
0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
|
950 |
+
0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x49, 0x6e, 0x74, 0x7d, 0x20, 0x2f,
|
951 |
+
0x3e, 0x20, 0x6e, 0x6f, 0x20, 0x4d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61,
|
952 |
+
0x74, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20,
|
953 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
954 |
+
0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e,
|
955 |
+
0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61,
|
956 |
+
0x64, 0x69, 0x6f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
|
957 |
+
0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c,
|
958 |
+
0x75, 0x65, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b,
|
959 |
+
0x65, 0x64, 0x3d, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e,
|
960 |
+
0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74,
|
961 |
+
0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x7d, 0x20, 0x6f, 0x6e, 0x69,
|
962 |
+
0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74,
|
963 |
+
0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x49, 0x6e, 0x74, 0x7d, 0x20,
|
964 |
+
0x2f, 0x3e, 0x20, 0x4d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x20,
|
965 |
+
0x76, 0x31, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x20,
|
966 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
967 |
+
0x20, 0x20, 0x20, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69,
|
968 |
+
0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72,
|
969 |
+
0x61, 0x64, 0x69, 0x6f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
|
970 |
+
0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x76, 0x61,
|
971 |
+
0x6c, 0x75, 0x65, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x63, 0x68, 0x65, 0x63,
|
972 |
+
0x6b, 0x65, 0x64, 0x3d, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,
|
973 |
+
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x6d, 0x69, 0x72, 0x6f, 0x73,
|
974 |
+
0x74, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x7d, 0x20, 0x6f, 0x6e,
|
975 |
0x69, 0x6e, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x75, 0x70, 0x64, 0x61,
|
976 |
+
0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x49, 0x6e, 0x74, 0x7d,
|
977 |
+
0x20, 0x2f, 0x3e, 0x20, 0x4d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74,
|
978 |
+
0x20, 0x76, 0x32, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a,
|
979 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
980 |
+
0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20,
|
981 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24,
|
982 |
+
0x7b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28,
|
983 |
+
0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x4d, 0x69, 0x72,
|
984 |
+
0x6f, 0x73, 0x74, 0x61, 0x74, 0x20, 0x74, 0x61, 0x75, 0x22, 0x2c, 0x20,
|
985 |
+
0x6d, 0x61, 0x78, 0x3a, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6d,
|
986 |
+
0x69, 0x6e, 0x3a, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d,
|
987 |
+
0x65, 0x3a, 0x20, 0x22, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74,
|
988 |
+
0x5f, 0x74, 0x61, 0x75, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a,
|
989 |
+
0x20, 0x30, 0x2e, 0x30, 0x31, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
990 |
+
0x3a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c,
|
991 |
+
0x75, 0x65, 0x2e, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x5f,
|
992 |
+
0x74, 0x61, 0x75, 0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
993 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x46,
|
994 |
+
0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x7b, 0x6c,
|
995 |
+
0x61, 0x62, 0x65, 0x6c, 0x3a, 0x20, 0x22, 0x4d, 0x69, 0x72, 0x6f, 0x73,
|
996 |
+
0x74, 0x61, 0x74, 0x20, 0x65, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x6d, 0x61,
|
997 |
+
0x78, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x3a,
|
998 |
+
0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20,
|
999 |
+
0x22, 0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x65, 0x74,
|
1000 |
+
0x61, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x30, 0x2e,
|
1001 |
+
0x30, 0x31, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x70,
|
1002 |
+
0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e,
|
1003 |
+
0x6d, 0x69, 0x72, 0x6f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x65, 0x74, 0x61,
|
1004 |
+
0x7d, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1005 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
|
1006 |
+
0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1007 |
+
0x20, 0x20, 0x3c, 0x2f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x3e,
|
1008 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66,
|
1009 |
+
0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60,
|
1010 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f,
|
1011 |
+
0x2f, 0x20, 0x70, 0x6f, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x73, 0x20,
|
1012 |
+
0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x72, 0x65, 0x70,
|
1013 |
+
0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20,
|
1014 |
+
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x64,
|
1015 |
+
0x6f, 0x77, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61,
|
1016 |
+
0x72, 0x61, 0x6d, 0x73, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0a, 0x20,
|
1017 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d,
|
1018 |
+
0x64, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x74,
|
1019 |
+
0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1020 |
+
0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x26, 0x2f,
|
1021 |
+
0x67, 0x2c, 0x20, 0x27, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x27, 0x29, 0x0a,
|
1022 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70,
|
1023 |
+
0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x3c, 0x2f, 0x67, 0x2c, 0x20, 0x27,
|
1024 |
+
0x26, 0x6c, 0x74, 0x3b, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1025 |
+
0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28,
|
1026 |
+
0x2f, 0x3e, 0x2f, 0x67, 0x2c, 0x20, 0x27, 0x26, 0x67, 0x74, 0x3b, 0x27,
|
|
|
|
|
|
|
|
|
1027 |
0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72,
|
1028 |
+
0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5e, 0x23, 0x7b, 0x31,
|
1029 |
+
0x2c, 0x36, 0x7d, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x24, 0x2f, 0x67, 0x69,
|
1030 |
+
0x6d, 0x2c, 0x20, 0x27, 0x3c, 0x68, 0x33, 0x3e, 0x24, 0x31, 0x3c, 0x2f,
|
1031 |
+
0x68, 0x33, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
1032 |
0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f,
|
1033 |
+
0x5c, 0x2a, 0x5c, 0x2a, 0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5c, 0x2a, 0x5c,
|
1034 |
+
0x2a, 0x2f, 0x67, 0x2c, 0x20, 0x27, 0x3c, 0x73, 0x74, 0x72, 0x6f, 0x6e,
|
1035 |
+
0x67, 0x3e, 0x24, 0x31, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67,
|
1036 |
+
0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1037 |
+
0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5f, 0x5f,
|
1038 |
+
0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5f, 0x5f, 0x2f, 0x67, 0x2c, 0x20, 0x27,
|
1039 |
+
0x3c, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x24, 0x31, 0x3c, 0x2f,
|
1040 |
+
0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20,
|
1041 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61,
|
1042 |
+
0x63, 0x65, 0x28, 0x2f, 0x5c, 0x2a, 0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5c,
|
1043 |
+
0x2a, 0x2f, 0x67, 0x2c, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x3e, 0x24, 0x31,
|
1044 |
+
0x3c, 0x2f, 0x65, 0x6d, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
1045 |
+
0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
|
1046 |
+
0x28, 0x2f, 0x5f, 0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x5f, 0x2f, 0x67, 0x2c,
|
1047 |
+
0x20, 0x27, 0x3c, 0x65, 0x6d, 0x3e, 0x24, 0x31, 0x3c, 0x2f, 0x65, 0x6d,
|
1048 |
+
0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1049 |
+
0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x60, 0x60,
|
1050 |
+
0x60, 0x2e, 0x2a, 0x3f, 0x5c, 0x6e, 0x28, 0x5b, 0x5c, 0x73, 0x5c, 0x53,
|
1051 |
+
0x5d, 0x2a, 0x3f, 0x29, 0x60, 0x60, 0x60, 0x2f, 0x67, 0x2c, 0x20, 0x27,
|
1052 |
+
0x3c, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x24,
|
1053 |
+
0x31, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x72,
|
1054 |
+
0x65, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1055 |
+
0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x60,
|
1056 |
+
0x28, 0x2e, 0x2a, 0x3f, 0x29, 0x60, 0x2f, 0x67, 0x2c, 0x20, 0x27, 0x3c,
|
1057 |
+
0x63, 0x6f, 0x64, 0x65, 0x3e, 0x24, 0x31, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
|
1058 |
+
0x65, 0x3e, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1059 |
+
0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c,
|
1060 |
+
0x6e, 0x2f, 0x67, 0x69, 0x6d, 0x2c, 0x20, 0x27, 0x3c, 0x62, 0x72, 0x20,
|
1061 |
+
0x2f, 0x3e, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1062 |
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60,
|
1063 |
+
0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72,
|
1064 |
+
0x6f, 0x75, 0x73, 0x6c, 0x79, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x6e, 0x65,
|
1065 |
+
0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x24, 0x7b, 0x7b, 0x20, 0x5f, 0x5f,
|
1066 |
+
0x68, 0x74, 0x6d, 0x6c, 0x3a, 0x20, 0x6d, 0x64, 0x20, 0x7d, 0x7d, 0x20,
|
1067 |
+
0x2f, 0x3e, 0x60, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a,
|
1068 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d,
|
1069 |
+
0x6f, 0x64, 0x65, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
|
1070 |
+
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61,
|
1071 |
+
0x72, 0x61, 0x6d, 0x73, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0a, 0x20,
|
1072 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x6c,
|
1073 |
+
0x61, 0x6d, 0x61, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x76, 0x61, 0x6c,
|
1074 |
+
0x75, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1075 |
+
0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d,
|
1076 |
+
0x6c, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x2f, 0x3e, 0x60, 0x0a, 0x20,
|
1077 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1078 |
+
0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c,
|
1079 |
+
0x60, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73,
|
1080 |
+
0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1081 |
+
0x20, 0x20, 0x20, 0x24, 0x7b, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x53, 0x74,
|
1082 |
+
0x61, 0x74, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72,
|
1083 |
+
0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x5f,
|
1084 |
+
0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x73, 0x2e, 0x74, 0x6f, 0x46,
|
1085 |
+
0x69, 0x78, 0x65, 0x64, 0x28, 0x29, 0x7d, 0x6d, 0x73, 0x20, 0x70, 0x65,
|
1086 |
+
0x72, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x24, 0x7b, 0x6c,
|
1087 |
+
0x6c, 0x61, 0x6d, 0x61, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x76, 0x61,
|
1088 |
+
0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65,
|
1089 |
+
0x64, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64,
|
1090 |
+
0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d,
|
1091 |
+
0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20,
|
1092 |
+
0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1093 |
+
0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20,
|
1094 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
|
1095 |
+
0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
|
1096 |
+
0x6f, 0x6e, 0x20, 0x41, 0x70, 0x70, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x73,
|
1097 |
+
0x29, 0x20, 0x7b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72,
|
1098 |
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x60, 0x0a,
|
1099 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76,
|
1100 |
+
0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
|
1101 |
+
0x65, 0x72, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1102 |
+
0x20, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e, 0x0a,
|
1103 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1104 |
+
0x3c, 0x68, 0x31, 0x3e, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x70,
|
1105 |
+
0x70, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1106 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65,
|
1107 |
+
0x72, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1108 |
+
0x20, 0x20, 0x3c, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22,
|
1109 |
+
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1110 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x24,
|
1111 |
+
0x7b, 0x63, 0x68, 0x61, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64,
|
1112 |
+
0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3f, 0x20, 0x43, 0x68, 0x61,
|
1113 |
+
0x74, 0x4c, 0x6f, 0x67, 0x20, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69,
|
1114 |
+
0x67, 0x46, 0x6f, 0x72, 0x6d, 0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20,
|
1115 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x61,
|
1116 |
+
0x69, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1117 |
+
0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
|
1118 |
+
0x69, 0x64, 0x3d, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x3e, 0x0a,
|
1119 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1120 |
+
0x3c, 0x24, 0x7b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e,
|
1121 |
+
0x70, 0x75, 0x74, 0x7d, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
1122 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x65, 0x63, 0x74,
|
1123 |
+
0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1124 |
+
0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3e,
|
1125 |
+
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1126 |
+
0x20, 0x3c, 0x70, 0x3e, 0x3c, 0x24, 0x7b, 0x4d, 0x6f, 0x64, 0x65, 0x6c,
|
1127 |
+
0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
|
1128 |
+
0x66, 0x6f, 0x7d, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20,
|
1129 |
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
1130 |
+
0x70, 0x3e, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79,
|
1131 |
+
0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
|
1132 |
+
0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
1133 |
+
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x67, 0x65, 0x72, 0x67, 0x61, 0x6e,
|
1134 |
+
0x6f, 0x76, 0x2f, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x70, 0x70,
|
1135 |
+
0x22, 0x3e, 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x70, 0x70, 0x3c,
|
1136 |
+
0x2f, 0x61, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x61, 0x20, 0x68,
|
1137 |
+
0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,
|
1138 |
+
0x2f, 0x67, 0x67, 0x6d, 0x6c, 0x2e, 0x61, 0x69, 0x22, 0x3e, 0x67, 0x67,
|
1139 |
+
0x6d, 0x6c, 0x2e, 0x61, 0x69, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, 0x3c, 0x2f,
|
1140 |
+
0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
1141 |
+
0x20, 0x3c, 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x20,
|
1142 |
+
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76,
|
1143 |
+
0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x3b, 0x0a, 0x20,
|
1144 |
+
0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
|
1145 |
+
0x6e, 0x64, 0x65, 0x72, 0x28, 0x68, 0x28, 0x41, 0x70, 0x70, 0x29, 0x2c,
|
1146 |
+
0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f,
|
1147 |
+
0x64, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x63, 0x72,
|
1148 |
+
0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
|
1149 |
+
0x0a, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x62,
|
1150 |
+
0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c,
|
1151 |
+
0x3e, 0x0a
|
|
|
|
|
|
|
1152 |
};
|
1153 |
+
unsigned int index_html_len = 13790;
|
examples/server/public/index.html
CHANGED
@@ -73,6 +73,37 @@
|
|
73 |
margin: 0;
|
74 |
}
|
75 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
textarea {
|
77 |
padding: 5px;
|
78 |
flex-grow: 1;
|
@@ -125,10 +156,17 @@
|
|
125 |
const params = signal({
|
126 |
n_predict: 400,
|
127 |
temperature: 0.7,
|
128 |
-
repeat_last_n: 256,
|
129 |
-
repeat_penalty: 1.18,
|
130 |
-
top_k: 40,
|
131 |
-
top_p: 0.5,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
})
|
133 |
|
134 |
const llamaStats = signal(null)
|
@@ -264,6 +302,27 @@
|
|
264 |
const updateSession = (el) => session.value = { ...session.value, [el.target.name]: el.target.value }
|
265 |
const updateParams = (el) => params.value = { ...params.value, [el.target.name]: el.target.value }
|
266 |
const updateParamsFloat = (el) => params.value = { ...params.value, [el.target.name]: parseFloat(el.target.value) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
267 |
|
268 |
return html`
|
269 |
<form>
|
@@ -272,7 +331,9 @@
|
|
272 |
<label for="prompt">Prompt</label>
|
273 |
<textarea type="text" name="prompt" value="${session.value.prompt}" rows=4 oninput=${updateSession}/>
|
274 |
</div>
|
|
|
275 |
|
|
|
276 |
<div>
|
277 |
<label for="user">User name</label>
|
278 |
<input type="text" name="user" value="${session.value.user}" oninput=${updateSession} />
|
@@ -282,7 +343,9 @@
|
|
282 |
<label for="bot">Bot name</label>
|
283 |
<input type="text" name="char" value="${session.value.char}" oninput=${updateSession} />
|
284 |
</div>
|
|
|
285 |
|
|
|
286 |
<div>
|
287 |
<label for="template">Prompt template</label>
|
288 |
<textarea id="template" name="template" value="${session.value.template}" rows=4 oninput=${updateSession}/>
|
@@ -292,38 +355,44 @@
|
|
292 |
<label for="template">Chat history template</label>
|
293 |
<textarea id="template" name="historyTemplate" value="${session.value.historyTemplate}" rows=1 oninput=${updateSession}/>
|
294 |
</div>
|
|
|
295 |
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
<label for="nPredict">Predictions</label>
|
304 |
-
<input type="range" id="nPredict" min="1" max="2048" step="1" name="n_predict" value="${params.value.n_predict}" oninput=${updateParamsFloat} />
|
305 |
-
<span>${params.value.n_predict}</span>
|
306 |
-
</div>
|
307 |
-
|
308 |
-
<div>
|
309 |
-
<label for="repeat_penalty">Penalize repeat sequence</label>
|
310 |
-
<input type="range" id="repeat_penalty" min="0.0" max="2.0" step="0.01" name="repeat_penalty" value="${params.value.repeat_penalty}" oninput=${updateParamsFloat} />
|
311 |
-
<span>${params.value.repeat_penalty}</span>
|
312 |
-
</div>
|
313 |
-
|
314 |
-
<div>
|
315 |
-
<label for="repeat_last_n">Consider N tokens for penalize</label>
|
316 |
-
<input type="range" id="repeat_last_n" min="0.0" max="2048" name="repeat_last_n" value="${params.value.repeat_last_n}" oninput=${updateParamsFloat} />
|
317 |
-
<span>${params.value.repeat_last_n}</span>
|
318 |
-
</div>
|
319 |
-
|
320 |
</fieldset>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
321 |
</form>
|
322 |
`
|
323 |
}
|
324 |
// poor mans markdown replacement
|
325 |
const Markdownish = (params) => {
|
326 |
const md = params.text
|
|
|
|
|
|
|
327 |
.replace(/^#{1,6} (.*)$/gim, '<h3>$1</h3>')
|
328 |
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
329 |
.replace(/__(.*?)__/g, '<strong>$1</strong>')
|
|
|
73 |
margin: 0;
|
74 |
}
|
75 |
|
76 |
+
fieldset.two {
|
77 |
+
display: grid;
|
78 |
+
grid-template: "a a";
|
79 |
+
gap: 1em;
|
80 |
+
}
|
81 |
+
|
82 |
+
fieldset.three {
|
83 |
+
display: grid;
|
84 |
+
grid-template: "a a a";
|
85 |
+
gap: 1em;
|
86 |
+
}
|
87 |
+
|
88 |
+
details {
|
89 |
+
border: 1px solid #aaa;
|
90 |
+
border-radius: 4px;
|
91 |
+
padding: 0.5em 0.5em 0;
|
92 |
+
margin-top: 0.5em;
|
93 |
+
}
|
94 |
+
|
95 |
+
summary {
|
96 |
+
font-weight: bold;
|
97 |
+
margin: -0.5em -0.5em 0;
|
98 |
+
padding: 0.5em;
|
99 |
+
cursor: pointer;
|
100 |
+
}
|
101 |
+
|
102 |
+
details[open] {
|
103 |
+
padding: 0.5em;
|
104 |
+
}
|
105 |
+
|
106 |
+
|
107 |
textarea {
|
108 |
padding: 5px;
|
109 |
flex-grow: 1;
|
|
|
156 |
const params = signal({
|
157 |
n_predict: 400,
|
158 |
temperature: 0.7,
|
159 |
+
repeat_last_n: 256, // 0 = disable penalty, -1 = context size
|
160 |
+
repeat_penalty: 1.18, // 1.0 = disabled
|
161 |
+
top_k: 40, // <= 0 to use vocab size
|
162 |
+
top_p: 0.5, // 1.0 = disabled
|
163 |
+
tfs_z: 1.0, // 1.0 = disabled
|
164 |
+
typical_p: 1.0, // 1.0 = disabled
|
165 |
+
presence_penalty: 0.0, // 0.0 = disabled
|
166 |
+
frequency_penalty: 0.0, // 0.0 = disabled
|
167 |
+
mirostat: 0, // 0/1/2
|
168 |
+
mirostat_tau: 5, // target entropy
|
169 |
+
mirostat_eta: 0.1, // learning rate
|
170 |
})
|
171 |
|
172 |
const llamaStats = signal(null)
|
|
|
302 |
const updateSession = (el) => session.value = { ...session.value, [el.target.name]: el.target.value }
|
303 |
const updateParams = (el) => params.value = { ...params.value, [el.target.name]: el.target.value }
|
304 |
const updateParamsFloat = (el) => params.value = { ...params.value, [el.target.name]: parseFloat(el.target.value) }
|
305 |
+
const updateParamsInt = (el) => params.value = { ...params.value, [el.target.name]: Math.floor(parseFloat(el.target.value)) }
|
306 |
+
|
307 |
+
const FloatField = ({label, max, min, name, step, value}) => {
|
308 |
+
return html`
|
309 |
+
<div>
|
310 |
+
<label for="${name}">${label}</label>
|
311 |
+
<input type="range" id="${name}" min="${min}" max="${max}" step="${step}" name="${name}" value="${value}" oninput=${updateParamsFloat} />
|
312 |
+
<span>${value}</span>
|
313 |
+
</div>
|
314 |
+
`
|
315 |
+
};
|
316 |
+
|
317 |
+
const IntField = ({label, max, min, name, value}) => {
|
318 |
+
return html`
|
319 |
+
<div>
|
320 |
+
<label for="${name}">${label}</label>
|
321 |
+
<input type="range" id="${name}" min="${min}" max="${max}" name="${name}" value="${value}" oninput=${updateParamsInt} />
|
322 |
+
<span>${value}</span>
|
323 |
+
</div>
|
324 |
+
`
|
325 |
+
};
|
326 |
|
327 |
return html`
|
328 |
<form>
|
|
|
331 |
<label for="prompt">Prompt</label>
|
332 |
<textarea type="text" name="prompt" value="${session.value.prompt}" rows=4 oninput=${updateSession}/>
|
333 |
</div>
|
334 |
+
</fieldset>
|
335 |
|
336 |
+
<fieldset class="two">
|
337 |
<div>
|
338 |
<label for="user">User name</label>
|
339 |
<input type="text" name="user" value="${session.value.user}" oninput=${updateSession} />
|
|
|
343 |
<label for="bot">Bot name</label>
|
344 |
<input type="text" name="char" value="${session.value.char}" oninput=${updateSession} />
|
345 |
</div>
|
346 |
+
</fieldset>
|
347 |
|
348 |
+
<fieldset>
|
349 |
<div>
|
350 |
<label for="template">Prompt template</label>
|
351 |
<textarea id="template" name="template" value="${session.value.template}" rows=4 oninput=${updateSession}/>
|
|
|
355 |
<label for="template">Chat history template</label>
|
356 |
<textarea id="template" name="historyTemplate" value="${session.value.historyTemplate}" rows=1 oninput=${updateSession}/>
|
357 |
</div>
|
358 |
+
</fieldset>
|
359 |
|
360 |
+
<fieldset class="two">
|
361 |
+
${IntField({label: "Predictions", max: 2048, min: -1, name: "n_predict", value: params.value.n_predict})}
|
362 |
+
${FloatField({label: "Temperature", max: 1.5, min: 0.0, name: "temperature", step: 0.01, value: params.value.temperature})}
|
363 |
+
${FloatField({label: "Penalize repeat sequence", max: 2.0, min: 0.0, name: "repeat_penalty", step: 0.01, value: params.value.repeat_penalty})}
|
364 |
+
${IntField({label: "Consider N tokens for penalize", max: 2048, min: 0, name: "repeat_last_n", value: params.value.repeat_last_n})}
|
365 |
+
${IntField({label: "Top-K sampling", max: 100, min: -1, name: "top_k", value: params.value.top_k})}
|
366 |
+
${FloatField({label: "Top-P sampling", max: 1.0, min: 0.0, name: "top_p", step: 0.01, value: params.value.top_p})}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
367 |
</fieldset>
|
368 |
+
<details>
|
369 |
+
<summary>More options</summary>
|
370 |
+
<fieldset class="two">
|
371 |
+
${FloatField({label: "TFS-Z", max: 1.0, min: 0.0, name: "tfs_z", step: 0.01, value: params.value.tfs_z})}
|
372 |
+
${FloatField({label: "Typical P", max: 1.0, min: 0.0, name: "typical_p", step: 0.01, value: params.value.typical_p})}
|
373 |
+
${FloatField({label: "Presence penalty", max: 1.0, min: 0.0, name: "presence_penalty", step: 0.01, value: params.value.presence_penalty})}
|
374 |
+
${FloatField({label: "Frequency penalty", max: 1.0, min: 0.0, name: "frequency_penalty", step: 0.01, value: params.value.frequency_penalty})}
|
375 |
+
</fieldset>
|
376 |
+
<hr />
|
377 |
+
<fieldset class="three">
|
378 |
+
<div>
|
379 |
+
<label><input type="radio" name="mirostat" value="0" checked=${params.value.mirostat == 0} oninput=${updateParamsInt} /> no Mirostat</label>
|
380 |
+
<label><input type="radio" name="mirostat" value="1" checked=${params.value.mirostat == 1} oninput=${updateParamsInt} /> Mirostat v1</label>
|
381 |
+
<label><input type="radio" name="mirostat" value="2" checked=${params.value.mirostat == 2} oninput=${updateParamsInt} /> Mirostat v2</label>
|
382 |
+
</div>
|
383 |
+
${FloatField({label: "Mirostat tau", max: 10.0, min: 0.0, name: "mirostat_tau", step: 0.01, value: params.value.mirostat_tau})}
|
384 |
+
${FloatField({label: "Mirostat eta", max: 1.0, min: 0.0, name: "mirostat_eta", step: 0.01, value: params.value.mirostat_eta})}
|
385 |
+
</fieldset>
|
386 |
+
</details>
|
387 |
</form>
|
388 |
`
|
389 |
}
|
390 |
// poor mans markdown replacement
|
391 |
const Markdownish = (params) => {
|
392 |
const md = params.text
|
393 |
+
.replace(/&/g, '&')
|
394 |
+
.replace(/</g, '<')
|
395 |
+
.replace(/>/g, '>')
|
396 |
.replace(/^#{1,6} (.*)$/gim, '<h3>$1</h3>')
|
397 |
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
398 |
.replace(/__(.*?)__/g, '<strong>$1</strong>')
|
examples/server/server.cpp
CHANGED
@@ -601,45 +601,49 @@ struct llama_server_context
|
|
601 |
static void server_print_usage(const char *argv0, const gpt_params ¶ms,
|
602 |
const server_params &sparams)
|
603 |
{
|
604 |
-
fprintf(
|
605 |
-
fprintf(
|
606 |
-
fprintf(
|
607 |
-
fprintf(
|
608 |
-
fprintf(
|
609 |
-
fprintf(
|
610 |
-
fprintf(
|
611 |
-
fprintf(
|
612 |
-
fprintf(
|
613 |
-
fprintf(
|
|
|
|
|
|
|
|
|
614 |
if (llama_mlock_supported())
|
615 |
{
|
616 |
-
fprintf(
|
617 |
}
|
618 |
if (llama_mmap_supported())
|
619 |
{
|
620 |
-
fprintf(
|
621 |
}
|
622 |
#ifdef LLAMA_SUPPORTS_GPU_OFFLOAD
|
623 |
-
fprintf(
|
624 |
-
fprintf(
|
625 |
-
fprintf(
|
626 |
-
fprintf(
|
627 |
-
fprintf(
|
628 |
-
fprintf(
|
629 |
-
fprintf(
|
630 |
#endif
|
631 |
-
fprintf(
|
632 |
-
fprintf(
|
633 |
-
fprintf(
|
634 |
-
fprintf(
|
635 |
-
fprintf(
|
636 |
-
fprintf(
|
637 |
-
fprintf(
|
638 |
-
fprintf(
|
639 |
-
fprintf(
|
640 |
-
fprintf(
|
641 |
-
fprintf(
|
642 |
-
fprintf(
|
643 |
}
|
644 |
|
645 |
static void server_params_parse(int argc, char **argv, server_params &sparams,
|
@@ -722,6 +726,41 @@ static void server_params_parse(int argc, char **argv, server_params &sparams,
|
|
722 |
}
|
723 |
params.n_ctx = std::stoi(argv[i]);
|
724 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
725 |
else if (arg == "--memory-f32" || arg == "--memory_f32")
|
726 |
{
|
727 |
params.memory_f16 = false;
|
@@ -820,6 +859,7 @@ static void server_params_parse(int argc, char **argv, server_params &sparams,
|
|
820 |
break;
|
821 |
}
|
822 |
params.lora_adapter = argv[i];
|
|
|
823 |
}
|
824 |
else if (arg == "--lora-base")
|
825 |
{
|
|
|
601 |
static void server_print_usage(const char *argv0, const gpt_params ¶ms,
|
602 |
const server_params &sparams)
|
603 |
{
|
604 |
+
fprintf(stdout, "usage: %s [options]\n", argv0);
|
605 |
+
fprintf(stdout, "\n");
|
606 |
+
fprintf(stdout, "options:\n");
|
607 |
+
fprintf(stdout, " -h, --help show this help message and exit\n");
|
608 |
+
fprintf(stdout, " -v, --verbose verbose output (default: %s)\n", server_verbose ? "enabled" : "disabled");
|
609 |
+
fprintf(stdout, " -t N, --threads N number of threads to use during computation (default: %d)\n", params.n_threads);
|
610 |
+
fprintf(stdout, " -c N, --ctx-size N size of the prompt context (default: %d)\n", params.n_ctx);
|
611 |
+
fprintf(stdout, " -gqa N, --gqa N grouped-query attention factor (TEMP!!! use 8 for LLaMAv2 70B) (default: %d)\n", params.n_gqa);
|
612 |
+
fprintf(stdout, " -eps N, --rms-norm-eps N rms norm eps (TEMP!!! use 1e-5 for LLaMAv2) (default: %.1e)\n", params.rms_norm_eps);
|
613 |
+
fprintf(stdout, " --rope-freq-base N RoPE base frequency (default: %.1f)\n", params.rope_freq_base);
|
614 |
+
fprintf(stdout, " --rope-freq-scale N RoPE frequency scaling factor (default: %g)\n", params.rope_freq_scale);
|
615 |
+
fprintf(stdout, " -b N, --batch-size N batch size for prompt processing (default: %d)\n", params.n_batch);
|
616 |
+
fprintf(stdout, " --memory-f32 use f32 instead of f16 for memory key+value (default: disabled)\n");
|
617 |
+
fprintf(stdout, " not recommended: doubles context memory required and no measurable increase in quality\n");
|
618 |
if (llama_mlock_supported())
|
619 |
{
|
620 |
+
fprintf(stdout, " --mlock force system to keep model in RAM rather than swapping or compressing\n");
|
621 |
}
|
622 |
if (llama_mmap_supported())
|
623 |
{
|
624 |
+
fprintf(stdout, " --no-mmap do not memory-map model (slower load but may reduce pageouts if not using mlock)\n");
|
625 |
}
|
626 |
#ifdef LLAMA_SUPPORTS_GPU_OFFLOAD
|
627 |
+
fprintf(stdout, " -ngl N, --n-gpu-layers N\n");
|
628 |
+
fprintf(stdout, " number of layers to store in VRAM\n");
|
629 |
+
fprintf(stdout, " -ts SPLIT --tensor-split SPLIT\n");
|
630 |
+
fprintf(stdout, " how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n");
|
631 |
+
fprintf(stdout, " how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n");
|
632 |
+
fprintf(stdout, " -mg i, --main-gpu i the GPU to use for scratch and small tensors\n");
|
633 |
+
fprintf(stdout, " -lv, --low-vram don't allocate VRAM scratch buffer\n");
|
634 |
#endif
|
635 |
+
fprintf(stdout, " -m FNAME, --model FNAME\n");
|
636 |
+
fprintf(stdout, " model path (default: %s)\n", params.model.c_str());
|
637 |
+
fprintf(stdout, " -a ALIAS, --alias ALIAS\n");
|
638 |
+
fprintf(stdout, " set an alias for the model, will be added as `model` field in completion response\n");
|
639 |
+
fprintf(stdout, " --lora FNAME apply LoRA adapter (implies --no-mmap)\n");
|
640 |
+
fprintf(stdout, " --lora-base FNAME optional model to use as a base for the layers modified by the LoRA adapter\n");
|
641 |
+
fprintf(stdout, " --host ip address to listen (default (default: %s)\n", sparams.hostname.c_str());
|
642 |
+
fprintf(stdout, " --port PORT port to listen (default (default: %d)\n", sparams.port);
|
643 |
+
fprintf(stdout, " --path PUBLIC_PATH path from which to serve static files (default %s)\n", sparams.public_path.c_str());
|
644 |
+
fprintf(stdout, " -to N, --timeout N server read/write timeout in seconds (default: %d)\n", sparams.read_timeout);
|
645 |
+
fprintf(stdout, " --embedding enable embedding vector output (default: %s)\n", params.embedding ? "enabled" : "disabled");
|
646 |
+
fprintf(stdout, "\n");
|
647 |
}
|
648 |
|
649 |
static void server_params_parse(int argc, char **argv, server_params &sparams,
|
|
|
726 |
}
|
727 |
params.n_ctx = std::stoi(argv[i]);
|
728 |
}
|
729 |
+
else if (arg == "-gqa" || arg == "--gqa")
|
730 |
+
{
|
731 |
+
if (++i >= argc)
|
732 |
+
{
|
733 |
+
invalid_param = true;
|
734 |
+
break;
|
735 |
+
}
|
736 |
+
params.n_gqa = std::stoi(argv[i]);
|
737 |
+
}
|
738 |
+
else if (arg == "-eps" || arg == "--rms-norm-eps") {
|
739 |
+
if (++i >= argc)
|
740 |
+
{
|
741 |
+
invalid_param = true;
|
742 |
+
break;
|
743 |
+
}
|
744 |
+
params.rms_norm_eps = std::stof(argv[i]);
|
745 |
+
}
|
746 |
+
else if (arg == "--rope-freq-base")
|
747 |
+
{
|
748 |
+
if (++i >= argc)
|
749 |
+
{
|
750 |
+
invalid_param = true;
|
751 |
+
break;
|
752 |
+
}
|
753 |
+
params.rope_freq_base = std::stof(argv[i]);
|
754 |
+
}
|
755 |
+
else if (arg == "--rope-freq-scale")
|
756 |
+
{
|
757 |
+
if (++i >= argc)
|
758 |
+
{
|
759 |
+
invalid_param = true;
|
760 |
+
break;
|
761 |
+
}
|
762 |
+
params.rope_freq_scale = std::stof(argv[i]);
|
763 |
+
}
|
764 |
else if (arg == "--memory-f32" || arg == "--memory_f32")
|
765 |
{
|
766 |
params.memory_f16 = false;
|
|
|
859 |
break;
|
860 |
}
|
861 |
params.lora_adapter = argv[i];
|
862 |
+
params.use_mmap = false;
|
863 |
}
|
864 |
else if (arg == "--lora-base")
|
865 |
{
|
examples/simple/CMakeLists.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
set(TARGET simple)
|
2 |
add_executable(${TARGET} simple.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
5 |
if(TARGET BUILD_INFO)
|
|
|
1 |
set(TARGET simple)
|
2 |
add_executable(${TARGET} simple.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
6 |
if(TARGET BUILD_INFO)
|
examples/train-text-from-scratch/CMakeLists.txt
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
set(TARGET train-text-from-scratch)
|
2 |
add_executable(${TARGET} train-text-from-scratch.cpp)
|
|
|
3 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
4 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
|
|
1 |
set(TARGET train-text-from-scratch)
|
2 |
add_executable(${TARGET} train-text-from-scratch.cpp)
|
3 |
+
install(TARGETS ${TARGET} RUNTIME)
|
4 |
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT})
|
5 |
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
examples/train-text-from-scratch/train-text-from-scratch.cpp
CHANGED
@@ -16,6 +16,8 @@
|
|
16 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
17 |
#endif
|
18 |
|
|
|
|
|
19 |
struct random_normal_distribution {
|
20 |
std::mt19937 gen;
|
21 |
std::normal_distribution<float> rd;
|
@@ -439,7 +441,7 @@ struct ggml_tensor * forward(
|
|
439 |
// norm
|
440 |
{
|
441 |
// cur shape [n_embd,N,1,1]
|
442 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
443 |
|
444 |
// cur = attention_norm*cur
|
445 |
cur = ggml_mul(ctx0,
|
@@ -562,7 +564,7 @@ struct ggml_tensor * forward(
|
|
562 |
// norm
|
563 |
{
|
564 |
// cur shape [n_embd,N,1,1]
|
565 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
566 |
|
567 |
// cur = ffn_norm*cur
|
568 |
// cur shape [n_embd,N,1,1]
|
@@ -606,7 +608,7 @@ struct ggml_tensor * forward(
|
|
606 |
{
|
607 |
|
608 |
// inpL shape [n_embd,N,1,1]
|
609 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
610 |
|
611 |
// inpL = norm*inpL
|
612 |
// inpL shape [n_embd,N,1,1]
|
@@ -694,7 +696,7 @@ struct ggml_tensor * forward_batch(
|
|
694 |
// norm
|
695 |
{
|
696 |
// cur shape [n_embd,N*n_batch,1,1]
|
697 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
698 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
699 |
|
700 |
// cur = attention_norm*cur
|
@@ -857,7 +859,7 @@ struct ggml_tensor * forward_batch(
|
|
857 |
// norm
|
858 |
{
|
859 |
// cur shape [n_embd,N*n_batch,1,1]
|
860 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
861 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
862 |
|
863 |
// cur = ffn_norm*cur
|
@@ -910,7 +912,7 @@ struct ggml_tensor * forward_batch(
|
|
910 |
{
|
911 |
|
912 |
// inpL shape [n_embd,N*n_batch,1,1]
|
913 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
914 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
915 |
|
916 |
// inpL = norm*inpL
|
@@ -979,7 +981,7 @@ struct ggml_tensor * forward_batch_wo_cache(
|
|
979 |
// norm
|
980 |
{
|
981 |
// cur shape [n_embd,N*n_batch,1,1]
|
982 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
983 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
984 |
|
985 |
// cur = attention_norm*cur
|
@@ -1085,7 +1087,7 @@ struct ggml_tensor * forward_batch_wo_cache(
|
|
1085 |
// norm
|
1086 |
{
|
1087 |
// cur shape [n_embd,N*n_batch,1,1]
|
1088 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
1089 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1090 |
|
1091 |
// cur = ffn_norm*cur
|
@@ -1138,7 +1140,7 @@ struct ggml_tensor * forward_batch_wo_cache(
|
|
1138 |
{
|
1139 |
|
1140 |
// inpL shape [n_embd,N*n_batch,1,1]
|
1141 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
1142 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1143 |
|
1144 |
// inpL = norm*inpL
|
@@ -1203,7 +1205,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn(
|
|
1203 |
|
1204 |
// norm
|
1205 |
{
|
1206 |
-
cur = ggml_rms_norm(ctx0, inpL);
|
1207 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1208 |
|
1209 |
// cur = attention_norm*cur
|
@@ -1267,7 +1269,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn(
|
|
1267 |
{
|
1268 |
// norm
|
1269 |
{
|
1270 |
-
cur = ggml_rms_norm(ctx0, inpFF);
|
1271 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1272 |
|
1273 |
// cur = ffn_norm*cur
|
@@ -1311,7 +1313,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn(
|
|
1311 |
// norm
|
1312 |
{
|
1313 |
|
1314 |
-
inpL = ggml_rms_norm(ctx0, inpL);
|
1315 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1316 |
|
1317 |
// inpL = norm*inpL
|
@@ -1434,7 +1436,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn_train(
|
|
1434 |
gf->perf_time_us = 0;
|
1435 |
|
1436 |
const auto & hparams = model->hparams;
|
1437 |
-
|
1438 |
const int n_vocab = hparams.n_vocab;
|
1439 |
const int n_embd = hparams.n_embd;
|
1440 |
const int n_layer = hparams.n_layer;
|
@@ -1603,7 +1605,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn_train(
|
|
1603 |
struct my_llama_layer & layer = model->layers[il];
|
1604 |
// tensors with values necessary for backward pass are in persistent buf(-1)
|
1605 |
// other tensors with buf(0) and buf(1) are only temporary needed, and their memory reused after layer is completed.
|
1606 |
-
use_buf(-1); struct ggml_tensor * t02 = expand(gf, ggml_rms_norm (ctx0, cur));
|
1607 |
use_buf( 0); struct ggml_tensor * t03 = expand(gf, ggml_repeat (ctx0, layer.attention_norm, t02)); assert_shape_2d(t03, n_embd, N*n_batch);
|
1608 |
use_buf(-1); struct ggml_tensor * t04 = expand(gf, ggml_mul (ctx0, t02, t03)); assert_shape_2d(t04, n_embd, N*n_batch);
|
1609 |
use_buf(-1); struct ggml_tensor * t05 = expand(gf, ggml_mul_mat (ctx0, layer.wq, t04)); assert_shape_2d(t05, n_embd, N*n_batch);
|
@@ -1623,7 +1625,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn_train(
|
|
1623 |
use_buf(-1); struct ggml_tensor * t19 = expand(gf, ggml_reshape_2d (ctx0, t18, n_embd, N*n_batch)); assert_shape_2d(t19, n_embd, N*n_batch);
|
1624 |
use_buf( 0); struct ggml_tensor * t20 = expand(gf, ggml_mul_mat (ctx0, layer.wo, t19)); assert_shape_2d(t20, n_embd, N*n_batch);
|
1625 |
use_buf(-1); struct ggml_tensor * t21 = expand(gf, ggml_add (ctx0, t20, cur)); assert_shape_2d(t21, n_embd, N*n_batch);
|
1626 |
-
use_buf(-1); struct ggml_tensor * t22 = expand(gf, ggml_rms_norm (ctx0, t21));
|
1627 |
use_buf( 0); struct ggml_tensor * t23 = expand(gf, ggml_repeat (ctx0, layer.ffn_norm, t22)); assert_shape_2d(t23, n_embd, N*n_batch);
|
1628 |
use_buf(-1); struct ggml_tensor * t24 = expand(gf, ggml_mul (ctx0, t23, t22)); assert_shape_2d(t24, n_embd, N*n_batch);
|
1629 |
use_buf(-1); struct ggml_tensor * t25 = expand(gf, ggml_mul_mat (ctx0, layer.w3, t24)); assert_shape_2d(t25, n_ff, N*n_batch);
|
@@ -1666,7 +1668,7 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn_train(
|
|
1666 |
}
|
1667 |
clr_buf(0);
|
1668 |
use_buf(0);
|
1669 |
-
struct ggml_tensor * t31 = expand(gf, ggml_rms_norm (ctx0, cur));
|
1670 |
struct ggml_tensor * t32 = expand(gf, ggml_repeat (ctx0, model->norm, t31)); assert_shape_2d(t32, n_embd, N*n_batch);
|
1671 |
struct ggml_tensor * t33 = expand(gf, ggml_mul (ctx0, t32, t31)); assert_shape_2d(t33, n_embd, N*n_batch);
|
1672 |
use_buf(-1);
|
@@ -1863,10 +1865,10 @@ struct ggml_tensor * forward_batch_wo_cache_flash_attn_train(
|
|
1863 |
t12->grad = expand(gb, ggml_permute(ctx0, t15->grad, 0, 2, 3, 1)); assert_shape_4d(t12->grad, N, n_batch, n_embd/n_head, n_head);
|
1864 |
t11->grad = expand(gb, ggml_reshape_2d(ctx0, ggml_cont(ctx0, t12->grad), N*n_batch, n_embd)); assert_shape_2d(t11->grad, N*n_batch, n_embd);
|
1865 |
t10->grad = expand(gb, ggml_permute(ctx0, t14->grad, 0, 2, 1, 3)); assert_shape_4d(t10->grad, n_embd/n_head, n_head, N, n_batch);
|
1866 |
-
t09->grad = expand(gb, ggml_rope_back(ctx0, t10->grad, n_past, n_rot, rope_mode));
|
1867 |
t08->grad = expand(gb, ggml_reshape_2d(ctx0, t09->grad, n_embd, N*n_batch)); assert_shape_2d(t08->grad, n_embd, N*n_batch);
|
1868 |
t07->grad = expand(gb, ggml_permute(ctx0, t13->grad, 0, 2, 1, 3)); assert_shape_4d(t07->grad, n_embd/n_head, n_head, N, n_batch);
|
1869 |
-
t06->grad = expand(gb, ggml_rope_back(ctx0, t07->grad, n_past, n_rot, rope_mode));
|
1870 |
t05->grad = expand(gb, ggml_reshape_2d(ctx0, t06->grad, n_embd, N*n_batch)); assert_shape_2d(t05->grad, n_embd, N*n_batch);
|
1871 |
t04->grad = expand(gb, ggml_add_inplace(ctx0,
|
1872 |
ggml_add_inplace(ctx0,
|
|
|
16 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
17 |
#endif
|
18 |
|
19 |
+
static const float rms_norm_eps = LLAMA_DEFAULT_RMS_EPS;
|
20 |
+
|
21 |
struct random_normal_distribution {
|
22 |
std::mt19937 gen;
|
23 |
std::normal_distribution<float> rd;
|
|
|
441 |
// norm
|
442 |
{
|
443 |
// cur shape [n_embd,N,1,1]
|
444 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
445 |
|
446 |
// cur = attention_norm*cur
|
447 |
cur = ggml_mul(ctx0,
|
|
|
564 |
// norm
|
565 |
{
|
566 |
// cur shape [n_embd,N,1,1]
|
567 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
568 |
|
569 |
// cur = ffn_norm*cur
|
570 |
// cur shape [n_embd,N,1,1]
|
|
|
608 |
{
|
609 |
|
610 |
// inpL shape [n_embd,N,1,1]
|
611 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
612 |
|
613 |
// inpL = norm*inpL
|
614 |
// inpL shape [n_embd,N,1,1]
|
|
|
696 |
// norm
|
697 |
{
|
698 |
// cur shape [n_embd,N*n_batch,1,1]
|
699 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
700 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
701 |
|
702 |
// cur = attention_norm*cur
|
|
|
859 |
// norm
|
860 |
{
|
861 |
// cur shape [n_embd,N*n_batch,1,1]
|
862 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
863 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
864 |
|
865 |
// cur = ffn_norm*cur
|
|
|
912 |
{
|
913 |
|
914 |
// inpL shape [n_embd,N*n_batch,1,1]
|
915 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
916 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
917 |
|
918 |
// inpL = norm*inpL
|
|
|
981 |
// norm
|
982 |
{
|
983 |
// cur shape [n_embd,N*n_batch,1,1]
|
984 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
985 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
986 |
|
987 |
// cur = attention_norm*cur
|
|
|
1087 |
// norm
|
1088 |
{
|
1089 |
// cur shape [n_embd,N*n_batch,1,1]
|
1090 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
1091 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1092 |
|
1093 |
// cur = ffn_norm*cur
|
|
|
1140 |
{
|
1141 |
|
1142 |
// inpL shape [n_embd,N*n_batch,1,1]
|
1143 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1144 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1145 |
|
1146 |
// inpL = norm*inpL
|
|
|
1205 |
|
1206 |
// norm
|
1207 |
{
|
1208 |
+
cur = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1209 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1210 |
|
1211 |
// cur = attention_norm*cur
|
|
|
1269 |
{
|
1270 |
// norm
|
1271 |
{
|
1272 |
+
cur = ggml_rms_norm(ctx0, inpFF, rms_norm_eps);
|
1273 |
assert_shape_2d(cur, n_embd, N*n_batch);
|
1274 |
|
1275 |
// cur = ffn_norm*cur
|
|
|
1313 |
// norm
|
1314 |
{
|
1315 |
|
1316 |
+
inpL = ggml_rms_norm(ctx0, inpL, rms_norm_eps);
|
1317 |
assert_shape_2d(inpL, n_embd, N*n_batch);
|
1318 |
|
1319 |
// inpL = norm*inpL
|
|
|
1436 |
gf->perf_time_us = 0;
|
1437 |
|
1438 |
const auto & hparams = model->hparams;
|
1439 |
+
const int n_ctx = hparams.n_ctx;
|
1440 |
const int n_vocab = hparams.n_vocab;
|
1441 |
const int n_embd = hparams.n_embd;
|
1442 |
const int n_layer = hparams.n_layer;
|
|
|
1605 |
struct my_llama_layer & layer = model->layers[il];
|
1606 |
// tensors with values necessary for backward pass are in persistent buf(-1)
|
1607 |
// other tensors with buf(0) and buf(1) are only temporary needed, and their memory reused after layer is completed.
|
1608 |
+
use_buf(-1); struct ggml_tensor * t02 = expand(gf, ggml_rms_norm (ctx0, cur, rms_norm_eps)); assert_shape_2d(t02, n_embd, N*n_batch);
|
1609 |
use_buf( 0); struct ggml_tensor * t03 = expand(gf, ggml_repeat (ctx0, layer.attention_norm, t02)); assert_shape_2d(t03, n_embd, N*n_batch);
|
1610 |
use_buf(-1); struct ggml_tensor * t04 = expand(gf, ggml_mul (ctx0, t02, t03)); assert_shape_2d(t04, n_embd, N*n_batch);
|
1611 |
use_buf(-1); struct ggml_tensor * t05 = expand(gf, ggml_mul_mat (ctx0, layer.wq, t04)); assert_shape_2d(t05, n_embd, N*n_batch);
|
|
|
1625 |
use_buf(-1); struct ggml_tensor * t19 = expand(gf, ggml_reshape_2d (ctx0, t18, n_embd, N*n_batch)); assert_shape_2d(t19, n_embd, N*n_batch);
|
1626 |
use_buf( 0); struct ggml_tensor * t20 = expand(gf, ggml_mul_mat (ctx0, layer.wo, t19)); assert_shape_2d(t20, n_embd, N*n_batch);
|
1627 |
use_buf(-1); struct ggml_tensor * t21 = expand(gf, ggml_add (ctx0, t20, cur)); assert_shape_2d(t21, n_embd, N*n_batch);
|
1628 |
+
use_buf(-1); struct ggml_tensor * t22 = expand(gf, ggml_rms_norm (ctx0, t21, rms_norm_eps)); assert_shape_2d(t22, n_embd, N*n_batch);
|
1629 |
use_buf( 0); struct ggml_tensor * t23 = expand(gf, ggml_repeat (ctx0, layer.ffn_norm, t22)); assert_shape_2d(t23, n_embd, N*n_batch);
|
1630 |
use_buf(-1); struct ggml_tensor * t24 = expand(gf, ggml_mul (ctx0, t23, t22)); assert_shape_2d(t24, n_embd, N*n_batch);
|
1631 |
use_buf(-1); struct ggml_tensor * t25 = expand(gf, ggml_mul_mat (ctx0, layer.w3, t24)); assert_shape_2d(t25, n_ff, N*n_batch);
|
|
|
1668 |
}
|
1669 |
clr_buf(0);
|
1670 |
use_buf(0);
|
1671 |
+
struct ggml_tensor * t31 = expand(gf, ggml_rms_norm (ctx0, cur, rms_norm_eps)); assert_shape_2d(t31, n_embd, N*n_batch);
|
1672 |
struct ggml_tensor * t32 = expand(gf, ggml_repeat (ctx0, model->norm, t31)); assert_shape_2d(t32, n_embd, N*n_batch);
|
1673 |
struct ggml_tensor * t33 = expand(gf, ggml_mul (ctx0, t32, t31)); assert_shape_2d(t33, n_embd, N*n_batch);
|
1674 |
use_buf(-1);
|
|
|
1865 |
t12->grad = expand(gb, ggml_permute(ctx0, t15->grad, 0, 2, 3, 1)); assert_shape_4d(t12->grad, N, n_batch, n_embd/n_head, n_head);
|
1866 |
t11->grad = expand(gb, ggml_reshape_2d(ctx0, ggml_cont(ctx0, t12->grad), N*n_batch, n_embd)); assert_shape_2d(t11->grad, N*n_batch, n_embd);
|
1867 |
t10->grad = expand(gb, ggml_permute(ctx0, t14->grad, 0, 2, 1, 3)); assert_shape_4d(t10->grad, n_embd/n_head, n_head, N, n_batch);
|
1868 |
+
t09->grad = expand(gb, ggml_rope_back(ctx0, t10->grad, n_past, n_rot, rope_mode, n_ctx)); assert_shape_4d(t09->grad, n_embd/n_head, n_head, N, n_batch);
|
1869 |
t08->grad = expand(gb, ggml_reshape_2d(ctx0, t09->grad, n_embd, N*n_batch)); assert_shape_2d(t08->grad, n_embd, N*n_batch);
|
1870 |
t07->grad = expand(gb, ggml_permute(ctx0, t13->grad, 0, 2, 1, 3)); assert_shape_4d(t07->grad, n_embd/n_head, n_head, N, n_batch);
|
1871 |
+
t06->grad = expand(gb, ggml_rope_back(ctx0, t07->grad, n_past, n_rot, rope_mode, n_ctx)); assert_shape_4d(t06->grad, n_embd/n_head, n_head, N, n_batch);
|
1872 |
t05->grad = expand(gb, ggml_reshape_2d(ctx0, t06->grad, n_embd, N*n_batch)); assert_shape_2d(t05->grad, n_embd, N*n_batch);
|
1873 |
t04->grad = expand(gb, ggml_add_inplace(ctx0,
|
1874 |
ggml_add_inplace(ctx0,
|
expose.cpp
CHANGED
@@ -223,10 +223,15 @@ extern "C"
|
|
223 |
float get_last_eval_time() {
|
224 |
return last_eval_time;
|
225 |
}
|
226 |
-
|
227 |
float get_last_process_time() {
|
228 |
return last_process_time;
|
229 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
|
231 |
const char* get_pending_output() {
|
232 |
return gpttype_get_pending_output().c_str();
|
|
|
223 |
float get_last_eval_time() {
|
224 |
return last_eval_time;
|
225 |
}
|
|
|
226 |
float get_last_process_time() {
|
227 |
return last_process_time;
|
228 |
}
|
229 |
+
int get_last_token_count() {
|
230 |
+
return last_token_count;
|
231 |
+
}
|
232 |
+
int get_last_stop_reason() {
|
233 |
+
return (int)last_stop_reason;
|
234 |
+
}
|
235 |
|
236 |
const char* get_pending_output() {
|
237 |
return gpttype_get_pending_output().c_str();
|
expose.h
CHANGED
@@ -2,6 +2,7 @@
|
|
2 |
|
3 |
const int stop_token_max = 10;
|
4 |
const int ban_token_max = 10;
|
|
|
5 |
// match kobold's sampler list and order
|
6 |
enum samplers
|
7 |
{
|
@@ -14,6 +15,13 @@ enum samplers
|
|
14 |
KCPP_SAMPLER_REP_PEN=6,
|
15 |
KCPP_SAMPLER_MAX
|
16 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
struct load_model_inputs
|
18 |
{
|
19 |
const int threads;
|
@@ -36,8 +44,10 @@ struct load_model_inputs
|
|
36 |
const int debugmode = 0;
|
37 |
const int forceversion = 0;
|
38 |
const int gpulayers = 0;
|
39 |
-
const
|
|
|
40 |
const char * banned_tokens[ban_token_max];
|
|
|
41 |
};
|
42 |
struct generation_inputs
|
43 |
{
|
@@ -74,3 +84,5 @@ extern std::vector<std::string> generated_tokens;
|
|
74 |
extern bool generation_finished;
|
75 |
extern float last_eval_time;
|
76 |
extern float last_process_time;
|
|
|
|
|
|
2 |
|
3 |
const int stop_token_max = 10;
|
4 |
const int ban_token_max = 10;
|
5 |
+
const int tensor_split_max = 16;
|
6 |
// match kobold's sampler list and order
|
7 |
enum samplers
|
8 |
{
|
|
|
15 |
KCPP_SAMPLER_REP_PEN=6,
|
16 |
KCPP_SAMPLER_MAX
|
17 |
};
|
18 |
+
enum stop_reason
|
19 |
+
{
|
20 |
+
INVALID=-1,
|
21 |
+
OUT_OF_TOKENS=0,
|
22 |
+
EOS_TOKEN=1,
|
23 |
+
CUSTOM_STOPPER=2,
|
24 |
+
};
|
25 |
struct load_model_inputs
|
26 |
{
|
27 |
const int threads;
|
|
|
44 |
const int debugmode = 0;
|
45 |
const int forceversion = 0;
|
46 |
const int gpulayers = 0;
|
47 |
+
const float rope_freq_scale = 1.0f;
|
48 |
+
const float rope_freq_base = 10000.0f;
|
49 |
const char * banned_tokens[ban_token_max];
|
50 |
+
const float tensor_split[tensor_split_max];
|
51 |
};
|
52 |
struct generation_inputs
|
53 |
{
|
|
|
84 |
extern bool generation_finished;
|
85 |
extern float last_eval_time;
|
86 |
extern float last_process_time;
|
87 |
+
extern int last_token_count;
|
88 |
+
extern stop_reason last_stop_reason;
|
ggml-cuda.cu
CHANGED
@@ -13,6 +13,8 @@
|
|
13 |
#include "ggml-cuda.h"
|
14 |
#include "ggml.h"
|
15 |
|
|
|
|
|
16 |
#if defined(_MSC_VER)
|
17 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
18 |
#endif
|
@@ -74,7 +76,7 @@ typedef void (*ggml_cuda_op_t)(
|
|
74 |
|
75 |
#define QK4_0 32
|
76 |
#define QR4_0 2
|
77 |
-
#define QI4_0 4
|
78 |
typedef struct {
|
79 |
half d; // delta
|
80 |
uint8_t qs[QK4_0 / 2]; // nibbles / quants
|
@@ -83,7 +85,7 @@ static_assert(sizeof(block_q4_0) == sizeof(ggml_fp16_t) + QK4_0 / 2, "wrong q4_0
|
|
83 |
|
84 |
#define QK4_1 32
|
85 |
#define QR4_1 2
|
86 |
-
#define QI4_1 4
|
87 |
typedef struct {
|
88 |
half d; // delta
|
89 |
half m; // min
|
@@ -93,7 +95,7 @@ static_assert(sizeof(block_q4_1) == sizeof(ggml_fp16_t) * 2 + QK4_1 / 2, "wrong
|
|
93 |
|
94 |
#define QK5_0 32
|
95 |
#define QR5_0 2
|
96 |
-
#define QI5_0 4
|
97 |
typedef struct {
|
98 |
half d; // delta
|
99 |
uint8_t qh[4]; // 5-th bit of quants
|
@@ -103,7 +105,7 @@ static_assert(sizeof(block_q5_0) == sizeof(ggml_fp16_t) + sizeof(uint32_t) + QK5
|
|
103 |
|
104 |
#define QK5_1 32
|
105 |
#define QR5_1 2
|
106 |
-
#define QI5_1 4
|
107 |
typedef struct {
|
108 |
half d; // delta
|
109 |
half m; // min
|
@@ -114,7 +116,7 @@ static_assert(sizeof(block_q5_1) == 2 * sizeof(ggml_fp16_t) + sizeof(uint32_t) +
|
|
114 |
|
115 |
#define QK8_0 32
|
116 |
#define QR8_0 1
|
117 |
-
#define QI8_0
|
118 |
typedef struct {
|
119 |
half d; // delta
|
120 |
int8_t qs[QK8_0]; // quants
|
@@ -123,7 +125,7 @@ static_assert(sizeof(block_q8_0) == sizeof(ggml_fp16_t) + QK8_0, "wrong q8_0 blo
|
|
123 |
|
124 |
#define QK8_1 32
|
125 |
#define QR8_1 1
|
126 |
-
#define QI8_1
|
127 |
typedef struct {
|
128 |
half d; // delta
|
129 |
half s; // unquantized sum
|
@@ -143,6 +145,8 @@ typedef float (*vec_dot_q_cuda_t)(const void * __restrict__ vbq, const block_q8_
|
|
143 |
#define K_SCALE_SIZE 12
|
144 |
#endif
|
145 |
|
|
|
|
|
146 |
typedef struct {
|
147 |
uint8_t scales[QK_K/16]; // scales and mins, quantized with 4 bits
|
148 |
uint8_t qs[QK_K/4]; // quants
|
@@ -151,6 +155,8 @@ typedef struct {
|
|
151 |
} block_q2_K;
|
152 |
static_assert(sizeof(block_q2_K) == 2*sizeof(ggml_fp16_t) + QK_K/16 + QK_K/4, "wrong q2_K block size/padding");
|
153 |
|
|
|
|
|
154 |
typedef struct {
|
155 |
uint8_t hmask[QK_K/8]; // quants - high bit
|
156 |
uint8_t qs[QK_K/4]; // quants - low 2 bits
|
@@ -163,6 +169,8 @@ typedef struct {
|
|
163 |
} block_q3_K;
|
164 |
//static_assert(sizeof(block_q3_K) == sizeof(ggml_fp16_t) + QK_K / 4 + QK_K / 8 + K_SCALE_SIZE, "wrong q3_K block size/padding");
|
165 |
|
|
|
|
|
166 |
#ifdef GGML_QKK_64
|
167 |
typedef struct {
|
168 |
half d[2]; // super-block scales/mins
|
@@ -180,6 +188,8 @@ typedef struct {
|
|
180 |
static_assert(sizeof(block_q4_K) == 2*sizeof(ggml_fp16_t) + 3*QK_K/64 + QK_K/2, "wrong q4_K block size/padding");
|
181 |
#endif
|
182 |
|
|
|
|
|
183 |
#ifdef GGML_QKK_64
|
184 |
typedef struct {
|
185 |
half d; // super-block scale
|
@@ -199,6 +209,8 @@ typedef struct {
|
|
199 |
static_assert(sizeof(block_q5_K) == 2*sizeof(ggml_fp16_t) + K_SCALE_SIZE + QK_K/2 + QK_K/8, "wrong q5_K block size/padding");
|
200 |
#endif
|
201 |
|
|
|
|
|
202 |
typedef struct {
|
203 |
uint8_t ql[QK_K/2]; // quants, lower 4 bits
|
204 |
uint8_t qh[QK_K/4]; // quants, upper 2 bits
|
@@ -208,10 +220,11 @@ typedef struct {
|
|
208 |
static_assert(sizeof(block_q6_K) == sizeof(ggml_fp16_t) + 13*QK_K/16, "wrong q6_K block size/padding");
|
209 |
|
210 |
#define WARP_SIZE 32
|
211 |
-
#define MATRIX_ROW_PADDING
|
212 |
|
213 |
#define CUDA_ADD_BLOCK_SIZE 256
|
214 |
#define CUDA_MUL_BLOCK_SIZE 256
|
|
|
215 |
#define CUDA_SILU_BLOCK_SIZE 256
|
216 |
#define CUDA_CPY_BLOCK_SIZE 32
|
217 |
#define CUDA_SCALE_BLOCK_SIZE 256
|
@@ -239,13 +252,13 @@ struct ggml_tensor_extra_gpu {
|
|
239 |
cudaEvent_t events[GGML_CUDA_MAX_DEVICES]; // events for synchronizing multiple GPUs
|
240 |
};
|
241 |
|
242 |
-
static __global__ void add_f32(const float * x, const float * y, float * dst, const int
|
243 |
const int i = blockDim.x*blockIdx.x + threadIdx.x;
|
244 |
|
245 |
-
if (i >=
|
246 |
return;
|
247 |
}
|
248 |
-
dst[i] = x[i] + y[i];
|
249 |
}
|
250 |
|
251 |
static __global__ void add_f16_f32_f16(const half * x, const float * y, half * dst, const int k) {
|
@@ -266,6 +279,19 @@ static __global__ void mul_f32(const float * x, const float * y, float * dst, co
|
|
266 |
dst[i] = x[i] * y[i%ky];
|
267 |
}
|
268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
269 |
static __global__ void silu_f32(const float * x, float * dst, const int k) {
|
270 |
const int i = blockDim.x*blockIdx.x + threadIdx.x;
|
271 |
|
@@ -275,16 +301,44 @@ static __global__ void silu_f32(const float * x, float * dst, const int k) {
|
|
275 |
dst[i] = x[i] / (1.0f + expf(-x[i]));
|
276 |
}
|
277 |
|
278 |
-
static __global__ void
|
279 |
const int row = blockIdx.x*blockDim.y + threadIdx.y;
|
280 |
const int tid = threadIdx.x;
|
281 |
|
282 |
-
const float eps = 1e-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
283 |
|
284 |
float tmp = 0.0f; // partial sum for thread in warp
|
285 |
|
286 |
-
for (int
|
287 |
-
const int col = i + tid;
|
288 |
const float xi = x[row*ncols + col];
|
289 |
tmp += xi * xi;
|
290 |
}
|
@@ -296,10 +350,9 @@ static __global__ void rms_norm_f32(const float * x, float * dst, const int ncol
|
|
296 |
}
|
297 |
|
298 |
const float mean = tmp / ncols;
|
299 |
-
const float scale =
|
300 |
|
301 |
-
for (int
|
302 |
-
const int col = i + tid;
|
303 |
dst[row*ncols + col] = scale * x[row*ncols + col];
|
304 |
}
|
305 |
}
|
@@ -880,12 +933,18 @@ static __global__ void dequantize_mul_mat_vec_q4_k(const void * __restrict__ vx,
|
|
880 |
uint16_t aux[4];
|
881 |
const uint8_t * sc = (const uint8_t *)aux;
|
882 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
883 |
float tmp = 0; // partial sum for thread in warp
|
884 |
|
885 |
for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
|
886 |
|
887 |
-
const uint8_t * q1 = x[i].qs + q_offset;
|
888 |
-
const uint8_t * q2 = q1 + 64;
|
889 |
const float * y1 = yy + i*QK_K + y_offset;
|
890 |
const float * y2 = y1 + 128;
|
891 |
|
@@ -898,14 +957,41 @@ static __global__ void dequantize_mul_mat_vec_q4_k(const void * __restrict__ vx,
|
|
898 |
aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
|
899 |
aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
|
900 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
901 |
float4 s = {0.f, 0.f, 0.f, 0.f};
|
902 |
float smin = 0;
|
903 |
-
for (int l = 0; l <
|
904 |
-
s.x += y1[l] *
|
905 |
-
s.z += y2[l] *
|
906 |
smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
|
907 |
}
|
908 |
-
tmp += dall * (s.x * sc[0] + s.y * sc[1] + s.z * sc[4] + s.w * sc[5]) - dmin * smin;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
909 |
|
910 |
}
|
911 |
#else
|
@@ -985,10 +1071,12 @@ static __global__ void dequantize_mul_mat_vec_q5_k(const void * __restrict__ vx,
|
|
985 |
uint16_t aux[4];
|
986 |
const uint8_t * sc = (const uint8_t *)aux;
|
987 |
|
|
|
|
|
|
|
988 |
for (int i = ix; i < num_blocks_per_row; i += 2) {
|
989 |
|
990 |
const uint8_t * ql1 = x[i].qs + q_offset;
|
991 |
-
const uint8_t * ql2 = ql1 + 64;
|
992 |
const uint8_t * qh = x[i].qh + l0;
|
993 |
const float * y1 = yy + i*QK_K + y_offset;
|
994 |
const float * y2 = y1 + 128;
|
@@ -1004,15 +1092,25 @@ static __global__ void dequantize_mul_mat_vec_q5_k(const void * __restrict__ vx,
|
|
1004 |
|
1005 |
float4 sum = {0.f, 0.f, 0.f, 0.f};
|
1006 |
float smin = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1007 |
for (int l = 0; l < n; ++l) {
|
1008 |
-
sum.x += y1[l+ 0] * (
|
1009 |
-
+ y1[l+16] * (
|
1010 |
-
sum.y += y1[l+32] * (
|
1011 |
-
+ y1[l+48] * (
|
1012 |
-
sum.z += y2[l+ 0] * (
|
1013 |
-
+ y2[l+16] * (
|
1014 |
-
sum.w += y2[l+32] * (
|
1015 |
-
+ y2[l+48] * (
|
1016 |
smin += (y1[l] + y1[l+16]) * sc[2] + (y1[l+32] + y1[l+48]) * sc[3]
|
1017 |
+ (y2[l] + y2[l+16]) * sc[6] + (y2[l+32] + y2[l+48]) * sc[7];
|
1018 |
}
|
@@ -1228,8 +1326,9 @@ static __global__ void dequantize_block(const void * __restrict__ vx, float * __
|
|
1228 |
y[iybs + iqs + y_offset] = v.y;
|
1229 |
}
|
1230 |
|
1231 |
-
static __device__ __forceinline__ float vec_dot_q4_0_q8_1(
|
1232 |
-
|
|
|
1233 |
const block_q4_0 * bq4_0 = (const block_q4_0 *) vbq;
|
1234 |
|
1235 |
int vi;
|
@@ -1250,11 +1349,12 @@ static __device__ __forceinline__ float vec_dot_q4_0_q8_1(const void * __restric
|
|
1250 |
return sumi*d;
|
1251 |
#else
|
1252 |
return 0.0f; // only to satisfy the compiler
|
1253 |
-
#endif // __CUDA_ARCH__ >=
|
1254 |
}
|
1255 |
|
1256 |
-
static __device__ __forceinline__ float vec_dot_q4_1_q8_1(
|
1257 |
-
|
|
|
1258 |
const block_q4_1 * bq4_1 = (const block_q4_1 *) vbq;
|
1259 |
|
1260 |
const int vi = *((int *) &bq4_1->qs[sizeof(int) * (iqs + 0)]);
|
@@ -1275,11 +1375,12 @@ static __device__ __forceinline__ float vec_dot_q4_1_q8_1(const void * __restric
|
|
1275 |
return sumi*d + m*s / QI4_1; // scale sum by QI4_1 because there are QI4_1 threads working on this block
|
1276 |
#else
|
1277 |
return 0.0f; // only to satisfy the compiler
|
1278 |
-
#endif // __CUDA_ARCH__ >=
|
1279 |
}
|
1280 |
|
1281 |
-
static __device__ __forceinline__ float vec_dot_q5_0_q8_1(
|
1282 |
-
|
|
|
1283 |
const block_q5_0 * bq5_0 = (const block_q5_0 *) vbq;
|
1284 |
|
1285 |
int qs;
|
@@ -1310,11 +1411,12 @@ static __device__ __forceinline__ float vec_dot_q5_0_q8_1(const void * __restric
|
|
1310 |
return sumi*d;
|
1311 |
#else
|
1312 |
return 0.0f; // only to satisfy the compiler
|
1313 |
-
#endif // __CUDA_ARCH__ >=
|
1314 |
}
|
1315 |
|
1316 |
-
static __device__ __forceinline__ float vec_dot_q5_1_q8_1(
|
1317 |
-
|
|
|
1318 |
const block_q5_1 * bq5_1 = (const block_q5_1 *) vbq;
|
1319 |
|
1320 |
const int qs = *((int *) &bq5_1->qs[sizeof(int) * (iqs + 0)]);
|
@@ -1344,11 +1446,12 @@ static __device__ __forceinline__ float vec_dot_q5_1_q8_1(const void * __restric
|
|
1344 |
return sumi*d + m*s / QI5_1; // scale sum by QI5_1 because there are QI5_1 threads working on this block
|
1345 |
#else
|
1346 |
return 0.0f; // only to satisfy the compiler
|
1347 |
-
#endif // __CUDA_ARCH__ >=
|
1348 |
}
|
1349 |
|
1350 |
-
static __device__ __forceinline__ float vec_dot_q8_0_q8_1(
|
1351 |
-
|
|
|
1352 |
const block_q8_0 * bq8_0 = (const block_q8_0 *) vbq;
|
1353 |
|
1354 |
int vi;
|
@@ -1363,7 +1466,342 @@ static __device__ __forceinline__ float vec_dot_q8_0_q8_1(const void * __restric
|
|
1363 |
return sumi*d;
|
1364 |
#else
|
1365 |
return 0.0f; // only to satisfy the compiler
|
1366 |
-
#endif // __CUDA_ARCH__ >=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1367 |
}
|
1368 |
|
1369 |
template <int qk, int qi, typename block_q_t, vec_dot_q_cuda_t vec_dot_q_cuda>
|
@@ -1386,7 +1824,7 @@ static __global__ void mul_mat_vec_q(const void * __restrict__ vx, const void *
|
|
1386 |
for (int i = 0; i < blocks_per_row; i += blocks_per_warp) {
|
1387 |
const int ibx = row*blocks_per_row + i + threadIdx.x / qi; // x block index
|
1388 |
|
1389 |
-
const int iby = i + threadIdx.x / qi; // y block index
|
1390 |
|
1391 |
const int iqs = threadIdx.x % qi; // x block quant index when casting the quants to int
|
1392 |
|
@@ -1472,11 +1910,15 @@ static __global__ void dequantize_mul_mat_vec(const void * __restrict__ vx, cons
|
|
1472 |
}
|
1473 |
}
|
1474 |
|
1475 |
-
static __global__ void mul_mat_p021_f16_f32(
|
|
|
|
|
|
|
1476 |
const half * x = (const half *) vx;
|
1477 |
|
1478 |
const int row_x = blockDim.y*blockIdx.y + threadIdx.y;
|
1479 |
const int channel = blockDim.z*blockIdx.z + threadIdx.z;
|
|
|
1480 |
|
1481 |
const int nrows_y = ncols_x;
|
1482 |
const int nrows_dst = nrows_x;
|
@@ -1492,7 +1934,7 @@ static __global__ void mul_mat_p021_f16_f32(const void * __restrict__ vx, const
|
|
1492 |
}
|
1493 |
|
1494 |
// x is transposed and permuted
|
1495 |
-
const int ix = row_x*nchannels_x*ncols_x +
|
1496 |
const float xi = __half2float(x[ix]);
|
1497 |
|
1498 |
const int row_y = col_x;
|
@@ -1520,12 +1962,13 @@ static __global__ void mul_mat_p021_f16_f32(const void * __restrict__ vx, const
|
|
1520 |
|
1521 |
static __global__ void mul_mat_vec_nc_f16_f32( // nc == non-contiguous
|
1522 |
const void * __restrict__ vx, const float * __restrict__ y, float * __restrict__ dst, const int ncols_x, const int nrows_x,
|
1523 |
-
const int row_stride_x, const int channel_stride_x) {
|
1524 |
|
1525 |
const half * x = (const half *) vx;
|
1526 |
|
1527 |
const int row_x = blockDim.y*blockIdx.y + threadIdx.y;
|
1528 |
const int channel = blockDim.z*blockIdx.z + threadIdx.z;
|
|
|
1529 |
|
1530 |
const int nrows_y = ncols_x;
|
1531 |
const int nrows_dst = nrows_x;
|
@@ -1542,7 +1985,7 @@ static __global__ void mul_mat_vec_nc_f16_f32( // nc == non-contiguous
|
|
1542 |
break;
|
1543 |
}
|
1544 |
|
1545 |
-
const int ix =
|
1546 |
const float xi = __half2float(x[ix]);
|
1547 |
|
1548 |
const int row_y = col_x;
|
@@ -1624,6 +2067,40 @@ static __global__ void rope_f32(const float * x, float * dst, const int ncols, c
|
|
1624 |
dst[i + 1] = x0*sin_theta + x1*cos_theta;
|
1625 |
}
|
1626 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1627 |
static __global__ void diag_mask_inf_f32(const float * x, float * dst, const int ncols, const int rows_per_channel, const int n_past) {
|
1628 |
const int col = blockDim.x*blockIdx.x + threadIdx.x;
|
1629 |
const int row = blockDim.y*blockIdx.y + threadIdx.y;
|
@@ -1689,9 +2166,9 @@ static __global__ void scale_f32(const float * x, float * dst, const float scale
|
|
1689 |
dst[i] = scale * x[i];
|
1690 |
}
|
1691 |
|
1692 |
-
static void add_f32_cuda(const float * x, const float * y, float * dst, const int
|
1693 |
-
const int num_blocks = (
|
1694 |
-
add_f32<<<num_blocks, CUDA_ADD_BLOCK_SIZE, 0, stream>>>(x, y, dst,
|
1695 |
}
|
1696 |
|
1697 |
static void add_f16_f32_f16_cuda(const half * x, const float * y, half * dst, const int k, cudaStream_t stream) {
|
@@ -1704,15 +2181,26 @@ static void mul_f32_cuda(const float * x, const float * y, float * dst, const in
|
|
1704 |
mul_f32<<<num_blocks, CUDA_MUL_BLOCK_SIZE, 0, stream>>>(x, y, dst, kx, ky);
|
1705 |
}
|
1706 |
|
|
|
|
|
|
|
|
|
|
|
1707 |
static void silu_f32_cuda(const float * x, float * dst, const int k, cudaStream_t stream) {
|
1708 |
const int num_blocks = (k + CUDA_SILU_BLOCK_SIZE - 1) / CUDA_SILU_BLOCK_SIZE;
|
1709 |
silu_f32<<<num_blocks, CUDA_SILU_BLOCK_SIZE, 0, stream>>>(x, dst, k);
|
1710 |
}
|
1711 |
|
1712 |
-
static void
|
|
|
|
|
|
|
|
|
|
|
|
|
1713 |
GGML_ASSERT(ncols % WARP_SIZE == 0);
|
1714 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
1715 |
-
rms_norm_f32<<<nrows, block_dims, 0, stream>>>(x, dst, ncols);
|
1716 |
}
|
1717 |
|
1718 |
static void quantize_row_q8_1_cuda(const float * x, void * vy, const int ndata, const int k, cudaStream_t stream) {
|
@@ -1874,7 +2362,7 @@ static void dequantize_mul_mat_vec_q6_K_cuda(const void * vx, const float * y, f
|
|
1874 |
}
|
1875 |
|
1876 |
static void mul_mat_vec_q4_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
1877 |
-
GGML_ASSERT(ncols %
|
1878 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
1879 |
const dim3 block_nums(1, block_num_y, 1);
|
1880 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
@@ -1883,7 +2371,7 @@ static void mul_mat_vec_q4_0_q8_1_cuda(const void * vx, const void * vy, float *
|
|
1883 |
}
|
1884 |
|
1885 |
static void mul_mat_vec_q4_1_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
1886 |
-
GGML_ASSERT(ncols %
|
1887 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
1888 |
const dim3 block_nums(1, block_num_y, 1);
|
1889 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
@@ -1892,7 +2380,7 @@ static void mul_mat_vec_q4_1_q8_1_cuda(const void * vx, const void * vy, float *
|
|
1892 |
}
|
1893 |
|
1894 |
static void mul_mat_vec_q5_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
1895 |
-
GGML_ASSERT(ncols %
|
1896 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
1897 |
const dim3 block_nums(1, block_num_y, 1);
|
1898 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
@@ -1901,7 +2389,7 @@ static void mul_mat_vec_q5_0_q8_1_cuda(const void * vx, const void * vy, float *
|
|
1901 |
}
|
1902 |
|
1903 |
static void mul_mat_vec_q5_1_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
1904 |
-
GGML_ASSERT(ncols %
|
1905 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
1906 |
const dim3 block_nums(1, block_num_y, 1);
|
1907 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
@@ -1910,7 +2398,7 @@ static void mul_mat_vec_q5_1_q8_1_cuda(const void * vx, const void * vy, float *
|
|
1910 |
}
|
1911 |
|
1912 |
static void mul_mat_vec_q8_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
1913 |
-
GGML_ASSERT(ncols %
|
1914 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
1915 |
const dim3 block_nums(1, block_num_y, 1);
|
1916 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
@@ -1918,6 +2406,57 @@ static void mul_mat_vec_q8_0_q8_1_cuda(const void * vx, const void * vy, float *
|
|
1918 |
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
1919 |
}
|
1920 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1921 |
static void convert_fp16_to_fp32_cuda(const void * vx, float * y, const int k, cudaStream_t stream) {
|
1922 |
const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE;
|
1923 |
dequantize_block<1, 1, convert_f16><<<num_blocks, CUDA_DEQUANTIZE_BLOCK_SIZE, 0, stream>>>(vx, y, k);
|
@@ -1961,20 +2500,23 @@ static to_fp32_cuda_t ggml_get_to_fp32_cuda(ggml_type type) {
|
|
1961 |
}
|
1962 |
}
|
1963 |
|
1964 |
-
static void ggml_mul_mat_p021_f16_f32_cuda(
|
1965 |
-
const
|
|
|
|
|
|
|
1966 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
1967 |
-
mul_mat_p021_f16_f32<<<block_nums, block_dims, 0, stream>>>(vx, y, dst, ncols_x, nrows_x, nchannels_x);
|
1968 |
}
|
1969 |
|
1970 |
static void ggml_mul_mat_vec_nc_f16_f32_cuda(
|
1971 |
const void * vx, const float * y, float * dst, const int ncols_x, const int nrows_x, const int row_stride_x,
|
1972 |
-
const int nchannels_x, const int channel_stride_x, cudaStream_t stream) {
|
1973 |
|
1974 |
-
const dim3 block_nums(1, nrows_x,
|
1975 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
1976 |
mul_mat_vec_nc_f16_f32<<<block_nums, block_dims, 0, stream>>>
|
1977 |
-
(vx, y, dst, ncols_x, nrows_x, row_stride_x, channel_stride_x);
|
1978 |
}
|
1979 |
|
1980 |
static void ggml_cpy_f32_f32_cuda(
|
@@ -2010,6 +2552,14 @@ static void rope_f32_cuda(const float * x, float * dst, const int ncols, const i
|
|
2010 |
rope_f32<<<block_nums, block_dims, 0, stream>>>(x, dst, ncols, p, theta_scale);
|
2011 |
}
|
2012 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013 |
static void diag_mask_inf_f32_cuda(const float * x, float * dst, const int ncols_x, const int nrows_x, const int rows_per_channel, const int n_past, cudaStream_t stream) {
|
2014 |
const dim3 block_dims(CUDA_DIAG_MASK_INF_BLOCK_SIZE, 1, 1);
|
2015 |
const int block_num_x = (ncols_x + CUDA_DIAG_MASK_INF_BLOCK_SIZE - 1) / CUDA_DIAG_MASK_INF_BLOCK_SIZE;
|
@@ -2118,7 +2668,9 @@ static size_t g_scratch_offset = 0;
|
|
2118 |
|
2119 |
static int g_device_count = -1;
|
2120 |
static int g_main_device = 0;
|
|
|
2121 |
static int g_compute_capabilities[GGML_CUDA_MAX_DEVICES];
|
|
|
2122 |
static float g_tensor_split[GGML_CUDA_MAX_DEVICES] = {0};
|
2123 |
|
2124 |
static cublasHandle_t g_cublas_handles[GGML_CUDA_MAX_DEVICES] = {nullptr};
|
@@ -2141,7 +2693,9 @@ void ggml_init_cublas() {
|
|
2141 |
g_tensor_split[id] = total_vram;
|
2142 |
total_vram += prop.totalGlobalMem;
|
2143 |
|
|
|
2144 |
g_compute_capabilities[id] = 100*prop.major + 10*prop.minor;
|
|
|
2145 |
}
|
2146 |
for (int id = 0; id < g_device_count; ++id) {
|
2147 |
g_tensor_split[id] /= total_vram;
|
@@ -2166,6 +2720,9 @@ void ggml_init_cublas() {
|
|
2166 |
}
|
2167 |
|
2168 |
void ggml_cuda_set_tensor_split(const float * tensor_split) {
|
|
|
|
|
|
|
2169 |
bool all_zero = true;
|
2170 |
for (int i = 0; i < g_device_count; ++i) {
|
2171 |
if (tensor_split[i] != 0.0f) {
|
@@ -2262,16 +2819,19 @@ inline void ggml_cuda_op_add(
|
|
2262 |
|
2263 |
GGML_ASSERT(src0_ddq_i != nullptr || src0_ddf_i != nullptr);
|
2264 |
GGML_ASSERT(src1_ddf_i != nullptr);
|
2265 |
-
GGML_ASSERT(dst_ddf_i
|
2266 |
|
2267 |
-
const int64_t
|
2268 |
const int64_t i01_diff = i01_high - i01_low;
|
2269 |
|
|
|
|
|
|
|
2270 |
// compute
|
2271 |
if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) {
|
2272 |
-
add_f32_cuda(src0_ddf_i, src1_ddf_i, dst_ddf_i,
|
2273 |
} else if (src0->type == GGML_TYPE_F16 && dst->type == GGML_TYPE_F16) {
|
2274 |
-
add_f16_f32_f16_cuda((half *) src0_ddq_i, src1_ddf_i, (half *) dst_ddf_i,
|
2275 |
} else {
|
2276 |
GGML_ASSERT(false);
|
2277 |
}
|
@@ -2290,27 +2850,42 @@ inline void ggml_cuda_op_mul(
|
|
2290 |
|
2291 |
GGML_ASSERT(src0_ddf_i != nullptr);
|
2292 |
GGML_ASSERT(src1_ddf_i != nullptr);
|
2293 |
-
GGML_ASSERT(dst_ddf_i
|
2294 |
|
2295 |
const int64_t ne00 = src0->ne[0];
|
|
|
2296 |
|
2297 |
const int64_t ne10 = src1->ne[0];
|
2298 |
const int64_t ne11 = src1->ne[1];
|
2299 |
|
2300 |
-
|
2301 |
-
const int64_t i11 = i1*ne11 + i01%ne11; // broadcast src1 across src0
|
2302 |
|
2303 |
-
|
2304 |
-
|
2305 |
-
|
|
|
|
|
2306 |
|
2307 |
-
|
2308 |
-
|
2309 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2310 |
|
|
|
|
|
|
|
|
|
2311 |
(void) dst;
|
2312 |
(void) src0_ddq_i;
|
|
|
2313 |
(void) i02;
|
|
|
2314 |
}
|
2315 |
|
2316 |
inline void ggml_cuda_op_silu(
|
@@ -2335,6 +2910,28 @@ inline void ggml_cuda_op_silu(
|
|
2335 |
(void) i1;
|
2336 |
}
|
2337 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2338 |
inline void ggml_cuda_op_rms_norm(
|
2339 |
const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, char * src0_ddq_i,
|
2340 |
float * src0_ddf_i, float * src1_ddf_i, float * dst_ddf_i, int64_t i02, int64_t i01_low, int64_t i01_high, int i1,
|
@@ -2346,8 +2943,11 @@ inline void ggml_cuda_op_rms_norm(
|
|
2346 |
const int64_t ne00 = src0->ne[0];
|
2347 |
const int64_t i01_diff = i01_high - i01_low;
|
2348 |
|
|
|
|
|
|
|
2349 |
// compute
|
2350 |
-
rms_norm_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, cudaStream_main);
|
2351 |
|
2352 |
(void) src1;
|
2353 |
(void) dst;
|
@@ -2375,18 +2975,27 @@ inline void ggml_cuda_op_mul_mat_vec(
|
|
2375 |
int id;
|
2376 |
CUDA_CHECK(cudaGetDevice(&id));
|
2377 |
|
2378 |
-
|
|
|
2379 |
src0->type == GGML_TYPE_Q4_1 ||
|
2380 |
src0->type == GGML_TYPE_Q5_0 ||
|
2381 |
src0->type == GGML_TYPE_Q5_1 ||
|
2382 |
src0->type == GGML_TYPE_Q8_0;
|
2383 |
-
|
2384 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2385 |
#endif
|
2386 |
|
2387 |
if (use_mul_mat_vec_q) {
|
2388 |
-
int64_t padded_row_size = ne00
|
2389 |
-
|
2390 |
size_t as;
|
2391 |
void * src1_q8_1 = ggml_cuda_pool_malloc(padded_row_size*sizeof(block_q8_1)/QK8_1, &as);
|
2392 |
quantize_row_q8_1_cuda(src1_ddf_i, src1_q8_1, ne00, padded_row_size, cudaStream_main);
|
@@ -2407,6 +3016,21 @@ inline void ggml_cuda_op_mul_mat_vec(
|
|
2407 |
case GGML_TYPE_Q8_0:
|
2408 |
mul_mat_vec_q8_0_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
2409 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2410 |
default:
|
2411 |
GGML_ASSERT(false);
|
2412 |
break;
|
@@ -2538,20 +3162,31 @@ inline void ggml_cuda_op_rope(
|
|
2538 |
const int64_t ne00 = src0->ne[0];
|
2539 |
const int64_t i01_diff = i01_high - i01_low;
|
2540 |
|
2541 |
-
const int n_past = ((int32_t *)
|
2542 |
-
const int n_dims = ((int32_t *)
|
2543 |
-
const int mode = ((int32_t *)
|
2544 |
-
const int n_ctx = ((int32_t *)
|
2545 |
-
|
2546 |
|
2547 |
-
|
2548 |
-
|
|
|
2549 |
|
2550 |
-
const float
|
|
|
|
|
|
|
2551 |
|
2552 |
// compute
|
2553 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
2554 |
|
|
|
2555 |
(void) dst;
|
2556 |
(void) src0_ddq_i;
|
2557 |
(void) src1_ddf_i;
|
@@ -2570,11 +3205,12 @@ inline void ggml_cuda_op_diag_mask_inf(
|
|
2570 |
const int64_t ne01 = src0->ne[1];
|
2571 |
const int64_t i01_diff = i01_high - i01_low;
|
2572 |
|
2573 |
-
const int n_past = ((int32_t *)
|
2574 |
|
2575 |
// compute
|
2576 |
diag_mask_inf_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, ne01, n_past, cudaStream_main);
|
2577 |
|
|
|
2578 |
(void) dst;
|
2579 |
(void) src0_ddq_i;
|
2580 |
(void) src1_ddf_i;
|
@@ -2642,6 +3278,9 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2642 |
const int64_t ne11 = use_src1 ? src1->ne[1] : 1;
|
2643 |
const int64_t ne12 = use_src1 ? src1->ne[2] : 1;
|
2644 |
const int64_t ne13 = use_src1 ? src1->ne[3] : 1;
|
|
|
|
|
|
|
2645 |
|
2646 |
const int64_t ne0 = dst->ne[0];
|
2647 |
const int64_t ne1 = dst->ne[1];
|
@@ -2653,12 +3292,19 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2653 |
GGML_ASSERT(!use_src1 || src1->backend != GGML_BACKEND_GPU_SPLIT);
|
2654 |
|
2655 |
// strides for iteration over dims 3 and 2
|
2656 |
-
const int64_t
|
2657 |
-
const int64_t
|
|
|
2658 |
const int64_t src0_stride = ne00 * ne01 * stride_mod;
|
2659 |
const int64_t src1_stride = ne10 * ne11 * stride_mod;
|
2660 |
const int64_t dst_stride = ne0 * ne1 * stride_mod;
|
2661 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2662 |
const size_t src0_ts = ggml_type_size(src0->type);
|
2663 |
const size_t src0_bs = ggml_blck_size(src0->type);
|
2664 |
|
@@ -2675,6 +3321,7 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2675 |
dst->op == GGML_OP_SCALE || dst->op == GGML_OP_DIAG_MASK_INF || dst->op == GGML_OP_ROPE);
|
2676 |
|
2677 |
const bool split = src0->backend == GGML_BACKEND_GPU_SPLIT;
|
|
|
2678 |
|
2679 |
const to_fp32_cuda_t to_fp32_cuda = ggml_get_to_fp32_cuda(src0->type);
|
2680 |
|
@@ -2711,7 +3358,7 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2711 |
row_high = id == g_device_count - 1 ? nrows0 : nrows0*g_tensor_split[id + 1];
|
2712 |
} else {
|
2713 |
row_low = 0;
|
2714 |
-
row_high = nrows0;
|
2715 |
}
|
2716 |
if (row_low == row_high) {
|
2717 |
continue;
|
@@ -2759,16 +3406,12 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2759 |
dst_ddf[id] = (float *) ggml_cuda_pool_malloc(size_dst_ddf, &dst_asf[id]);
|
2760 |
}
|
2761 |
|
2762 |
-
const int64_t i03_max = flatten_rows ? 1 : ne03;
|
2763 |
-
const int64_t i02_max = flatten_rows ? 1 : ne02;
|
2764 |
-
const int64_t rows_per_iter = flatten_rows ? nrows0 : ne01;
|
2765 |
-
|
2766 |
for (int64_t i03 = 0; i03 < i03_max; i03++) {
|
2767 |
const int64_t i13 = i03 % ne13;
|
2768 |
for (int64_t i02 = 0; i02 < i02_max; i02++) {
|
2769 |
const int64_t i12 = i02 % ne12;
|
2770 |
|
2771 |
-
const int64_t i0 = i03*
|
2772 |
|
2773 |
// i0 values that contain the lower/upper rows for a split tensor when using multiple GPUs
|
2774 |
const int64_t i0_offset_low = row_low/rows_per_iter;
|
@@ -2802,10 +3445,10 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2802 |
const int64_t i11 = i13*ne12 + i12;
|
2803 |
|
2804 |
// for split tensors the data begins at i0 == i0_offset_low
|
2805 |
-
char * src0_ddq_i = src0_ddq[id] + (i0 - i0_offset_low)*src0_stride*src0_ts/src0_bs;
|
2806 |
-
float * src0_ddf_i = src0_ddf[id] + (i0 - i0_offset_low)*src0_stride;
|
2807 |
float * src1_ddf_i = src1_ddf[id] + i11*src1_stride;
|
2808 |
-
float * dst_ddf_i = dst_ddf[id] + (i0
|
2809 |
|
2810 |
// for split tensors the data pointer needs to be rounded down
|
2811 |
// to the bin edge for i03, i02 bins beyond the first
|
@@ -2844,11 +3487,11 @@ static void ggml_cuda_op(const ggml_tensor * src0, const ggml_tensor * src1, ggm
|
|
2844 |
}
|
2845 |
}
|
2846 |
|
2847 |
-
if (!src0_on_device || !src0_is_contiguous) {
|
2848 |
if (src0_is_f32) {
|
2849 |
-
CUDA_CHECK(ggml_cuda_cpy_tensor_2d(src0_ddf_i, src0, i03, i02, i01_low, i01_high, cudaStream_main));
|
2850 |
} else {
|
2851 |
-
CUDA_CHECK(ggml_cuda_cpy_tensor_2d(src0_ddq_i, src0, i03, i02, i01_low, i01_high, cudaStream_main));
|
2852 |
}
|
2853 |
}
|
2854 |
|
@@ -2953,11 +3596,21 @@ void ggml_cuda_mul(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tens
|
|
2953 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_mul, true, false); // TODO ggml_cuda_op needs modification for flatten
|
2954 |
}
|
2955 |
|
|
|
|
|
|
|
|
|
|
|
2956 |
void ggml_cuda_silu(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
2957 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
2958 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_silu, true, true);
|
2959 |
}
|
2960 |
|
|
|
|
|
|
|
|
|
|
|
2961 |
void ggml_cuda_rms_norm(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
2962 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
2963 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_rms_norm, true, true);
|
@@ -2992,6 +3645,8 @@ void ggml_cuda_mul_mat_vec_p021(const ggml_tensor * src0, const ggml_tensor * sr
|
|
2992 |
const int64_t ne01 = src0->ne[1];
|
2993 |
const int64_t ne02 = src0->ne[2];
|
2994 |
|
|
|
|
|
2995 |
CUDA_CHECK(cudaSetDevice(g_main_device));
|
2996 |
cudaStream_t cudaStream_main = g_cudaStreams_main[g_main_device];
|
2997 |
|
@@ -3004,7 +3659,7 @@ void ggml_cuda_mul_mat_vec_p021(const ggml_tensor * src0, const ggml_tensor * sr
|
|
3004 |
struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra;
|
3005 |
float * dst_ddf = (float *) dst_extra->data_device[g_main_device];
|
3006 |
|
3007 |
-
ggml_mul_mat_p021_f16_f32_cuda(src0_ddq, src1_ddf, dst_ddf, ne00, ne01, ne02, cudaStream_main);
|
3008 |
}
|
3009 |
|
3010 |
void ggml_cuda_mul_mat_vec_nc(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst){
|
@@ -3018,6 +3673,8 @@ void ggml_cuda_mul_mat_vec_nc(const ggml_tensor * src0, const ggml_tensor * src1
|
|
3018 |
const int64_t ne01 = src0->ne[1];
|
3019 |
const int64_t ne02 = src0->ne[2];
|
3020 |
|
|
|
|
|
3021 |
const int64_t nb01 = src0->nb[1];
|
3022 |
const int64_t nb02 = src0->nb[2];
|
3023 |
|
@@ -3036,7 +3693,7 @@ void ggml_cuda_mul_mat_vec_nc(const ggml_tensor * src0, const ggml_tensor * src1
|
|
3036 |
const int row_stride_x = nb01 / sizeof(half);
|
3037 |
const int channel_stride_x = nb02 / sizeof(half);
|
3038 |
|
3039 |
-
ggml_mul_mat_vec_nc_f16_f32_cuda(src0_ddq, src1_ddf, dst_ddf, ne00, ne01, row_stride_x, ne02, channel_stride_x, cudaStream_main);
|
3040 |
}
|
3041 |
|
3042 |
void ggml_cuda_mul_mat(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
@@ -3113,6 +3770,11 @@ void ggml_cuda_cpy(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tens
|
|
3113 |
(void) dst;
|
3114 |
}
|
3115 |
|
|
|
|
|
|
|
|
|
|
|
3116 |
void ggml_cuda_diag_mask_inf(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3117 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3118 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_diag_mask_inf, true, true);
|
@@ -3172,7 +3834,7 @@ void ggml_cuda_transform_tensor(void * data, struct ggml_tensor * tensor) {
|
|
3172 |
size_t size = ggml_nbytes_split(tensor, nrows_split);
|
3173 |
const size_t original_size = size;
|
3174 |
|
3175 |
-
// pad last row to a multiple of
|
3176 |
if (ne0 % MATRIX_ROW_PADDING != 0) {
|
3177 |
size += (MATRIX_ROW_PADDING - ne0 % MATRIX_ROW_PADDING)
|
3178 |
* ggml_type_size(tensor->type)/ggml_blck_size(tensor->type);
|
@@ -3188,7 +3850,7 @@ void ggml_cuda_transform_tensor(void * data, struct ggml_tensor * tensor) {
|
|
3188 |
}
|
3189 |
|
3190 |
|
3191 |
-
cudaMemcpy(buf, buf_host,
|
3192 |
|
3193 |
extra->data_device[id] = buf;
|
3194 |
|
@@ -3222,6 +3884,22 @@ void ggml_cuda_free_data(struct ggml_tensor * tensor) {
|
|
3222 |
delete extra;
|
3223 |
}
|
3224 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3225 |
void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bool force_inplace) {
|
3226 |
if (scratch && g_scratch_size == 0) {
|
3227 |
return;
|
@@ -3230,7 +3908,7 @@ void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bo
|
|
3230 |
// recursively assign CUDA buffers until a compute tensor is found
|
3231 |
if (tensor->src[0] != nullptr && tensor->src[0]->backend == GGML_BACKEND_CPU) {
|
3232 |
const ggml_op src0_op = tensor->src[0]->op;
|
3233 |
-
if (src0_op == GGML_OP_RESHAPE || src0_op == GGML_OP_TRANSPOSE || src0_op == GGML_OP_VIEW) {
|
3234 |
ggml_cuda_assign_buffers_impl(tensor->src[0], scratch, force_inplace);
|
3235 |
}
|
3236 |
}
|
@@ -3239,8 +3917,7 @@ void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bo
|
|
3239 |
}
|
3240 |
|
3241 |
tensor->backend = GGML_BACKEND_GPU;
|
3242 |
-
struct ggml_tensor_extra_gpu * extra
|
3243 |
-
memset(extra, 0, sizeof(*extra));
|
3244 |
|
3245 |
const bool inplace = (tensor->src[0] != nullptr && tensor->src[0]->data == tensor->data) ||
|
3246 |
tensor->op == GGML_OP_VIEW ||
|
@@ -3253,12 +3930,14 @@ void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bo
|
|
3253 |
char * src0_ddc = (char *) src0_extra->data_device[g_main_device];
|
3254 |
size_t offset = 0;
|
3255 |
if (tensor->op == GGML_OP_VIEW) {
|
3256 |
-
memcpy(&offset, tensor->
|
3257 |
}
|
|
|
3258 |
extra->data_device[g_main_device] = src0_ddc + offset;
|
3259 |
} else if (tensor->op == GGML_OP_CPY) {
|
3260 |
struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu * ) tensor->src[1]->extra;
|
3261 |
void * src1_ddv = src1_extra->data_device[g_main_device];
|
|
|
3262 |
extra->data_device[g_main_device] = src1_ddv;
|
3263 |
} else if (scratch) {
|
3264 |
GGML_ASSERT(size <= g_scratch_size);
|
@@ -3271,6 +3950,7 @@ void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bo
|
|
3271 |
CUDA_CHECK(cudaMalloc(&data, g_scratch_size));
|
3272 |
g_scratch_buffer = data;
|
3273 |
}
|
|
|
3274 |
extra->data_device[g_main_device] = data + g_scratch_offset;
|
3275 |
|
3276 |
g_scratch_offset += size;
|
@@ -3280,6 +3960,8 @@ void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bo
|
|
3280 |
void * data;
|
3281 |
CUDA_CHECK(cudaMalloc(&data, size));
|
3282 |
CUDA_CHECK(cudaMemset(data, 0, size));
|
|
|
|
|
3283 |
extra->data_device[g_main_device] = data;
|
3284 |
}
|
3285 |
|
@@ -3332,6 +4014,12 @@ bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_
|
|
3332 |
|| (tensor->src[1] != nullptr && tensor->src[1]->backend == GGML_BACKEND_GPU);
|
3333 |
|
3334 |
switch (tensor->op) {
|
|
|
|
|
|
|
|
|
|
|
|
|
3335 |
case GGML_OP_ADD:
|
3336 |
if (!any_on_device) {
|
3337 |
return false;
|
@@ -3344,11 +4032,28 @@ bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_
|
|
3344 |
}
|
3345 |
func = ggml_cuda_mul;
|
3346 |
break;
|
3347 |
-
case
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3348 |
if (!any_on_device) {
|
3349 |
return false;
|
3350 |
}
|
3351 |
-
func =
|
3352 |
break;
|
3353 |
case GGML_OP_RMS_NORM:
|
3354 |
if (!any_on_device) {
|
@@ -3374,6 +4079,12 @@ bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_
|
|
3374 |
}
|
3375 |
func = ggml_cuda_cpy;
|
3376 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
3377 |
case GGML_OP_RESHAPE:
|
3378 |
case GGML_OP_VIEW:
|
3379 |
case GGML_OP_PERMUTE:
|
|
|
13 |
#include "ggml-cuda.h"
|
14 |
#include "ggml.h"
|
15 |
|
16 |
+
#define MIN_CC_DP4A 610 // minimum compute capability for __dp4a, an intrinsic for byte-wise dot products
|
17 |
+
|
18 |
#if defined(_MSC_VER)
|
19 |
#pragma warning(disable: 4244 4267) // possible loss of data
|
20 |
#endif
|
|
|
76 |
|
77 |
#define QK4_0 32
|
78 |
#define QR4_0 2
|
79 |
+
#define QI4_0 (QK4_0 / (4 * QR4_0))
|
80 |
typedef struct {
|
81 |
half d; // delta
|
82 |
uint8_t qs[QK4_0 / 2]; // nibbles / quants
|
|
|
85 |
|
86 |
#define QK4_1 32
|
87 |
#define QR4_1 2
|
88 |
+
#define QI4_1 (QK4_1 / (4 * QR4_1))
|
89 |
typedef struct {
|
90 |
half d; // delta
|
91 |
half m; // min
|
|
|
95 |
|
96 |
#define QK5_0 32
|
97 |
#define QR5_0 2
|
98 |
+
#define QI5_0 (QK5_0 / (4 * QR5_0))
|
99 |
typedef struct {
|
100 |
half d; // delta
|
101 |
uint8_t qh[4]; // 5-th bit of quants
|
|
|
105 |
|
106 |
#define QK5_1 32
|
107 |
#define QR5_1 2
|
108 |
+
#define QI5_1 (QK5_1 / (4 * QR5_1))
|
109 |
typedef struct {
|
110 |
half d; // delta
|
111 |
half m; // min
|
|
|
116 |
|
117 |
#define QK8_0 32
|
118 |
#define QR8_0 1
|
119 |
+
#define QI8_0 (QK8_0 / (4 * QR8_0))
|
120 |
typedef struct {
|
121 |
half d; // delta
|
122 |
int8_t qs[QK8_0]; // quants
|
|
|
125 |
|
126 |
#define QK8_1 32
|
127 |
#define QR8_1 1
|
128 |
+
#define QI8_1 (QK8_1 / (4 * QR8_1))
|
129 |
typedef struct {
|
130 |
half d; // delta
|
131 |
half s; // unquantized sum
|
|
|
145 |
#define K_SCALE_SIZE 12
|
146 |
#endif
|
147 |
|
148 |
+
#define QR2_K 4
|
149 |
+
#define QI2_K (QK_K / (4*QR2_K))
|
150 |
typedef struct {
|
151 |
uint8_t scales[QK_K/16]; // scales and mins, quantized with 4 bits
|
152 |
uint8_t qs[QK_K/4]; // quants
|
|
|
155 |
} block_q2_K;
|
156 |
static_assert(sizeof(block_q2_K) == 2*sizeof(ggml_fp16_t) + QK_K/16 + QK_K/4, "wrong q2_K block size/padding");
|
157 |
|
158 |
+
#define QR3_K 4
|
159 |
+
#define QI3_K (QK_K / (4*QR3_K))
|
160 |
typedef struct {
|
161 |
uint8_t hmask[QK_K/8]; // quants - high bit
|
162 |
uint8_t qs[QK_K/4]; // quants - low 2 bits
|
|
|
169 |
} block_q3_K;
|
170 |
//static_assert(sizeof(block_q3_K) == sizeof(ggml_fp16_t) + QK_K / 4 + QK_K / 8 + K_SCALE_SIZE, "wrong q3_K block size/padding");
|
171 |
|
172 |
+
#define QR4_K 2
|
173 |
+
#define QI4_K (QK_K / (4*QR4_K))
|
174 |
#ifdef GGML_QKK_64
|
175 |
typedef struct {
|
176 |
half d[2]; // super-block scales/mins
|
|
|
188 |
static_assert(sizeof(block_q4_K) == 2*sizeof(ggml_fp16_t) + 3*QK_K/64 + QK_K/2, "wrong q4_K block size/padding");
|
189 |
#endif
|
190 |
|
191 |
+
#define QR5_K 2
|
192 |
+
#define QI5_K (QK_K / (4*QR5_K))
|
193 |
#ifdef GGML_QKK_64
|
194 |
typedef struct {
|
195 |
half d; // super-block scale
|
|
|
209 |
static_assert(sizeof(block_q5_K) == 2*sizeof(ggml_fp16_t) + K_SCALE_SIZE + QK_K/2 + QK_K/8, "wrong q5_K block size/padding");
|
210 |
#endif
|
211 |
|
212 |
+
#define QR6_K 2
|
213 |
+
#define QI6_K (QK_K / (4*QR6_K))
|
214 |
typedef struct {
|
215 |
uint8_t ql[QK_K/2]; // quants, lower 4 bits
|
216 |
uint8_t qh[QK_K/4]; // quants, upper 2 bits
|
|
|
220 |
static_assert(sizeof(block_q6_K) == sizeof(ggml_fp16_t) + 13*QK_K/16, "wrong q6_K block size/padding");
|
221 |
|
222 |
#define WARP_SIZE 32
|
223 |
+
#define MATRIX_ROW_PADDING 512 // last row of quant. matrices is a multiple of this to avoid out-of-bounds memory accesses
|
224 |
|
225 |
#define CUDA_ADD_BLOCK_SIZE 256
|
226 |
#define CUDA_MUL_BLOCK_SIZE 256
|
227 |
+
#define CUDA_GELU_BLOCK_SIZE 256
|
228 |
#define CUDA_SILU_BLOCK_SIZE 256
|
229 |
#define CUDA_CPY_BLOCK_SIZE 32
|
230 |
#define CUDA_SCALE_BLOCK_SIZE 256
|
|
|
252 |
cudaEvent_t events[GGML_CUDA_MAX_DEVICES]; // events for synchronizing multiple GPUs
|
253 |
};
|
254 |
|
255 |
+
static __global__ void add_f32(const float * x, const float * y, float * dst, const int kx, const int ky) {
|
256 |
const int i = blockDim.x*blockIdx.x + threadIdx.x;
|
257 |
|
258 |
+
if (i >= kx) {
|
259 |
return;
|
260 |
}
|
261 |
+
dst[i] = x[i] + y[i%ky];
|
262 |
}
|
263 |
|
264 |
static __global__ void add_f16_f32_f16(const half * x, const float * y, half * dst, const int k) {
|
|
|
279 |
dst[i] = x[i] * y[i%ky];
|
280 |
}
|
281 |
|
282 |
+
static __global__ void gelu_f32(const float * x, float * dst, const int k) {
|
283 |
+
const float GELU_COEF_A = 0.044715f;
|
284 |
+
const float SQRT_2_OVER_PI = 0.79788456080286535587989211986876f;
|
285 |
+
const int i = blockDim.x*blockIdx.x + threadIdx.x;
|
286 |
+
|
287 |
+
if (i >= k) {
|
288 |
+
return;
|
289 |
+
}
|
290 |
+
|
291 |
+
float xi = x[i];
|
292 |
+
dst[i] = 0.5f*xi*(1.0f + tanhf(SQRT_2_OVER_PI*xi*(1.0f + GELU_COEF_A*xi*xi)));
|
293 |
+
}
|
294 |
+
|
295 |
static __global__ void silu_f32(const float * x, float * dst, const int k) {
|
296 |
const int i = blockDim.x*blockIdx.x + threadIdx.x;
|
297 |
|
|
|
301 |
dst[i] = x[i] / (1.0f + expf(-x[i]));
|
302 |
}
|
303 |
|
304 |
+
static __global__ void norm_f32(const float * x, float * dst, const int ncols) {
|
305 |
const int row = blockIdx.x*blockDim.y + threadIdx.y;
|
306 |
const int tid = threadIdx.x;
|
307 |
|
308 |
+
const float eps = 1e-5f;
|
309 |
+
|
310 |
+
float mean = 0.0f;
|
311 |
+
float var = 0.0f;
|
312 |
+
|
313 |
+
for (int col = tid; col < ncols; col += WARP_SIZE) {
|
314 |
+
const float xi = x[row*ncols + col];
|
315 |
+
mean += xi;
|
316 |
+
var += xi * xi;
|
317 |
+
}
|
318 |
+
|
319 |
+
// sum up partial sums
|
320 |
+
#pragma unroll
|
321 |
+
for (int mask = 16; mask > 0; mask >>= 1) {
|
322 |
+
mean += __shfl_xor_sync(0xffffffff, mean, mask, 32);
|
323 |
+
var += __shfl_xor_sync(0xffffffff, var, mask, 32);
|
324 |
+
}
|
325 |
+
|
326 |
+
mean /= ncols;
|
327 |
+
var = var / ncols - mean * mean;
|
328 |
+
const float inv_var = rsqrtf(var + eps);
|
329 |
+
|
330 |
+
for (int col = tid; col < ncols; col += WARP_SIZE) {
|
331 |
+
dst[row*ncols + col] = (x[row*ncols + col] - mean) * inv_var;
|
332 |
+
}
|
333 |
+
}
|
334 |
+
|
335 |
+
static __global__ void rms_norm_f32(const float * x, float * dst, const int ncols, const float eps) {
|
336 |
+
const int row = blockIdx.x*blockDim.y + threadIdx.y;
|
337 |
+
const int tid = threadIdx.x;
|
338 |
|
339 |
float tmp = 0.0f; // partial sum for thread in warp
|
340 |
|
341 |
+
for (int col = tid; col < ncols; col += WARP_SIZE) {
|
|
|
342 |
const float xi = x[row*ncols + col];
|
343 |
tmp += xi * xi;
|
344 |
}
|
|
|
350 |
}
|
351 |
|
352 |
const float mean = tmp / ncols;
|
353 |
+
const float scale = rsqrtf(mean + eps);
|
354 |
|
355 |
+
for (int col = tid; col < ncols; col += WARP_SIZE) {
|
|
|
356 |
dst[row*ncols + col] = scale * x[row*ncols + col];
|
357 |
}
|
358 |
}
|
|
|
933 |
uint16_t aux[4];
|
934 |
const uint8_t * sc = (const uint8_t *)aux;
|
935 |
|
936 |
+
#if K_QUANTS_PER_ITERATION == 2
|
937 |
+
uint32_t q32[4];
|
938 |
+
const uint8_t * q4 = (const uint8_t *)q32;
|
939 |
+
#else
|
940 |
+
uint16_t q16[4];
|
941 |
+
const uint8_t * q4 = (const uint8_t *)q16;
|
942 |
+
#endif
|
943 |
+
|
944 |
float tmp = 0; // partial sum for thread in warp
|
945 |
|
946 |
for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
|
947 |
|
|
|
|
|
948 |
const float * y1 = yy + i*QK_K + y_offset;
|
949 |
const float * y2 = y1 + 128;
|
950 |
|
|
|
957 |
aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
|
958 |
aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
|
959 |
|
960 |
+
#if K_QUANTS_PER_ITERATION == 2
|
961 |
+
const uint32_t * q1 = (const uint32_t *)(x[i].qs + q_offset);
|
962 |
+
const uint32_t * q2 = q1 + 16;
|
963 |
+
|
964 |
+
q32[0] = q1[0] & 0x0f0f0f0f;
|
965 |
+
q32[1] = q1[0] & 0xf0f0f0f0;
|
966 |
+
q32[2] = q2[0] & 0x0f0f0f0f;
|
967 |
+
q32[3] = q2[0] & 0xf0f0f0f0;
|
968 |
+
|
969 |
float4 s = {0.f, 0.f, 0.f, 0.f};
|
970 |
float smin = 0;
|
971 |
+
for (int l = 0; l < 4; ++l) {
|
972 |
+
s.x += y1[l] * q4[l+0]; s.y += y1[l+32] * q4[l+ 4];
|
973 |
+
s.z += y2[l] * q4[l+8]; s.w += y2[l+32] * q4[l+12];
|
974 |
smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
|
975 |
}
|
976 |
+
tmp += dall * (s.x * sc[0] + s.y * sc[1] * 1.f/16.f + s.z * sc[4] + s.w * sc[5] * 1.f/16.f) - dmin * smin;
|
977 |
+
#else
|
978 |
+
const uint16_t * q1 = (const uint16_t *)(x[i].qs + q_offset);
|
979 |
+
const uint16_t * q2 = q1 + 32;
|
980 |
+
|
981 |
+
q16[0] = q1[0] & 0x0f0f;
|
982 |
+
q16[1] = q1[0] & 0xf0f0;
|
983 |
+
q16[2] = q2[0] & 0x0f0f;
|
984 |
+
q16[3] = q2[0] & 0xf0f0;
|
985 |
+
|
986 |
+
float4 s = {0.f, 0.f, 0.f, 0.f};
|
987 |
+
float smin = 0;
|
988 |
+
for (int l = 0; l < 2; ++l) {
|
989 |
+
s.x += y1[l] * q4[l+0]; s.y += y1[l+32] * q4[l+2];
|
990 |
+
s.z += y2[l] * q4[l+4]; s.w += y2[l+32] * q4[l+6];
|
991 |
+
smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
|
992 |
+
}
|
993 |
+
tmp += dall * (s.x * sc[0] + s.y * sc[1] * 1.f/16.f + s.z * sc[4] + s.w * sc[5] * 1.f/16.f) - dmin * smin;
|
994 |
+
#endif
|
995 |
|
996 |
}
|
997 |
#else
|
|
|
1071 |
uint16_t aux[4];
|
1072 |
const uint8_t * sc = (const uint8_t *)aux;
|
1073 |
|
1074 |
+
uint16_t q16[8];
|
1075 |
+
const uint8_t * q4 = (const uint8_t *)q16;
|
1076 |
+
|
1077 |
for (int i = ix; i < num_blocks_per_row; i += 2) {
|
1078 |
|
1079 |
const uint8_t * ql1 = x[i].qs + q_offset;
|
|
|
1080 |
const uint8_t * qh = x[i].qh + l0;
|
1081 |
const float * y1 = yy + i*QK_K + y_offset;
|
1082 |
const float * y2 = y1 + 128;
|
|
|
1092 |
|
1093 |
float4 sum = {0.f, 0.f, 0.f, 0.f};
|
1094 |
float smin = 0;
|
1095 |
+
const uint16_t * q1 = (const uint16_t *)ql1;
|
1096 |
+
const uint16_t * q2 = q1 + 32;
|
1097 |
+
q16[0] = q1[0] & 0x0f0f;
|
1098 |
+
q16[1] = q1[8] & 0x0f0f;
|
1099 |
+
q16[2] = (q1[0] >> 4) & 0x0f0f;
|
1100 |
+
q16[3] = (q1[8] >> 4) & 0x0f0f;
|
1101 |
+
q16[4] = q2[0] & 0x0f0f;
|
1102 |
+
q16[5] = q2[8] & 0x0f0f;
|
1103 |
+
q16[6] = (q2[0] >> 4) & 0x0f0f;
|
1104 |
+
q16[7] = (q2[8] >> 4) & 0x0f0f;
|
1105 |
for (int l = 0; l < n; ++l) {
|
1106 |
+
sum.x += y1[l+ 0] * (q4[l +0] + (qh[l+ 0] & (hm1 << 0) ? 16 : 0))
|
1107 |
+
+ y1[l+16] * (q4[l +2] + (qh[l+16] & (hm1 << 0) ? 16 : 0));
|
1108 |
+
sum.y += y1[l+32] * (q4[l +4] + (qh[l+ 0] & (hm1 << 1) ? 16 : 0))
|
1109 |
+
+ y1[l+48] * (q4[l +6] + (qh[l+16] & (hm1 << 1) ? 16 : 0));
|
1110 |
+
sum.z += y2[l+ 0] * (q4[l +8] + (qh[l+ 0] & (hm2 << 0) ? 16 : 0))
|
1111 |
+
+ y2[l+16] * (q4[l+10] + (qh[l+16] & (hm2 << 0) ? 16 : 0));
|
1112 |
+
sum.w += y2[l+32] * (q4[l+12] + (qh[l+ 0] & (hm2 << 1) ? 16 : 0))
|
1113 |
+
+ y2[l+48] * (q4[l+14] + (qh[l+16] & (hm2 << 1) ? 16 : 0));
|
1114 |
smin += (y1[l] + y1[l+16]) * sc[2] + (y1[l+32] + y1[l+48]) * sc[3]
|
1115 |
+ (y2[l] + y2[l+16]) * sc[6] + (y2[l+32] + y2[l+48]) * sc[7];
|
1116 |
}
|
|
|
1326 |
y[iybs + iqs + y_offset] = v.y;
|
1327 |
}
|
1328 |
|
1329 |
+
static __device__ __forceinline__ float vec_dot_q4_0_q8_1(
|
1330 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1331 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1332 |
const block_q4_0 * bq4_0 = (const block_q4_0 *) vbq;
|
1333 |
|
1334 |
int vi;
|
|
|
1349 |
return sumi*d;
|
1350 |
#else
|
1351 |
return 0.0f; // only to satisfy the compiler
|
1352 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1353 |
}
|
1354 |
|
1355 |
+
static __device__ __forceinline__ float vec_dot_q4_1_q8_1(
|
1356 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1357 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1358 |
const block_q4_1 * bq4_1 = (const block_q4_1 *) vbq;
|
1359 |
|
1360 |
const int vi = *((int *) &bq4_1->qs[sizeof(int) * (iqs + 0)]);
|
|
|
1375 |
return sumi*d + m*s / QI4_1; // scale sum by QI4_1 because there are QI4_1 threads working on this block
|
1376 |
#else
|
1377 |
return 0.0f; // only to satisfy the compiler
|
1378 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1379 |
}
|
1380 |
|
1381 |
+
static __device__ __forceinline__ float vec_dot_q5_0_q8_1(
|
1382 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1383 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1384 |
const block_q5_0 * bq5_0 = (const block_q5_0 *) vbq;
|
1385 |
|
1386 |
int qs;
|
|
|
1411 |
return sumi*d;
|
1412 |
#else
|
1413 |
return 0.0f; // only to satisfy the compiler
|
1414 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1415 |
}
|
1416 |
|
1417 |
+
static __device__ __forceinline__ float vec_dot_q5_1_q8_1(
|
1418 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1419 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1420 |
const block_q5_1 * bq5_1 = (const block_q5_1 *) vbq;
|
1421 |
|
1422 |
const int qs = *((int *) &bq5_1->qs[sizeof(int) * (iqs + 0)]);
|
|
|
1446 |
return sumi*d + m*s / QI5_1; // scale sum by QI5_1 because there are QI5_1 threads working on this block
|
1447 |
#else
|
1448 |
return 0.0f; // only to satisfy the compiler
|
1449 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1450 |
}
|
1451 |
|
1452 |
+
static __device__ __forceinline__ float vec_dot_q8_0_q8_1(
|
1453 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1454 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1455 |
const block_q8_0 * bq8_0 = (const block_q8_0 *) vbq;
|
1456 |
|
1457 |
int vi;
|
|
|
1466 |
return sumi*d;
|
1467 |
#else
|
1468 |
return 0.0f; // only to satisfy the compiler
|
1469 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1470 |
+
}
|
1471 |
+
|
1472 |
+
static __device__ __forceinline__ float vec_dot_q2_K_q8_1(
|
1473 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1474 |
+
|
1475 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1476 |
+
const block_q2_K * bq2_K = (const block_q2_K *) vbq;
|
1477 |
+
|
1478 |
+
const int bq8_offset = QR2_K * (iqs / QI8_1);
|
1479 |
+
const int scale_offset = iqs - iqs % QI8_1 + (iqs % QI8_1) / (QI8_1/2);
|
1480 |
+
|
1481 |
+
float sumf_d = 0.0f;
|
1482 |
+
float sumf_m = 0.0f;
|
1483 |
+
|
1484 |
+
const float d = bq2_K->d;
|
1485 |
+
const float dmin = bq2_K->dmin;
|
1486 |
+
|
1487 |
+
const int v = *((int *) &bq2_K->qs[sizeof(int) * iqs]);
|
1488 |
+
|
1489 |
+
for (int i = 0; i < QR2_K; ++i) {
|
1490 |
+
const int sc = bq2_K->scales[scale_offset + 2*i];
|
1491 |
+
|
1492 |
+
const block_q8_1 * bq8i = bq8_1 + bq8_offset + i;
|
1493 |
+
const float d8i = bq8i->d;
|
1494 |
+
|
1495 |
+
const int vi = (v >> (2*i)) & 0x03030303;
|
1496 |
+
const int ui = *((int*) &bq8i->qs[sizeof(int) * (iqs % QI8_1)]);
|
1497 |
+
|
1498 |
+
sumf_d += d8i * (__dp4a(vi, ui, 0) * (sc & 0xF)); // SIMD dot product
|
1499 |
+
sumf_m += d8i * (__dp4a(0x01010101, ui, 0) * (sc >> 4)); // multiply constant q2_K part with sum of q8_1 values
|
1500 |
+
}
|
1501 |
+
|
1502 |
+
return d*sumf_d - dmin*sumf_m;
|
1503 |
+
#else
|
1504 |
+
return 0.0f; // only to satisfy the compiler
|
1505 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1506 |
+
}
|
1507 |
+
|
1508 |
+
static __device__ __forceinline__ float vec_dot_q3_K_q8_1(
|
1509 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1510 |
+
|
1511 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1512 |
+
const block_q3_K * bq3_K = (const block_q3_K *) vbq;
|
1513 |
+
|
1514 |
+
const int bq8_offset = QR3_K * (iqs / (QI3_K/2));
|
1515 |
+
const int scale_offset = iqs - iqs % QI8_1 + (iqs % QI8_1) / (QI8_1/2);
|
1516 |
+
|
1517 |
+
float sumf = 0.0f;
|
1518 |
+
|
1519 |
+
const float d = bq3_K->d;
|
1520 |
+
|
1521 |
+
int vl;
|
1522 |
+
memcpy(&vl, &bq3_K->qs[sizeof(int) * iqs], sizeof(int));
|
1523 |
+
|
1524 |
+
int vh;
|
1525 |
+
memcpy(&vh, &bq3_K->hmask[sizeof(int) * (iqs % (QI3_K/2))], sizeof(int));
|
1526 |
+
vh = ~vh; // invert the mask so that a 0/1 results in 4/0 being subtracted
|
1527 |
+
vh >>= bq8_offset;
|
1528 |
+
|
1529 |
+
for (int i = 0; i < QR3_K; ++i) {
|
1530 |
+
const int isc = scale_offset + 2*i;
|
1531 |
+
|
1532 |
+
const int isc_low = isc % (QK_K/32);
|
1533 |
+
const int sc_shift_low = 4 * (isc / (QK_K/32));
|
1534 |
+
const int sc_low = (bq3_K->scales[isc_low] >> sc_shift_low) & 0xF;
|
1535 |
+
|
1536 |
+
const int isc_high = isc % (QK_K/64);
|
1537 |
+
const int sc_shift_high = 2 * (isc / (QK_K/64));
|
1538 |
+
const int sc_high = ((bq3_K->scales[(QK_K/32) + isc_high] >> sc_shift_high) & 3) << 4;
|
1539 |
+
|
1540 |
+
const int sc = (sc_low | sc_high) - 32;
|
1541 |
+
|
1542 |
+
const block_q8_1 * bq8i = bq8_1 + bq8_offset + i;
|
1543 |
+
const int ui = *((int*) &bq8i->qs[sizeof(int) * (iqs % QI8_1)]);
|
1544 |
+
const float d8i = bq8i->d;
|
1545 |
+
|
1546 |
+
const int vil = (vl >> (2*i)) & 0x03030303;
|
1547 |
+
|
1548 |
+
const int vih = ((vh >> i) << 2) & 0x04040404;
|
1549 |
+
|
1550 |
+
const int vi = __vsubss4(vil, vih);
|
1551 |
+
|
1552 |
+
sumf += d8i * (__dp4a(vi, ui, 0) * sc); // SIMD dot product
|
1553 |
+
}
|
1554 |
+
|
1555 |
+
return d*sumf;
|
1556 |
+
#else
|
1557 |
+
return 0.0f; // only to satisfy the compiler
|
1558 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1559 |
+
}
|
1560 |
+
|
1561 |
+
static __device__ __forceinline__ float vec_dot_q4_K_q8_1(
|
1562 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1563 |
+
|
1564 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1565 |
+
const block_q4_K * bq4_K = (const block_q4_K *) vbq;
|
1566 |
+
|
1567 |
+
float sumf_d = 0.0f;
|
1568 |
+
float sumf_m = 0.0f;
|
1569 |
+
|
1570 |
+
#ifndef GGML_QKK_64
|
1571 |
+
|
1572 |
+
// iqs is in 0...15. bq8_offset = 2 * (iqs/4) -> bq8_offset = 0, 2, 4, 6
|
1573 |
+
const int bq8_offset = QR4_K * (iqs / (QI8_1/2));
|
1574 |
+
|
1575 |
+
const float d = bq4_K->d;
|
1576 |
+
const float dmin = bq4_K->dmin;
|
1577 |
+
|
1578 |
+
// iqs = 0....3 -> bq8_offset = 0, want q4_offset = 0, 4, 8, 12
|
1579 |
+
// iqs = 4....7 -> bq8_offset = 2, want q4_offset = 32, 36, 40, 44
|
1580 |
+
// iqs = 8...11 -> bq8_offset = 4, want q4_offset = 64, 68, 72, 76
|
1581 |
+
// iqs = 12..15 -> bq8_offset = 6, want q4_offset = 96, 100, 104, 108
|
1582 |
+
|
1583 |
+
const int * q4 = (const int *)(bq4_K->qs + 16 * bq8_offset + 4 * (iqs%4));
|
1584 |
+
const int v1 = q4[0];
|
1585 |
+
const int v2 = q4[4];
|
1586 |
+
|
1587 |
+
const uint16_t * scales = (const uint16_t *)bq4_K->scales;
|
1588 |
+
uint16_t aux[2];
|
1589 |
+
const int j = bq8_offset/2;
|
1590 |
+
if (j < 2) {
|
1591 |
+
aux[0] = scales[j+0] & 0x3f3f;
|
1592 |
+
aux[1] = scales[j+2] & 0x3f3f;
|
1593 |
+
} else {
|
1594 |
+
aux[0] = ((scales[j+2] >> 0) & 0x0f0f) | ((scales[j-2] & 0xc0c0) >> 2);
|
1595 |
+
aux[1] = ((scales[j+2] >> 4) & 0x0f0f) | ((scales[j-0] & 0xc0c0) >> 2);
|
1596 |
+
}
|
1597 |
+
const uint8_t * sc = (const uint8_t *)aux;
|
1598 |
+
const uint8_t * m = sc + 2;
|
1599 |
+
|
1600 |
+
for (int i = 0; i < QR4_K; ++i) {
|
1601 |
+
|
1602 |
+
const block_q8_1 * bq8i = bq8_1 + bq8_offset + i;
|
1603 |
+
const float d8i = bq8i->d;
|
1604 |
+
const int * q8 = (const int *)bq8i->qs + (iqs%4);
|
1605 |
+
const int ui1 = q8[0];
|
1606 |
+
const int ui2 = q8[4];
|
1607 |
+
|
1608 |
+
const int vi1 = (v1 >> (4*i)) & 0x0F0F0F0F;
|
1609 |
+
const int vi2 = (v2 >> (4*i)) & 0x0F0F0F0F;
|
1610 |
+
|
1611 |
+
const int dot1 = __dp4a(vi2, ui2, __dp4a(vi1, ui1, 0)); // SIMD dot product
|
1612 |
+
const int dot2 = __dp4a(0x01010101, ui2, __dp4a(0x01010101, ui1, 0));
|
1613 |
+
|
1614 |
+
sumf_d += d8i * (dot1 * sc[i]);
|
1615 |
+
sumf_m += d8i * (dot2 * m[i]); // multiply constant part of q4_K with sum of q8_1 values
|
1616 |
+
}
|
1617 |
+
|
1618 |
+
return d*sumf_d - dmin*sumf_m;
|
1619 |
+
|
1620 |
+
#else
|
1621 |
+
|
1622 |
+
uint16_t aux16[2];
|
1623 |
+
const uint8_t * s = (const uint8_t *)aux16;
|
1624 |
+
|
1625 |
+
const uint16_t * a = (const uint16_t *)bq4_K->scales;
|
1626 |
+
aux16[0] = a[0] & 0x0f0f;
|
1627 |
+
aux16[1] = (a[0] >> 4) & 0x0f0f;
|
1628 |
+
|
1629 |
+
const float dall = bq4_K->d[0];
|
1630 |
+
const float dmin = bq4_K->d[1];
|
1631 |
+
|
1632 |
+
const float d8_1 = bq8_1[0].d;
|
1633 |
+
const float d8_2 = bq8_1[1].d;
|
1634 |
+
|
1635 |
+
const int ui1 = *((const int *)bq8_1[0].qs + iqs);
|
1636 |
+
const int ui2 = *((const int *)bq8_1[0].qs + iqs + 4);
|
1637 |
+
const int ui3 = *((const int *)bq8_1[1].qs + iqs);
|
1638 |
+
const int ui4 = *((const int *)bq8_1[1].qs + iqs + 4);
|
1639 |
+
|
1640 |
+
const int * q4 = (const int *)bq4_K->qs + iqs;
|
1641 |
+
const int v1 = q4[0];
|
1642 |
+
const int v2 = q4[4];
|
1643 |
+
|
1644 |
+
const int dot1 = __dp4a(ui2, v2 & 0x0f0f0f0f, __dp4a(ui1, v1 & 0x0f0f0f0f, 0));
|
1645 |
+
const int dot2 = __dp4a(ui4, (v2 >> 4) & 0x0f0f0f0f, __dp4a(ui3, (v1 >> 4) & 0x0f0f0f0f, 0));
|
1646 |
+
const int dot3 = __dp4a(0x01010101, ui2, __dp4a(0x01010101, ui1, 0));
|
1647 |
+
const int dot4 = __dp4a(0x01010101, ui4, __dp4a(0x01010101, ui3, 0));
|
1648 |
+
|
1649 |
+
sumf_d += d8_1 * (dot1 * s[0]) + d8_2 * (dot2 * s[1]);
|
1650 |
+
sumf_m += d8_1 * (dot3 * s[2]) + d8_2 * (dot4 * s[3]);
|
1651 |
+
|
1652 |
+
return dall * sumf_d - dmin * sumf_m;
|
1653 |
+
|
1654 |
+
#endif
|
1655 |
+
|
1656 |
+
#else
|
1657 |
+
return 0.0f; // only to satisfy the compiler
|
1658 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1659 |
+
}
|
1660 |
+
|
1661 |
+
static __device__ __forceinline__ float vec_dot_q5_K_q8_1(
|
1662 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1663 |
+
|
1664 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1665 |
+
const block_q5_K * bq5_K = (const block_q5_K *) vbq;
|
1666 |
+
|
1667 |
+
#ifndef GGML_QKK_64
|
1668 |
+
|
1669 |
+
const int bq8_offset = QR5_K * (iqs / (QI8_1/2));
|
1670 |
+
const int * ql = (const int *)(bq5_K->qs + 16 * bq8_offset + 4 * (iqs%4));
|
1671 |
+
const int * qh = (const int *)(bq5_K->qh + 4 * (iqs%4));
|
1672 |
+
|
1673 |
+
float sumf_d = 0.0f;
|
1674 |
+
float sumf_m = 0.0f;
|
1675 |
+
|
1676 |
+
const float d = bq5_K->d;
|
1677 |
+
const float dmin = bq5_K->dmin;
|
1678 |
+
|
1679 |
+
const int vl1 = ql[0];
|
1680 |
+
const int vl2 = ql[4];
|
1681 |
+
|
1682 |
+
const int vh1 = qh[0] >> bq8_offset;
|
1683 |
+
const int vh2 = qh[4] >> bq8_offset;
|
1684 |
+
|
1685 |
+
const uint16_t * scales = (const uint16_t *)bq5_K->scales;
|
1686 |
+
uint16_t aux[2];
|
1687 |
+
const int j = bq8_offset/2;
|
1688 |
+
if (j < 2) {
|
1689 |
+
aux[0] = scales[j+0] & 0x3f3f;
|
1690 |
+
aux[1] = scales[j+2] & 0x3f3f;
|
1691 |
+
} else {
|
1692 |
+
aux[0] = ((scales[j+2] >> 0) & 0x0f0f) | ((scales[j-2] & 0xc0c0) >> 2);
|
1693 |
+
aux[1] = ((scales[j+2] >> 4) & 0x0f0f) | ((scales[j-0] & 0xc0c0) >> 2);
|
1694 |
+
}
|
1695 |
+
const uint8_t * sc = (const uint8_t *)aux;
|
1696 |
+
const uint8_t * m = sc + 2;
|
1697 |
+
|
1698 |
+
for (int i = 0; i < QR5_K; ++i) {
|
1699 |
+
|
1700 |
+
const block_q8_1 * bq8i = bq8_1 + bq8_offset + i;
|
1701 |
+
const float d8i = bq8i->d;
|
1702 |
+
const int * q8 = (const int *)bq8i->qs + (iqs%4);
|
1703 |
+
const int ui1 = q8[0];
|
1704 |
+
const int ui2 = q8[4];
|
1705 |
+
|
1706 |
+
const int vil1 = (vl1 >> (4*i)) & 0x0F0F0F0F;
|
1707 |
+
const int vil2 = (vl2 >> (4*i)) & 0x0F0F0F0F;
|
1708 |
+
|
1709 |
+
const int vih1 = ((vh1 >> i) << 4) & 0x10101010;
|
1710 |
+
const int vih2 = ((vh2 >> i) << 4) & 0x10101010;
|
1711 |
+
|
1712 |
+
const int vi1 = vil1 | vih1;
|
1713 |
+
const int vi2 = vil2 | vih2;
|
1714 |
+
|
1715 |
+
const int dot1 = __dp4a(vi2, ui2, __dp4a(vi1, ui1, 0)); // SIMD dot product
|
1716 |
+
const int dot2 = __dp4a(0x01010101, ui2, __dp4a(0x01010101, ui1, 0));
|
1717 |
+
|
1718 |
+
sumf_d += d8i * (dot1 * sc[i]);
|
1719 |
+
sumf_m += d8i * (dot2 * m[i]);
|
1720 |
+
|
1721 |
+
}
|
1722 |
+
|
1723 |
+
return d*sumf_d - dmin*sumf_m;
|
1724 |
+
|
1725 |
+
#else
|
1726 |
+
|
1727 |
+
const int8_t * s = bq5_K->scales;
|
1728 |
+
|
1729 |
+
const float d = bq5_K->d;
|
1730 |
+
|
1731 |
+
const float d8_1 = bq8_1[0].d;
|
1732 |
+
const float d8_2 = bq8_1[1].d;
|
1733 |
+
|
1734 |
+
const int ui1 = *((const int *)bq8_1[0].qs + iqs);
|
1735 |
+
const int ui2 = *((const int *)bq8_1[0].qs + iqs + 4);
|
1736 |
+
const int ui3 = *((const int *)bq8_1[1].qs + iqs);
|
1737 |
+
const int ui4 = *((const int *)bq8_1[1].qs + iqs + 4);
|
1738 |
+
|
1739 |
+
const int * ql = (const int *)bq5_K->qs + iqs;
|
1740 |
+
const int vl1 = ql[0];
|
1741 |
+
const int vl2 = ql[4];
|
1742 |
+
|
1743 |
+
const int step = 4 * iqs; // 0, 4, 8, 12
|
1744 |
+
const int im = step/8; // = 0 for iqs = 0, 1, = 1 for iqs = 2, 3
|
1745 |
+
const int in = step%8; // 0, 4, 0, 4
|
1746 |
+
const int vh = (*((const int *)(bq5_K->qh + in))) >> im;
|
1747 |
+
|
1748 |
+
const int v1 = (((vh << 4) & 0x10101010) ^ 0x10101010) | ((vl1 >> 0) & 0x0f0f0f0f);
|
1749 |
+
const int v2 = (((vh << 2) & 0x10101010) ^ 0x10101010) | ((vl2 >> 0) & 0x0f0f0f0f);
|
1750 |
+
const int v3 = (((vh >> 0) & 0x10101010) ^ 0x10101010) | ((vl1 >> 4) & 0x0f0f0f0f);
|
1751 |
+
const int v4 = (((vh >> 2) & 0x10101010) ^ 0x10101010) | ((vl2 >> 4) & 0x0f0f0f0f);
|
1752 |
+
|
1753 |
+
const float sumf_d = d8_1 * (__dp4a(ui1, v1, 0) * s[0] + __dp4a(ui2, v2, 0) * s[1])
|
1754 |
+
+ d8_2 * (__dp4a(ui3, v3, 0) * s[2] + __dp4a(ui4, v4, 0) * s[3]);
|
1755 |
+
|
1756 |
+
return d * sumf_d;
|
1757 |
+
|
1758 |
+
#endif
|
1759 |
+
|
1760 |
+
#else
|
1761 |
+
return 0.0f; // only to satisfy the compiler
|
1762 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1763 |
+
}
|
1764 |
+
|
1765 |
+
static __device__ __forceinline__ float vec_dot_q6_K_q8_1(
|
1766 |
+
const void * __restrict__ vbq, const block_q8_1 * __restrict__ bq8_1, const int iqs) {
|
1767 |
+
|
1768 |
+
#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
|
1769 |
+
const block_q6_K * bq6_K = (const block_q6_K *) vbq;
|
1770 |
+
|
1771 |
+
const int bq8_offset = 2 * QR6_K * (iqs / (QI6_K/2)) + (iqs % (QI6_K/2)) / (QI6_K/4);
|
1772 |
+
const int scale_offset = (QI6_K/4) * (iqs / (QI6_K/2)) + (iqs % (QI6_K/2)) / (QI6_K/8);
|
1773 |
+
const int vh_shift = 2 * ((iqs % (QI6_K/2)) / (QI6_K/4));
|
1774 |
+
|
1775 |
+
float sumf = 0.0f;
|
1776 |
+
|
1777 |
+
const float d = bq6_K->d;
|
1778 |
+
|
1779 |
+
int vl;
|
1780 |
+
memcpy(&vl, &bq6_K->ql[sizeof(int) * iqs], sizeof(int));
|
1781 |
+
|
1782 |
+
int vh;
|
1783 |
+
memcpy(&vh, &bq6_K->qh[sizeof(int) * ((QI6_K/4) * (iqs / (QI6_K/2)) + iqs % (QI6_K/4))], sizeof(int));
|
1784 |
+
|
1785 |
+
for (int i = 0; i < QR6_K; ++i) {
|
1786 |
+
const int sc = bq6_K->scales[scale_offset + 4*i];
|
1787 |
+
|
1788 |
+
const block_q8_1 * bq8i = bq8_1 + bq8_offset + 2*i;
|
1789 |
+
const int ui = *((int*) &bq8i->qs[sizeof(int) * (iqs % (QI8_1))]);
|
1790 |
+
const float d8i = bq8i->d;
|
1791 |
+
|
1792 |
+
const int vil = (vl >> (4*i)) & 0x0F0F0F0F;
|
1793 |
+
|
1794 |
+
const int vih = ((vh >> (vh_shift + 4*i)) << 4) & 0x30303030;
|
1795 |
+
|
1796 |
+
const int vi = __vsubss4((vil | vih), 0x20202020); // vi = (vil | vih) - 32
|
1797 |
+
|
1798 |
+
sumf += d8i * (__dp4a(vi, ui, 0) * sc); // SIMD dot product
|
1799 |
+
}
|
1800 |
+
|
1801 |
+
return d*sumf;
|
1802 |
+
#else
|
1803 |
+
return 0.0f; // only to satisfy the compiler
|
1804 |
+
#endif // __CUDA_ARCH__ >= MIN_CC_DP4A
|
1805 |
}
|
1806 |
|
1807 |
template <int qk, int qi, typename block_q_t, vec_dot_q_cuda_t vec_dot_q_cuda>
|
|
|
1824 |
for (int i = 0; i < blocks_per_row; i += blocks_per_warp) {
|
1825 |
const int ibx = row*blocks_per_row + i + threadIdx.x / qi; // x block index
|
1826 |
|
1827 |
+
const int iby = (i + threadIdx.x / qi) * qk/QK8_1; // y block index that aligns with ibx
|
1828 |
|
1829 |
const int iqs = threadIdx.x % qi; // x block quant index when casting the quants to int
|
1830 |
|
|
|
1910 |
}
|
1911 |
}
|
1912 |
|
1913 |
+
static __global__ void mul_mat_p021_f16_f32(
|
1914 |
+
const void * __restrict__ vx, const float * __restrict__ y, float * __restrict__ dst,
|
1915 |
+
const int ncols_x, const int nrows_x, const int nchannels_x, const int nchannels_y) {
|
1916 |
+
|
1917 |
const half * x = (const half *) vx;
|
1918 |
|
1919 |
const int row_x = blockDim.y*blockIdx.y + threadIdx.y;
|
1920 |
const int channel = blockDim.z*blockIdx.z + threadIdx.z;
|
1921 |
+
const int channel_x = channel / (nchannels_y / nchannels_x);
|
1922 |
|
1923 |
const int nrows_y = ncols_x;
|
1924 |
const int nrows_dst = nrows_x;
|
|
|
1934 |
}
|
1935 |
|
1936 |
// x is transposed and permuted
|
1937 |
+
const int ix = row_x*nchannels_x*ncols_x + channel_x*ncols_x + col_x;
|
1938 |
const float xi = __half2float(x[ix]);
|
1939 |
|
1940 |
const int row_y = col_x;
|
|
|
1962 |
|
1963 |
static __global__ void mul_mat_vec_nc_f16_f32( // nc == non-contiguous
|
1964 |
const void * __restrict__ vx, const float * __restrict__ y, float * __restrict__ dst, const int ncols_x, const int nrows_x,
|
1965 |
+
const int row_stride_x, const int channel_stride_x, const int channel_x_divisor) {
|
1966 |
|
1967 |
const half * x = (const half *) vx;
|
1968 |
|
1969 |
const int row_x = blockDim.y*blockIdx.y + threadIdx.y;
|
1970 |
const int channel = blockDim.z*blockIdx.z + threadIdx.z;
|
1971 |
+
const int channel_x = channel / channel_x_divisor;
|
1972 |
|
1973 |
const int nrows_y = ncols_x;
|
1974 |
const int nrows_dst = nrows_x;
|
|
|
1985 |
break;
|
1986 |
}
|
1987 |
|
1988 |
+
const int ix = channel_x*channel_stride_x + row_x*row_stride_x + col_x;
|
1989 |
const float xi = __half2float(x[ix]);
|
1990 |
|
1991 |
const int row_y = col_x;
|
|
|
2067 |
dst[i + 1] = x0*sin_theta + x1*cos_theta;
|
2068 |
}
|
2069 |
|
2070 |
+
static __global__ void rope_glm_f32(const float * x, float * dst, const int ncols, const float p, const float block_p, const float theta_scale) {
|
2071 |
+
const int col = blockDim.x*blockIdx.x + threadIdx.x;
|
2072 |
+
const int half_n_dims = ncols/4;
|
2073 |
+
|
2074 |
+
if (col >= half_n_dims) {
|
2075 |
+
return;
|
2076 |
+
}
|
2077 |
+
|
2078 |
+
const int row = blockDim.y*blockIdx.y + threadIdx.y;
|
2079 |
+
const int i = row*ncols + col;
|
2080 |
+
|
2081 |
+
const float col_theta_scale = powf(theta_scale, col);
|
2082 |
+
|
2083 |
+
const float theta = p*col_theta_scale;
|
2084 |
+
const float sin_theta = sinf(theta);
|
2085 |
+
const float cos_theta = cosf(theta);
|
2086 |
+
|
2087 |
+
const float x0 = x[i + 0];
|
2088 |
+
const float x1 = x[i + half_n_dims];
|
2089 |
+
|
2090 |
+
dst[i + 0] = x0*cos_theta - x1*sin_theta;
|
2091 |
+
dst[i + half_n_dims] = x0*sin_theta + x1*cos_theta;
|
2092 |
+
|
2093 |
+
const float block_theta = block_p*col_theta_scale;
|
2094 |
+
const float sin_block_theta = sinf(block_theta);
|
2095 |
+
const float cos_block_theta = cosf(block_theta);
|
2096 |
+
|
2097 |
+
const float x2 = x[i + half_n_dims * 2];
|
2098 |
+
const float x3 = x[i + half_n_dims * 3];
|
2099 |
+
|
2100 |
+
dst[i + half_n_dims * 2] = x2*cos_block_theta - x3*sin_block_theta;
|
2101 |
+
dst[i + half_n_dims * 3] = x2*sin_block_theta + x3*cos_block_theta;
|
2102 |
+
}
|
2103 |
+
|
2104 |
static __global__ void diag_mask_inf_f32(const float * x, float * dst, const int ncols, const int rows_per_channel, const int n_past) {
|
2105 |
const int col = blockDim.x*blockIdx.x + threadIdx.x;
|
2106 |
const int row = blockDim.y*blockIdx.y + threadIdx.y;
|
|
|
2166 |
dst[i] = scale * x[i];
|
2167 |
}
|
2168 |
|
2169 |
+
static void add_f32_cuda(const float * x, const float * y, float * dst, const int kx, const int ky, cudaStream_t stream) {
|
2170 |
+
const int num_blocks = (kx + CUDA_ADD_BLOCK_SIZE - 1) / CUDA_ADD_BLOCK_SIZE;
|
2171 |
+
add_f32<<<num_blocks, CUDA_ADD_BLOCK_SIZE, 0, stream>>>(x, y, dst, kx, ky);
|
2172 |
}
|
2173 |
|
2174 |
static void add_f16_f32_f16_cuda(const half * x, const float * y, half * dst, const int k, cudaStream_t stream) {
|
|
|
2181 |
mul_f32<<<num_blocks, CUDA_MUL_BLOCK_SIZE, 0, stream>>>(x, y, dst, kx, ky);
|
2182 |
}
|
2183 |
|
2184 |
+
static void gelu_f32_cuda(const float * x, float * dst, const int k, cudaStream_t stream) {
|
2185 |
+
const int num_blocks = (k + CUDA_GELU_BLOCK_SIZE - 1) / CUDA_GELU_BLOCK_SIZE;
|
2186 |
+
gelu_f32<<<num_blocks, CUDA_GELU_BLOCK_SIZE, 0, stream>>>(x, dst, k);
|
2187 |
+
}
|
2188 |
+
|
2189 |
static void silu_f32_cuda(const float * x, float * dst, const int k, cudaStream_t stream) {
|
2190 |
const int num_blocks = (k + CUDA_SILU_BLOCK_SIZE - 1) / CUDA_SILU_BLOCK_SIZE;
|
2191 |
silu_f32<<<num_blocks, CUDA_SILU_BLOCK_SIZE, 0, stream>>>(x, dst, k);
|
2192 |
}
|
2193 |
|
2194 |
+
static void norm_f32_cuda(const float * x, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2195 |
+
GGML_ASSERT(ncols % WARP_SIZE == 0);
|
2196 |
+
const dim3 block_dims(WARP_SIZE, 1, 1);
|
2197 |
+
norm_f32<<<nrows, block_dims, 0, stream>>>(x, dst, ncols);
|
2198 |
+
}
|
2199 |
+
|
2200 |
+
static void rms_norm_f32_cuda(const float * x, float * dst, const int ncols, const int nrows, const float eps, cudaStream_t stream) {
|
2201 |
GGML_ASSERT(ncols % WARP_SIZE == 0);
|
2202 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
2203 |
+
rms_norm_f32<<<nrows, block_dims, 0, stream>>>(x, dst, ncols, eps);
|
2204 |
}
|
2205 |
|
2206 |
static void quantize_row_q8_1_cuda(const float * x, void * vy, const int ndata, const int k, cudaStream_t stream) {
|
|
|
2362 |
}
|
2363 |
|
2364 |
static void mul_mat_vec_q4_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2365 |
+
GGML_ASSERT(ncols % QK4_0 == 0);
|
2366 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2367 |
const dim3 block_nums(1, block_num_y, 1);
|
2368 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
|
2371 |
}
|
2372 |
|
2373 |
static void mul_mat_vec_q4_1_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2374 |
+
GGML_ASSERT(ncols % QK4_1 == 0);
|
2375 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2376 |
const dim3 block_nums(1, block_num_y, 1);
|
2377 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
|
2380 |
}
|
2381 |
|
2382 |
static void mul_mat_vec_q5_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2383 |
+
GGML_ASSERT(ncols % QK5_0 == 0);
|
2384 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2385 |
const dim3 block_nums(1, block_num_y, 1);
|
2386 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
|
2389 |
}
|
2390 |
|
2391 |
static void mul_mat_vec_q5_1_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2392 |
+
GGML_ASSERT(ncols % QK5_1 == 0);
|
2393 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2394 |
const dim3 block_nums(1, block_num_y, 1);
|
2395 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
|
2398 |
}
|
2399 |
|
2400 |
static void mul_mat_vec_q8_0_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2401 |
+
GGML_ASSERT(ncols % QK8_0 == 0);
|
2402 |
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2403 |
const dim3 block_nums(1, block_num_y, 1);
|
2404 |
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
|
2406 |
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2407 |
}
|
2408 |
|
2409 |
+
static void mul_mat_vec_q2_K_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2410 |
+
GGML_ASSERT(ncols % QK_K == 0);
|
2411 |
+
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2412 |
+
const dim3 block_nums(1, block_num_y, 1);
|
2413 |
+
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
2414 |
+
mul_mat_vec_q<QK_K, QI2_K, block_q2_K, vec_dot_q2_K_q8_1>
|
2415 |
+
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2416 |
+
}
|
2417 |
+
|
2418 |
+
static void mul_mat_vec_q3_K_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2419 |
+
GGML_ASSERT(ncols % QK_K == 0);
|
2420 |
+
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2421 |
+
const dim3 block_nums(1, block_num_y, 1);
|
2422 |
+
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
2423 |
+
mul_mat_vec_q<QK_K, QI3_K, block_q3_K, vec_dot_q3_K_q8_1>
|
2424 |
+
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2425 |
+
}
|
2426 |
+
|
2427 |
+
static void mul_mat_vec_q4_K_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2428 |
+
GGML_ASSERT(ncols % QK_K == 0);
|
2429 |
+
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2430 |
+
const dim3 block_nums(1, block_num_y, 1);
|
2431 |
+
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
2432 |
+
// Note: we use QI4_K/2 instead of QI4_K to make the dot product template require 4 groups of quants to be processed per
|
2433 |
+
// kernel call instead of 2. This results in a better perfmance because the cost of computing the k-quant scales
|
2434 |
+
// is better amortized.
|
2435 |
+
mul_mat_vec_q<QK_K, QI4_K/2, block_q4_K, vec_dot_q4_K_q8_1>
|
2436 |
+
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2437 |
+
}
|
2438 |
+
|
2439 |
+
static void mul_mat_vec_q5_K_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2440 |
+
GGML_ASSERT(ncols % QK_K == 0);
|
2441 |
+
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2442 |
+
const dim3 block_nums(1, block_num_y, 1);
|
2443 |
+
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
2444 |
+
// Note: we use QI5_K/2 instead of QI5_K to make the dot product template require 4 groups of quants to be processed per
|
2445 |
+
// kernel call instead of 2. This results in a better perfmance because the cost of computing the k-quant scales
|
2446 |
+
// is better amortized.
|
2447 |
+
mul_mat_vec_q<QK_K, QI5_K/2, block_q5_K, vec_dot_q5_K_q8_1>
|
2448 |
+
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2449 |
+
}
|
2450 |
+
|
2451 |
+
static void mul_mat_vec_q6_K_q8_1_cuda(const void * vx, const void * vy, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
2452 |
+
GGML_ASSERT(ncols % QK_K == 0);
|
2453 |
+
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
2454 |
+
const dim3 block_nums(1, block_num_y, 1);
|
2455 |
+
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
2456 |
+
mul_mat_vec_q<QK_K, QI6_K, block_q6_K, vec_dot_q6_K_q8_1>
|
2457 |
+
<<<block_nums, block_dims, 0, stream>>>(vx, vy, dst, ncols, nrows);
|
2458 |
+
}
|
2459 |
+
|
2460 |
static void convert_fp16_to_fp32_cuda(const void * vx, float * y, const int k, cudaStream_t stream) {
|
2461 |
const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE;
|
2462 |
dequantize_block<1, 1, convert_f16><<<num_blocks, CUDA_DEQUANTIZE_BLOCK_SIZE, 0, stream>>>(vx, y, k);
|
|
|
2500 |
}
|
2501 |
}
|
2502 |
|
2503 |
+
static void ggml_mul_mat_p021_f16_f32_cuda(
|
2504 |
+
const void * vx, const float * y, float * dst, const int ncols_x, const int nrows_x,
|
2505 |
+
const int nchannels_x, const int nchannels_y, cudaStream_t stream) {
|
2506 |
+
|
2507 |
+
const dim3 block_nums(1, nrows_x, nchannels_y);
|
2508 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
2509 |
+
mul_mat_p021_f16_f32<<<block_nums, block_dims, 0, stream>>>(vx, y, dst, ncols_x, nrows_x, nchannels_x, nchannels_y);
|
2510 |
}
|
2511 |
|
2512 |
static void ggml_mul_mat_vec_nc_f16_f32_cuda(
|
2513 |
const void * vx, const float * y, float * dst, const int ncols_x, const int nrows_x, const int row_stride_x,
|
2514 |
+
const int nchannels_x, const int nchannels_y, const int channel_stride_x, cudaStream_t stream) {
|
2515 |
|
2516 |
+
const dim3 block_nums(1, nrows_x, nchannels_y);
|
2517 |
const dim3 block_dims(WARP_SIZE, 1, 1);
|
2518 |
mul_mat_vec_nc_f16_f32<<<block_nums, block_dims, 0, stream>>>
|
2519 |
+
(vx, y, dst, ncols_x, nrows_x, row_stride_x, channel_stride_x, nchannels_y/nchannels_x);
|
2520 |
}
|
2521 |
|
2522 |
static void ggml_cpy_f32_f32_cuda(
|
|
|
2552 |
rope_f32<<<block_nums, block_dims, 0, stream>>>(x, dst, ncols, p, theta_scale);
|
2553 |
}
|
2554 |
|
2555 |
+
static void rope_glm_f32_cuda(const float * x, float * dst, const int ncols, const int nrows, const float p, const float block_p, const float theta_scale, cudaStream_t stream) {
|
2556 |
+
GGML_ASSERT(nrows % 4 == 0);
|
2557 |
+
const dim3 block_dims(4*CUDA_ROPE_BLOCK_SIZE, 1, 1);
|
2558 |
+
const int num_blocks_x = (ncols + 4*CUDA_ROPE_BLOCK_SIZE - 1) / (4*CUDA_ROPE_BLOCK_SIZE);
|
2559 |
+
const dim3 block_nums(num_blocks_x, nrows, 1);
|
2560 |
+
rope_glm_f32<<<block_nums, block_dims, 0, stream>>>(x, dst, ncols, p, block_p, theta_scale);
|
2561 |
+
}
|
2562 |
+
|
2563 |
static void diag_mask_inf_f32_cuda(const float * x, float * dst, const int ncols_x, const int nrows_x, const int rows_per_channel, const int n_past, cudaStream_t stream) {
|
2564 |
const dim3 block_dims(CUDA_DIAG_MASK_INF_BLOCK_SIZE, 1, 1);
|
2565 |
const int block_num_x = (ncols_x + CUDA_DIAG_MASK_INF_BLOCK_SIZE - 1) / CUDA_DIAG_MASK_INF_BLOCK_SIZE;
|
|
|
2668 |
|
2669 |
static int g_device_count = -1;
|
2670 |
static int g_main_device = 0;
|
2671 |
+
#ifndef GGML_CUDA_FORCE_DMMV
|
2672 |
static int g_compute_capabilities[GGML_CUDA_MAX_DEVICES];
|
2673 |
+
#endif
|
2674 |
static float g_tensor_split[GGML_CUDA_MAX_DEVICES] = {0};
|
2675 |
|
2676 |
static cublasHandle_t g_cublas_handles[GGML_CUDA_MAX_DEVICES] = {nullptr};
|
|
|
2693 |
g_tensor_split[id] = total_vram;
|
2694 |
total_vram += prop.totalGlobalMem;
|
2695 |
|
2696 |
+
#ifndef GGML_CUDA_FORCE_DMMV
|
2697 |
g_compute_capabilities[id] = 100*prop.major + 10*prop.minor;
|
2698 |
+
#endif
|
2699 |
}
|
2700 |
for (int id = 0; id < g_device_count; ++id) {
|
2701 |
g_tensor_split[id] /= total_vram;
|
|
|
2720 |
}
|
2721 |
|
2722 |
void ggml_cuda_set_tensor_split(const float * tensor_split) {
|
2723 |
+
if (tensor_split == nullptr) {
|
2724 |
+
return;
|
2725 |
+
}
|
2726 |
bool all_zero = true;
|
2727 |
for (int i = 0; i < g_device_count; ++i) {
|
2728 |
if (tensor_split[i] != 0.0f) {
|
|
|
2819 |
|
2820 |
GGML_ASSERT(src0_ddq_i != nullptr || src0_ddf_i != nullptr);
|
2821 |
GGML_ASSERT(src1_ddf_i != nullptr);
|
2822 |
+
GGML_ASSERT(dst_ddf_i != nullptr);
|
2823 |
|
2824 |
+
const int64_t ne00 = src0->ne[0];
|
2825 |
const int64_t i01_diff = i01_high - i01_low;
|
2826 |
|
2827 |
+
const int64_t ne10 = src1->ne[0];
|
2828 |
+
const int64_t ne11 = src1->ne[1];
|
2829 |
+
|
2830 |
// compute
|
2831 |
if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) {
|
2832 |
+
add_f32_cuda(src0_ddf_i, src1_ddf_i, dst_ddf_i, ne00*i01_diff, ne10*ne11, cudaStream_main);
|
2833 |
} else if (src0->type == GGML_TYPE_F16 && dst->type == GGML_TYPE_F16) {
|
2834 |
+
add_f16_f32_f16_cuda((half *) src0_ddq_i, src1_ddf_i, (half *) dst_ddf_i, ne00*i01_diff, cudaStream_main);
|
2835 |
} else {
|
2836 |
GGML_ASSERT(false);
|
2837 |
}
|
|
|
2850 |
|
2851 |
GGML_ASSERT(src0_ddf_i != nullptr);
|
2852 |
GGML_ASSERT(src1_ddf_i != nullptr);
|
2853 |
+
GGML_ASSERT(dst_ddf_i != nullptr);
|
2854 |
|
2855 |
const int64_t ne00 = src0->ne[0];
|
2856 |
+
const int64_t i01_diff = i01_high - i01_low;
|
2857 |
|
2858 |
const int64_t ne10 = src1->ne[0];
|
2859 |
const int64_t ne11 = src1->ne[1];
|
2860 |
|
2861 |
+
mul_f32_cuda(src0_ddf_i, src1_ddf_i, dst_ddf_i, ne00*i01_diff, ne10*ne11, cudaStream_main);
|
|
|
2862 |
|
2863 |
+
(void) dst;
|
2864 |
+
(void) src0_ddq_i;
|
2865 |
+
(void) i02;
|
2866 |
+
(void) i1;
|
2867 |
+
}
|
2868 |
|
2869 |
+
inline void ggml_cuda_op_gelu(
|
2870 |
+
const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, char * src0_ddq_i,
|
2871 |
+
float * src0_ddf_i, float * src1_ddf_i, float * dst_ddf_i, int64_t i02, int64_t i01_low, int64_t i01_high, int i1,
|
2872 |
+
cudaStream_t & cudaStream_main){
|
2873 |
+
|
2874 |
+
GGML_ASSERT(src0_ddf_i != nullptr);
|
2875 |
+
GGML_ASSERT(dst_ddf_i != nullptr);
|
2876 |
+
|
2877 |
+
const int64_t ne00 = src0->ne[0];
|
2878 |
+
const int64_t i01_diff = i01_high - i01_low;
|
2879 |
|
2880 |
+
// compute
|
2881 |
+
gelu_f32_cuda(src0_ddf_i, dst_ddf_i, ne00*i01_diff, cudaStream_main);
|
2882 |
+
|
2883 |
+
(void) src1;
|
2884 |
(void) dst;
|
2885 |
(void) src0_ddq_i;
|
2886 |
+
(void) src1_ddf_i;
|
2887 |
(void) i02;
|
2888 |
+
(void) i1;
|
2889 |
}
|
2890 |
|
2891 |
inline void ggml_cuda_op_silu(
|
|
|
2910 |
(void) i1;
|
2911 |
}
|
2912 |
|
2913 |
+
inline void ggml_cuda_op_norm(
|
2914 |
+
const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, char * src0_ddq_i,
|
2915 |
+
float * src0_ddf_i, float * src1_ddf_i, float * dst_ddf_i, int64_t i02, int64_t i01_low, int64_t i01_high, int i1,
|
2916 |
+
cudaStream_t & cudaStream_main){
|
2917 |
+
|
2918 |
+
GGML_ASSERT(src0_ddf_i != nullptr);
|
2919 |
+
GGML_ASSERT(dst_ddf_i != nullptr);
|
2920 |
+
|
2921 |
+
const int64_t ne00 = src0->ne[0];
|
2922 |
+
const int64_t i01_diff = i01_high - i01_low;
|
2923 |
+
|
2924 |
+
// compute
|
2925 |
+
norm_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, cudaStream_main);
|
2926 |
+
|
2927 |
+
(void) src1;
|
2928 |
+
(void) dst;
|
2929 |
+
(void) src0_ddq_i;
|
2930 |
+
(void) src1_ddf_i;
|
2931 |
+
(void) i02;
|
2932 |
+
(void) i1;
|
2933 |
+
}
|
2934 |
+
|
2935 |
inline void ggml_cuda_op_rms_norm(
|
2936 |
const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, char * src0_ddq_i,
|
2937 |
float * src0_ddf_i, float * src1_ddf_i, float * dst_ddf_i, int64_t i02, int64_t i01_low, int64_t i01_high, int i1,
|
|
|
2943 |
const int64_t ne00 = src0->ne[0];
|
2944 |
const int64_t i01_diff = i01_high - i01_low;
|
2945 |
|
2946 |
+
float eps;
|
2947 |
+
memcpy(&eps, dst->op_params, sizeof(float));
|
2948 |
+
|
2949 |
// compute
|
2950 |
+
rms_norm_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, eps, cudaStream_main);
|
2951 |
|
2952 |
(void) src1;
|
2953 |
(void) dst;
|
|
|
2975 |
int id;
|
2976 |
CUDA_CHECK(cudaGetDevice(&id));
|
2977 |
|
2978 |
+
bool mul_mat_vec_q_implemented =
|
2979 |
+
src0->type == GGML_TYPE_Q4_0 ||
|
2980 |
src0->type == GGML_TYPE_Q4_1 ||
|
2981 |
src0->type == GGML_TYPE_Q5_0 ||
|
2982 |
src0->type == GGML_TYPE_Q5_1 ||
|
2983 |
src0->type == GGML_TYPE_Q8_0;
|
2984 |
+
#if QK_K == 256
|
2985 |
+
mul_mat_vec_q_implemented = mul_mat_vec_q_implemented ||
|
2986 |
+
src0->type == GGML_TYPE_Q2_K ||
|
2987 |
+
src0->type == GGML_TYPE_Q3_K ||
|
2988 |
+
src0->type == GGML_TYPE_Q4_K ||
|
2989 |
+
src0->type == GGML_TYPE_Q5_K ||
|
2990 |
+
src0->type == GGML_TYPE_Q6_K;
|
2991 |
+
#endif // QK_K == 256
|
2992 |
+
|
2993 |
+
const bool use_mul_mat_vec_q = g_compute_capabilities[id] >= MIN_CC_DP4A && mul_mat_vec_q_implemented;
|
2994 |
#endif
|
2995 |
|
2996 |
if (use_mul_mat_vec_q) {
|
2997 |
+
const int64_t padded_row_size = ne00 % MATRIX_ROW_PADDING == 0 ?
|
2998 |
+
ne00 : ne00 - ne00 % MATRIX_ROW_PADDING + MATRIX_ROW_PADDING;
|
2999 |
size_t as;
|
3000 |
void * src1_q8_1 = ggml_cuda_pool_malloc(padded_row_size*sizeof(block_q8_1)/QK8_1, &as);
|
3001 |
quantize_row_q8_1_cuda(src1_ddf_i, src1_q8_1, ne00, padded_row_size, cudaStream_main);
|
|
|
3016 |
case GGML_TYPE_Q8_0:
|
3017 |
mul_mat_vec_q8_0_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3018 |
break;
|
3019 |
+
case GGML_TYPE_Q2_K:
|
3020 |
+
mul_mat_vec_q2_K_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3021 |
+
break;
|
3022 |
+
case GGML_TYPE_Q3_K:
|
3023 |
+
mul_mat_vec_q3_K_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3024 |
+
break;
|
3025 |
+
case GGML_TYPE_Q4_K:
|
3026 |
+
mul_mat_vec_q4_K_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3027 |
+
break;
|
3028 |
+
case GGML_TYPE_Q5_K:
|
3029 |
+
mul_mat_vec_q5_K_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3030 |
+
break;
|
3031 |
+
case GGML_TYPE_Q6_K:
|
3032 |
+
mul_mat_vec_q6_K_q8_1_cuda(src0_ddq_i, src1_q8_1, dst_ddf_i, ne00, nrows, cudaStream_main);
|
3033 |
+
break;
|
3034 |
default:
|
3035 |
GGML_ASSERT(false);
|
3036 |
break;
|
|
|
3162 |
const int64_t ne00 = src0->ne[0];
|
3163 |
const int64_t i01_diff = i01_high - i01_low;
|
3164 |
|
3165 |
+
const int n_past = ((int32_t *) dst->op_params)[0];
|
3166 |
+
const int n_dims = ((int32_t *) dst->op_params)[1];
|
3167 |
+
const int mode = ((int32_t *) dst->op_params)[2];
|
3168 |
+
const int n_ctx = ((int32_t *) dst->op_params)[3];
|
3169 |
+
// RoPE alteration for extended context
|
3170 |
|
3171 |
+
float freq_base, freq_scale;
|
3172 |
+
memcpy(&freq_base, (int32_t *) dst->op_params + 4, sizeof(float));
|
3173 |
+
memcpy(&freq_scale, (int32_t *) dst->op_params + 5, sizeof(float));
|
3174 |
|
3175 |
+
const float theta_scale = powf(freq_base, -2.0f/n_dims);
|
3176 |
+
const float p = (((mode & 1) == 0 ? n_past + i02 : i02)) * freq_scale;
|
3177 |
+
|
3178 |
+
bool is_glm = mode & 4;
|
3179 |
|
3180 |
// compute
|
3181 |
+
if (is_glm) {
|
3182 |
+
const float id_p = min(p, n_ctx - 2.f);
|
3183 |
+
const float block_p = max(p - (n_ctx - 2.f), 0.f);
|
3184 |
+
rope_glm_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, id_p, block_p, theta_scale, cudaStream_main);
|
3185 |
+
} else {
|
3186 |
+
rope_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, p, theta_scale, cudaStream_main);
|
3187 |
+
}
|
3188 |
|
3189 |
+
(void) src1;
|
3190 |
(void) dst;
|
3191 |
(void) src0_ddq_i;
|
3192 |
(void) src1_ddf_i;
|
|
|
3205 |
const int64_t ne01 = src0->ne[1];
|
3206 |
const int64_t i01_diff = i01_high - i01_low;
|
3207 |
|
3208 |
+
const int n_past = ((int32_t *) dst->op_params)[0];
|
3209 |
|
3210 |
// compute
|
3211 |
diag_mask_inf_f32_cuda(src0_ddf_i, dst_ddf_i, ne00, i01_diff, ne01, n_past, cudaStream_main);
|
3212 |
|
3213 |
+
(void) src1;
|
3214 |
(void) dst;
|
3215 |
(void) src0_ddq_i;
|
3216 |
(void) src1_ddf_i;
|
|
|
3278 |
const int64_t ne11 = use_src1 ? src1->ne[1] : 1;
|
3279 |
const int64_t ne12 = use_src1 ? src1->ne[2] : 1;
|
3280 |
const int64_t ne13 = use_src1 ? src1->ne[3] : 1;
|
3281 |
+
const int64_t nrows1 = use_src1 ? ggml_nrows(src1) : 1;
|
3282 |
+
|
3283 |
+
GGML_ASSERT(ne03 == ne13);
|
3284 |
|
3285 |
const int64_t ne0 = dst->ne[0];
|
3286 |
const int64_t ne1 = dst->ne[1];
|
|
|
3292 |
GGML_ASSERT(!use_src1 || src1->backend != GGML_BACKEND_GPU_SPLIT);
|
3293 |
|
3294 |
// strides for iteration over dims 3 and 2
|
3295 |
+
const int64_t num_iters_0 = ne02 >= ne12 ? ne02*ne03 : ne12*ne13;
|
3296 |
+
const int64_t num_iters = flatten_rows ? 1 : num_iters_0;
|
3297 |
+
const int64_t stride_mod = flatten_rows ? num_iters_0 : 1;
|
3298 |
const int64_t src0_stride = ne00 * ne01 * stride_mod;
|
3299 |
const int64_t src1_stride = ne10 * ne11 * stride_mod;
|
3300 |
const int64_t dst_stride = ne0 * ne1 * stride_mod;
|
3301 |
|
3302 |
+
const int64_t rows_per_iter = flatten_rows ? nrows0 : ne01;
|
3303 |
+
const int64_t i03_max = flatten_rows ? 1 : ne03;
|
3304 |
+
const int64_t i02_max = flatten_rows ? 1 : (ne02 >= ne12 ? ne02 : ne12);
|
3305 |
+
const int64_t i02_divisor = ne02 >= ne12 ? 1 : ne12 / ne02;
|
3306 |
+
GGML_ASSERT(!(flatten_rows && ne02 < ne12));
|
3307 |
+
|
3308 |
const size_t src0_ts = ggml_type_size(src0->type);
|
3309 |
const size_t src0_bs = ggml_blck_size(src0->type);
|
3310 |
|
|
|
3321 |
dst->op == GGML_OP_SCALE || dst->op == GGML_OP_DIAG_MASK_INF || dst->op == GGML_OP_ROPE);
|
3322 |
|
3323 |
const bool split = src0->backend == GGML_BACKEND_GPU_SPLIT;
|
3324 |
+
GGML_ASSERT(!(split && ne02 < ne12));
|
3325 |
|
3326 |
const to_fp32_cuda_t to_fp32_cuda = ggml_get_to_fp32_cuda(src0->type);
|
3327 |
|
|
|
3358 |
row_high = id == g_device_count - 1 ? nrows0 : nrows0*g_tensor_split[id + 1];
|
3359 |
} else {
|
3360 |
row_low = 0;
|
3361 |
+
row_high = nrows0*i02_divisor;
|
3362 |
}
|
3363 |
if (row_low == row_high) {
|
3364 |
continue;
|
|
|
3406 |
dst_ddf[id] = (float *) ggml_cuda_pool_malloc(size_dst_ddf, &dst_asf[id]);
|
3407 |
}
|
3408 |
|
|
|
|
|
|
|
|
|
3409 |
for (int64_t i03 = 0; i03 < i03_max; i03++) {
|
3410 |
const int64_t i13 = i03 % ne13;
|
3411 |
for (int64_t i02 = 0; i02 < i02_max; i02++) {
|
3412 |
const int64_t i12 = i02 % ne12;
|
3413 |
|
3414 |
+
const int64_t i0 = i03*i02_max + i02;
|
3415 |
|
3416 |
// i0 values that contain the lower/upper rows for a split tensor when using multiple GPUs
|
3417 |
const int64_t i0_offset_low = row_low/rows_per_iter;
|
|
|
3445 |
const int64_t i11 = i13*ne12 + i12;
|
3446 |
|
3447 |
// for split tensors the data begins at i0 == i0_offset_low
|
3448 |
+
char * src0_ddq_i = src0_ddq[id] + (i0/i02_divisor - i0_offset_low)*src0_stride*src0_ts/src0_bs;
|
3449 |
+
float * src0_ddf_i = src0_ddf[id] + (i0/i02_divisor - i0_offset_low)*src0_stride;
|
3450 |
float * src1_ddf_i = src1_ddf[id] + i11*src1_stride;
|
3451 |
+
float * dst_ddf_i = dst_ddf[id] + (i0 - i0_offset_low)*dst_stride;
|
3452 |
|
3453 |
// for split tensors the data pointer needs to be rounded down
|
3454 |
// to the bin edge for i03, i02 bins beyond the first
|
|
|
3487 |
}
|
3488 |
}
|
3489 |
|
3490 |
+
if ((!src0_on_device || !src0_is_contiguous) && i02 % i02_divisor == 0) {
|
3491 |
if (src0_is_f32) {
|
3492 |
+
CUDA_CHECK(ggml_cuda_cpy_tensor_2d(src0_ddf_i, src0, i03, i02/i02_divisor, i01_low, i01_high, cudaStream_main));
|
3493 |
} else {
|
3494 |
+
CUDA_CHECK(ggml_cuda_cpy_tensor_2d(src0_ddq_i, src0, i03, i02/i02_divisor, i01_low, i01_high, cudaStream_main));
|
3495 |
}
|
3496 |
}
|
3497 |
|
|
|
3596 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_mul, true, false); // TODO ggml_cuda_op needs modification for flatten
|
3597 |
}
|
3598 |
|
3599 |
+
void ggml_cuda_gelu(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3600 |
+
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3601 |
+
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_gelu, true, true);
|
3602 |
+
}
|
3603 |
+
|
3604 |
void ggml_cuda_silu(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3605 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3606 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_silu, true, true);
|
3607 |
}
|
3608 |
|
3609 |
+
void ggml_cuda_norm(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3610 |
+
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3611 |
+
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_norm, true, true);
|
3612 |
+
}
|
3613 |
+
|
3614 |
void ggml_cuda_rms_norm(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3615 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3616 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_rms_norm, true, true);
|
|
|
3645 |
const int64_t ne01 = src0->ne[1];
|
3646 |
const int64_t ne02 = src0->ne[2];
|
3647 |
|
3648 |
+
const int64_t ne12 = src1->ne[2];
|
3649 |
+
|
3650 |
CUDA_CHECK(cudaSetDevice(g_main_device));
|
3651 |
cudaStream_t cudaStream_main = g_cudaStreams_main[g_main_device];
|
3652 |
|
|
|
3659 |
struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra;
|
3660 |
float * dst_ddf = (float *) dst_extra->data_device[g_main_device];
|
3661 |
|
3662 |
+
ggml_mul_mat_p021_f16_f32_cuda(src0_ddq, src1_ddf, dst_ddf, ne00, ne01, ne02, ne12, cudaStream_main);
|
3663 |
}
|
3664 |
|
3665 |
void ggml_cuda_mul_mat_vec_nc(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst){
|
|
|
3673 |
const int64_t ne01 = src0->ne[1];
|
3674 |
const int64_t ne02 = src0->ne[2];
|
3675 |
|
3676 |
+
const int64_t ne12 = src1->ne[2];
|
3677 |
+
|
3678 |
const int64_t nb01 = src0->nb[1];
|
3679 |
const int64_t nb02 = src0->nb[2];
|
3680 |
|
|
|
3693 |
const int row_stride_x = nb01 / sizeof(half);
|
3694 |
const int channel_stride_x = nb02 / sizeof(half);
|
3695 |
|
3696 |
+
ggml_mul_mat_vec_nc_f16_f32_cuda(src0_ddq, src1_ddf, dst_ddf, ne00, ne01, row_stride_x, ne02, ne12, channel_stride_x, cudaStream_main);
|
3697 |
}
|
3698 |
|
3699 |
void ggml_cuda_mul_mat(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
|
|
3770 |
(void) dst;
|
3771 |
}
|
3772 |
|
3773 |
+
void ggml_cuda_dup(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3774 |
+
ggml_cuda_cpy(src0, dst, nullptr);
|
3775 |
+
(void) src1;
|
3776 |
+
}
|
3777 |
+
|
3778 |
void ggml_cuda_diag_mask_inf(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
|
3779 |
GGML_ASSERT(src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
|
3780 |
ggml_cuda_op(src0, src1, dst, ggml_cuda_op_diag_mask_inf, true, true);
|
|
|
3834 |
size_t size = ggml_nbytes_split(tensor, nrows_split);
|
3835 |
const size_t original_size = size;
|
3836 |
|
3837 |
+
// pad last row to a multiple of 512 elements to avoid out-of-bounds memory accesses
|
3838 |
if (ne0 % MATRIX_ROW_PADDING != 0) {
|
3839 |
size += (MATRIX_ROW_PADDING - ne0 % MATRIX_ROW_PADDING)
|
3840 |
* ggml_type_size(tensor->type)/ggml_blck_size(tensor->type);
|
|
|
3850 |
}
|
3851 |
|
3852 |
|
3853 |
+
CUDA_CHECK(cudaMemcpy(buf, buf_host, original_size, cudaMemcpyHostToDevice));
|
3854 |
|
3855 |
extra->data_device[id] = buf;
|
3856 |
|
|
|
3884 |
delete extra;
|
3885 |
}
|
3886 |
|
3887 |
+
static struct ggml_tensor_extra_gpu * g_temp_tensor_extras = nullptr;
|
3888 |
+
static size_t g_temp_tensor_extra_index = 0;
|
3889 |
+
|
3890 |
+
static struct ggml_tensor_extra_gpu * ggml_cuda_alloc_temp_tensor_extra() {
|
3891 |
+
if (g_temp_tensor_extras == nullptr) {
|
3892 |
+
g_temp_tensor_extras = new ggml_tensor_extra_gpu[GGML_MAX_NODES];
|
3893 |
+
}
|
3894 |
+
|
3895 |
+
size_t alloc_index = g_temp_tensor_extra_index;
|
3896 |
+
g_temp_tensor_extra_index = (g_temp_tensor_extra_index + 1) % GGML_MAX_NODES;
|
3897 |
+
struct ggml_tensor_extra_gpu * extra = &g_temp_tensor_extras[alloc_index];
|
3898 |
+
memset(extra, 0, sizeof(*extra));
|
3899 |
+
|
3900 |
+
return extra;
|
3901 |
+
}
|
3902 |
+
|
3903 |
void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scratch, bool force_inplace) {
|
3904 |
if (scratch && g_scratch_size == 0) {
|
3905 |
return;
|
|
|
3908 |
// recursively assign CUDA buffers until a compute tensor is found
|
3909 |
if (tensor->src[0] != nullptr && tensor->src[0]->backend == GGML_BACKEND_CPU) {
|
3910 |
const ggml_op src0_op = tensor->src[0]->op;
|
3911 |
+
if (src0_op == GGML_OP_RESHAPE || src0_op == GGML_OP_TRANSPOSE || src0_op == GGML_OP_VIEW || src0_op == GGML_OP_PERMUTE) {
|
3912 |
ggml_cuda_assign_buffers_impl(tensor->src[0], scratch, force_inplace);
|
3913 |
}
|
3914 |
}
|
|
|
3917 |
}
|
3918 |
|
3919 |
tensor->backend = GGML_BACKEND_GPU;
|
3920 |
+
struct ggml_tensor_extra_gpu * extra;
|
|
|
3921 |
|
3922 |
const bool inplace = (tensor->src[0] != nullptr && tensor->src[0]->data == tensor->data) ||
|
3923 |
tensor->op == GGML_OP_VIEW ||
|
|
|
3930 |
char * src0_ddc = (char *) src0_extra->data_device[g_main_device];
|
3931 |
size_t offset = 0;
|
3932 |
if (tensor->op == GGML_OP_VIEW) {
|
3933 |
+
memcpy(&offset, tensor->op_params, sizeof(size_t));
|
3934 |
}
|
3935 |
+
extra = ggml_cuda_alloc_temp_tensor_extra();
|
3936 |
extra->data_device[g_main_device] = src0_ddc + offset;
|
3937 |
} else if (tensor->op == GGML_OP_CPY) {
|
3938 |
struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu * ) tensor->src[1]->extra;
|
3939 |
void * src1_ddv = src1_extra->data_device[g_main_device];
|
3940 |
+
extra = ggml_cuda_alloc_temp_tensor_extra();
|
3941 |
extra->data_device[g_main_device] = src1_ddv;
|
3942 |
} else if (scratch) {
|
3943 |
GGML_ASSERT(size <= g_scratch_size);
|
|
|
3950 |
CUDA_CHECK(cudaMalloc(&data, g_scratch_size));
|
3951 |
g_scratch_buffer = data;
|
3952 |
}
|
3953 |
+
extra = ggml_cuda_alloc_temp_tensor_extra();
|
3954 |
extra->data_device[g_main_device] = data + g_scratch_offset;
|
3955 |
|
3956 |
g_scratch_offset += size;
|
|
|
3960 |
void * data;
|
3961 |
CUDA_CHECK(cudaMalloc(&data, size));
|
3962 |
CUDA_CHECK(cudaMemset(data, 0, size));
|
3963 |
+
extra = new ggml_tensor_extra_gpu;
|
3964 |
+
memset(extra, 0, sizeof(*extra));
|
3965 |
extra->data_device[g_main_device] = data;
|
3966 |
}
|
3967 |
|
|
|
4014 |
|| (tensor->src[1] != nullptr && tensor->src[1]->backend == GGML_BACKEND_GPU);
|
4015 |
|
4016 |
switch (tensor->op) {
|
4017 |
+
case GGML_OP_DUP:
|
4018 |
+
if (!any_on_device) {
|
4019 |
+
return false;
|
4020 |
+
}
|
4021 |
+
func = ggml_cuda_dup;
|
4022 |
+
break;
|
4023 |
case GGML_OP_ADD:
|
4024 |
if (!any_on_device) {
|
4025 |
return false;
|
|
|
4032 |
}
|
4033 |
func = ggml_cuda_mul;
|
4034 |
break;
|
4035 |
+
case GGML_OP_UNARY:
|
4036 |
+
switch (ggml_get_unary_op(tensor)) {
|
4037 |
+
case GGML_UNARY_OP_GELU:
|
4038 |
+
if (!any_on_device) {
|
4039 |
+
return false;
|
4040 |
+
}
|
4041 |
+
func = ggml_cuda_gelu;
|
4042 |
+
break;
|
4043 |
+
case GGML_UNARY_OP_SILU:
|
4044 |
+
if (!any_on_device) {
|
4045 |
+
return false;
|
4046 |
+
}
|
4047 |
+
func = ggml_cuda_silu;
|
4048 |
+
break;
|
4049 |
+
default:
|
4050 |
+
return false;
|
4051 |
+
} break;
|
4052 |
+
case GGML_OP_NORM:
|
4053 |
if (!any_on_device) {
|
4054 |
return false;
|
4055 |
}
|
4056 |
+
func = ggml_cuda_norm;
|
4057 |
break;
|
4058 |
case GGML_OP_RMS_NORM:
|
4059 |
if (!any_on_device) {
|
|
|
4079 |
}
|
4080 |
func = ggml_cuda_cpy;
|
4081 |
break;
|
4082 |
+
case GGML_OP_CONT:
|
4083 |
+
if (!any_on_device) {
|
4084 |
+
return false;
|
4085 |
+
}
|
4086 |
+
func = ggml_cuda_dup;
|
4087 |
+
break;
|
4088 |
case GGML_OP_RESHAPE:
|
4089 |
case GGML_OP_VIEW:
|
4090 |
case GGML_OP_PERMUTE:
|
ggml-metal.h
CHANGED
@@ -61,6 +61,13 @@ void ggml_metal_set_tensor(struct ggml_metal_context * ctx, struct ggml_tensor *
|
|
61 |
// get data from the device into host memory
|
62 |
void ggml_metal_get_tensor(struct ggml_metal_context * ctx, struct ggml_tensor * t);
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
// same as ggml_graph_compute but uses Metal
|
65 |
// creates gf->n_threads command buffers in parallel
|
66 |
void ggml_metal_graph_compute(struct ggml_metal_context * ctx, struct ggml_cgraph * gf);
|
|
|
61 |
// get data from the device into host memory
|
62 |
void ggml_metal_get_tensor(struct ggml_metal_context * ctx, struct ggml_tensor * t);
|
63 |
|
64 |
+
// try to find operations that can be run concurrently in the graph
|
65 |
+
// you should run it again if the topology of your graph changes
|
66 |
+
void ggml_metal_graph_find_concurrency(struct ggml_metal_context * ctx, struct ggml_cgraph * gf);
|
67 |
+
|
68 |
+
// if the graph has been optimized for concurrently dispatch
|
69 |
+
bool ggml_metal_if_optimized(struct ggml_metal_context * ctx);
|
70 |
+
|
71 |
// same as ggml_graph_compute but uses Metal
|
72 |
// creates gf->n_threads command buffers in parallel
|
73 |
void ggml_metal_graph_compute(struct ggml_metal_context * ctx, struct ggml_cgraph * gf);
|