summaryrefslogtreecommitdiff
path: root/examples/server
diff options
context:
space:
mode:
authorslaren <slarengh@gmail.com>2024-01-12 20:07:38 +0100
committerGitHub <noreply@github.com>2024-01-12 20:07:38 +0100
commite7e4df031b9e29d4b55a4e0b0295187f6b213db1 (patch)
tree93211b7800be3c2c5f9eb1d55f3b7b3acdc56c9b /examples/server
parent584d674be622fbf1578694ada6e62eebedbfd377 (diff)
llama : ggml-backend integration (#4766)
* llama : ggml-backend integration * ggml-backend : add names to buffers * fix unmap after loading * batched-bench : add tensor_split param * llama : check for null tensor_split * ggml-backend : increase GGML_MAX_BACKENDS * improve graph splitting, partial fix for --no-kv-offload * cuda : add ggml-backend split buffer support * cuda : do not create buffer types for devices that don't exist (fixes usage without CUDA devices available) * ggml : fix null backend dereference (#4807) * ggml : fix null backend dereference * ggml : also check ggml_backend_is_cpu * test-backend-ops : check buffer allocation failures * llama : add cparam (split_mode) and command line argument (--split-mode, -sm) to configure the split mode (none, layer or row) * ggml : fix mul_mat_id work size * llama : rewrite session kv load/set without graphs * minor * llama : only initialize used backends, free backends on context free * llama : abort ctx if cuda backend init fails * llama : rewrite lora with ggml-backend and compute on CPU ggml-ci * llama : only map to a backend buffer the region of the file mapping containing the tensors used in the buffer * opencl : add ggml-backend buffer type * cuda : only use batched_cublas with batched mat muls (fixes fp16 tg perf) * llama : on Metal, by default offload the full model ggml-ci * metal : page align the data ptr (#4854) * Apply suggestions from code review Co-authored-by: Johannes Gäßler <johannesg@5d6.de> * cuda : fix split buffer free * address review comments * llama-bench : add split-mode parameter * fix whitespace * opencl : fix double initialization * server : add --split-mode parameter * use async copy and compute to improve multi-gpu performance ggml-ci * use async memcpys to copy the graph outputs to the CPU * fix opencl * use a host buffer for the cpu compute buffer for faster copies to the gpu --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com> Co-authored-by: Johannes Gäßler <johannesg@5d6.de>
Diffstat (limited to 'examples/server')
-rw-r--r--examples/server/server.cpp40
1 files changed, 35 insertions, 5 deletions
diff --git a/examples/server/server.cpp b/examples/server/server.cpp
index 1d30a15a..c1ab8f9d 100644
--- a/examples/server/server.cpp
+++ b/examples/server/server.cpp
@@ -2005,12 +2005,15 @@ static void server_print_usage(const char *argv0, const gpt_params &params,
#ifdef LLAMA_SUPPORTS_GPU_OFFLOAD
printf(" -ngl N, --n-gpu-layers N\n");
printf(" number of layers to store in VRAM\n");
+ printf(" -sm SPLIT_MODE, --split-mode SPLIT_MODE\n");
+ printf(" how to split the model across multiple GPUs, one of:\n");
+ printf(" - none: use one GPU only\n");
+ printf(" - layer (default): split layers and KV across GPUs\n");
+ printf(" - row: split rows across GPUs\n");
printf(" -ts SPLIT --tensor-split SPLIT\n");
- printf(" how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n");
- printf(" -mg i, --main-gpu i the GPU to use for scratch and small tensors\n");
- printf(" -nommq, --no-mul-mat-q\n");
- printf(" use cuBLAS instead of custom mul_mat_q CUDA kernels.\n");
- printf(" Not recommended since this is both slower and uses more VRAM.\n");
+ printf(" fraction of the model to offload to each GPU, comma-separated list of proportions, e.g. 3,1\n");
+ printf(" -mg i, --main-gpu i the GPU to use for the model (with split-mode = none),\n");
+ printf(" or for intermediate results and KV (with split-mode = row)\n");
#endif
printf(" -m FNAME, --model FNAME\n");
printf(" model path (default: %s)\n", params.model.c_str());
@@ -2254,6 +2257,33 @@ static void server_params_parse(int argc, char **argv, server_params &sparams,
{{"n_gpu_layers", params.n_gpu_layers}});
#endif
}
+ else if (arg == "--split-mode" || arg == "-sm")
+ {
+ if (++i >= argc) {
+ invalid_param = true;
+ break;
+ }
+ std::string arg_next = argv[i];
+ if (arg_next == "none")
+ {
+ params.split_mode = LLAMA_SPLIT_NONE;
+ }
+ else if (arg_next == "layer")
+ {
+ params.split_mode = LLAMA_SPLIT_LAYER;
+ }
+ else if (arg_next == "row")
+ {
+ params.split_mode = LLAMA_SPLIT_ROW;
+ }
+ else {
+ invalid_param = true;
+ break;
+ }
+#ifndef GGML_USE_CUBLAS
+ fprintf(stderr, "warning: llama.cpp was compiled without cuBLAS. Setting the split mode has no effect.\n");
+#endif // GGML_USE_CUBLAS
+ }
else if (arg == "--tensor-split" || arg == "-ts")
{
if (++i >= argc)