Merge branch 'master' into xsn/llama_batch_remove_compat
This commit is contained in:
commit
b4c9911ebe
19 changed files with 766 additions and 718 deletions
|
@ -31,7 +31,7 @@ variety of hardware - locally and in the cloud.
|
||||||
- Apple silicon is a first-class citizen - optimized via ARM NEON, Accelerate and Metal frameworks
|
- Apple silicon is a first-class citizen - optimized via ARM NEON, Accelerate and Metal frameworks
|
||||||
- AVX, AVX2 and AVX512 support for x86 architectures
|
- AVX, AVX2 and AVX512 support for x86 architectures
|
||||||
- 1.5-bit, 2-bit, 3-bit, 4-bit, 5-bit, 6-bit, and 8-bit integer quantization for faster inference and reduced memory use
|
- 1.5-bit, 2-bit, 3-bit, 4-bit, 5-bit, 6-bit, and 8-bit integer quantization for faster inference and reduced memory use
|
||||||
- Custom CUDA kernels for running LLMs on NVIDIA GPUs (support for AMD GPUs via HIP)
|
- Custom CUDA kernels for running LLMs on NVIDIA GPUs (support for AMD GPUs via HIP and Moore Threads MTT GPUs via MUSA)
|
||||||
- Vulkan and SYCL backend support
|
- Vulkan and SYCL backend support
|
||||||
- CPU+GPU hybrid inference to partially accelerate models larger than the total VRAM capacity
|
- CPU+GPU hybrid inference to partially accelerate models larger than the total VRAM capacity
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ Please refer to [Build llama.cpp locally](./docs/build.md)
|
||||||
| [BLAS](./docs/build.md#blas-build) | All |
|
| [BLAS](./docs/build.md#blas-build) | All |
|
||||||
| [BLIS](./docs/backend/BLIS.md) | All |
|
| [BLIS](./docs/backend/BLIS.md) | All |
|
||||||
| [SYCL](./docs/backend/SYCL.md) | Intel and Nvidia GPU |
|
| [SYCL](./docs/backend/SYCL.md) | Intel and Nvidia GPU |
|
||||||
| [MUSA](./docs/build.md#musa) | Moore Threads GPU |
|
| [MUSA](./docs/build.md#musa) | Moore Threads MTT GPU |
|
||||||
| [CUDA](./docs/build.md#cuda) | Nvidia GPU |
|
| [CUDA](./docs/build.md#cuda) | Nvidia GPU |
|
||||||
| [hipBLAS](./docs/build.md#hipblas) | AMD GPU |
|
| [hipBLAS](./docs/build.md#hipblas) | AMD GPU |
|
||||||
| [Vulkan](./docs/build.md#vulkan) | GPU |
|
| [Vulkan](./docs/build.md#vulkan) | GPU |
|
||||||
|
|
267
common/arg.cpp
267
common/arg.cpp
|
@ -119,32 +119,6 @@ std::string common_arg::to_string() {
|
||||||
// utils
|
// utils
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
|
|
||||||
#else
|
|
||||||
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LLAMA_COMMON_ATTRIBUTE_FORMAT(1, 2)
|
|
||||||
static std::string format(const char * fmt, ...) {
|
|
||||||
va_list ap;
|
|
||||||
va_list ap2;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
va_copy(ap2, ap);
|
|
||||||
int size = vsnprintf(NULL, 0, fmt, ap);
|
|
||||||
GGML_ASSERT(size >= 0 && size < INT_MAX); // NOLINT
|
|
||||||
std::vector<char> buf(size + 1);
|
|
||||||
int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
|
|
||||||
GGML_ASSERT(size2 == size);
|
|
||||||
va_end(ap2);
|
|
||||||
va_end(ap);
|
|
||||||
return std::string(buf.data(), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void common_params_handle_model_default(common_params & params) {
|
static void common_params_handle_model_default(common_params & params) {
|
||||||
if (!params.hf_repo.empty()) {
|
if (!params.hf_repo.empty()) {
|
||||||
// short-hand to avoid specifying --hf-file -> default it to --model
|
// short-hand to avoid specifying --hf-file -> default it to --model
|
||||||
|
@ -199,7 +173,7 @@ static bool common_params_parse_ex(int argc, char ** argv, common_params_context
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} catch (std::exception & e) {
|
} catch (std::exception & e) {
|
||||||
throw std::invalid_argument(format(
|
throw std::invalid_argument(string_format(
|
||||||
"error while handling environment variable \"%s\": %s\n\n", opt.env, e.what()));
|
"error while handling environment variable \"%s\": %s\n\n", opt.env, e.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,7 +194,7 @@ static bool common_params_parse_ex(int argc, char ** argv, common_params_context
|
||||||
std::replace(arg.begin(), arg.end(), '_', '-');
|
std::replace(arg.begin(), arg.end(), '_', '-');
|
||||||
}
|
}
|
||||||
if (arg_to_options.find(arg) == arg_to_options.end()) {
|
if (arg_to_options.find(arg) == arg_to_options.end()) {
|
||||||
throw std::invalid_argument(format("error: invalid argument: %s", arg.c_str()));
|
throw std::invalid_argument(string_format("error: invalid argument: %s", arg.c_str()));
|
||||||
}
|
}
|
||||||
auto opt = *arg_to_options[arg];
|
auto opt = *arg_to_options[arg];
|
||||||
if (opt.has_value_from_env()) {
|
if (opt.has_value_from_env()) {
|
||||||
|
@ -252,7 +226,7 @@ static bool common_params_parse_ex(int argc, char ** argv, common_params_context
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} catch (std::exception & e) {
|
} catch (std::exception & e) {
|
||||||
throw std::invalid_argument(format(
|
throw std::invalid_argument(string_format(
|
||||||
"error while handling argument \"%s\": %s\n\n"
|
"error while handling argument \"%s\": %s\n\n"
|
||||||
"usage:\n%s\n\nto show complete usage, run with -h",
|
"usage:\n%s\n\nto show complete usage, run with -h",
|
||||||
arg.c_str(), e.what(), arg_to_options[arg]->to_string().c_str()));
|
arg.c_str(), e.what(), arg_to_options[arg]->to_string().c_str()));
|
||||||
|
@ -391,28 +365,28 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--verbose-prompt"},
|
{"--verbose-prompt"},
|
||||||
format("print a verbose prompt before generation (default: %s)", params.verbose_prompt ? "true" : "false"),
|
string_format("print a verbose prompt before generation (default: %s)", params.verbose_prompt ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.verbose_prompt = true;
|
params.verbose_prompt = true;
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--no-display-prompt"},
|
{"--no-display-prompt"},
|
||||||
format("don't print prompt at generation (default: %s)", !params.display_prompt ? "true" : "false"),
|
string_format("don't print prompt at generation (default: %s)", !params.display_prompt ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.display_prompt = false;
|
params.display_prompt = false;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-co", "--color"},
|
{"-co", "--color"},
|
||||||
format("colorise output to distinguish prompt and user input from generations (default: %s)", params.use_color ? "true" : "false"),
|
string_format("colorise output to distinguish prompt and user input from generations (default: %s)", params.use_color ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.use_color = true;
|
params.use_color = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
|
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-t", "--threads"}, "N",
|
{"-t", "--threads"}, "N",
|
||||||
format("number of threads to use during generation (default: %d)", params.cpuparams.n_threads),
|
string_format("number of threads to use during generation (default: %d)", params.cpuparams.n_threads),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.cpuparams.n_threads = value;
|
params.cpuparams.n_threads = value;
|
||||||
if (params.cpuparams.n_threads <= 0) {
|
if (params.cpuparams.n_threads <= 0) {
|
||||||
|
@ -472,14 +446,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--cpu-strict"}, "<0|1>",
|
{"--cpu-strict"}, "<0|1>",
|
||||||
format("use strict CPU placement (default: %u)\n", (unsigned) params.cpuparams.strict_cpu),
|
string_format("use strict CPU placement (default: %u)\n", (unsigned) params.cpuparams.strict_cpu),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.cpuparams.strict_cpu = std::stoul(value);
|
params.cpuparams.strict_cpu = std::stoul(value);
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--prio"}, "N",
|
{"--prio"}, "N",
|
||||||
format("set process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.cpuparams.priority),
|
string_format("set process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.cpuparams.priority),
|
||||||
[](common_params & params, int prio) {
|
[](common_params & params, int prio) {
|
||||||
if (prio < 0 || prio > 3) {
|
if (prio < 0 || prio > 3) {
|
||||||
throw std::invalid_argument("invalid value");
|
throw std::invalid_argument("invalid value");
|
||||||
|
@ -489,7 +463,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--poll"}, "<0...100>",
|
{"--poll"}, "<0...100>",
|
||||||
format("use polling level to wait for work (0 - no polling, default: %u)\n", (unsigned) params.cpuparams.poll),
|
string_format("use polling level to wait for work (0 - no polling, default: %u)\n", (unsigned) params.cpuparams.poll),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.cpuparams.poll = std::stoul(value);
|
params.cpuparams.poll = std::stoul(value);
|
||||||
}
|
}
|
||||||
|
@ -523,7 +497,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--prio-batch"}, "N",
|
{"--prio-batch"}, "N",
|
||||||
format("set process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.cpuparams_batch.priority),
|
string_format("set process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.cpuparams_batch.priority),
|
||||||
[](common_params & params, int prio) {
|
[](common_params & params, int prio) {
|
||||||
if (prio < 0 || prio > 3) {
|
if (prio < 0 || prio > 3) {
|
||||||
throw std::invalid_argument("invalid value");
|
throw std::invalid_argument("invalid value");
|
||||||
|
@ -567,7 +541,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--prio-draft"}, "N",
|
{"--prio-draft"}, "N",
|
||||||
format("set draft process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.draft_cpuparams.priority),
|
string_format("set draft process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.draft_cpuparams.priority),
|
||||||
[](common_params & params, int prio) {
|
[](common_params & params, int prio) {
|
||||||
if (prio < 0 || prio > 3) {
|
if (prio < 0 || prio > 3) {
|
||||||
throw std::invalid_argument("invalid value");
|
throw std::invalid_argument("invalid value");
|
||||||
|
@ -611,7 +585,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--prio-batch-draft"}, "N",
|
{"--prio-batch-draft"}, "N",
|
||||||
format("set draft process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.draft_cpuparams_batch.priority),
|
string_format("set draft process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: %d)\n", params.draft_cpuparams_batch.priority),
|
||||||
[](common_params & params, int prio) {
|
[](common_params & params, int prio) {
|
||||||
if (prio < 0 || prio > 3) {
|
if (prio < 0 || prio > 3) {
|
||||||
throw std::invalid_argument("invalid value");
|
throw std::invalid_argument("invalid value");
|
||||||
|
@ -628,14 +602,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
).set_examples({LLAMA_EXAMPLE_SPECULATIVE}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--draft"}, "N",
|
{"--draft"}, "N",
|
||||||
format("number of tokens to draft for speculative decoding (default: %d)", params.n_draft),
|
string_format("number of tokens to draft for speculative decoding (default: %d)", params.n_draft),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_draft = value;
|
params.n_draft = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
|
).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ps", "--p-split"}, "N",
|
{"-ps", "--p-split"}, "N",
|
||||||
format("speculative decoding split probability (default: %.1f)", (double)params.p_split),
|
string_format("speculative decoding split probability (default: %.1f)", (double)params.p_split),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.p_split = std::stof(value);
|
params.p_split = std::stof(value);
|
||||||
}
|
}
|
||||||
|
@ -656,56 +630,56 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_LOOKUP}));
|
).set_examples({LLAMA_EXAMPLE_LOOKUP}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-c", "--ctx-size"}, "N",
|
{"-c", "--ctx-size"}, "N",
|
||||||
format("size of the prompt context (default: %d, 0 = loaded from model)", params.n_ctx),
|
string_format("size of the prompt context (default: %d, 0 = loaded from model)", params.n_ctx),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_ctx = value;
|
params.n_ctx = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_CTX_SIZE"));
|
).set_env("LLAMA_ARG_CTX_SIZE"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-n", "--predict", "--n-predict"}, "N",
|
{"-n", "--predict", "--n-predict"}, "N",
|
||||||
format("number of tokens to predict (default: %d, -1 = infinity, -2 = until context filled)", params.n_predict),
|
string_format("number of tokens to predict (default: %d, -1 = infinity, -2 = until context filled)", params.n_predict),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_predict = value;
|
params.n_predict = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_N_PREDICT"));
|
).set_env("LLAMA_ARG_N_PREDICT"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-b", "--batch-size"}, "N",
|
{"-b", "--batch-size"}, "N",
|
||||||
format("logical maximum batch size (default: %d)", params.n_batch),
|
string_format("logical maximum batch size (default: %d)", params.n_batch),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_batch = value;
|
params.n_batch = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_BATCH"));
|
).set_env("LLAMA_ARG_BATCH"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ub", "--ubatch-size"}, "N",
|
{"-ub", "--ubatch-size"}, "N",
|
||||||
format("physical maximum batch size (default: %d)", params.n_ubatch),
|
string_format("physical maximum batch size (default: %d)", params.n_ubatch),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_ubatch = value;
|
params.n_ubatch = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_UBATCH"));
|
).set_env("LLAMA_ARG_UBATCH"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--keep"}, "N",
|
{"--keep"}, "N",
|
||||||
format("number of tokens to keep from the initial prompt (default: %d, -1 = all)", params.n_keep),
|
string_format("number of tokens to keep from the initial prompt (default: %d, -1 = all)", params.n_keep),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_keep = value;
|
params.n_keep = value;
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--no-context-shift"},
|
{"--no-context-shift"},
|
||||||
format("disables context shift on inifinite text generation (default: %s)", params.ctx_shift ? "disabled" : "enabled"),
|
string_format("disables context shift on inifinite text generation (default: %s)", params.ctx_shift ? "disabled" : "enabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.ctx_shift = false;
|
params.ctx_shift = false;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_NO_CONTEXT_SHIFT"));
|
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_NO_CONTEXT_SHIFT"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--chunks"}, "N",
|
{"--chunks"}, "N",
|
||||||
format("max number of chunks to process (default: %d, -1 = all)", params.n_chunks),
|
string_format("max number of chunks to process (default: %d, -1 = all)", params.n_chunks),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_chunks = value;
|
params.n_chunks = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_RETRIEVAL}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_RETRIEVAL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-fa", "--flash-attn"},
|
{"-fa", "--flash-attn"},
|
||||||
format("enable Flash Attention (default: %s)", params.flash_attn ? "enabled" : "disabled"),
|
string_format("enable Flash Attention (default: %s)", params.flash_attn ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.flash_attn = true;
|
params.flash_attn = true;
|
||||||
}
|
}
|
||||||
|
@ -721,7 +695,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--no-perf"},
|
{"--no-perf"},
|
||||||
format("disable internal libllama performance timings (default: %s)", params.no_perf ? "true" : "false"),
|
string_format("disable internal libllama performance timings (default: %s)", params.no_perf ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.no_perf = true;
|
params.no_perf = true;
|
||||||
params.sparams.no_perf = true;
|
params.sparams.no_perf = true;
|
||||||
|
@ -733,7 +707,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream file(value);
|
std::ifstream file(value);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
// store the external file name in params
|
// store the external file name in params
|
||||||
params.prompt_file = value;
|
params.prompt_file = value;
|
||||||
|
@ -749,7 +723,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream file(value);
|
std::ifstream file(value);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
params.in_files.push_back(value);
|
params.in_files.push_back(value);
|
||||||
}
|
}
|
||||||
|
@ -760,7 +734,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream file(value, std::ios::binary);
|
std::ifstream file(value, std::ios::binary);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
// store the external file name in params
|
// store the external file name in params
|
||||||
params.prompt_file = value;
|
params.prompt_file = value;
|
||||||
|
@ -772,7 +746,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-e", "--escape"},
|
{"-e", "--escape"},
|
||||||
format("process escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\) (default: %s)", params.escape ? "true" : "false"),
|
string_format("process escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\) (default: %s)", params.escape ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.escape = true;
|
params.escape = true;
|
||||||
}
|
}
|
||||||
|
@ -786,7 +760,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ptc", "--print-token-count"}, "N",
|
{"-ptc", "--print-token-count"}, "N",
|
||||||
format("print token count every N tokens (default: %d)", params.n_print),
|
string_format("print token count every N tokens (default: %d)", params.n_print),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_print = value;
|
params.n_print = value;
|
||||||
}
|
}
|
||||||
|
@ -821,14 +795,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-sp", "--special"},
|
{"-sp", "--special"},
|
||||||
format("special tokens output enabled (default: %s)", params.special ? "true" : "false"),
|
string_format("special tokens output enabled (default: %s)", params.special ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.special = true;
|
params.special = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}));
|
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-cnv", "--conversation"},
|
{"-cnv", "--conversation"},
|
||||||
format(
|
string_format(
|
||||||
"run in conversation mode:\n"
|
"run in conversation mode:\n"
|
||||||
"- does not print special tokens and suffix/prefix\n"
|
"- does not print special tokens and suffix/prefix\n"
|
||||||
"- interactive mode is also enabled\n"
|
"- interactive mode is also enabled\n"
|
||||||
|
@ -841,14 +815,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-i", "--interactive"},
|
{"-i", "--interactive"},
|
||||||
format("run in interactive mode (default: %s)", params.interactive ? "true" : "false"),
|
string_format("run in interactive mode (default: %s)", params.interactive ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.interactive = true;
|
params.interactive = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-if", "--interactive-first"},
|
{"-if", "--interactive-first"},
|
||||||
format("run in interactive mode and wait for input right away (default: %s)", params.interactive_first ? "true" : "false"),
|
string_format("run in interactive mode and wait for input right away (default: %s)", params.interactive_first ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.interactive_first = true;
|
params.interactive_first = true;
|
||||||
}
|
}
|
||||||
|
@ -893,7 +867,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
).set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--spm-infill"},
|
{"--spm-infill"},
|
||||||
format(
|
string_format(
|
||||||
"use Suffix/Prefix/Middle pattern for infill (instead of Prefix/Suffix/Middle) as some models prefer this. (default: %s)",
|
"use Suffix/Prefix/Middle pattern for infill (instead of Prefix/Suffix/Middle) as some models prefer this. (default: %s)",
|
||||||
params.spm_infill ? "enabled" : "disabled"
|
params.spm_infill ? "enabled" : "disabled"
|
||||||
),
|
),
|
||||||
|
@ -903,7 +877,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_INFILL}));
|
).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_INFILL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--samplers"}, "SAMPLERS",
|
{"--samplers"}, "SAMPLERS",
|
||||||
format("samplers that will be used for generation in the order, separated by \';\'\n(default: %s)", sampler_type_names.c_str()),
|
string_format("samplers that will be used for generation in the order, separated by \';\'\n(default: %s)", sampler_type_names.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
const auto sampler_names = string_split(value, ';');
|
const auto sampler_names = string_split(value, ';');
|
||||||
params.sparams.samplers = common_sampler_types_from_names(sampler_names, true);
|
params.sparams.samplers = common_sampler_types_from_names(sampler_names, true);
|
||||||
|
@ -911,14 +885,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-s", "--seed"}, "SEED",
|
{"-s", "--seed"}, "SEED",
|
||||||
format("RNG seed (default: %d, use random seed for %d)", params.sparams.seed, LLAMA_DEFAULT_SEED),
|
string_format("RNG seed (default: %d, use random seed for %d)", params.sparams.seed, LLAMA_DEFAULT_SEED),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.seed = std::stoul(value);
|
params.sparams.seed = std::stoul(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--sampling-seq"}, "SEQUENCE",
|
{"--sampling-seq"}, "SEQUENCE",
|
||||||
format("simplified sequence for samplers that will be used (default: %s)", sampler_type_chars.c_str()),
|
string_format("simplified sequence for samplers that will be used (default: %s)", sampler_type_chars.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.samplers = common_sampler_types_from_chars(value);
|
params.sparams.samplers = common_sampler_types_from_chars(value);
|
||||||
}
|
}
|
||||||
|
@ -932,14 +906,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--penalize-nl"},
|
{"--penalize-nl"},
|
||||||
format("penalize newline tokens (default: %s)", params.sparams.penalize_nl ? "true" : "false"),
|
string_format("penalize newline tokens (default: %s)", params.sparams.penalize_nl ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.sparams.penalize_nl = true;
|
params.sparams.penalize_nl = true;
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--temp"}, "N",
|
{"--temp"}, "N",
|
||||||
format("temperature (default: %.1f)", (double)params.sparams.temp),
|
string_format("temperature (default: %.1f)", (double)params.sparams.temp),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.temp = std::stof(value);
|
params.sparams.temp = std::stof(value);
|
||||||
params.sparams.temp = std::max(params.sparams.temp, 0.0f);
|
params.sparams.temp = std::max(params.sparams.temp, 0.0f);
|
||||||
|
@ -947,42 +921,42 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--top-k"}, "N",
|
{"--top-k"}, "N",
|
||||||
format("top-k sampling (default: %d, 0 = disabled)", params.sparams.top_k),
|
string_format("top-k sampling (default: %d, 0 = disabled)", params.sparams.top_k),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.sparams.top_k = value;
|
params.sparams.top_k = value;
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--top-p"}, "N",
|
{"--top-p"}, "N",
|
||||||
format("top-p sampling (default: %.1f, 1.0 = disabled)", (double)params.sparams.top_p),
|
string_format("top-p sampling (default: %.1f, 1.0 = disabled)", (double)params.sparams.top_p),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.top_p = std::stof(value);
|
params.sparams.top_p = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--min-p"}, "N",
|
{"--min-p"}, "N",
|
||||||
format("min-p sampling (default: %.1f, 0.0 = disabled)", (double)params.sparams.min_p),
|
string_format("min-p sampling (default: %.1f, 0.0 = disabled)", (double)params.sparams.min_p),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.min_p = std::stof(value);
|
params.sparams.min_p = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--tfs"}, "N",
|
{"--tfs"}, "N",
|
||||||
format("tail free sampling, parameter z (default: %.1f, 1.0 = disabled)", (double)params.sparams.tfs_z),
|
string_format("tail free sampling, parameter z (default: %.1f, 1.0 = disabled)", (double)params.sparams.tfs_z),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.tfs_z = std::stof(value);
|
params.sparams.tfs_z = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--typical"}, "N",
|
{"--typical"}, "N",
|
||||||
format("locally typical sampling, parameter p (default: %.1f, 1.0 = disabled)", (double)params.sparams.typ_p),
|
string_format("locally typical sampling, parameter p (default: %.1f, 1.0 = disabled)", (double)params.sparams.typ_p),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.typ_p = std::stof(value);
|
params.sparams.typ_p = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--repeat-last-n"}, "N",
|
{"--repeat-last-n"}, "N",
|
||||||
format("last n tokens to consider for penalize (default: %d, 0 = disabled, -1 = ctx_size)", params.sparams.penalty_last_n),
|
string_format("last n tokens to consider for penalize (default: %d, 0 = disabled, -1 = ctx_size)", params.sparams.penalty_last_n),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.sparams.penalty_last_n = value;
|
params.sparams.penalty_last_n = value;
|
||||||
params.sparams.n_prev = std::max(params.sparams.n_prev, params.sparams.penalty_last_n);
|
params.sparams.n_prev = std::max(params.sparams.n_prev, params.sparams.penalty_last_n);
|
||||||
|
@ -990,42 +964,42 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--repeat-penalty"}, "N",
|
{"--repeat-penalty"}, "N",
|
||||||
format("penalize repeat sequence of tokens (default: %.1f, 1.0 = disabled)", (double)params.sparams.penalty_repeat),
|
string_format("penalize repeat sequence of tokens (default: %.1f, 1.0 = disabled)", (double)params.sparams.penalty_repeat),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.penalty_repeat = std::stof(value);
|
params.sparams.penalty_repeat = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--presence-penalty"}, "N",
|
{"--presence-penalty"}, "N",
|
||||||
format("repeat alpha presence penalty (default: %.1f, 0.0 = disabled)", (double)params.sparams.penalty_present),
|
string_format("repeat alpha presence penalty (default: %.1f, 0.0 = disabled)", (double)params.sparams.penalty_present),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.penalty_present = std::stof(value);
|
params.sparams.penalty_present = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--frequency-penalty"}, "N",
|
{"--frequency-penalty"}, "N",
|
||||||
format("repeat alpha frequency penalty (default: %.1f, 0.0 = disabled)", (double)params.sparams.penalty_freq),
|
string_format("repeat alpha frequency penalty (default: %.1f, 0.0 = disabled)", (double)params.sparams.penalty_freq),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.penalty_freq = std::stof(value);
|
params.sparams.penalty_freq = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--dynatemp-range"}, "N",
|
{"--dynatemp-range"}, "N",
|
||||||
format("dynamic temperature range (default: %.1f, 0.0 = disabled)", (double)params.sparams.dynatemp_range),
|
string_format("dynamic temperature range (default: %.1f, 0.0 = disabled)", (double)params.sparams.dynatemp_range),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.dynatemp_range = std::stof(value);
|
params.sparams.dynatemp_range = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--dynatemp-exp"}, "N",
|
{"--dynatemp-exp"}, "N",
|
||||||
format("dynamic temperature exponent (default: %.1f)", (double)params.sparams.dynatemp_exponent),
|
string_format("dynamic temperature exponent (default: %.1f)", (double)params.sparams.dynatemp_exponent),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.dynatemp_exponent = std::stof(value);
|
params.sparams.dynatemp_exponent = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--mirostat"}, "N",
|
{"--mirostat"}, "N",
|
||||||
format("use Mirostat sampling.\nTop K, Nucleus, Tail Free and Locally Typical samplers are ignored if used.\n"
|
string_format("use Mirostat sampling.\nTop K, Nucleus, Tail Free and Locally Typical samplers are ignored if used.\n"
|
||||||
"(default: %d, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0)", params.sparams.mirostat),
|
"(default: %d, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0)", params.sparams.mirostat),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.sparams.mirostat = value;
|
params.sparams.mirostat = value;
|
||||||
|
@ -1033,14 +1007,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--mirostat-lr"}, "N",
|
{"--mirostat-lr"}, "N",
|
||||||
format("Mirostat learning rate, parameter eta (default: %.1f)", (double)params.sparams.mirostat_eta),
|
string_format("Mirostat learning rate, parameter eta (default: %.1f)", (double)params.sparams.mirostat_eta),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.mirostat_eta = std::stof(value);
|
params.sparams.mirostat_eta = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--mirostat-ent"}, "N",
|
{"--mirostat-ent"}, "N",
|
||||||
format("Mirostat target entropy, parameter tau (default: %.1f)", (double)params.sparams.mirostat_tau),
|
string_format("Mirostat target entropy, parameter tau (default: %.1f)", (double)params.sparams.mirostat_tau),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.mirostat_tau = std::stof(value);
|
params.sparams.mirostat_tau = std::stof(value);
|
||||||
}
|
}
|
||||||
|
@ -1069,7 +1043,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_sparam());
|
).set_sparam());
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--grammar"}, "GRAMMAR",
|
{"--grammar"}, "GRAMMAR",
|
||||||
format("BNF-like grammar to constrain generations (see samples in grammars/ dir) (default: '%s')", params.sparams.grammar.c_str()),
|
string_format("BNF-like grammar to constrain generations (see samples in grammars/ dir) (default: '%s')", params.sparams.grammar.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.sparams.grammar = value;
|
params.sparams.grammar = value;
|
||||||
}
|
}
|
||||||
|
@ -1080,7 +1054,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream file(value);
|
std::ifstream file(value);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
std::copy(
|
std::copy(
|
||||||
std::istreambuf_iterator<char>(file),
|
std::istreambuf_iterator<char>(file),
|
||||||
|
@ -1150,53 +1124,53 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_ROPE_FREQ_SCALE"));
|
).set_env("LLAMA_ARG_ROPE_FREQ_SCALE"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--yarn-orig-ctx"}, "N",
|
{"--yarn-orig-ctx"}, "N",
|
||||||
format("YaRN: original context size of model (default: %d = model training context size)", params.yarn_orig_ctx),
|
string_format("YaRN: original context size of model (default: %d = model training context size)", params.yarn_orig_ctx),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.yarn_orig_ctx = value;
|
params.yarn_orig_ctx = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_YARN_ORIG_CTX"));
|
).set_env("LLAMA_ARG_YARN_ORIG_CTX"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--yarn-ext-factor"}, "N",
|
{"--yarn-ext-factor"}, "N",
|
||||||
format("YaRN: extrapolation mix factor (default: %.1f, 0.0 = full interpolation)", (double)params.yarn_ext_factor),
|
string_format("YaRN: extrapolation mix factor (default: %.1f, 0.0 = full interpolation)", (double)params.yarn_ext_factor),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.yarn_ext_factor = std::stof(value);
|
params.yarn_ext_factor = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_YARN_EXT_FACTOR"));
|
).set_env("LLAMA_ARG_YARN_EXT_FACTOR"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--yarn-attn-factor"}, "N",
|
{"--yarn-attn-factor"}, "N",
|
||||||
format("YaRN: scale sqrt(t) or attention magnitude (default: %.1f)", (double)params.yarn_attn_factor),
|
string_format("YaRN: scale sqrt(t) or attention magnitude (default: %.1f)", (double)params.yarn_attn_factor),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.yarn_attn_factor = std::stof(value);
|
params.yarn_attn_factor = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_YARN_ATTN_FACTOR"));
|
).set_env("LLAMA_ARG_YARN_ATTN_FACTOR"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--yarn-beta-slow"}, "N",
|
{"--yarn-beta-slow"}, "N",
|
||||||
format("YaRN: high correction dim or alpha (default: %.1f)", (double)params.yarn_beta_slow),
|
string_format("YaRN: high correction dim or alpha (default: %.1f)", (double)params.yarn_beta_slow),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.yarn_beta_slow = std::stof(value);
|
params.yarn_beta_slow = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_YARN_BETA_SLOW"));
|
).set_env("LLAMA_ARG_YARN_BETA_SLOW"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--yarn-beta-fast"}, "N",
|
{"--yarn-beta-fast"}, "N",
|
||||||
format("YaRN: low correction dim or beta (default: %.1f)", (double)params.yarn_beta_fast),
|
string_format("YaRN: low correction dim or beta (default: %.1f)", (double)params.yarn_beta_fast),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.yarn_beta_fast = std::stof(value);
|
params.yarn_beta_fast = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_YARN_BETA_FAST"));
|
).set_env("LLAMA_ARG_YARN_BETA_FAST"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-gan", "--grp-attn-n"}, "N",
|
{"-gan", "--grp-attn-n"}, "N",
|
||||||
format("group-attention factor (default: %d)", params.grp_attn_n),
|
string_format("group-attention factor (default: %d)", params.grp_attn_n),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.grp_attn_n = value;
|
params.grp_attn_n = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_GRP_ATTN_N"));
|
).set_env("LLAMA_ARG_GRP_ATTN_N").set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_PASSKEY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-gaw", "--grp-attn-w"}, "N",
|
{"-gaw", "--grp-attn-w"}, "N",
|
||||||
format("group-attention width (default: %.1f)", (double)params.grp_attn_w),
|
string_format("group-attention width (default: %d)", params.grp_attn_w),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.grp_attn_w = value;
|
params.grp_attn_w = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_GRP_ATTN_W"));
|
).set_env("LLAMA_ARG_GRP_ATTN_W").set_examples({LLAMA_EXAMPLE_MAIN}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-dkvc", "--dump-kv-cache"},
|
{"-dkvc", "--dump-kv-cache"},
|
||||||
"verbose print of the KV cache",
|
"verbose print of the KV cache",
|
||||||
|
@ -1213,7 +1187,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_NO_KV_OFFLOAD"));
|
).set_env("LLAMA_ARG_NO_KV_OFFLOAD"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ctk", "--cache-type-k"}, "TYPE",
|
{"-ctk", "--cache-type-k"}, "TYPE",
|
||||||
format("KV cache data type for K (default: %s)", params.cache_type_k.c_str()),
|
string_format("KV cache data type for K (default: %s)", params.cache_type_k.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
// TODO: get the type right here
|
// TODO: get the type right here
|
||||||
params.cache_type_k = value;
|
params.cache_type_k = value;
|
||||||
|
@ -1221,7 +1195,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_CACHE_TYPE_K"));
|
).set_env("LLAMA_ARG_CACHE_TYPE_K"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ctv", "--cache-type-v"}, "TYPE",
|
{"-ctv", "--cache-type-v"}, "TYPE",
|
||||||
format("KV cache data type for V (default: %s)", params.cache_type_v.c_str()),
|
string_format("KV cache data type for V (default: %s)", params.cache_type_v.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
// TODO: get the type right here
|
// TODO: get the type right here
|
||||||
params.cache_type_v = value;
|
params.cache_type_v = value;
|
||||||
|
@ -1229,7 +1203,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_CACHE_TYPE_V"));
|
).set_env("LLAMA_ARG_CACHE_TYPE_V"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--perplexity", "--all-logits"},
|
{"--perplexity", "--all-logits"},
|
||||||
format("return logits for all tokens in the batch (default: %s)", params.logits_all ? "true" : "false"),
|
string_format("return logits for all tokens in the batch (default: %s)", params.logits_all ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.logits_all = true;
|
params.logits_all = true;
|
||||||
}
|
}
|
||||||
|
@ -1243,7 +1217,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--hellaswag-tasks"}, "N",
|
{"--hellaswag-tasks"}, "N",
|
||||||
format("number of tasks to use when computing the HellaSwag score (default: %zu)", params.hellaswag_tasks),
|
string_format("number of tasks to use when computing the HellaSwag score (default: %zu)", params.hellaswag_tasks),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.hellaswag_tasks = value;
|
params.hellaswag_tasks = value;
|
||||||
}
|
}
|
||||||
|
@ -1257,7 +1231,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--winogrande-tasks"}, "N",
|
{"--winogrande-tasks"}, "N",
|
||||||
format("number of tasks to use when computing the Winogrande score (default: %zu)", params.winogrande_tasks),
|
string_format("number of tasks to use when computing the Winogrande score (default: %zu)", params.winogrande_tasks),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.winogrande_tasks = value;
|
params.winogrande_tasks = value;
|
||||||
}
|
}
|
||||||
|
@ -1271,7 +1245,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--multiple-choice-tasks"}, "N",
|
{"--multiple-choice-tasks"}, "N",
|
||||||
format("number of tasks to use when computing the multiple choice score (default: %zu)", params.multiple_choice_tasks),
|
string_format("number of tasks to use when computing the multiple choice score (default: %zu)", params.multiple_choice_tasks),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.multiple_choice_tasks = value;
|
params.multiple_choice_tasks = value;
|
||||||
}
|
}
|
||||||
|
@ -1292,42 +1266,42 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--ppl-stride"}, "N",
|
{"--ppl-stride"}, "N",
|
||||||
format("stride for perplexity calculation (default: %d)", params.ppl_stride),
|
string_format("stride for perplexity calculation (default: %d)", params.ppl_stride),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.ppl_stride = value;
|
params.ppl_stride = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--ppl-output-type"}, "<0|1>",
|
{"--ppl-output-type"}, "<0|1>",
|
||||||
format("output type for perplexity calculation (default: %d)", params.ppl_output_type),
|
string_format("output type for perplexity calculation (default: %d)", params.ppl_output_type),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.ppl_output_type = value;
|
params.ppl_output_type = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
).set_examples({LLAMA_EXAMPLE_PERPLEXITY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-dt", "--defrag-thold"}, "N",
|
{"-dt", "--defrag-thold"}, "N",
|
||||||
format("KV cache defragmentation threshold (default: %.1f, < 0 - disabled)", (double)params.defrag_thold),
|
string_format("KV cache defragmentation threshold (default: %.1f, < 0 - disabled)", (double)params.defrag_thold),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.defrag_thold = std::stof(value);
|
params.defrag_thold = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_DEFRAG_THOLD"));
|
).set_env("LLAMA_ARG_DEFRAG_THOLD"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-np", "--parallel"}, "N",
|
{"-np", "--parallel"}, "N",
|
||||||
format("number of parallel sequences to decode (default: %d)", params.n_parallel),
|
string_format("number of parallel sequences to decode (default: %d)", params.n_parallel),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_parallel = value;
|
params.n_parallel = value;
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_ARG_N_PARALLEL"));
|
).set_env("LLAMA_ARG_N_PARALLEL"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ns", "--sequences"}, "N",
|
{"-ns", "--sequences"}, "N",
|
||||||
format("number of sequences to decode (default: %d)", params.n_sequences),
|
string_format("number of sequences to decode (default: %d)", params.n_sequences),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_sequences = value;
|
params.n_sequences = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_PARALLEL}));
|
).set_examples({LLAMA_EXAMPLE_PARALLEL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-cb", "--cont-batching"},
|
{"-cb", "--cont-batching"},
|
||||||
format("enable continuous batching (a.k.a dynamic batching) (default: %s)", params.cont_batching ? "enabled" : "disabled"),
|
string_format("enable continuous batching (a.k.a dynamic batching) (default: %s)", params.cont_batching ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.cont_batching = true;
|
params.cont_batching = true;
|
||||||
}
|
}
|
||||||
|
@ -1451,7 +1425,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
std::vector<std::string> split_arg{ it, {} };
|
std::vector<std::string> split_arg{ it, {} };
|
||||||
if (split_arg.size() >= llama_max_devices()) {
|
if (split_arg.size() >= llama_max_devices()) {
|
||||||
throw std::invalid_argument(
|
throw std::invalid_argument(
|
||||||
format("got %d input configs, but system only has %d devices", (int)split_arg.size(), (int)llama_max_devices())
|
string_format("got %d input configs, but system only has %d devices", (int)split_arg.size(), (int)llama_max_devices())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < llama_max_devices(); ++i) {
|
for (size_t i = 0; i < llama_max_devices(); ++i) {
|
||||||
|
@ -1468,7 +1442,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_TENSOR_SPLIT"));
|
).set_env("LLAMA_ARG_TENSOR_SPLIT"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-mg", "--main-gpu"}, "INDEX",
|
{"-mg", "--main-gpu"}, "INDEX",
|
||||||
format("the GPU to use for the model (with split-mode = none), or for intermediate results and KV (with split-mode = row) (default: %d)", params.main_gpu),
|
string_format("the GPU to use for the model (with split-mode = none), or for intermediate results and KV (with split-mode = row) (default: %d)", params.main_gpu),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.main_gpu = value;
|
params.main_gpu = value;
|
||||||
if (!llama_supports_gpu_offload()) {
|
if (!llama_supports_gpu_offload()) {
|
||||||
|
@ -1478,7 +1452,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_env("LLAMA_ARG_MAIN_GPU"));
|
).set_env("LLAMA_ARG_MAIN_GPU"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--check-tensors"},
|
{"--check-tensors"},
|
||||||
format("check model tensor data for invalid values (default: %s)", params.check_tensors ? "true" : "false"),
|
string_format("check model tensor data for invalid values (default: %s)", params.check_tensors ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.check_tensors = true;
|
params.check_tensors = true;
|
||||||
}
|
}
|
||||||
|
@ -1489,7 +1463,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
"types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false",
|
"types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false",
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
if (!string_parse_kv_override(value.c_str(), params.kv_overrides)) {
|
if (!string_parse_kv_override(value.c_str(), params.kv_overrides)) {
|
||||||
throw std::runtime_error(format("error: Invalid type for KV override: %s\n", value.c_str()));
|
throw std::runtime_error(string_format("error: Invalid type for KV override: %s\n", value.c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
@ -1543,7 +1517,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
{"-m", "--model"}, "FNAME",
|
{"-m", "--model"}, "FNAME",
|
||||||
ex == LLAMA_EXAMPLE_EXPORT_LORA
|
ex == LLAMA_EXAMPLE_EXPORT_LORA
|
||||||
? std::string("model path from which to load base model")
|
? std::string("model path from which to load base model")
|
||||||
: format(
|
: string_format(
|
||||||
"model path (default: `models/$filename` with filename from `--hf-file` "
|
"model path (default: `models/$filename` with filename from `--hf-file` "
|
||||||
"or `--model-url` if set, otherwise %s)", DEFAULT_MODEL_PATH
|
"or `--model-url` if set, otherwise %s)", DEFAULT_MODEL_PATH
|
||||||
),
|
),
|
||||||
|
@ -1592,42 +1566,42 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream file(value, std::ios::binary);
|
std::ifstream file(value, std::ios::binary);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
params.context_files.push_back(value);
|
params.context_files.push_back(value);
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--chunk-size"}, "N",
|
{"--chunk-size"}, "N",
|
||||||
format("minimum length of embedded text chunks (default: %d)", params.chunk_size),
|
string_format("minimum length of embedded text chunks (default: %d)", params.chunk_size),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.chunk_size = value;
|
params.chunk_size = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--chunk-separator"}, "STRING",
|
{"--chunk-separator"}, "STRING",
|
||||||
format("separator between chunks (default: '%s')", params.chunk_separator.c_str()),
|
string_format("separator between chunks (default: '%s')", params.chunk_separator.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.chunk_separator = value;
|
params.chunk_separator = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
).set_examples({LLAMA_EXAMPLE_RETRIEVAL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--junk"}, "N",
|
{"--junk"}, "N",
|
||||||
format("number of times to repeat the junk text (default: %d)", params.n_junk),
|
string_format("number of times to repeat the junk text (default: %d)", params.n_junk),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_junk = value;
|
params.n_junk = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_PASSKEY}));
|
).set_examples({LLAMA_EXAMPLE_PASSKEY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--pos"}, "N",
|
{"--pos"}, "N",
|
||||||
format("position of the passkey in the junk text (default: %d)", params.i_pos),
|
string_format("position of the passkey in the junk text (default: %d)", params.i_pos),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.i_pos = value;
|
params.i_pos = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_PASSKEY}));
|
).set_examples({LLAMA_EXAMPLE_PASSKEY}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-o", "--output", "--output-file"}, "FNAME",
|
{"-o", "--output", "--output-file"}, "FNAME",
|
||||||
format("output file (default: '%s')",
|
string_format("output file (default: '%s')",
|
||||||
ex == LLAMA_EXAMPLE_EXPORT_LORA
|
ex == LLAMA_EXAMPLE_EXPORT_LORA
|
||||||
? params.lora_outfile.c_str()
|
? params.lora_outfile.c_str()
|
||||||
: ex == LLAMA_EXAMPLE_CVECTOR_GENERATOR
|
: ex == LLAMA_EXAMPLE_CVECTOR_GENERATOR
|
||||||
|
@ -1641,42 +1615,42 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_CVECTOR_GENERATOR, LLAMA_EXAMPLE_EXPORT_LORA}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_CVECTOR_GENERATOR, LLAMA_EXAMPLE_EXPORT_LORA}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-ofreq", "--output-frequency"}, "N",
|
{"-ofreq", "--output-frequency"}, "N",
|
||||||
format("output the imatrix every N iterations (default: %d)", params.n_out_freq),
|
string_format("output the imatrix every N iterations (default: %d)", params.n_out_freq),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_out_freq = value;
|
params.n_out_freq = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--save-frequency"}, "N",
|
{"--save-frequency"}, "N",
|
||||||
format("save an imatrix copy every N iterations (default: %d)", params.n_save_freq),
|
string_format("save an imatrix copy every N iterations (default: %d)", params.n_save_freq),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_save_freq = value;
|
params.n_save_freq = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--process-output"},
|
{"--process-output"},
|
||||||
format("collect data for the output tensor (default: %s)", params.process_output ? "true" : "false"),
|
string_format("collect data for the output tensor (default: %s)", params.process_output ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.process_output = true;
|
params.process_output = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--no-ppl"},
|
{"--no-ppl"},
|
||||||
format("do not compute perplexity (default: %s)", params.compute_ppl ? "true" : "false"),
|
string_format("do not compute perplexity (default: %s)", params.compute_ppl ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.compute_ppl = false;
|
params.compute_ppl = false;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--chunk", "--from-chunk"}, "N",
|
{"--chunk", "--from-chunk"}, "N",
|
||||||
format("start processing the input from chunk N (default: %d)", params.i_chunk),
|
string_format("start processing the input from chunk N (default: %d)", params.i_chunk),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.i_chunk = value;
|
params.i_chunk = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-pps"},
|
{"-pps"},
|
||||||
format("is the prompt shared across parallel sequences (default: %s)", params.is_pp_shared ? "true" : "false"),
|
string_format("is the prompt shared across parallel sequences (default: %s)", params.is_pp_shared ? "true" : "false"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.is_pp_shared = true;
|
params.is_pp_shared = true;
|
||||||
}
|
}
|
||||||
|
@ -1707,7 +1681,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_BENCH}));
|
).set_examples({LLAMA_EXAMPLE_BENCH}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--embd-normalize"}, "N",
|
{"--embd-normalize"}, "N",
|
||||||
format("normalisation for embendings (default: %d) (-1=none, 0=max absolute int16, 1=taxicab, 2=euclidean, >2=p-norm)", params.embd_normalize),
|
string_format("normalisation for embendings (default: %d) (-1=none, 0=max absolute int16, 1=taxicab, 2=euclidean, >2=p-norm)", params.embd_normalize),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.embd_normalize = value;
|
params.embd_normalize = value;
|
||||||
}
|
}
|
||||||
|
@ -1728,35 +1702,35 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_EMBEDDING}));
|
).set_examples({LLAMA_EXAMPLE_EMBEDDING}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--host"}, "HOST",
|
{"--host"}, "HOST",
|
||||||
format("ip address to listen (default: %s)", params.hostname.c_str()),
|
string_format("ip address to listen (default: %s)", params.hostname.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.hostname = value;
|
params.hostname = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_HOST"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_HOST"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--port"}, "PORT",
|
{"--port"}, "PORT",
|
||||||
format("port to listen (default: %d)", params.port),
|
string_format("port to listen (default: %d)", params.port),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.port = value;
|
params.port = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_PORT"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_PORT"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--path"}, "PATH",
|
{"--path"}, "PATH",
|
||||||
format("path to serve static files from (default: %s)", params.public_path.c_str()),
|
string_format("path to serve static files from (default: %s)", params.public_path.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.public_path = value;
|
params.public_path = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_STATIC_PATH"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_STATIC_PATH"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--embedding", "--embeddings"},
|
{"--embedding", "--embeddings"},
|
||||||
format("restrict to only support embedding use case; use only with dedicated embedding models (default: %s)", params.embedding ? "enabled" : "disabled"),
|
string_format("restrict to only support embedding use case; use only with dedicated embedding models (default: %s)", params.embedding ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.embedding = true;
|
params.embedding = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_EMBEDDINGS"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_EMBEDDINGS"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--reranking", "--rerank"},
|
{"--reranking", "--rerank"},
|
||||||
format("enable reranking endpoint on server (default: %s)", params.reranking ? "enabled" : "disabled"),
|
string_format("enable reranking endpoint on server (default: %s)", params.reranking ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.reranking = true;
|
params.reranking = true;
|
||||||
}
|
}
|
||||||
|
@ -1774,7 +1748,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
std::ifstream key_file(value);
|
std::ifstream key_file(value);
|
||||||
if (!key_file) {
|
if (!key_file) {
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
throw std::runtime_error(string_format("error: failed to open file '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
std::string key;
|
std::string key;
|
||||||
while (std::getline(key_file, key)) {
|
while (std::getline(key_file, key)) {
|
||||||
|
@ -1801,7 +1775,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_SSL_CERT_FILE"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_SSL_CERT_FILE"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-to", "--timeout"}, "N",
|
{"-to", "--timeout"}, "N",
|
||||||
format("server read/write timeout in seconds (default: %d)", params.timeout_read),
|
string_format("server read/write timeout in seconds (default: %d)", params.timeout_read),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.timeout_read = value;
|
params.timeout_read = value;
|
||||||
params.timeout_write = value;
|
params.timeout_write = value;
|
||||||
|
@ -1809,45 +1783,28 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_TIMEOUT"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_TIMEOUT"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--threads-http"}, "N",
|
{"--threads-http"}, "N",
|
||||||
format("number of threads used to process HTTP requests (default: %d)", params.n_threads_http),
|
string_format("number of threads used to process HTTP requests (default: %d)", params.n_threads_http),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_threads_http = value;
|
params.n_threads_http = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_THREADS_HTTP"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_THREADS_HTTP"));
|
||||||
add_opt(common_arg(
|
|
||||||
{"-spf", "--system-prompt-file"}, "FNAME",
|
|
||||||
"set a file to load a system prompt (initial prompt of all slots), this is useful for chat applications",
|
|
||||||
[](common_params & params, const std::string & value) {
|
|
||||||
std::ifstream file(value);
|
|
||||||
if (!file) {
|
|
||||||
throw std::runtime_error(format("error: failed to open file '%s'\n", value.c_str()));
|
|
||||||
}
|
|
||||||
std::string system_prompt;
|
|
||||||
std::copy(
|
|
||||||
std::istreambuf_iterator<char>(file),
|
|
||||||
std::istreambuf_iterator<char>(),
|
|
||||||
std::back_inserter(system_prompt)
|
|
||||||
);
|
|
||||||
params.system_prompt = system_prompt;
|
|
||||||
}
|
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}));
|
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--metrics"},
|
{"--metrics"},
|
||||||
format("enable prometheus compatible metrics endpoint (default: %s)", params.endpoint_metrics ? "enabled" : "disabled"),
|
string_format("enable prometheus compatible metrics endpoint (default: %s)", params.endpoint_metrics ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.endpoint_metrics = true;
|
params.endpoint_metrics = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_ENDPOINT_METRICS"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_ENDPOINT_METRICS"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--slots"},
|
{"--slots"},
|
||||||
format("enable slots monitoring endpoint (default: %s)", params.endpoint_slots ? "enabled" : "disabled"),
|
string_format("enable slots monitoring endpoint (default: %s)", params.endpoint_slots ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.endpoint_slots = true;
|
params.endpoint_slots = true;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_ENDPOINT_SLOTS"));
|
).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_ENDPOINT_SLOTS"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--props"},
|
{"--props"},
|
||||||
format("enable changing global properties via POST /props (default: %s)", params.endpoint_props ? "enabled" : "disabled"),
|
string_format("enable changing global properties via POST /props (default: %s)", params.endpoint_props ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.endpoint_props = true;
|
params.endpoint_props = true;
|
||||||
}
|
}
|
||||||
|
@ -1877,7 +1834,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
"only commonly used templates are accepted:\nhttps://github.com/ggerganov/llama.cpp/wiki/Templates-supported-by-llama_chat_apply_template",
|
"only commonly used templates are accepted:\nhttps://github.com/ggerganov/llama.cpp/wiki/Templates-supported-by-llama_chat_apply_template",
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
if (!common_chat_verify_template(value)) {
|
if (!common_chat_verify_template(value)) {
|
||||||
throw std::runtime_error(format(
|
throw std::runtime_error(string_format(
|
||||||
"error: the supplied chat template is not supported: %s\n"
|
"error: the supplied chat template is not supported: %s\n"
|
||||||
"note: llama.cpp does not use jinja parser, we only support commonly used templates\n",
|
"note: llama.cpp does not use jinja parser, we only support commonly used templates\n",
|
||||||
value.c_str()
|
value.c_str()
|
||||||
|
@ -1888,14 +1845,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_CHAT_TEMPLATE"));
|
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_CHAT_TEMPLATE"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-sps", "--slot-prompt-similarity"}, "SIMILARITY",
|
{"-sps", "--slot-prompt-similarity"}, "SIMILARITY",
|
||||||
format("how much the prompt of a request must match the prompt of a slot in order to use that slot (default: %.2f, 0.0 = disabled)\n", params.slot_prompt_similarity),
|
string_format("how much the prompt of a request must match the prompt of a slot in order to use that slot (default: %.2f, 0.0 = disabled)\n", params.slot_prompt_similarity),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.slot_prompt_similarity = std::stof(value);
|
params.slot_prompt_similarity = std::stof(value);
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_SERVER}));
|
).set_examples({LLAMA_EXAMPLE_SERVER}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--lora-init-without-apply"},
|
{"--lora-init-without-apply"},
|
||||||
format("load LoRA adapters without applying them (apply later via POST /lora-adapters) (default: %s)", params.lora_init_without_apply ? "enabled" : "disabled"),
|
string_format("load LoRA adapters without applying them (apply later via POST /lora-adapters) (default: %s)", params.lora_init_without_apply ? "enabled" : "disabled"),
|
||||||
[](common_params & params) {
|
[](common_params & params) {
|
||||||
params.lora_init_without_apply = true;
|
params.lora_init_without_apply = true;
|
||||||
}
|
}
|
||||||
|
@ -1920,28 +1877,28 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--positive-file"}, "FNAME",
|
{"--positive-file"}, "FNAME",
|
||||||
format("positive prompts file, one prompt per line (default: '%s')", params.cvector_positive_file.c_str()),
|
string_format("positive prompts file, one prompt per line (default: '%s')", params.cvector_positive_file.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.cvector_positive_file = value;
|
params.cvector_positive_file = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--negative-file"}, "FNAME",
|
{"--negative-file"}, "FNAME",
|
||||||
format("negative prompts file, one prompt per line (default: '%s')", params.cvector_negative_file.c_str()),
|
string_format("negative prompts file, one prompt per line (default: '%s')", params.cvector_negative_file.c_str()),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
params.cvector_negative_file = value;
|
params.cvector_negative_file = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--pca-batch"}, "N",
|
{"--pca-batch"}, "N",
|
||||||
format("batch size used for PCA. Larger batch runs faster, but uses more memory (default: %d)", params.n_pca_batch),
|
string_format("batch size used for PCA. Larger batch runs faster, but uses more memory (default: %d)", params.n_pca_batch),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_pca_batch = value;
|
params.n_pca_batch = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
).set_examples({LLAMA_EXAMPLE_CVECTOR_GENERATOR}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"--pca-iter"}, "N",
|
{"--pca-iter"}, "N",
|
||||||
format("number of iterations used for PCA (default: %d)", params.n_pca_iterations),
|
string_format("number of iterations used for PCA (default: %d)", params.n_pca_iterations),
|
||||||
[](common_params & params, int value) {
|
[](common_params & params, int value) {
|
||||||
params.n_pca_iterations = value;
|
params.n_pca_iterations = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
#include <climits>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
@ -23,10 +24,10 @@
|
||||||
#include <regex>
|
#include <regex>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
#if defined(__APPLE__) && defined(__MACH__)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -400,6 +401,21 @@ std::string common_params_get_system_info(const common_params & params) {
|
||||||
// String utils
|
// String utils
|
||||||
//
|
//
|
||||||
|
|
||||||
|
std::string string_format(const char * fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
va_list ap2;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
va_copy(ap2, ap);
|
||||||
|
int size = vsnprintf(NULL, 0, fmt, ap);
|
||||||
|
GGML_ASSERT(size >= 0 && size < INT_MAX); // NOLINT
|
||||||
|
std::vector<char> buf(size + 1);
|
||||||
|
int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
|
||||||
|
GGML_ASSERT(size2 == size);
|
||||||
|
va_end(ap2);
|
||||||
|
va_end(ap);
|
||||||
|
return std::string(buf.data(), size);
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> string_split(std::string input, char separator) {
|
std::vector<std::string> string_split(std::string input, char separator) {
|
||||||
std::vector<std::string> parts;
|
std::vector<std::string> parts;
|
||||||
size_t separator_pos = input.find(separator);
|
size_t separator_pos = input.find(separator);
|
||||||
|
|
|
@ -282,7 +282,6 @@ struct common_params {
|
||||||
std::string hostname = "127.0.0.1";
|
std::string hostname = "127.0.0.1";
|
||||||
std::string public_path = ""; // NOLINT
|
std::string public_path = ""; // NOLINT
|
||||||
std::string chat_template = ""; // NOLINT
|
std::string chat_template = ""; // NOLINT
|
||||||
std::string system_prompt = ""; // NOLINT
|
|
||||||
bool enable_chat_template = true;
|
bool enable_chat_template = true;
|
||||||
|
|
||||||
std::vector<std::string> api_keys;
|
std::vector<std::string> api_keys;
|
||||||
|
@ -352,15 +351,28 @@ void common_init();
|
||||||
|
|
||||||
std::string common_params_get_system_info(const common_params & params);
|
std::string common_params_get_system_info(const common_params & params);
|
||||||
|
|
||||||
bool parse_cpu_range(const std::string& range, bool(&boolmask)[GGML_MAX_N_THREADS]);
|
bool parse_cpu_range(const std::string & range, bool(&boolmask)[GGML_MAX_N_THREADS]);
|
||||||
bool parse_cpu_mask(const std::string& mask, bool(&boolmask)[GGML_MAX_N_THREADS]);
|
bool parse_cpu_mask(const std::string & mask, bool(&boolmask)[GGML_MAX_N_THREADS]);
|
||||||
void postprocess_cpu_params(cpu_params& cpuparams, const cpu_params* role_model = nullptr);
|
void postprocess_cpu_params(cpu_params & cpuparams, const cpu_params * role_model = nullptr);
|
||||||
bool set_process_priority(enum ggml_sched_priority prio);
|
bool set_process_priority(enum ggml_sched_priority prio);
|
||||||
|
|
||||||
//
|
//
|
||||||
// String utils
|
// String utils
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
|
||||||
|
#else
|
||||||
|
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define LLAMA_COMMON_ATTRIBUTE_FORMAT(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LLAMA_COMMON_ATTRIBUTE_FORMAT(1, 2)
|
||||||
|
std::string string_format(const char * fmt, ...);
|
||||||
|
|
||||||
std::vector<std::string> string_split(std::string input, char separator);
|
std::vector<std::string> string_split(std::string input, char separator);
|
||||||
|
|
||||||
std::string string_strip(const std::string & str);
|
std::string string_strip(const std::string & str);
|
||||||
|
|
|
@ -198,6 +198,8 @@ The following compilation options are also available to tweak performance:
|
||||||
|
|
||||||
### MUSA
|
### MUSA
|
||||||
|
|
||||||
|
This provides GPU acceleration using the MUSA cores of your Moore Threads MTT GPU. Make sure to have the MUSA SDK installed. You can download it from here: [MUSA SDK](https://developer.mthreads.com/sdk/download/musa).
|
||||||
|
|
||||||
- Using `make`:
|
- Using `make`:
|
||||||
```bash
|
```bash
|
||||||
make GGML_MUSA=1
|
make GGML_MUSA=1
|
||||||
|
@ -209,6 +211,12 @@ The following compilation options are also available to tweak performance:
|
||||||
cmake --build build --config Release
|
cmake --build build --config Release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The environment variable [`MUSA_VISIBLE_DEVICES`](https://docs.mthreads.com/musa-sdk/musa-sdk-doc-online/programming_guide/Z%E9%99%84%E5%BD%95/) can be used to specify which GPU(s) will be used.
|
||||||
|
|
||||||
|
The environment variable `GGML_CUDA_ENABLE_UNIFIED_MEMORY=1` can be used to enable unified memory in Linux. This allows swapping to system RAM instead of crashing when the GPU VRAM is exhausted.
|
||||||
|
|
||||||
|
Most of the compilation options available for CUDA should also be available for MUSA, though they haven't been thoroughly tested yet.
|
||||||
|
|
||||||
### hipBLAS
|
### hipBLAS
|
||||||
|
|
||||||
This provides BLAS acceleration on HIP-supported AMD GPUs.
|
This provides BLAS acceleration on HIP-supported AMD GPUs.
|
||||||
|
|
|
@ -205,11 +205,11 @@ int main(int argc, char ** argv) {
|
||||||
std::vector<llama_token> inp_pfx = common_tokenize(ctx, params.input_prefix, false);
|
std::vector<llama_token> inp_pfx = common_tokenize(ctx, params.input_prefix, false);
|
||||||
std::vector<llama_token> inp_sfx = common_tokenize(ctx, params.input_suffix, false);
|
std::vector<llama_token> inp_sfx = common_tokenize(ctx, params.input_suffix, false);
|
||||||
|
|
||||||
GGML_ASSERT(llama_token_prefix(model) >= 0);
|
GGML_ASSERT(llama_token_fim_pre(model) >= 0);
|
||||||
GGML_ASSERT(llama_token_suffix(model) >= 0);
|
GGML_ASSERT(llama_token_fim_suf(model) >= 0);
|
||||||
|
|
||||||
inp_pfx.insert(inp_pfx.begin(), llama_token_prefix(model));
|
inp_pfx.insert(inp_pfx.begin(), llama_token_fim_pre(model));
|
||||||
inp_sfx.insert(inp_sfx.begin(), llama_token_suffix(model));
|
inp_sfx.insert(inp_sfx.begin(), llama_token_fim_suf(model));
|
||||||
|
|
||||||
embd_inp = params.spm_infill ? inp_sfx : inp_pfx;
|
embd_inp = params.spm_infill ? inp_sfx : inp_pfx;
|
||||||
embd_end = params.spm_infill ? inp_pfx : inp_sfx;
|
embd_end = params.spm_infill ? inp_pfx : inp_sfx;
|
||||||
|
@ -218,7 +218,7 @@ int main(int argc, char ** argv) {
|
||||||
}
|
}
|
||||||
embd_inp.insert(embd_inp.end(), embd_end.begin(), embd_end.end());
|
embd_inp.insert(embd_inp.end(), embd_end.begin(), embd_end.end());
|
||||||
|
|
||||||
const llama_token middle_token = llama_token_middle(model);
|
const llama_token middle_token = llama_token_fim_mid(model);
|
||||||
if (middle_token >= 0) {
|
if (middle_token >= 0) {
|
||||||
embd_inp.push_back(middle_token);
|
embd_inp.push_back(middle_token);
|
||||||
}
|
}
|
||||||
|
@ -508,8 +508,8 @@ int main(int argc, char ** argv) {
|
||||||
std::vector<llama_token> inp_pfx = common_tokenize(ctx, params.input_prefix, false);
|
std::vector<llama_token> inp_pfx = common_tokenize(ctx, params.input_prefix, false);
|
||||||
std::vector<llama_token> inp_sfx = common_tokenize(ctx, params.input_suffix, false);
|
std::vector<llama_token> inp_sfx = common_tokenize(ctx, params.input_suffix, false);
|
||||||
|
|
||||||
inp_pfx.insert(inp_pfx.begin(), llama_token_prefix(model));
|
inp_pfx.insert(inp_pfx.begin(), llama_token_fim_pre(model));
|
||||||
inp_sfx.insert(inp_sfx.begin(), llama_token_suffix(model));
|
inp_sfx.insert(inp_sfx.begin(), llama_token_fim_suf(model));
|
||||||
|
|
||||||
embd_inp = params.spm_infill ? inp_sfx : inp_pfx;
|
embd_inp = params.spm_infill ? inp_sfx : inp_pfx;
|
||||||
embd_end = params.spm_infill ? inp_pfx : inp_sfx;
|
embd_end = params.spm_infill ? inp_pfx : inp_sfx;
|
||||||
|
|
|
@ -60,8 +60,6 @@ The project is under active development, and we are [looking for feedback and co
|
||||||
| `--yarn-attn-factor N` | YaRN: scale sqrt(t) or attention magnitude (default: 1.0)<br/>(env: LLAMA_ARG_YARN_ATTN_FACTOR) |
|
| `--yarn-attn-factor N` | YaRN: scale sqrt(t) or attention magnitude (default: 1.0)<br/>(env: LLAMA_ARG_YARN_ATTN_FACTOR) |
|
||||||
| `--yarn-beta-slow N` | YaRN: high correction dim or alpha (default: 1.0)<br/>(env: LLAMA_ARG_YARN_BETA_SLOW) |
|
| `--yarn-beta-slow N` | YaRN: high correction dim or alpha (default: 1.0)<br/>(env: LLAMA_ARG_YARN_BETA_SLOW) |
|
||||||
| `--yarn-beta-fast N` | YaRN: low correction dim or beta (default: 32.0)<br/>(env: LLAMA_ARG_YARN_BETA_FAST) |
|
| `--yarn-beta-fast N` | YaRN: low correction dim or beta (default: 32.0)<br/>(env: LLAMA_ARG_YARN_BETA_FAST) |
|
||||||
| `-gan, --grp-attn-n N` | group-attention factor (default: 1)<br/>(env: LLAMA_ARG_GRP_ATTN_N) |
|
|
||||||
| `-gaw, --grp-attn-w N` | group-attention width (default: 512.0)<br/>(env: LLAMA_ARG_GRP_ATTN_W) |
|
|
||||||
| `-dkvc, --dump-kv-cache` | verbose print of the KV cache |
|
| `-dkvc, --dump-kv-cache` | verbose print of the KV cache |
|
||||||
| `-nkvo, --no-kv-offload` | disable KV offload<br/>(env: LLAMA_ARG_NO_KV_OFFLOAD) |
|
| `-nkvo, --no-kv-offload` | disable KV offload<br/>(env: LLAMA_ARG_NO_KV_OFFLOAD) |
|
||||||
| `-ctk, --cache-type-k TYPE` | KV cache data type for K (default: f16)<br/>(env: LLAMA_ARG_CACHE_TYPE_K) |
|
| `-ctk, --cache-type-k TYPE` | KV cache data type for K (default: f16)<br/>(env: LLAMA_ARG_CACHE_TYPE_K) |
|
||||||
|
@ -149,7 +147,6 @@ The project is under active development, and we are [looking for feedback and co
|
||||||
| `--ssl-cert-file FNAME` | path to file a PEM-encoded SSL certificate<br/>(env: LLAMA_ARG_SSL_CERT_FILE) |
|
| `--ssl-cert-file FNAME` | path to file a PEM-encoded SSL certificate<br/>(env: LLAMA_ARG_SSL_CERT_FILE) |
|
||||||
| `-to, --timeout N` | server read/write timeout in seconds (default: 600)<br/>(env: LLAMA_ARG_TIMEOUT) |
|
| `-to, --timeout N` | server read/write timeout in seconds (default: 600)<br/>(env: LLAMA_ARG_TIMEOUT) |
|
||||||
| `--threads-http N` | number of threads used to process HTTP requests (default: -1)<br/>(env: LLAMA_ARG_THREADS_HTTP) |
|
| `--threads-http N` | number of threads used to process HTTP requests (default: -1)<br/>(env: LLAMA_ARG_THREADS_HTTP) |
|
||||||
| `-spf, --system-prompt-file FNAME` | set a file to load a system prompt (initial prompt of all slots), this is useful for chat applications |
|
|
||||||
| `--metrics` | enable prometheus compatible metrics endpoint (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_METRICS) |
|
| `--metrics` | enable prometheus compatible metrics endpoint (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_METRICS) |
|
||||||
| `--slots` | enable slots monitoring endpoint (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_SLOTS) |
|
| `--slots` | enable slots monitoring endpoint (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_SLOTS) |
|
||||||
| `--props` | enable changing global properties via POST /props (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_PROPS) |
|
| `--props` | enable changing global properties via POST /props (default: disabled)<br/>(env: LLAMA_ARG_ENDPOINT_PROPS) |
|
||||||
|
@ -320,7 +317,6 @@ node index.js
|
||||||
|
|
||||||
- The prompt is a string or an array with the first element given as a string
|
- The prompt is a string or an array with the first element given as a string
|
||||||
- The model's `tokenizer.ggml.add_bos_token` metadata is `true`
|
- The model's `tokenizer.ggml.add_bos_token` metadata is `true`
|
||||||
- The system prompt is empty
|
|
||||||
|
|
||||||
`temperature`: Adjust the randomness of the generated text. Default: `0.8`
|
`temperature`: Adjust the randomness of the generated text. Default: `0.8`
|
||||||
|
|
||||||
|
@ -378,6 +374,8 @@ node index.js
|
||||||
|
|
||||||
`min_keep`: If greater than 0, force samplers to return N possible tokens at minimum. Default: `0`
|
`min_keep`: If greater than 0, force samplers to return N possible tokens at minimum. Default: `0`
|
||||||
|
|
||||||
|
`t_max_predict_ms`: Set a time limit in milliseconds for the prediction (a.k.a. text-generation) phase. The timeout will trigger if the generation takes more than the specified time (measured since the first token was generated) and if a new-line character has already been generated. Useful for FIM applications. Default: `0`, which is disabled.
|
||||||
|
|
||||||
`image_data`: An array of objects to hold base64-encoded image `data` and its `id`s to be reference in `prompt`. You can determine the place of the image in the prompt as in the following: `USER:[img-12]Describe the image in detail.\nASSISTANT:`. In this case, `[img-12]` will be replaced by the embeddings of the image with id `12` in the following `image_data` array: `{..., "image_data": [{"data": "<BASE64_STRING>", "id": 12}]}`. Use `image_data` only with multimodal models, e.g., LLaVA.
|
`image_data`: An array of objects to hold base64-encoded image `data` and its `id`s to be reference in `prompt`. You can determine the place of the image in the prompt as in the following: `USER:[img-12]Describe the image in detail.\nASSISTANT:`. In this case, `[img-12]` will be replaced by the embeddings of the image with id `12` in the following `image_data` array: `{..., "image_data": [{"data": "<BASE64_STRING>", "id": 12}]}`. Use `image_data` only with multimodal models, e.g., LLaVA.
|
||||||
|
|
||||||
`id_slot`: Assign the completion task to an specific slot. If is -1 the task will be assigned to a Idle slot. Default: `-1`
|
`id_slot`: Assign the completion task to an specific slot. If is -1 the task will be assigned to a Idle slot. Default: `-1`
|
||||||
|
@ -526,7 +524,7 @@ Takes a prefix and a suffix and returns the predicted completion as stream.
|
||||||
- `input_prefix`: Set the prefix of the code to infill.
|
- `input_prefix`: Set the prefix of the code to infill.
|
||||||
- `input_suffix`: Set the suffix of the code to infill.
|
- `input_suffix`: Set the suffix of the code to infill.
|
||||||
|
|
||||||
It also accepts all the options of `/completion` except `stream` and `prompt`.
|
It also accepts all the options of `/completion`.
|
||||||
|
|
||||||
### **GET** `/props`: Get server global properties.
|
### **GET** `/props`: Get server global properties.
|
||||||
|
|
||||||
|
@ -536,14 +534,12 @@ This endpoint is public (no API key check). By default, it is read-only. To make
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"system_prompt": "",
|
|
||||||
"default_generation_settings": { ... },
|
"default_generation_settings": { ... },
|
||||||
"total_slots": 1,
|
"total_slots": 1,
|
||||||
"chat_template": ""
|
"chat_template": ""
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `system_prompt` - the system prompt (initial prompt of all slots). Please note that this does not take into account the chat template. It will append the prompt at the beginning of formatted prompt.
|
|
||||||
- `default_generation_settings` - the default generation settings for the `/completion` endpoint, which has the same fields as the `generation_settings` response object from the `/completion` endpoint.
|
- `default_generation_settings` - the default generation settings for the `/completion` endpoint, which has the same fields as the `generation_settings` response object from the `/completion` endpoint.
|
||||||
- `total_slots` - the total number of slots for process requests (defined by `--parallel` option)
|
- `total_slots` - the total number of slots for process requests (defined by `--parallel` option)
|
||||||
- `chat_template` - the model's original Jinja2 prompt template
|
- `chat_template` - the model's original Jinja2 prompt template
|
||||||
|
@ -554,7 +550,7 @@ To use this endpoint with POST method, you need to start server with `--props`
|
||||||
|
|
||||||
*Options:*
|
*Options:*
|
||||||
|
|
||||||
- `system_prompt`: Change the system prompt (initial prompt of all slots). Please note that this does not take into account the chat template. It will append the prompt at the beginning of formatted prompt.
|
- None yet
|
||||||
|
|
||||||
### POST `/v1/chat/completions`: OpenAI-compatible Chat Completions API
|
### POST `/v1/chat/completions`: OpenAI-compatible Chat Completions API
|
||||||
|
|
||||||
|
|
|
@ -128,9 +128,12 @@ struct slot_params {
|
||||||
bool stream = true;
|
bool stream = true;
|
||||||
bool cache_prompt = false; // remember the prompt to avoid reprocessing all prompt
|
bool cache_prompt = false; // remember the prompt to avoid reprocessing all prompt
|
||||||
|
|
||||||
int32_t n_keep = 0; // number of tokens to keep from initial prompt
|
int32_t n_keep = 0; // number of tokens to keep from initial prompt
|
||||||
int32_t n_discard = 0; // number of tokens after n_keep that may be discarded when shifting context, 0 defaults to half
|
int32_t n_discard = 0; // number of tokens after n_keep that may be discarded when shifting context, 0 defaults to half
|
||||||
int32_t n_predict = -1; // new tokens to predict
|
int32_t n_predict = -1; // new tokens to predict
|
||||||
|
|
||||||
|
int64_t t_max_prompt_ms = -1; // TODO: implement
|
||||||
|
int64_t t_max_predict_ms = -1; // if positive, limit the generation phase to this time limit
|
||||||
|
|
||||||
std::vector<std::string> antiprompt;
|
std::vector<std::string> antiprompt;
|
||||||
|
|
||||||
|
@ -175,6 +178,7 @@ struct server_slot {
|
||||||
server_task_cmpl_type cmpl_type = SERVER_TASK_CMPL_TYPE_NORMAL;
|
server_task_cmpl_type cmpl_type = SERVER_TASK_CMPL_TYPE_NORMAL;
|
||||||
|
|
||||||
bool has_next_token = true;
|
bool has_next_token = true;
|
||||||
|
bool has_new_line = false;
|
||||||
bool truncated = false;
|
bool truncated = false;
|
||||||
bool stopped_eos = false;
|
bool stopped_eos = false;
|
||||||
bool stopped_word = false;
|
bool stopped_word = false;
|
||||||
|
@ -193,21 +197,15 @@ struct server_slot {
|
||||||
|
|
||||||
llama_token sampled;
|
llama_token sampled;
|
||||||
|
|
||||||
int32_t ga_i = 0; // group-attention state
|
|
||||||
int32_t ga_n = 1; // group-attention factor
|
|
||||||
int32_t ga_w = 512; // group-attention width
|
|
||||||
|
|
||||||
int32_t n_past_se = 0; // self-extend
|
|
||||||
|
|
||||||
// stats
|
// stats
|
||||||
size_t n_sent_text = 0; // number of sent text character
|
size_t n_sent_text = 0; // number of sent text character
|
||||||
size_t n_sent_token_probs = 0;
|
size_t n_sent_token_probs = 0;
|
||||||
|
|
||||||
int64_t t_start_process_prompt;
|
int64_t t_start_process_prompt;
|
||||||
int64_t t_start_generation;
|
int64_t t_start_generation;
|
||||||
|
|
||||||
double t_prompt_processing; // ms
|
double t_prompt_processing; // ms
|
||||||
double t_token_generation; // ms
|
double t_token_generation; // ms
|
||||||
|
|
||||||
std::function<void(int)> callback_on_release;
|
std::function<void(int)> callback_on_release;
|
||||||
|
|
||||||
|
@ -216,6 +214,7 @@ struct server_slot {
|
||||||
|
|
||||||
n_prompt_tokens = 0;
|
n_prompt_tokens = 0;
|
||||||
generated_text = "";
|
generated_text = "";
|
||||||
|
has_new_line = false;
|
||||||
truncated = false;
|
truncated = false;
|
||||||
stopped_eos = false;
|
stopped_eos = false;
|
||||||
stopped_word = false;
|
stopped_word = false;
|
||||||
|
@ -225,8 +224,6 @@ struct server_slot {
|
||||||
n_sent_text = 0;
|
n_sent_text = 0;
|
||||||
n_sent_token_probs = 0;
|
n_sent_token_probs = 0;
|
||||||
cmpl_type = SERVER_TASK_CMPL_TYPE_NORMAL;
|
cmpl_type = SERVER_TASK_CMPL_TYPE_NORMAL;
|
||||||
ga_i = 0;
|
|
||||||
n_past_se = 0;
|
|
||||||
|
|
||||||
generated_token_probs.clear();
|
generated_token_probs.clear();
|
||||||
}
|
}
|
||||||
|
@ -623,12 +620,6 @@ struct server_context {
|
||||||
|
|
||||||
int32_t n_ctx; // total context for all clients / slots
|
int32_t n_ctx; // total context for all clients / slots
|
||||||
|
|
||||||
// system prompt
|
|
||||||
bool system_need_update = false;
|
|
||||||
|
|
||||||
std::string system_prompt;
|
|
||||||
std::vector<llama_token> system_tokens;
|
|
||||||
|
|
||||||
// slots / clients
|
// slots / clients
|
||||||
std::vector<server_slot> slots;
|
std::vector<server_slot> slots;
|
||||||
json default_generation_settings_for_props;
|
json default_generation_settings_for_props;
|
||||||
|
@ -665,7 +656,7 @@ struct server_context {
|
||||||
bool load_model(const common_params & params_) {
|
bool load_model(const common_params & params_) {
|
||||||
params = params_;
|
params = params_;
|
||||||
|
|
||||||
// dedicate one sequence to the system prompt
|
// reserve one extra sequence (seq_id == 0) for extra features
|
||||||
params.n_parallel += 1;
|
params.n_parallel += 1;
|
||||||
|
|
||||||
common_init_result llama_init = common_init_from_params(params);
|
common_init_result llama_init = common_init_from_params(params);
|
||||||
|
@ -711,22 +702,6 @@ struct server_context {
|
||||||
|
|
||||||
SLT_INF(slot, "new slot n_ctx_slot = %d\n", slot.n_ctx);
|
SLT_INF(slot, "new slot n_ctx_slot = %d\n", slot.n_ctx);
|
||||||
|
|
||||||
const int ga_n = params.grp_attn_n;
|
|
||||||
const int ga_w = params.grp_attn_w;
|
|
||||||
|
|
||||||
if (ga_n != 1) {
|
|
||||||
GGML_ASSERT(ga_n > 0 && "ga_n must be positive"); // NOLINT
|
|
||||||
GGML_ASSERT(ga_w % ga_n == 0 && "ga_w must be a multiple of ga_n"); // NOLINT
|
|
||||||
//GGML_ASSERT(n_ctx_train % ga_w == 0 && "n_ctx_train must be a multiple of ga_w"); // NOLINT
|
|
||||||
//GGML_ASSERT(n_ctx >= n_ctx_train * ga_n && "n_ctx must be at least n_ctx_train * ga_n"); // NOLINT
|
|
||||||
|
|
||||||
SLT_INF(slot, "slot self-extend: ga_n = %d, ga_w = %d\n", ga_n, ga_w);
|
|
||||||
}
|
|
||||||
|
|
||||||
slot.ga_i = 0;
|
|
||||||
slot.ga_n = ga_n;
|
|
||||||
slot.ga_w = ga_w;
|
|
||||||
|
|
||||||
slot.sparams = params.sparams;
|
slot.sparams = params.sparams;
|
||||||
|
|
||||||
slot.callback_on_release = [this](int) {
|
slot.callback_on_release = [this](int) {
|
||||||
|
@ -753,12 +728,7 @@ struct server_context {
|
||||||
metrics.init();
|
metrics.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<llama_token> tokenize(const json & json_prompt, bool add_special) const {
|
std::vector<llama_token> tokenize(const json & json_prompt, bool add_special, bool parse_special) const {
|
||||||
// TODO: currently, we tokenize using special tokens by default
|
|
||||||
// this is not always correct (see https://github.com/ggerganov/llama.cpp/pull/4160#issuecomment-1824826216)
|
|
||||||
// but it's better compared to completely ignoring ChatML and other chat templates
|
|
||||||
const bool TMP_FORCE_SPECIAL = true;
|
|
||||||
|
|
||||||
// If `add_bos` is true, we only add BOS, when json_prompt is a string,
|
// If `add_bos` is true, we only add BOS, when json_prompt is a string,
|
||||||
// or the first element of the json_prompt array is a string.
|
// or the first element of the json_prompt array is a string.
|
||||||
std::vector<llama_token> prompt_tokens;
|
std::vector<llama_token> prompt_tokens;
|
||||||
|
@ -771,10 +741,10 @@ struct server_context {
|
||||||
|
|
||||||
std::vector<llama_token> p;
|
std::vector<llama_token> p;
|
||||||
if (first) {
|
if (first) {
|
||||||
p = common_tokenize(ctx, s, add_special, TMP_FORCE_SPECIAL);
|
p = common_tokenize(ctx, s, add_special, parse_special);
|
||||||
first = false;
|
first = false;
|
||||||
} else {
|
} else {
|
||||||
p = common_tokenize(ctx, s, false, TMP_FORCE_SPECIAL);
|
p = common_tokenize(ctx, s, false, parse_special);
|
||||||
}
|
}
|
||||||
|
|
||||||
prompt_tokens.insert(prompt_tokens.end(), p.begin(), p.end());
|
prompt_tokens.insert(prompt_tokens.end(), p.begin(), p.end());
|
||||||
|
@ -788,7 +758,7 @@ struct server_context {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
auto s = json_prompt.template get<std::string>();
|
auto s = json_prompt.template get<std::string>();
|
||||||
prompt_tokens = common_tokenize(ctx, s, add_special, TMP_FORCE_SPECIAL);
|
prompt_tokens = common_tokenize(ctx, s, add_special, parse_special);
|
||||||
}
|
}
|
||||||
|
|
||||||
return prompt_tokens;
|
return prompt_tokens;
|
||||||
|
@ -909,6 +879,8 @@ struct server_context {
|
||||||
slot.sparams.seed = json_value(data, "seed", default_sparams.seed);
|
slot.sparams.seed = json_value(data, "seed", default_sparams.seed);
|
||||||
slot.sparams.n_probs = json_value(data, "n_probs", default_sparams.n_probs);
|
slot.sparams.n_probs = json_value(data, "n_probs", default_sparams.n_probs);
|
||||||
slot.sparams.min_keep = json_value(data, "min_keep", default_sparams.min_keep);
|
slot.sparams.min_keep = json_value(data, "min_keep", default_sparams.min_keep);
|
||||||
|
//slot.params.t_max_prompt_ms = json_value(data, "t_max_prompt_ms", default_params.t_max_prompt_ms); // TODO: implement
|
||||||
|
slot.params.t_max_predict_ms = json_value(data, "t_max_predict_ms", default_params.t_max_predict_ms);
|
||||||
|
|
||||||
// process "json_schema" and "grammar"
|
// process "json_schema" and "grammar"
|
||||||
if (data.contains("json_schema") && !data.at("json_schema").is_null() && data.contains("grammar") && !data.at("grammar").is_null()) {
|
if (data.contains("json_schema") && !data.at("json_schema").is_null() && data.contains("grammar") && !data.at("grammar").is_null()) {
|
||||||
|
@ -917,19 +889,14 @@ struct server_context {
|
||||||
}
|
}
|
||||||
if (data.contains("json_schema") && !data.contains("grammar")) {
|
if (data.contains("json_schema") && !data.contains("grammar")) {
|
||||||
try {
|
try {
|
||||||
auto schema = json_value(data, "json_schema", json::object());
|
auto schema = json_value(data, "json_schema", json::object());
|
||||||
slot.sparams.grammar = json_schema_to_grammar(schema);
|
slot.sparams.grammar = json_schema_to_grammar(schema);
|
||||||
} catch (const std::exception & e) {
|
} catch (const std::exception & e) {
|
||||||
send_error(task, std::string("\"json_schema\": ") + e.what(), ERROR_TYPE_INVALID_REQUEST);
|
send_error(task, std::string("\"json_schema\": ") + e.what(), ERROR_TYPE_INVALID_REQUEST);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
slot.sparams.grammar = json_value(data, "grammar", default_sparams.grammar);
|
slot.sparams.grammar = json_value(data, "grammar", default_sparams.grammar);
|
||||||
}
|
|
||||||
|
|
||||||
if (slot.params.cache_prompt && slot.ga_n != 1) {
|
|
||||||
slot.params.cache_prompt = false;
|
|
||||||
SLT_WRN(slot, "%s", "group-attention is not supported with prompt caching. disabling cache\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slot.n_predict > 0 && slot.params.n_predict > slot.n_predict) {
|
if (slot.n_predict > 0 && slot.params.n_predict > slot.n_predict) {
|
||||||
|
@ -1066,51 +1033,6 @@ struct server_context {
|
||||||
clean_kv_cache = false;
|
clean_kv_cache = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void system_prompt_update() {
|
|
||||||
SRV_DBG("updating system prompt: '%s'\n", system_prompt.c_str());
|
|
||||||
|
|
||||||
kv_cache_clear();
|
|
||||||
system_tokens.clear();
|
|
||||||
|
|
||||||
if (!system_prompt.empty()) {
|
|
||||||
system_tokens = common_tokenize(ctx, system_prompt, true);
|
|
||||||
|
|
||||||
const int32_t n_batch = llama_n_batch(ctx);
|
|
||||||
const int32_t n_tokens_prompt = system_tokens.size();
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < n_tokens_prompt; i += n_batch) {
|
|
||||||
const int32_t n_tokens = std::min(n_batch, n_tokens_prompt - i);
|
|
||||||
|
|
||||||
common_batch_clear(batch);
|
|
||||||
|
|
||||||
for (int32_t j = 0; j < n_tokens; ++j) {
|
|
||||||
common_batch_add(batch, system_tokens[i + j], i + j, { 0 }, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (llama_decode(ctx, batch) != 0) {
|
|
||||||
SRV_ERR("%s", "llama_decode() failed\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// assign the system KV cache to all parallel sequences
|
|
||||||
for (int32_t i = 1; i <= params.n_parallel; ++i) {
|
|
||||||
llama_kv_cache_seq_cp(ctx, 0, i, -1, -1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
system_need_update = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool system_prompt_set(const std::string & sys_prompt) {
|
|
||||||
SRV_DBG("system prompt set: '%s'\n", system_prompt.c_str());
|
|
||||||
|
|
||||||
system_prompt = sys_prompt;
|
|
||||||
// update system_tokens and KV cache as soon as all slots are idle
|
|
||||||
system_need_update = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process_token(completion_token_output & result, server_slot & slot) {
|
bool process_token(completion_token_output & result, server_slot & slot) {
|
||||||
// remember which tokens were sampled - used for repetition penalties during sampling
|
// remember which tokens were sampled - used for repetition penalties during sampling
|
||||||
const std::string token_str = common_token_to_piece(ctx, result.tok, params.special);
|
const std::string token_str = common_token_to_piece(ctx, result.tok, params.special);
|
||||||
|
@ -1186,13 +1108,28 @@ struct server_context {
|
||||||
SLT_DBG(slot, "stopped by limit, n_decoded = %d, n_predict = %d\n", slot.n_decoded, slot.params.n_predict);
|
SLT_DBG(slot, "stopped by limit, n_decoded = %d, n_predict = %d\n", slot.n_decoded, slot.params.n_predict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we have already seen a new line, we stop after a certain time limit
|
||||||
|
if (slot.has_new_line && slot.params.t_max_predict_ms > 0 &&
|
||||||
|
(ggml_time_us() - slot.t_start_generation > 1000.0f*slot.params.t_max_predict_ms)) {
|
||||||
|
slot.stopped_limit = true;
|
||||||
|
slot.has_next_token = false;
|
||||||
|
|
||||||
|
SLT_DBG(slot, "stopped by time limit, n_decoded = %d, t_max_predict_ms = %d ms\n", slot.n_decoded, (int) slot.params.t_max_predict_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if there is a new line in the generated text
|
||||||
|
if (result.text_to_send.find('\n') != std::string::npos) {
|
||||||
|
slot.has_new_line = true;
|
||||||
|
}
|
||||||
|
|
||||||
// if context shift is disabled, we stop when it reaches the context limit
|
// if context shift is disabled, we stop when it reaches the context limit
|
||||||
if (slot.n_decoded >= slot.n_ctx) {
|
if (slot.n_past >= slot.n_ctx) {
|
||||||
slot.truncated = true;
|
slot.truncated = true;
|
||||||
slot.stopped_limit = true;
|
slot.stopped_limit = true;
|
||||||
slot.has_next_token = false;
|
slot.has_next_token = false;
|
||||||
|
|
||||||
SLT_DBG(slot, "stopped due to running out of context capacity, n_decoded = %d, n_ctx = %d\n", slot.n_decoded, slot.n_ctx);
|
SLT_DBG(slot, "stopped due to running out of context capacity, n_past = %d, n_prompt_tokens = %d, n_decoded = %d, n_ctx = %d\n",
|
||||||
|
slot.n_decoded, slot.n_prompt_tokens, slot.n_past, slot.n_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (llama_token_is_eog(model, result.tok)) {
|
if (llama_token_is_eog(model, result.tok)) {
|
||||||
|
@ -1204,18 +1141,18 @@ struct server_context {
|
||||||
|
|
||||||
const auto n_ctx_train = llama_n_ctx_train(model);
|
const auto n_ctx_train = llama_n_ctx_train(model);
|
||||||
|
|
||||||
if (slot.params.n_predict < 1 && slot.n_predict < 1 && slot.ga_n == 1 && slot.n_prompt_tokens + slot.n_decoded >= n_ctx_train) {
|
if (slot.params.n_predict < 1 && slot.n_predict < 1 && slot.n_prompt_tokens + slot.n_decoded >= n_ctx_train) {
|
||||||
slot.truncated = true;
|
slot.truncated = true;
|
||||||
slot.stopped_limit = true;
|
slot.stopped_limit = true;
|
||||||
slot.has_next_token = false; // stop prediction
|
slot.has_next_token = false; // stop prediction
|
||||||
|
|
||||||
SLT_WRN(slot,
|
SLT_WRN(slot,
|
||||||
"n_predict (%d) is not set and self-context extend is disabled. "
|
"n_predict (%d) is set for infinite generation. "
|
||||||
"Limiting generated tokens to n_ctx_train (%d) to avoid EOS-less generation infinite loop\n",
|
"Limiting generated tokens to n_ctx_train (%d) to avoid EOS-less generation infinite loop\n",
|
||||||
slot.params.n_predict, n_ctx_train);
|
slot.params.n_predict, n_ctx_train);
|
||||||
}
|
}
|
||||||
|
|
||||||
SLT_DBG(slot, "n_decoded = %d, n_remaining = %d, next token: '%s'\n", slot.n_decoded, slot.n_remaining, token_str.c_str());
|
SLT_DBG(slot, "n_decoded = %d, n_remaining = %d, next token: %5d '%s'\n", slot.n_decoded, slot.n_remaining, result.tok, token_str.c_str());
|
||||||
|
|
||||||
return slot.has_next_token; // continue
|
return slot.has_next_token; // continue
|
||||||
}
|
}
|
||||||
|
@ -1334,6 +1271,7 @@ struct server_context {
|
||||||
{"tokens_evaluated", slot.n_prompt_tokens},
|
{"tokens_evaluated", slot.n_prompt_tokens},
|
||||||
{"generation_settings", get_formated_generation(slot)},
|
{"generation_settings", get_formated_generation(slot)},
|
||||||
{"prompt", slot.prompt},
|
{"prompt", slot.prompt},
|
||||||
|
{"has_new_line", slot.has_new_line},
|
||||||
{"truncated", slot.truncated},
|
{"truncated", slot.truncated},
|
||||||
{"stopped_eos", slot.stopped_eos},
|
{"stopped_eos", slot.stopped_eos},
|
||||||
{"stopped_word", slot.stopped_word},
|
{"stopped_word", slot.stopped_word},
|
||||||
|
@ -1483,9 +1421,8 @@ struct server_context {
|
||||||
if (prompt.is_string() || json_is_array_of_numbers(prompt)) {
|
if (prompt.is_string() || json_is_array_of_numbers(prompt)) {
|
||||||
data["index"] = 0;
|
data["index"] = 0;
|
||||||
create_task(data, false, nullptr);
|
create_task(data, false, nullptr);
|
||||||
}
|
} else if (prompt.is_array()) {
|
||||||
// otherwise, it's a multiple-prompt task, we break it into smaller tasks
|
// otherwise, it's a multiple-prompt task, we break it into smaller tasks
|
||||||
else if (prompt.is_array()) {
|
|
||||||
std::vector<json> prompts = prompt;
|
std::vector<json> prompts = prompt;
|
||||||
if (cmpl_type == SERVER_TASK_CMPL_TYPE_RERANK) {
|
if (cmpl_type == SERVER_TASK_CMPL_TYPE_RERANK) {
|
||||||
// prompts[0] is the question
|
// prompts[0] is the question
|
||||||
|
@ -1510,9 +1447,8 @@ struct server_context {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
// invalid case
|
// invalid case
|
||||||
else {
|
|
||||||
throw std::runtime_error(error_msg);
|
throw std::runtime_error(error_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1662,6 +1598,7 @@ struct server_context {
|
||||||
slot_data["prompt"] = slot.prompt;
|
slot_data["prompt"] = slot.prompt;
|
||||||
slot_data["next_token"] = {
|
slot_data["next_token"] = {
|
||||||
{"has_next_token", slot.has_next_token},
|
{"has_next_token", slot.has_next_token},
|
||||||
|
{"has_new_line", slot.has_new_line},
|
||||||
{"n_remain", slot.n_remaining},
|
{"n_remain", slot.n_remaining},
|
||||||
{"n_decoded", slot.n_decoded},
|
{"n_decoded", slot.n_decoded},
|
||||||
{"stopped_eos", slot.stopped_eos},
|
{"stopped_eos", slot.stopped_eos},
|
||||||
|
@ -1785,6 +1722,9 @@ struct server_context {
|
||||||
}
|
}
|
||||||
slot->cache_tokens.resize(token_count);
|
slot->cache_tokens.resize(token_count);
|
||||||
|
|
||||||
|
// TODO: maybe detokenize the slot->cache_tokens instead?
|
||||||
|
slot->prompt = string_format("[restored %d tokens from file]", (int) token_count);
|
||||||
|
|
||||||
const int64_t t_end = ggml_time_us();
|
const int64_t t_end = ggml_time_us();
|
||||||
const double t_restore_ms = (t_end - t_start) / 1000.0;
|
const double t_restore_ms = (t_end - t_start) / 1000.0;
|
||||||
|
|
||||||
|
@ -1859,12 +1799,8 @@ struct server_context {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (all_idle) {
|
if (all_idle) {
|
||||||
if (system_need_update) {
|
|
||||||
system_prompt_update();
|
|
||||||
}
|
|
||||||
|
|
||||||
SRV_INF("%s", "all slots are idle\n");
|
SRV_INF("%s", "all slots are idle\n");
|
||||||
if (system_prompt.empty() && clean_kv_cache) {
|
if (clean_kv_cache) {
|
||||||
kv_cache_clear();
|
kv_cache_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1885,38 +1821,36 @@ struct server_context {
|
||||||
// apply context-shift if needed
|
// apply context-shift if needed
|
||||||
// TODO: simplify and improve
|
// TODO: simplify and improve
|
||||||
for (server_slot & slot : slots) {
|
for (server_slot & slot : slots) {
|
||||||
if (slot.ga_n == 1) {
|
if (slot.is_processing() && slot.n_past + 1 >= slot.n_ctx) {
|
||||||
if (slot.is_processing() && (int) system_tokens.size() + slot.n_past >= slot.n_ctx - 1) {
|
if (!params.ctx_shift) {
|
||||||
if (!params.ctx_shift) {
|
// this check is redundant (for good)
|
||||||
// this check is redundant (for good)
|
// we should never get here, because generation should already stopped in process_token()
|
||||||
// we should never get here, because generation should already stopped in process_token()
|
slot.release();
|
||||||
slot.release();
|
send_error(slot, "context shift is disabled", ERROR_TYPE_SERVER);
|
||||||
send_error(slot, "context shift is disabled", ERROR_TYPE_SERVER);
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shift context
|
|
||||||
const int n_keep = slot.params.n_keep + add_bos_token;
|
|
||||||
const int n_left = (int) system_tokens.size() + slot.n_past - n_keep;
|
|
||||||
const int n_discard = slot.params.n_discard ? slot.params.n_discard : (n_left / 2);
|
|
||||||
|
|
||||||
SLT_WRN(slot, "slot context shift, n_keep = %d, n_left = %d, n_discard = %d\n", n_keep, n_left, n_discard);
|
|
||||||
|
|
||||||
llama_kv_cache_seq_rm (ctx, slot.id + 1, n_keep , n_keep + n_discard);
|
|
||||||
llama_kv_cache_seq_add(ctx, slot.id + 1, n_keep + n_discard, system_tokens.size() + slot.n_past, -n_discard);
|
|
||||||
|
|
||||||
if (slot.params.cache_prompt) {
|
|
||||||
for (size_t i = n_keep + n_discard; i < slot.cache_tokens.size(); i++) {
|
|
||||||
slot.cache_tokens[i - n_discard] = slot.cache_tokens[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
slot.cache_tokens.resize(slot.cache_tokens.size() - n_discard);
|
|
||||||
}
|
|
||||||
|
|
||||||
slot.n_past -= n_discard;
|
|
||||||
|
|
||||||
slot.truncated = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shift context
|
||||||
|
const int n_keep = slot.params.n_keep + add_bos_token;
|
||||||
|
const int n_left = slot.n_past - n_keep;
|
||||||
|
const int n_discard = slot.params.n_discard ? slot.params.n_discard : (n_left / 2);
|
||||||
|
|
||||||
|
SLT_WRN(slot, "slot context shift, n_keep = %d, n_left = %d, n_discard = %d\n", n_keep, n_left, n_discard);
|
||||||
|
|
||||||
|
llama_kv_cache_seq_rm (ctx, slot.id + 1, n_keep , n_keep + n_discard);
|
||||||
|
llama_kv_cache_seq_add(ctx, slot.id + 1, n_keep + n_discard, slot.n_past, -n_discard);
|
||||||
|
|
||||||
|
if (slot.params.cache_prompt) {
|
||||||
|
for (size_t i = n_keep + n_discard; i < slot.cache_tokens.size(); i++) {
|
||||||
|
slot.cache_tokens[i - n_discard] = slot.cache_tokens[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
slot.cache_tokens.resize(slot.cache_tokens.size() - n_discard);
|
||||||
|
}
|
||||||
|
|
||||||
|
slot.n_past -= n_discard;
|
||||||
|
|
||||||
|
slot.truncated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1931,11 +1865,7 @@ struct server_context {
|
||||||
|
|
||||||
slot.i_batch = batch.n_tokens;
|
slot.i_batch = batch.n_tokens;
|
||||||
|
|
||||||
const int32_t slot_npast = slot.n_past_se > 0 ? slot.n_past_se : slot.n_past;
|
common_batch_add(batch, slot.sampled, slot.n_past, { slot.id + 1 }, true);
|
||||||
|
|
||||||
// TODO: we always have to take into account the "system_tokens"
|
|
||||||
// this is not great and needs to be improved somehow
|
|
||||||
common_batch_add(batch, slot.sampled, system_tokens.size() + slot_npast, { slot.id + 1 }, true);
|
|
||||||
|
|
||||||
slot.n_past += 1;
|
slot.n_past += 1;
|
||||||
|
|
||||||
|
@ -1943,8 +1873,8 @@ struct server_context {
|
||||||
slot.cache_tokens.push_back(slot.sampled);
|
slot.cache_tokens.push_back(slot.sampled);
|
||||||
}
|
}
|
||||||
|
|
||||||
SLT_DBG(slot, "slot decode token, n_ctx = %d, n_past = %d, n_system_tokens = %d, n_cache_tokens = %d, truncated = %d\n",
|
SLT_DBG(slot, "slot decode token, n_ctx = %d, n_past = %d, n_cache_tokens = %d, truncated = %d\n",
|
||||||
slot.n_ctx, slot.n_past, (int) system_tokens.size(), (int) slot.cache_tokens.size(), slot.truncated);
|
slot.n_ctx, slot.n_past, (int) slot.cache_tokens.size(), slot.truncated);
|
||||||
}
|
}
|
||||||
|
|
||||||
// process in chunks of params.n_batch
|
// process in chunks of params.n_batch
|
||||||
|
@ -1971,63 +1901,64 @@ struct server_context {
|
||||||
slot.t_start_process_prompt = ggml_time_us();
|
slot.t_start_process_prompt = ggml_time_us();
|
||||||
slot.t_start_generation = 0;
|
slot.t_start_generation = 0;
|
||||||
|
|
||||||
if (slot.cmpl_type == SERVER_TASK_CMPL_TYPE_INFILL) {
|
switch (slot.cmpl_type) {
|
||||||
const bool add_bos = llama_add_bos_token(model);
|
case SERVER_TASK_CMPL_TYPE_NORMAL:
|
||||||
bool suff_rm_leading_spc = true;
|
case SERVER_TASK_CMPL_TYPE_EMBEDDING:
|
||||||
if (params.input_suffix.find_first_of(' ') == 0 && params.input_suffix.size() > 1) {
|
{
|
||||||
params.input_suffix.erase(0, 1);
|
prompt_tokens = tokenize(slot.prompt, llama_add_bos_token(model), true);
|
||||||
suff_rm_leading_spc = false;
|
} break;
|
||||||
}
|
case SERVER_TASK_CMPL_TYPE_RERANK:
|
||||||
|
{
|
||||||
|
// require slot.prompt to be array of 2 strings
|
||||||
|
if (!slot.prompt.is_array() || slot.prompt.size() != 2) {
|
||||||
|
SLT_ERR(slot, "%s", "invalid prompt for rerank task\n");
|
||||||
|
slot.release();
|
||||||
|
send_error(slot, "invalid prompt for rerank task", ERROR_TYPE_INVALID_REQUEST);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
auto prefix_tokens = tokenize(slot.params.input_prefix, false);
|
// prompt: [BOS]query[EOS][SEP]doc[EOS]
|
||||||
auto suffix_tokens = tokenize(slot.params.input_suffix, false);
|
prompt_tokens.clear();
|
||||||
|
prompt_tokens.push_back(llama_token_bos(model));
|
||||||
|
{
|
||||||
|
const auto part = tokenize(slot.prompt[0], false, false);
|
||||||
|
prompt_tokens.insert(prompt_tokens.end(), part.begin(), part.end());
|
||||||
|
}
|
||||||
|
prompt_tokens.push_back(llama_token_eos(model));
|
||||||
|
prompt_tokens.push_back(llama_token_sep(model));
|
||||||
|
{
|
||||||
|
const auto part = tokenize(slot.prompt[1], false, false);
|
||||||
|
prompt_tokens.insert(prompt_tokens.end(), part.begin(), part.end());
|
||||||
|
}
|
||||||
|
prompt_tokens.push_back(llama_token_eos(model));
|
||||||
|
} break;
|
||||||
|
case SERVER_TASK_CMPL_TYPE_INFILL:
|
||||||
|
{
|
||||||
|
auto prefix_tokens = tokenize(slot.params.input_prefix, false, false);
|
||||||
|
auto suffix_tokens = tokenize(slot.params.input_suffix, false, false);
|
||||||
|
|
||||||
const int space_token = 29871; // TODO: this should not be hardcoded
|
// for now pick context to fit in a single batch (ratio prefix:suffix = 3:1, TODO: configurable?)
|
||||||
if (suff_rm_leading_spc && !suffix_tokens.empty() && suffix_tokens[0] == space_token) {
|
const int n_suffix_take = std::min<int>(suffix_tokens.size(), n_batch/4);
|
||||||
suffix_tokens.erase(suffix_tokens.begin());
|
const int n_prefix_take = std::min<int>(prefix_tokens.size(), (n_batch - 3) - n_suffix_take);
|
||||||
}
|
|
||||||
|
|
||||||
prefix_tokens.insert(prefix_tokens.begin(), llama_token_prefix(model));
|
prefix_tokens.erase(prefix_tokens.begin(), prefix_tokens.begin() + prefix_tokens.size() - n_prefix_take);
|
||||||
suffix_tokens.insert(suffix_tokens.begin(), llama_token_suffix(model));
|
suffix_tokens.resize(n_suffix_take);
|
||||||
|
|
||||||
auto embd_inp = params.spm_infill ? suffix_tokens : prefix_tokens;
|
prefix_tokens.insert(prefix_tokens.begin(), llama_token_fim_pre(model));
|
||||||
auto embd_end = params.spm_infill ? prefix_tokens : suffix_tokens;
|
suffix_tokens.insert(suffix_tokens.begin(), llama_token_fim_suf(model));
|
||||||
if (add_bos) {
|
|
||||||
embd_inp.insert(embd_inp.begin(), llama_token_bos(model));
|
|
||||||
}
|
|
||||||
embd_inp.insert(embd_inp.end(), embd_end.begin(), embd_end.end());
|
|
||||||
|
|
||||||
const llama_token middle_token = llama_token_middle(model);
|
auto embd_inp = params.spm_infill ? suffix_tokens : prefix_tokens;
|
||||||
if (middle_token >= 0) {
|
auto embd_end = params.spm_infill ? prefix_tokens : suffix_tokens;
|
||||||
embd_inp.push_back(middle_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_tokens = embd_inp;
|
if (llama_add_bos_token(model)) {
|
||||||
} else if (slot.cmpl_type == SERVER_TASK_CMPL_TYPE_RERANK) {
|
embd_inp.insert(embd_inp.begin(), llama_token_bos(model));
|
||||||
// require slot.prompt to be array of 2 strings
|
}
|
||||||
if (!slot.prompt.is_array() || slot.prompt.size() != 2) {
|
|
||||||
SLT_ERR(slot, "%s", "invalid prompt for rerank task\n");
|
|
||||||
slot.release();
|
|
||||||
send_error(slot, "invalid prompt for rerank task", ERROR_TYPE_INVALID_REQUEST);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// prompt: [BOS]query[EOS][SEP]doc[EOS]
|
embd_inp.insert(embd_inp.end(), embd_end.begin(), embd_end.end());
|
||||||
prompt_tokens.clear();
|
embd_inp.push_back(llama_token_fim_mid(model));
|
||||||
prompt_tokens.push_back(llama_token_bos(model));
|
|
||||||
{
|
prompt_tokens = std::move(embd_inp);
|
||||||
const auto part = tokenize(slot.prompt[0], false);
|
} break;
|
||||||
prompt_tokens.insert(prompt_tokens.end(), part.begin(), part.end());
|
|
||||||
}
|
|
||||||
prompt_tokens.push_back(llama_token_eos(model));
|
|
||||||
prompt_tokens.push_back(llama_token_sep(model));
|
|
||||||
{
|
|
||||||
const auto part = tokenize(slot.prompt[1], false);
|
|
||||||
prompt_tokens.insert(prompt_tokens.end(), part.begin(), part.end());
|
|
||||||
}
|
|
||||||
prompt_tokens.push_back(llama_token_eos(model));
|
|
||||||
} else {
|
|
||||||
prompt_tokens = tokenize(slot.prompt, system_prompt.empty()); // add BOS if there isn't system prompt
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slot.n_past = 0;
|
slot.n_past = 0;
|
||||||
|
@ -2035,6 +1966,19 @@ struct server_context {
|
||||||
|
|
||||||
SLT_INF(slot, "prompt tokenized, n_ctx_slot = %d, n_keep = %d, n_prompt_tokens = %d\n", slot.n_ctx, slot.params.n_keep, slot.n_prompt_tokens);
|
SLT_INF(slot, "prompt tokenized, n_ctx_slot = %d, n_keep = %d, n_prompt_tokens = %d\n", slot.n_ctx, slot.params.n_keep, slot.n_prompt_tokens);
|
||||||
|
|
||||||
|
// print prompt tokens (for debugging)
|
||||||
|
if (1) {
|
||||||
|
// first 16 tokens (avoid flooding logs)
|
||||||
|
for (int i = 0; i < std::min<int>(16, prompt_tokens.size()); i++) {
|
||||||
|
SLT_DBG(slot, "prompt token %3d: %6d '%s'\n", i, prompt_tokens[i], common_token_to_piece(ctx, prompt_tokens[i]).c_str());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// all
|
||||||
|
for (int i = 0; i < (int) prompt_tokens.size(); i++) {
|
||||||
|
SLT_DBG(slot, "prompt token %3d: %6d '%s'\n", i, prompt_tokens[i], common_token_to_piece(ctx, prompt_tokens[i]).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// empty prompt passed -> release the slot and send empty response
|
// empty prompt passed -> release the slot and send empty response
|
||||||
if (prompt_tokens.empty()) {
|
if (prompt_tokens.empty()) {
|
||||||
SLT_WRN(slot, "%s", "empty prompt - releasing slot\n");
|
SLT_WRN(slot, "%s", "empty prompt - releasing slot\n");
|
||||||
|
@ -2055,7 +1999,9 @@ struct server_context {
|
||||||
} else {
|
} else {
|
||||||
if (!params.ctx_shift) {
|
if (!params.ctx_shift) {
|
||||||
// if context shift is disabled, we make sure prompt size is smaller than KV size
|
// if context shift is disabled, we make sure prompt size is smaller than KV size
|
||||||
if ((int) system_tokens.size() + slot.n_prompt_tokens >= slot.n_ctx) {
|
// TODO: there should be a separate parameter that control prompt truncation
|
||||||
|
// context shift should be applied only during the generation phase
|
||||||
|
if (slot.n_prompt_tokens >= slot.n_ctx) {
|
||||||
slot.release();
|
slot.release();
|
||||||
send_error(slot, "the request exceeds the available context size. try increasing the context size or enable context shift", ERROR_TYPE_INVALID_REQUEST);
|
send_error(slot, "the request exceeds the available context size. try increasing the context size or enable context shift", ERROR_TYPE_INVALID_REQUEST);
|
||||||
continue;
|
continue;
|
||||||
|
@ -2067,7 +2013,7 @@ struct server_context {
|
||||||
slot.params.n_keep = std::min(slot.n_ctx - 4, slot.params.n_keep);
|
slot.params.n_keep = std::min(slot.n_ctx - 4, slot.params.n_keep);
|
||||||
|
|
||||||
// if input prompt is too big, truncate it (if group attention self-extend is disabled)
|
// if input prompt is too big, truncate it (if group attention self-extend is disabled)
|
||||||
if (slot.ga_n == 1 && slot.n_prompt_tokens >= slot.n_ctx) {
|
if (slot.n_prompt_tokens >= slot.n_ctx) {
|
||||||
const int n_left = slot.n_ctx - slot.params.n_keep;
|
const int n_left = slot.n_ctx - slot.params.n_keep;
|
||||||
|
|
||||||
const int n_block_size = n_left / 2;
|
const int n_block_size = n_left / 2;
|
||||||
|
@ -2094,12 +2040,7 @@ struct server_context {
|
||||||
|
|
||||||
common_sampler_reset(slot.smpl);
|
common_sampler_reset(slot.smpl);
|
||||||
|
|
||||||
if (!slot.params.cache_prompt) {
|
if (slot.params.cache_prompt) {
|
||||||
slot.n_past_se = 0;
|
|
||||||
slot.ga_i = 0;
|
|
||||||
} else {
|
|
||||||
GGML_ASSERT(slot.ga_n == 1);
|
|
||||||
|
|
||||||
// reuse any previously computed tokens that are common with the new prompt
|
// reuse any previously computed tokens that are common with the new prompt
|
||||||
slot.n_past = common_part(slot.cache_tokens, prompt_tokens);
|
slot.n_past = common_part(slot.cache_tokens, prompt_tokens);
|
||||||
|
|
||||||
|
@ -2115,9 +2056,6 @@ struct server_context {
|
||||||
SLT_WRN(slot, "need to evaluate at least 1 token to generate logits, n_past = %d, n_prompt_tokens = %d\n", slot.n_past, slot.n_prompt_tokens);
|
SLT_WRN(slot, "need to evaluate at least 1 token to generate logits, n_past = %d, n_prompt_tokens = %d\n", slot.n_past, slot.n_prompt_tokens);
|
||||||
|
|
||||||
slot.n_past--;
|
slot.n_past--;
|
||||||
if (slot.ga_i > 0) {
|
|
||||||
slot.n_past_se--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slot.n_prompt_tokens_processed = 0;
|
slot.n_prompt_tokens_processed = 0;
|
||||||
|
@ -2143,55 +2081,31 @@ struct server_context {
|
||||||
}
|
}
|
||||||
|
|
||||||
// keep only the common part
|
// keep only the common part
|
||||||
int p0 = (int) system_tokens.size() + slot.n_past;
|
if (!llama_kv_cache_seq_rm(ctx, slot.id + 1, slot.n_past, -1)) {
|
||||||
if (!llama_kv_cache_seq_rm(ctx, slot.id + 1, p0, -1)) {
|
|
||||||
// could not partially delete (likely using a non-Transformer model)
|
// could not partially delete (likely using a non-Transformer model)
|
||||||
llama_kv_cache_seq_rm(ctx, slot.id + 1, -1, -1);
|
llama_kv_cache_seq_rm(ctx, slot.id + 1, -1, -1);
|
||||||
|
|
||||||
p0 = (int) system_tokens.size();
|
// there is no common part left
|
||||||
if (p0 != 0) {
|
|
||||||
// copy over the system prompt when there is one
|
|
||||||
llama_kv_cache_seq_cp(ctx, 0, slot.id + 1, -1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// there is no common part left (except for the system prompt)
|
|
||||||
slot.n_past = 0;
|
slot.n_past = 0;
|
||||||
slot.n_past_se = 0;
|
|
||||||
slot.ga_i = 0;
|
|
||||||
// TODO: is the system prompt ever in the sampling context?
|
|
||||||
common_sampler_reset(slot.smpl);
|
common_sampler_reset(slot.smpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SLT_INF(slot, "kv cache rm [%d, end)\n", slot.n_past);
|
||||||
|
|
||||||
// remove the non-common part from the cache
|
// remove the non-common part from the cache
|
||||||
slot.cache_tokens.resize(slot.n_past);
|
slot.cache_tokens.resize(slot.n_past);
|
||||||
|
|
||||||
SLT_INF(slot, "kv cache rm [%d, end)\n", p0);
|
|
||||||
|
|
||||||
int32_t slot_npast = slot.n_past_se > 0 ? slot.n_past_se : slot.n_past;
|
|
||||||
|
|
||||||
int32_t ga_i = slot.ga_i;
|
|
||||||
int32_t ga_n = slot.ga_n;
|
|
||||||
int32_t ga_w = slot.ga_w;
|
|
||||||
|
|
||||||
// add prompt tokens for processing in the current batch
|
// add prompt tokens for processing in the current batch
|
||||||
// TODO: the self-extend stuff here is a mess - simplify and/or abstract it somehow
|
while (slot.n_past < slot.n_prompt_tokens && batch.n_tokens < n_batch) {
|
||||||
for (; slot.n_past < slot.n_prompt_tokens && batch.n_tokens < n_batch; ++slot.n_past) {
|
common_batch_add(batch, prompt_tokens[slot.n_past], slot.n_past, { slot.id + 1 }, false);
|
||||||
if (slot.ga_n != 1) {
|
|
||||||
while (slot_npast >= ga_i + ga_w) {
|
|
||||||
const int bd = (ga_w/ga_n)*(ga_n - 1);
|
|
||||||
slot_npast -= bd;
|
|
||||||
ga_i += ga_w/ga_n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
common_batch_add(batch, prompt_tokens[slot.n_past], system_tokens.size() + slot_npast, { slot.id + 1 }, false);
|
|
||||||
|
|
||||||
if (slot.params.cache_prompt) {
|
if (slot.params.cache_prompt) {
|
||||||
slot.cache_tokens.push_back(prompt_tokens[slot.n_past]);
|
slot.cache_tokens.push_back(prompt_tokens[slot.n_past]);
|
||||||
}
|
}
|
||||||
|
|
||||||
slot.n_prompt_tokens_processed++;
|
slot.n_prompt_tokens_processed++;
|
||||||
slot_npast++;
|
slot.n_past++;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLT_INF(slot, "prompt processing progress, n_past = %d, n_tokens = %d, progress = %f\n", slot.n_past, batch.n_tokens, (float) slot.n_prompt_tokens_processed / slot.n_prompt_tokens);
|
SLT_INF(slot, "prompt processing progress, n_past = %d, n_tokens = %d, progress = %f\n", slot.n_past, batch.n_tokens, (float) slot.n_prompt_tokens_processed / slot.n_prompt_tokens);
|
||||||
|
@ -2232,34 +2146,6 @@ struct server_context {
|
||||||
for (int32_t i = 0; i < batch.n_tokens; i += n_batch) {
|
for (int32_t i = 0; i < batch.n_tokens; i += n_batch) {
|
||||||
const int32_t n_tokens = std::min(n_batch, batch.n_tokens - i);
|
const int32_t n_tokens = std::min(n_batch, batch.n_tokens - i);
|
||||||
|
|
||||||
for (auto & slot : slots) {
|
|
||||||
if (slot.ga_n != 1) {
|
|
||||||
// context extension via Self-Extend
|
|
||||||
// TODO: simplify and/or abstract this
|
|
||||||
while (slot.n_past_se >= slot.ga_i + slot.ga_w) {
|
|
||||||
const int ib = (slot.ga_n * slot.ga_i) / slot.ga_w;
|
|
||||||
const int bd = (slot.ga_w / slot.ga_n) * (slot.ga_n - 1);
|
|
||||||
const int dd = (slot.ga_w / slot.ga_n) - ib * bd - slot.ga_w;
|
|
||||||
|
|
||||||
SLT_DBG(slot, "shift: [%6d, %6d] + %6d -> [%6d, %6d]\n", slot.ga_i, slot.n_past_se, ib * bd, slot.ga_i + ib * bd, slot.n_past_se + ib * bd);
|
|
||||||
SLT_DBG(slot, "div: [%6d, %6d] / %6d -> [%6d, %6d]\n", slot.ga_i + ib * bd, slot.ga_i + ib * bd + slot.ga_w, slot.ga_n, (slot.ga_i + ib * bd) / slot.ga_n, (slot.ga_i + ib * bd + slot.ga_w) / slot.ga_n);
|
|
||||||
SLT_DBG(slot, "shift: [%6d, %6d] + %6d -> [%6d, %6d]\n", slot.ga_i + ib * bd + slot.ga_w, slot.n_past_se + ib * bd, dd, slot.ga_i + ib * bd + slot.ga_w + dd, slot.n_past_se + ib * bd + dd);
|
|
||||||
|
|
||||||
llama_kv_cache_seq_add(ctx, slot.id + 1, slot.ga_i, slot.n_past_se, ib * bd);
|
|
||||||
llama_kv_cache_seq_div(ctx, slot.id + 1, slot.ga_i + ib * bd, slot.ga_i + ib * bd + slot.ga_w, slot.ga_n);
|
|
||||||
llama_kv_cache_seq_add(ctx, slot.id + 1, slot.ga_i + ib * bd + slot.ga_w, slot.n_past_se + ib * bd, dd);
|
|
||||||
|
|
||||||
slot.n_past_se -= bd;
|
|
||||||
|
|
||||||
slot.ga_i += slot.ga_w / slot.ga_n;
|
|
||||||
|
|
||||||
SLT_DBG(slot, "\nn_past_old = %d, n_past = %d, ga_i = %d\n\n", slot.n_past_se + bd, slot.n_past_se, slot.ga_i);
|
|
||||||
}
|
|
||||||
|
|
||||||
slot.n_past_se += n_tokens;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
llama_batch batch_view = {
|
llama_batch batch_view = {
|
||||||
n_tokens,
|
n_tokens,
|
||||||
batch.token + i,
|
batch.token + i,
|
||||||
|
@ -2413,10 +2299,6 @@ int main(int argc, char ** argv) {
|
||||||
// struct that contains llama context and inference
|
// struct that contains llama context and inference
|
||||||
server_context ctx_server;
|
server_context ctx_server;
|
||||||
|
|
||||||
if (!params.system_prompt.empty()) {
|
|
||||||
ctx_server.system_prompt_set(params.system_prompt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (params.model_alias == "unknown") {
|
if (params.model_alias == "unknown") {
|
||||||
params.model_alias = params.model;
|
params.model_alias = params.model;
|
||||||
}
|
}
|
||||||
|
@ -2844,7 +2726,6 @@ int main(int argc, char ** argv) {
|
||||||
|
|
||||||
const auto handle_props = [&ctx_server, &res_ok](const httplib::Request &, httplib::Response & res) {
|
const auto handle_props = [&ctx_server, &res_ok](const httplib::Request &, httplib::Response & res) {
|
||||||
json data = {
|
json data = {
|
||||||
{ "system_prompt", ctx_server.system_prompt },
|
|
||||||
{ "default_generation_settings", ctx_server.default_generation_settings_for_props },
|
{ "default_generation_settings", ctx_server.default_generation_settings_for_props },
|
||||||
{ "total_slots", ctx_server.params.n_parallel },
|
{ "total_slots", ctx_server.params.n_parallel },
|
||||||
{ "chat_template", llama_get_chat_template(ctx_server.model) },
|
{ "chat_template", llama_get_chat_template(ctx_server.model) },
|
||||||
|
@ -2860,10 +2741,8 @@ int main(int argc, char ** argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
json data = json::parse(req.body);
|
json data = json::parse(req.body);
|
||||||
if (data.contains("system_prompt")) {
|
|
||||||
std::string system_prompt = data.at("system_prompt");
|
// update any props here
|
||||||
ctx_server.system_prompt_set(system_prompt);
|
|
||||||
}
|
|
||||||
|
|
||||||
res_ok(res, {{ "success", true }});
|
res_ok(res, {{ "success", true }});
|
||||||
};
|
};
|
||||||
|
@ -2923,7 +2802,23 @@ int main(int argc, char ** argv) {
|
||||||
return handle_completions_generic(SERVER_TASK_CMPL_TYPE_NORMAL, data, res);
|
return handle_completions_generic(SERVER_TASK_CMPL_TYPE_NORMAL, data, res);
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto handle_infill = [&handle_completions_generic](const httplib::Request & req, httplib::Response & res) {
|
const auto handle_infill = [&ctx_server, &res_error, &handle_completions_generic](const httplib::Request & req, httplib::Response & res) {
|
||||||
|
std::string err;
|
||||||
|
if (llama_token_fim_pre(ctx_server.model) == LLAMA_TOKEN_NULL) {
|
||||||
|
err += "prefix token is missing. ";
|
||||||
|
}
|
||||||
|
if (llama_token_fim_suf(ctx_server.model) == LLAMA_TOKEN_NULL) {
|
||||||
|
err += "suffix token is missing. ";
|
||||||
|
}
|
||||||
|
if (llama_token_fim_mid(ctx_server.model) == LLAMA_TOKEN_NULL) {
|
||||||
|
err += "middle token is missing. ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!err.empty()) {
|
||||||
|
res_error(res, format_error_response(string_format("Infill is not supported by this model: %s", err.c_str()), ERROR_TYPE_NOT_SUPPORTED));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
json data = json::parse(req.body);
|
json data = json::parse(req.body);
|
||||||
return handle_completions_generic(SERVER_TASK_CMPL_TYPE_INFILL, data, res);
|
return handle_completions_generic(SERVER_TASK_CMPL_TYPE_INFILL, data, res);
|
||||||
};
|
};
|
||||||
|
@ -3009,7 +2904,8 @@ int main(int argc, char ** argv) {
|
||||||
if (body.count("content") != 0) {
|
if (body.count("content") != 0) {
|
||||||
const bool add_special = json_value(body, "add_special", false);
|
const bool add_special = json_value(body, "add_special", false);
|
||||||
const bool with_pieces = json_value(body, "with_pieces", false);
|
const bool with_pieces = json_value(body, "with_pieces", false);
|
||||||
std::vector<llama_token> tokens = ctx_server.tokenize(body.at("content"), add_special);
|
|
||||||
|
std::vector<llama_token> tokens = ctx_server.tokenize(body.at("content"), add_special, true);
|
||||||
|
|
||||||
if (with_pieces) {
|
if (with_pieces) {
|
||||||
for (const auto& token : tokens) {
|
for (const auto& token : tokens) {
|
||||||
|
|
|
@ -13,6 +13,10 @@ Feature: llama.cpp server
|
||||||
And 32 as batch size
|
And 32 as batch size
|
||||||
And 2 slots
|
And 2 slots
|
||||||
|
|
||||||
|
# the prompt is 301 tokens
|
||||||
|
# the slot context is 256/2 = 128 tokens
|
||||||
|
# the prompt is truncated to keep the last 109 tokens
|
||||||
|
# 64 tokens are generated thanks to shifting the context when it gets full
|
||||||
Scenario: Inference with context shift
|
Scenario: Inference with context shift
|
||||||
And 64 server max tokens to predict
|
And 64 server max tokens to predict
|
||||||
Then the server is starting
|
Then the server is starting
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
//#define GGML_ALLOCATOR_DEBUG
|
//#define GGML_ALLOCATOR_DEBUG
|
||||||
|
|
||||||
//#define AT_PRINTF(...) fprintf(stderr, __VA_ARGS__)
|
//#define AT_PRINTF(...) GGML_LOG_DEBUG(__VA_ARGS__)
|
||||||
#define AT_PRINTF(...)
|
#define AT_PRINTF(...)
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ void ggml_tallocr_alloc(struct ggml_tallocr * talloc, struct ggml_tensor * tenso
|
||||||
size = GGML_PAD(size, talloc->alignment);
|
size = GGML_PAD(size, talloc->alignment);
|
||||||
|
|
||||||
if (talloc->offset + size > ggml_backend_buffer_get_size(talloc->buffer)) {
|
if (talloc->offset + size > ggml_backend_buffer_get_size(talloc->buffer)) {
|
||||||
fprintf(stderr, "%s: not enough space in the buffer to allocate %s (needed %zu, available %zu)\n",
|
GGML_LOG_ERROR("%s: not enough space in the buffer to allocate %s (needed %zu, available %zu)\n",
|
||||||
__func__, tensor->name, size, ggml_backend_buffer_get_size(talloc->buffer) - talloc->offset);
|
__func__, tensor->name, size, ggml_backend_buffer_get_size(talloc->buffer) - talloc->offset);
|
||||||
GGML_ABORT("not enough space in the buffer");
|
GGML_ABORT("not enough space in the buffer");
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ static size_t ggml_dyn_tallocr_alloc(struct ggml_dyn_tallocr * alloc, size_t siz
|
||||||
best_fit_block = alloc->n_free_blocks - 1;
|
best_fit_block = alloc->n_free_blocks - 1;
|
||||||
} else {
|
} else {
|
||||||
// this should never happen
|
// this should never happen
|
||||||
fprintf(stderr, "%s: not enough space in the buffer to allocate %zu bytes, largest block available %zu bytes\n",
|
GGML_LOG_ERROR("%s: not enough space in the buffer to allocate %zu bytes, largest block available %zu bytes\n",
|
||||||
__func__, size, max_avail);
|
__func__, size, max_avail);
|
||||||
GGML_ABORT("not enough space in the buffer");
|
GGML_ABORT("not enough space in the buffer");
|
||||||
}
|
}
|
||||||
|
@ -209,16 +209,16 @@ static size_t ggml_dyn_tallocr_alloc(struct ggml_dyn_tallocr * alloc, size_t siz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr, "max_size = %.2f MB: tensors: ", cur_max / 1024.0 / 1024.0);
|
GGML_LOG_DEBUG("max_size = %.2f MB: tensors: ", cur_max / 1024.0 / 1024.0);
|
||||||
for (int i = 0; i < 1024; i++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
if (alloc->allocated_tensors[i].tensor) {
|
if (alloc->allocated_tensors[i].tensor) {
|
||||||
fprintf(stderr, "%s [%zx-%zx] (%.2f MB) ", alloc->allocated_tensors[i].tensor->name,
|
GGML_LOG_DEBUG("%s [%zx-%zx] (%.2f MB) ", alloc->allocated_tensors[i].tensor->name,
|
||||||
alloc->allocated_tensors[i].offset,
|
alloc->allocated_tensors[i].offset,
|
||||||
alloc->allocated_tensors[i].offset + ggml_nbytes(alloc->allocated_tensors[i].tensor),
|
alloc->allocated_tensors[i].offset + ggml_nbytes(alloc->allocated_tensors[i].tensor),
|
||||||
ggml_nbytes(alloc->allocated_tensors[i].tensor) / 1024.0 / 1024.0);
|
ggml_nbytes(alloc->allocated_tensors[i].tensor) / 1024.0 / 1024.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr, "\n");
|
GGML_LOG_DEBUG("\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -768,13 +768,13 @@ bool ggml_gallocr_reserve_n(ggml_gallocr_t galloc, struct ggml_cgraph * graph, c
|
||||||
// even if there are no tensors allocated in this buffer, we still need to allocate it to initialize views
|
// even if there are no tensors allocated in this buffer, we still need to allocate it to initialize views
|
||||||
if (new_size > cur_size || galloc->buffers[i] == NULL) {
|
if (new_size > cur_size || galloc->buffers[i] == NULL) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: reallocating %s buffer from size %.02f MiB to %.02f MiB\n", __func__, ggml_backend_buft_name(galloc->bufts[i]), cur_size / 1024.0 / 1024.0, new_size / 1024.0 / 1024.0);
|
GGML_LOG_DEBUG("%s: reallocating %s buffer from size %.02f MiB to %.02f MiB\n", __func__, ggml_backend_buft_name(galloc->bufts[i]), cur_size / 1024.0 / 1024.0, new_size / 1024.0 / 1024.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ggml_backend_buffer_free(galloc->buffers[i]);
|
ggml_backend_buffer_free(galloc->buffers[i]);
|
||||||
galloc->buffers[i] = ggml_backend_buft_alloc_buffer(galloc->bufts[i], new_size);
|
galloc->buffers[i] = ggml_backend_buft_alloc_buffer(galloc->bufts[i], new_size);
|
||||||
if (galloc->buffers[i] == NULL) {
|
if (galloc->buffers[i] == NULL) {
|
||||||
fprintf(stderr, "%s: failed to allocate %s buffer of size %zu\n", __func__, ggml_backend_buft_name(galloc->bufts[i]), new_size);
|
GGML_LOG_ERROR("%s: failed to allocate %s buffer of size %zu\n", __func__, ggml_backend_buft_name(galloc->bufts[i]), new_size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ggml_backend_buffer_set_usage(galloc->buffers[i], GGML_BACKEND_BUFFER_USAGE_COMPUTE);
|
ggml_backend_buffer_set_usage(galloc->buffers[i], GGML_BACKEND_BUFFER_USAGE_COMPUTE);
|
||||||
|
@ -825,14 +825,14 @@ static bool ggml_gallocr_node_needs_realloc(ggml_gallocr_t galloc, struct ggml_t
|
||||||
static bool ggml_gallocr_needs_realloc(ggml_gallocr_t galloc, struct ggml_cgraph * graph) {
|
static bool ggml_gallocr_needs_realloc(ggml_gallocr_t galloc, struct ggml_cgraph * graph) {
|
||||||
if (galloc->n_nodes != graph->n_nodes) {
|
if (galloc->n_nodes != graph->n_nodes) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: graph has different number of nodes\n", __func__);
|
GGML_LOG_DEBUG("%s: graph has different number of nodes\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (galloc->n_leafs != graph->n_leafs) {
|
if (galloc->n_leafs != graph->n_leafs) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: graph has different number of leafs\n", __func__);
|
GGML_LOG_DEBUG("%s: graph has different number of leafs\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -843,7 +843,7 @@ static bool ggml_gallocr_needs_realloc(ggml_gallocr_t galloc, struct ggml_cgraph
|
||||||
|
|
||||||
if (!ggml_gallocr_node_needs_realloc(galloc, node, &node_alloc->dst)) {
|
if (!ggml_gallocr_node_needs_realloc(galloc, node, &node_alloc->dst)) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: node %s is not valid\n", __func__, node->name);
|
GGML_LOG_DEBUG("%s: node %s is not valid\n", __func__, node->name);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -855,7 +855,7 @@ static bool ggml_gallocr_needs_realloc(ggml_gallocr_t galloc, struct ggml_cgraph
|
||||||
}
|
}
|
||||||
if (!ggml_gallocr_node_needs_realloc(galloc, src, &node_alloc->src[j])) {
|
if (!ggml_gallocr_node_needs_realloc(galloc, src, &node_alloc->src[j])) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: src %d (%s) of node %s is not valid\n", __func__, j, src->name, node->name);
|
GGML_LOG_DEBUG("%s: src %d (%s) of node %s is not valid\n", __func__, j, src->name, node->name);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -869,14 +869,14 @@ bool ggml_gallocr_alloc_graph(ggml_gallocr_t galloc, struct ggml_cgraph * graph)
|
||||||
if (ggml_gallocr_needs_realloc(galloc, graph)) {
|
if (ggml_gallocr_needs_realloc(galloc, graph)) {
|
||||||
if (galloc->n_buffers == 1) {
|
if (galloc->n_buffers == 1) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: reallocating buffers automatically\n", __func__);
|
GGML_LOG_DEBUG("%s: reallocating buffers automatically\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
if (!ggml_gallocr_reserve(galloc, graph)) {
|
if (!ggml_gallocr_reserve(galloc, graph)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: cannot reallocate multi buffer graph automatically, call reserve\n", __func__);
|
GGML_LOG_DEBUG("%s: cannot reallocate multi buffer graph automatically, call reserve\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -940,7 +940,7 @@ static bool alloc_tensor_range(struct ggml_context * ctx,
|
||||||
ggml_backend_buffer_t buffer = ggml_backend_buft_alloc_buffer(buft, size);
|
ggml_backend_buffer_t buffer = ggml_backend_buft_alloc_buffer(buft, size);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: failed to allocate %s buffer of size %zu\n", __func__, ggml_backend_buft_name(buft), size);
|
GGML_LOG_DEBUG("%s: failed to allocate %s buffer of size %zu\n", __func__, ggml_backend_buft_name(buft), size);
|
||||||
#endif
|
#endif
|
||||||
for (size_t i = 0; i < *n_buffers; i++) {
|
for (size_t i = 0; i < *n_buffers; i++) {
|
||||||
ggml_backend_buffer_free((*buffers)[i]);
|
ggml_backend_buffer_free((*buffers)[i]);
|
||||||
|
@ -990,7 +990,7 @@ ggml_backend_buffer_t ggml_backend_alloc_ctx_tensors_from_buft(struct ggml_conte
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this_size > max_size) {
|
if (this_size > max_size) {
|
||||||
fprintf(stderr, "%s: tensor %s is too large to fit in a %s buffer (tensor size: %zu, max buffer size: %zu)\n",
|
GGML_LOG_ERROR("%s: tensor %s is too large to fit in a %s buffer (tensor size: %zu, max buffer size: %zu)\n",
|
||||||
__func__, t->name,
|
__func__, t->name,
|
||||||
ggml_backend_buft_name(buft),
|
ggml_backend_buft_name(buft),
|
||||||
this_size, max_size);
|
this_size, max_size);
|
||||||
|
@ -1022,7 +1022,7 @@ ggml_backend_buffer_t ggml_backend_alloc_ctx_tensors_from_buft(struct ggml_conte
|
||||||
|
|
||||||
if (n_buffers == 0) {
|
if (n_buffers == 0) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: all tensors in the context are already allocated\n", __func__);
|
GGML_LOG_DEBUG("%s: all tensors in the context are already allocated\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,7 +379,7 @@ void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst
|
||||||
ggml_backend_tensor_get(src, dst->data, 0, ggml_nbytes(src));
|
ggml_backend_tensor_get(src, dst->data, 0, ggml_nbytes(src));
|
||||||
} else if (!ggml_backend_buffer_copy_tensor(src, dst)) {
|
} else if (!ggml_backend_buffer_copy_tensor(src, dst)) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: warning: slow copy from %s to %s\n", __func__, ggml_backend_buffer_name(src->buffer), ggml_backend_buffer_name(dst->buffer));
|
GGML_LOG_DEBUG("%s: warning: slow copy from %s to %s\n", __func__, ggml_backend_buffer_name(src->buffer), ggml_backend_buffer_name(dst->buffer));
|
||||||
#endif
|
#endif
|
||||||
size_t nbytes = ggml_nbytes(src);
|
size_t nbytes = ggml_nbytes(src);
|
||||||
void * data = malloc(nbytes);
|
void * data = malloc(nbytes);
|
||||||
|
@ -571,7 +571,7 @@ struct ggml_backend_registry {
|
||||||
|
|
||||||
void register_backend(ggml_backend_reg_t reg) {
|
void register_backend(ggml_backend_reg_t reg) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: registered backend %s (%zu devices)\n",
|
GGML_LOG_DEBUG("%s: registered backend %s (%zu devices)\n",
|
||||||
__func__, ggml_backend_reg_name(reg), ggml_backend_reg_dev_count(reg));
|
__func__, ggml_backend_reg_name(reg), ggml_backend_reg_dev_count(reg));
|
||||||
#endif
|
#endif
|
||||||
backends.push_back(reg);
|
backends.push_back(reg);
|
||||||
|
@ -582,7 +582,7 @@ struct ggml_backend_registry {
|
||||||
|
|
||||||
void register_device(ggml_backend_dev_t device) {
|
void register_device(ggml_backend_dev_t device) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: registered device %s (%s)\n", __func__, ggml_backend_dev_name(device), ggml_backend_dev_description(device));
|
GGML_LOG_DEBUG("%s: registered device %s (%s)\n", __func__, ggml_backend_dev_name(device), ggml_backend_dev_description(device));
|
||||||
#endif
|
#endif
|
||||||
devices.push_back(device);
|
devices.push_back(device);
|
||||||
}
|
}
|
||||||
|
@ -773,7 +773,7 @@ static ggml_backend_buffer_t ggml_backend_cpu_buffer_type_alloc_buffer(ggml_back
|
||||||
size += TENSOR_ALIGNMENT; // malloc may return an address that is not aligned
|
size += TENSOR_ALIGNMENT; // malloc may return an address that is not aligned
|
||||||
void * data = malloc(size); // TODO: use GGML_ALIGNED_MALLOC (move to ggml-impl.h)
|
void * data = malloc(size); // TODO: use GGML_ALIGNED_MALLOC (move to ggml-impl.h)
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
fprintf(stderr, "%s: failed to allocate buffer of size %zu\n", __func__, size);
|
GGML_LOG_ERROR("%s: failed to allocate buffer of size %zu\n", __func__, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,7 +836,7 @@ static ggml_backend_buffer_t ggml_backend_cpu_hbm_buffer_type_alloc_buffer(ggml_
|
||||||
void * ptr;
|
void * ptr;
|
||||||
int result = hbw_posix_memalign(&ptr, ggml_backend_cpu_buffer_type_get_alignment(buft), size);
|
int result = hbw_posix_memalign(&ptr, ggml_backend_cpu_buffer_type_get_alignment(buft), size);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
fprintf(stderr, "failed to allocate HBM buffer of size %zu\n", size);
|
GGML_LOG_ERROR("failed to allocate HBM buffer of size %zu\n", size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1459,7 +1459,7 @@ static int ggml_backend_sched_backend_from_buffer(ggml_backend_sched_t sched, co
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: warning: no backend supports op %s with a weight with buffer type %s used in tensor %s, the weight will need to be copied\n",
|
GGML_LOG_DEBUG("%s: warning: no backend supports op %s with a weight with buffer type %s used in tensor %s, the weight will need to be copied\n",
|
||||||
__func__, ggml_op_desc(tensor), ggml_backend_buffer_name(buffer), tensor->name);
|
__func__, ggml_op_desc(tensor), ggml_backend_buffer_name(buffer), tensor->name);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1548,13 +1548,13 @@ static void ggml_backend_sched_print_assignments(ggml_backend_sched_t sched, str
|
||||||
for (int i = 0; i < graph->n_nodes; i++) {
|
for (int i = 0; i < graph->n_nodes; i++) {
|
||||||
if (cur_split < sched->n_splits && i == sched->splits[cur_split].i_start) {
|
if (cur_split < sched->n_splits && i == sched->splits[cur_split].i_start) {
|
||||||
ggml_backend_t split_backend = sched->backends[sched->splits[cur_split].backend_id];
|
ggml_backend_t split_backend = sched->backends[sched->splits[cur_split].backend_id];
|
||||||
fprintf(stderr, "\n## SPLIT #%d: %s # %d inputs: ", cur_split, ggml_backend_name(split_backend),
|
GGML_LOG_DEBUG("\n## SPLIT #%d: %s # %d inputs: ", cur_split, ggml_backend_name(split_backend),
|
||||||
sched->splits[cur_split].n_inputs);
|
sched->splits[cur_split].n_inputs);
|
||||||
for (int j = 0; j < sched->splits[cur_split].n_inputs; j++) {
|
for (int j = 0; j < sched->splits[cur_split].n_inputs; j++) {
|
||||||
fprintf(stderr, "[%s (%5.5s)] ", sched->splits[cur_split].inputs[j]->name,
|
GGML_LOG_DEBUG("[%s (%5.5s)] ", sched->splits[cur_split].inputs[j]->name,
|
||||||
fmt_size(ggml_nbytes(sched->splits[cur_split].inputs[j])));
|
fmt_size(ggml_nbytes(sched->splits[cur_split].inputs[j])));
|
||||||
}
|
}
|
||||||
fprintf(stderr, "\n");
|
GGML_LOG_DEBUG("\n");
|
||||||
cur_split++;
|
cur_split++;
|
||||||
}
|
}
|
||||||
struct ggml_tensor * node = graph->nodes[i];
|
struct ggml_tensor * node = graph->nodes[i];
|
||||||
|
@ -1562,7 +1562,7 @@ static void ggml_backend_sched_print_assignments(ggml_backend_sched_t sched, str
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ggml_backend_t tensor_backend = ggml_backend_sched_get_tensor_backend(sched, node);
|
ggml_backend_t tensor_backend = ggml_backend_sched_get_tensor_backend(sched, node);
|
||||||
fprintf(stderr, "node #%3d (%10.10s): %20.20s (%5.5s) [%5.5s %8.8s]:", i, ggml_op_name(node->op), node->name,
|
GGML_LOG_DEBUG("node #%3d (%10.10s): %20.20s (%5.5s) [%5.5s %8.8s]:", i, ggml_op_name(node->op), node->name,
|
||||||
fmt_size(ggml_nbytes(node)), tensor_backend ? ggml_backend_name(tensor_backend) : "NULL", GET_CAUSE(node));
|
fmt_size(ggml_nbytes(node)), tensor_backend ? ggml_backend_name(tensor_backend) : "NULL", GET_CAUSE(node));
|
||||||
for (int j = 0; j < GGML_MAX_SRC; j++) {
|
for (int j = 0; j < GGML_MAX_SRC; j++) {
|
||||||
struct ggml_tensor * src = node->src[j];
|
struct ggml_tensor * src = node->src[j];
|
||||||
|
@ -1570,10 +1570,10 @@ static void ggml_backend_sched_print_assignments(ggml_backend_sched_t sched, str
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ggml_backend_t src_backend = ggml_backend_sched_get_tensor_backend(sched, src);
|
ggml_backend_t src_backend = ggml_backend_sched_get_tensor_backend(sched, src);
|
||||||
fprintf(stderr, " %20.20s (%5.5s) [%5.5s %8.8s]", src->name,
|
GGML_LOG_DEBUG(" %20.20s (%5.5s) [%5.5s %8.8s]", src->name,
|
||||||
fmt_size(ggml_nbytes(src)), src_backend ? ggml_backend_name(src_backend) : "NULL", GET_CAUSE(src));
|
fmt_size(ggml_nbytes(src)), src_backend ? ggml_backend_name(src_backend) : "NULL", GET_CAUSE(src));
|
||||||
}
|
}
|
||||||
fprintf(stderr, "\n");
|
GGML_LOG_DEBUG("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2087,11 +2087,11 @@ static bool ggml_backend_sched_alloc_splits(ggml_backend_sched_t sched) {
|
||||||
// the re-allocation may cause the split inputs to be moved to a different address
|
// the re-allocation may cause the split inputs to be moved to a different address
|
||||||
ggml_backend_sched_synchronize(sched);
|
ggml_backend_sched_synchronize(sched);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
fprintf(stderr, "%s: failed to allocate graph, reserving (backend_ids_changed = %d)\n", __func__, backend_ids_changed);
|
GGML_LOG_DEBUG("%s: failed to allocate graph, reserving (backend_ids_changed = %d)\n", __func__, backend_ids_changed);
|
||||||
#endif
|
#endif
|
||||||
ggml_gallocr_reserve_n(sched->galloc, &sched->graph, sched->node_backend_ids, sched->leaf_backend_ids);
|
ggml_gallocr_reserve_n(sched->galloc, &sched->graph, sched->node_backend_ids, sched->leaf_backend_ids);
|
||||||
if (!ggml_gallocr_alloc_graph(sched->galloc, &sched->graph)) {
|
if (!ggml_gallocr_alloc_graph(sched->galloc, &sched->graph)) {
|
||||||
fprintf(stderr, "%s: failed to allocate graph\n", __func__);
|
GGML_LOG_ERROR("%s: failed to allocate graph\n", __func__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2485,7 +2485,7 @@ struct ggml_backend_graph_copy ggml_backend_graph_copy(ggml_backend_t backend, s
|
||||||
struct ggml_context * ctx_unallocated = ggml_init(params);
|
struct ggml_context * ctx_unallocated = ggml_init(params);
|
||||||
|
|
||||||
if (ctx_allocated == NULL || ctx_unallocated == NULL) {
|
if (ctx_allocated == NULL || ctx_unallocated == NULL) {
|
||||||
fprintf(stderr, "failed to allocate context for graph copy\n");
|
GGML_LOG_ERROR("%s: failed to allocate context for graph copy\n", __func__);
|
||||||
ggml_hash_set_free(&hash_set);
|
ggml_hash_set_free(&hash_set);
|
||||||
free(node_copies);
|
free(node_copies);
|
||||||
free(node_init);
|
free(node_init);
|
||||||
|
@ -2508,7 +2508,7 @@ struct ggml_backend_graph_copy ggml_backend_graph_copy(ggml_backend_t backend, s
|
||||||
// allocate nodes
|
// allocate nodes
|
||||||
ggml_backend_buffer_t buffer = ggml_backend_alloc_ctx_tensors(ctx_allocated, backend);
|
ggml_backend_buffer_t buffer = ggml_backend_alloc_ctx_tensors(ctx_allocated, backend);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
fprintf(stderr, "failed to allocate buffer for graph copy\n");
|
GGML_LOG_ERROR("%s: failed to allocate buffer for graph copy\n", __func__);
|
||||||
ggml_hash_set_free(&hash_set);
|
ggml_hash_set_free(&hash_set);
|
||||||
free(node_copies);
|
free(node_copies);
|
||||||
free(node_init);
|
free(node_init);
|
||||||
|
|
|
@ -297,14 +297,14 @@ ggml_backend_t ggml_backend_blas_init(void) {
|
||||||
/* .context = */ ctx,
|
/* .context = */ ctx,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(OPENBLAS_VERSION) && defined(GGML_USE_OPENMP)
|
#if defined(OPENBLAS_VERSION) && defined(GGML_USE_OPENMP)
|
||||||
if (openblas_get_parallel() != OPENBLAS_OPENMP) {
|
if (openblas_get_parallel() != OPENBLAS_OPENMP) {
|
||||||
fprintf(stderr, "%s: warning: ggml is using OpenMP, but OpenBLAS was compiled without OpenMP support\n", __func__);
|
GGML_LOG_DEBUG("%s: warning: ggml is using OpenMP, but OpenBLAS was compiled without OpenMP support\n", __func__);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(BLIS_ENABLE_CBLAS) && defined(GGML_USE_OPENMP) && !defined(BLIS_ENABLE_OPENMP)
|
#if defined(BLIS_ENABLE_CBLAS) && defined(GGML_USE_OPENMP) && !defined(BLIS_ENABLE_OPENMP)
|
||||||
fprintf(stderr, "%s: warning: ggml is using OpenMP, but BLIS was compiled without OpenMP support\n", __func__);
|
GGML_LOG_DEBUG("%s: warning: ggml is using OpenMP, but BLIS was compiled without OpenMP support\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return backend;
|
return backend;
|
||||||
|
|
|
@ -291,7 +291,7 @@ struct ggml_cuda_pool_leg : public ggml_cuda_pool {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GGML_LOG_WARN(GGML_CUDA_NAME " buffer pool full, increase MAX_CUDA_BUFFERS\n");
|
GGML_LOG_DEBUG(GGML_CUDA_NAME " buffer pool full, increase MAX_CUDA_BUFFERS\n");
|
||||||
ggml_cuda_set_device(device);
|
ggml_cuda_set_device(device);
|
||||||
CUDA_CHECK(cudaFree(ptr));
|
CUDA_CHECK(cudaFree(ptr));
|
||||||
pool_size -= size;
|
pool_size -= size;
|
||||||
|
@ -980,7 +980,7 @@ static void * ggml_cuda_host_malloc(size_t size) {
|
||||||
if (err != cudaSuccess) {
|
if (err != cudaSuccess) {
|
||||||
// clear the error
|
// clear the error
|
||||||
cudaGetLastError();
|
cudaGetLastError();
|
||||||
GGML_LOG_WARN("%s: failed to allocate %.2f MiB of pinned memory: %s\n", __func__,
|
GGML_LOG_DEBUG("%s: failed to allocate %.2f MiB of pinned memory: %s\n", __func__,
|
||||||
size / 1024.0 / 1024.0, cudaGetErrorString(err));
|
size / 1024.0 / 1024.0, cudaGetErrorString(err));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -2406,7 +2406,7 @@ static bool ggml_backend_cuda_cpy_tensor_async(ggml_backend_t backend_src, ggml_
|
||||||
|
|
||||||
if (cuda_ctx_src->device != buf_ctx_src->device || cuda_ctx_dst->device != buf_ctx_dst->device) {
|
if (cuda_ctx_src->device != buf_ctx_src->device || cuda_ctx_dst->device != buf_ctx_dst->device) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: backend and buffer devices do not match\n", __func__);
|
GGML_LOG_DEBUG("%s: backend and buffer devices do not match\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2524,7 +2524,7 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
if (ggml_cuda_info().devices[cuda_ctx->device].cc < CC_AMPERE) {
|
if (ggml_cuda_info().devices[cuda_ctx->device].cc < CC_AMPERE) {
|
||||||
cuda_ctx->cuda_graph->disable_due_to_gpu_arch = true;
|
cuda_ctx->cuda_graph->disable_due_to_gpu_arch = true;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to GPU architecture\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to GPU architecture\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2575,14 +2575,14 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
if (node->src[0] && node->src[0]->buffer && ggml_backend_buffer_is_cuda_split(node->src[0]->buffer)) {
|
if (node->src[0] && node->src[0]->buffer && ggml_backend_buffer_is_cuda_split(node->src[0]->buffer)) {
|
||||||
use_cuda_graph = false; // Split buffers are not supported by CUDA graph capture
|
use_cuda_graph = false; // Split buffers are not supported by CUDA graph capture
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to split buffer\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to split buffer\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->op == GGML_OP_MUL_MAT_ID) {
|
if (node->op == GGML_OP_MUL_MAT_ID) {
|
||||||
use_cuda_graph = false; // This node type is not supported by CUDA graph capture
|
use_cuda_graph = false; // This node type is not supported by CUDA graph capture
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to mul_mat_id\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to mul_mat_id\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2591,7 +2591,7 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
// Changes in batch size or context size can cause changes to the grid size of some kernels.
|
// Changes in batch size or context size can cause changes to the grid size of some kernels.
|
||||||
use_cuda_graph = false;
|
use_cuda_graph = false;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to batch size > 1 [%s] [%ld %ld %ld %ld]\n", __func__, node->name, node->ne[0], node->ne[1], node->ne[2], node->ne[3]);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to batch size > 1 [%s] [%ld %ld %ld %ld]\n", __func__, node->name, node->ne[0], node->ne[1], node->ne[2], node->ne[3]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2603,7 +2603,7 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
use_cuda_graph = false;
|
use_cuda_graph = false;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to unsupported copy op\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to unsupported copy op\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (std::find(ggml_cuda_cpy_fn_ptrs.begin(), ggml_cuda_cpy_fn_ptrs.end(), ptr) == ggml_cuda_cpy_fn_ptrs.end()) {
|
if (std::find(ggml_cuda_cpy_fn_ptrs.begin(), ggml_cuda_cpy_fn_ptrs.end(), ptr) == ggml_cuda_cpy_fn_ptrs.end()) {
|
||||||
|
@ -2627,7 +2627,7 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
if (cuda_ctx->cuda_graph->number_consecutive_updates >= 4) {
|
if (cuda_ctx->cuda_graph->number_consecutive_updates >= 4) {
|
||||||
cuda_ctx->cuda_graph->disable_due_to_too_many_updates = true;
|
cuda_ctx->cuda_graph->disable_due_to_too_many_updates = true;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to too many consecutive updates\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to too many consecutive updates\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2685,7 +2685,7 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend,
|
||||||
use_cuda_graph = false;
|
use_cuda_graph = false;
|
||||||
cuda_ctx->cuda_graph->disable_due_to_failed_graph_capture = true;
|
cuda_ctx->cuda_graph->disable_due_to_failed_graph_capture = true;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
GGML_LOG_WARN("%s: disabling CUDA graphs due to failed graph capture\n", __func__);
|
GGML_LOG_DEBUG("%s: disabling CUDA graphs due to failed graph capture\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
graph_evaluated_or_captured = true; // CUDA graph has been captured
|
graph_evaluated_or_captured = true; // CUDA graph has been captured
|
||||||
|
@ -2854,7 +2854,7 @@ bool ggml_backend_cuda_register_host_buffer(void * buffer, size_t size) {
|
||||||
// clear the error
|
// clear the error
|
||||||
cudaGetLastError();
|
cudaGetLastError();
|
||||||
|
|
||||||
GGML_LOG_WARN("%s: failed to register %.2f MiB of pinned memory: %s\n", __func__,
|
GGML_LOG_DEBUG("%s: failed to register %.2f MiB of pinned memory: %s\n", __func__,
|
||||||
size / 1024.0 / 1024.0, cudaGetErrorString(err));
|
size / 1024.0 / 1024.0, cudaGetErrorString(err));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,6 +152,8 @@ class Keys:
|
||||||
MERGES = "tokenizer.ggml.merges"
|
MERGES = "tokenizer.ggml.merges"
|
||||||
BOS_ID = "tokenizer.ggml.bos_token_id"
|
BOS_ID = "tokenizer.ggml.bos_token_id"
|
||||||
EOS_ID = "tokenizer.ggml.eos_token_id"
|
EOS_ID = "tokenizer.ggml.eos_token_id"
|
||||||
|
EOT_ID = "tokenizer.ggml.eot_token_id"
|
||||||
|
EOM_ID = "tokenizer.ggml.eom_token_id"
|
||||||
UNK_ID = "tokenizer.ggml.unknown_token_id"
|
UNK_ID = "tokenizer.ggml.unknown_token_id"
|
||||||
SEP_ID = "tokenizer.ggml.seperator_token_id"
|
SEP_ID = "tokenizer.ggml.seperator_token_id"
|
||||||
PAD_ID = "tokenizer.ggml.padding_token_id"
|
PAD_ID = "tokenizer.ggml.padding_token_id"
|
||||||
|
@ -168,11 +170,16 @@ class Keys:
|
||||||
CHAT_TEMPLATE_N = "tokenizer.chat_template.{name}"
|
CHAT_TEMPLATE_N = "tokenizer.chat_template.{name}"
|
||||||
CHAT_TEMPLATES = "tokenizer.chat_templates"
|
CHAT_TEMPLATES = "tokenizer.chat_templates"
|
||||||
# FIM/Infill special tokens constants
|
# FIM/Infill special tokens constants
|
||||||
|
FIM_PRE_ID = "tokenizer.ggml.fim_pre_token_id"
|
||||||
|
FIM_SUF_ID = "tokenizer.ggml.fim_suf_token_id"
|
||||||
|
FIM_MID_ID = "tokenizer.ggml.fim_mid_token_id"
|
||||||
|
FIM_PAD_ID = "tokenizer.ggml.fim_pad_token_id"
|
||||||
|
FIM_REP_ID = "tokenizer.ggml.fim_rep_token_id"
|
||||||
|
FIM_SEP_ID = "tokenizer.ggml.fim_sep_token_id"
|
||||||
|
# deprecated:
|
||||||
PREFIX_ID = "tokenizer.ggml.prefix_token_id"
|
PREFIX_ID = "tokenizer.ggml.prefix_token_id"
|
||||||
SUFFIX_ID = "tokenizer.ggml.suffix_token_id"
|
SUFFIX_ID = "tokenizer.ggml.suffix_token_id"
|
||||||
MIDDLE_ID = "tokenizer.ggml.middle_token_id"
|
MIDDLE_ID = "tokenizer.ggml.middle_token_id"
|
||||||
EOT_ID = "tokenizer.ggml.eot_token_id"
|
|
||||||
EOM_ID = "tokenizer.ggml.eom_token_id"
|
|
||||||
|
|
||||||
class Adapter:
|
class Adapter:
|
||||||
TYPE = "adapter.type"
|
TYPE = "adapter.type"
|
||||||
|
@ -1579,6 +1586,8 @@ KEY_TOKENIZER_SCORES = Keys.Tokenizer.SCORES
|
||||||
KEY_TOKENIZER_MERGES = Keys.Tokenizer.MERGES
|
KEY_TOKENIZER_MERGES = Keys.Tokenizer.MERGES
|
||||||
KEY_TOKENIZER_BOS_ID = Keys.Tokenizer.BOS_ID
|
KEY_TOKENIZER_BOS_ID = Keys.Tokenizer.BOS_ID
|
||||||
KEY_TOKENIZER_EOS_ID = Keys.Tokenizer.EOS_ID
|
KEY_TOKENIZER_EOS_ID = Keys.Tokenizer.EOS_ID
|
||||||
|
KEY_TOKENIZER_EOT_ID = Keys.Tokenizer.EOT_ID
|
||||||
|
KEY_TOKENIZER_EOM_ID = Keys.Tokenizer.EOM_ID
|
||||||
KEY_TOKENIZER_UNK_ID = Keys.Tokenizer.UNK_ID
|
KEY_TOKENIZER_UNK_ID = Keys.Tokenizer.UNK_ID
|
||||||
KEY_TOKENIZER_SEP_ID = Keys.Tokenizer.SEP_ID
|
KEY_TOKENIZER_SEP_ID = Keys.Tokenizer.SEP_ID
|
||||||
KEY_TOKENIZER_PAD_ID = Keys.Tokenizer.PAD_ID
|
KEY_TOKENIZER_PAD_ID = Keys.Tokenizer.PAD_ID
|
||||||
|
@ -1586,8 +1595,15 @@ KEY_TOKENIZER_CLS_ID = Keys.Tokenizer.CLS_ID
|
||||||
KEY_TOKENIZER_MASK_ID = Keys.Tokenizer.MASK_ID
|
KEY_TOKENIZER_MASK_ID = Keys.Tokenizer.MASK_ID
|
||||||
KEY_TOKENIZER_HF_JSON = Keys.Tokenizer.HF_JSON
|
KEY_TOKENIZER_HF_JSON = Keys.Tokenizer.HF_JSON
|
||||||
KEY_TOKENIZER_RWKV = Keys.Tokenizer.RWKV
|
KEY_TOKENIZER_RWKV = Keys.Tokenizer.RWKV
|
||||||
KEY_TOKENIZER_PRIFIX_ID = Keys.Tokenizer.PREFIX_ID
|
|
||||||
|
KEY_TOKENIZER_FIM_PRE_ID = Keys.Tokenizer.FIM_PRE_ID
|
||||||
|
KEY_TOKENIZER_FIM_SUF_ID = Keys.Tokenizer.FIM_SUF_ID
|
||||||
|
KEY_TOKENIZER_FIM_MID_ID = Keys.Tokenizer.FIM_MID_ID
|
||||||
|
KEY_TOKENIZER_FIM_PAD_ID = Keys.Tokenizer.FIM_PAD_ID
|
||||||
|
KEY_TOKENIZER_FIM_REP_ID = Keys.Tokenizer.FIM_REP_ID
|
||||||
|
KEY_TOKENIZER_FIM_SEP_ID = Keys.Tokenizer.FIM_SEP_ID
|
||||||
|
|
||||||
|
# deprecated
|
||||||
|
KEY_TOKENIZER_PREFIX_ID = Keys.Tokenizer.PREFIX_ID
|
||||||
KEY_TOKENIZER_SUFFIX_ID = Keys.Tokenizer.SUFFIX_ID
|
KEY_TOKENIZER_SUFFIX_ID = Keys.Tokenizer.SUFFIX_ID
|
||||||
KEY_TOKENIZER_MIDDLE_ID = Keys.Tokenizer.MIDDLE_ID
|
KEY_TOKENIZER_MIDDLE_ID = Keys.Tokenizer.MIDDLE_ID
|
||||||
KEY_TOKENIZER_EOT_ID = Keys.Tokenizer.EOT_ID
|
|
||||||
KEY_TOKENIZER_EOM_ID = Keys.Tokenizer.EOM_ID
|
|
||||||
|
|
|
@ -843,15 +843,6 @@ class GGUFWriter:
|
||||||
|
|
||||||
self.add_string(Keys.Tokenizer.CHAT_TEMPLATE, value)
|
self.add_string(Keys.Tokenizer.CHAT_TEMPLATE, value)
|
||||||
|
|
||||||
def add_prefix_token_id(self, id: int) -> None:
|
|
||||||
self.add_uint32(Keys.Tokenizer.PREFIX_ID, id)
|
|
||||||
|
|
||||||
def add_suffix_token_id(self, id: int) -> None:
|
|
||||||
self.add_uint32(Keys.Tokenizer.SUFFIX_ID, id)
|
|
||||||
|
|
||||||
def add_middle_token_id(self, id: int) -> None:
|
|
||||||
self.add_uint32(Keys.Tokenizer.MIDDLE_ID, id)
|
|
||||||
|
|
||||||
def add_eot_token_id(self, id: int) -> None:
|
def add_eot_token_id(self, id: int) -> None:
|
||||||
self.add_uint32(Keys.Tokenizer.EOT_ID, id)
|
self.add_uint32(Keys.Tokenizer.EOT_ID, id)
|
||||||
|
|
||||||
|
|
|
@ -891,6 +891,7 @@ extern "C" {
|
||||||
// Special tokens
|
// Special tokens
|
||||||
LLAMA_API llama_token llama_token_bos(const struct llama_model * model); // beginning-of-sentence
|
LLAMA_API llama_token llama_token_bos(const struct llama_model * model); // beginning-of-sentence
|
||||||
LLAMA_API llama_token llama_token_eos(const struct llama_model * model); // end-of-sentence
|
LLAMA_API llama_token llama_token_eos(const struct llama_model * model); // end-of-sentence
|
||||||
|
LLAMA_API llama_token llama_token_eot(const struct llama_model * model); // end-of-turn
|
||||||
LLAMA_API llama_token llama_token_cls(const struct llama_model * model); // classification
|
LLAMA_API llama_token llama_token_cls(const struct llama_model * model); // classification
|
||||||
LLAMA_API llama_token llama_token_sep(const struct llama_model * model); // sentence separator
|
LLAMA_API llama_token llama_token_sep(const struct llama_model * model); // sentence separator
|
||||||
LLAMA_API llama_token llama_token_nl (const struct llama_model * model); // next-line
|
LLAMA_API llama_token llama_token_nl (const struct llama_model * model); // next-line
|
||||||
|
@ -899,11 +900,17 @@ extern "C" {
|
||||||
LLAMA_API bool llama_add_bos_token(const struct llama_model * model);
|
LLAMA_API bool llama_add_bos_token(const struct llama_model * model);
|
||||||
LLAMA_API bool llama_add_eos_token(const struct llama_model * model);
|
LLAMA_API bool llama_add_eos_token(const struct llama_model * model);
|
||||||
|
|
||||||
// Codellama infill tokens
|
// infill tokens
|
||||||
LLAMA_API llama_token llama_token_prefix(const struct llama_model * model); // Beginning of infill prefix
|
DEPRECATED(LLAMA_API llama_token llama_token_prefix(const struct llama_model * model), "use llama_token_fim_pre instead");
|
||||||
LLAMA_API llama_token llama_token_middle(const struct llama_model * model); // Beginning of infill middle
|
DEPRECATED(LLAMA_API llama_token llama_token_middle(const struct llama_model * model), "use llama_token_fim_mid instead");
|
||||||
LLAMA_API llama_token llama_token_suffix(const struct llama_model * model); // Beginning of infill suffix
|
DEPRECATED(LLAMA_API llama_token llama_token_suffix(const struct llama_model * model), "use llama_token_fim_suf instead");
|
||||||
LLAMA_API llama_token llama_token_eot (const struct llama_model * model); // End of infill middle
|
|
||||||
|
LLAMA_API llama_token llama_token_fim_pre(const struct llama_model * model);
|
||||||
|
LLAMA_API llama_token llama_token_fim_suf(const struct llama_model * model);
|
||||||
|
LLAMA_API llama_token llama_token_fim_mid(const struct llama_model * model);
|
||||||
|
LLAMA_API llama_token llama_token_fim_pad(const struct llama_model * model);
|
||||||
|
LLAMA_API llama_token llama_token_fim_rep(const struct llama_model * model);
|
||||||
|
LLAMA_API llama_token llama_token_fim_sep(const struct llama_model * model);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tokenization
|
// Tokenization
|
||||||
|
|
|
@ -1663,6 +1663,14 @@ llama_token llama_token_eos_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_eos_id;
|
return vocab.special_eos_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_eot_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_eot_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_eom_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_eom_id;
|
||||||
|
}
|
||||||
|
|
||||||
llama_token llama_token_cls_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_cls_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_cls_id;
|
return vocab.special_cls_id;
|
||||||
}
|
}
|
||||||
|
@ -1688,23 +1696,39 @@ bool llama_add_eos_token_impl(const struct llama_vocab & vocab) {
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_prefix_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_prefix_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_prefix_id;
|
return vocab.special_fim_pre_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_middle_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_middle_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_middle_id;
|
return vocab.special_fim_mid_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_suffix_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_suffix_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_suffix_id;
|
return vocab.special_fim_suf_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_eot_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_fim_pre_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_eot_id;
|
return vocab.special_fim_pre_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_eom_impl(const struct llama_vocab & vocab) {
|
llama_token llama_token_fim_suf_impl(const struct llama_vocab & vocab) {
|
||||||
return vocab.special_eom_id;
|
return vocab.special_fim_suf_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_mid_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_fim_mid_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_pad_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_fim_pad_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_rep_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_fim_rep_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_sep_impl(const struct llama_vocab & vocab) {
|
||||||
|
return vocab.special_fim_sep_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t llama_tokenize_impl(
|
int32_t llama_tokenize_impl(
|
||||||
|
|
|
@ -37,20 +37,26 @@ struct llama_vocab {
|
||||||
std::map<std::pair<std::string, std::string>, int> bpe_ranks;
|
std::map<std::pair<std::string, std::string>, int> bpe_ranks;
|
||||||
|
|
||||||
// default LLaMA special tokens
|
// default LLaMA special tokens
|
||||||
|
// TODO: should we set all of these to LLAMA_TOKEN_NULL?
|
||||||
id special_bos_id = 1;
|
id special_bos_id = 1;
|
||||||
id special_eos_id = 2;
|
id special_eos_id = 2;
|
||||||
|
id special_eot_id = LLAMA_TOKEN_NULL;
|
||||||
|
id special_eom_id = LLAMA_TOKEN_NULL;
|
||||||
id special_unk_id = 0;
|
id special_unk_id = 0;
|
||||||
id special_sep_id = LLAMA_TOKEN_NULL;
|
id special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
id special_pad_id = LLAMA_TOKEN_NULL;
|
id special_pad_id = LLAMA_TOKEN_NULL;
|
||||||
id special_cls_id = LLAMA_TOKEN_NULL;
|
id special_cls_id = LLAMA_TOKEN_NULL;
|
||||||
id special_mask_id = LLAMA_TOKEN_NULL;
|
id special_mask_id = LLAMA_TOKEN_NULL;
|
||||||
|
|
||||||
id linefeed_id = 13;
|
id linefeed_id = 13;
|
||||||
id special_prefix_id = LLAMA_TOKEN_NULL;
|
|
||||||
id special_suffix_id = LLAMA_TOKEN_NULL;
|
// fim tokens
|
||||||
id special_middle_id = LLAMA_TOKEN_NULL;
|
id special_fim_pre_id = LLAMA_TOKEN_NULL;
|
||||||
id special_eot_id = LLAMA_TOKEN_NULL; // TODO: move above after "eos_id", and here add "file separator" token
|
id special_fim_suf_id = LLAMA_TOKEN_NULL;
|
||||||
id special_eom_id = LLAMA_TOKEN_NULL;
|
id special_fim_mid_id = LLAMA_TOKEN_NULL;
|
||||||
|
id special_fim_pad_id = LLAMA_TOKEN_NULL;
|
||||||
|
id special_fim_rep_id = LLAMA_TOKEN_NULL; // repo
|
||||||
|
id special_fim_sep_id = LLAMA_TOKEN_NULL; // file separator
|
||||||
|
|
||||||
// set of all tokens that cause "end of generation"
|
// set of all tokens that cause "end of generation"
|
||||||
std::set<id> special_eog_ids;
|
std::set<id> special_eog_ids;
|
||||||
|
@ -104,19 +110,26 @@ bool llama_token_is_control_impl(const struct llama_vocab & vocab, llama_token t
|
||||||
|
|
||||||
llama_token llama_token_bos_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_bos_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_eos_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_eos_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_eot_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_eom_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_cls_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_cls_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_sep_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_sep_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_nl_impl (const struct llama_vocab & vocab);
|
llama_token llama_token_nl_impl (const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_pad_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_pad_impl(const struct llama_vocab & vocab);
|
||||||
|
|
||||||
bool llama_add_bos_token_impl(const struct llama_vocab & vocab);
|
|
||||||
bool llama_add_eos_token_impl(const struct llama_vocab & vocab);
|
|
||||||
|
|
||||||
llama_token llama_token_prefix_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_prefix_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_middle_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_middle_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_suffix_impl(const struct llama_vocab & vocab);
|
llama_token llama_token_suffix_impl(const struct llama_vocab & vocab);
|
||||||
llama_token llama_token_eot_impl (const struct llama_vocab & vocab);
|
|
||||||
llama_token llama_token_eom_impl (const struct llama_vocab & vocab);
|
llama_token llama_token_fim_pre_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_fim_suf_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_fim_mid_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_fim_pad_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_fim_rep_impl(const struct llama_vocab & vocab);
|
||||||
|
llama_token llama_token_fim_sep_impl(const struct llama_vocab & vocab);
|
||||||
|
|
||||||
|
bool llama_add_bos_token_impl(const struct llama_vocab & vocab);
|
||||||
|
bool llama_add_eos_token_impl(const struct llama_vocab & vocab);
|
||||||
|
|
||||||
int32_t llama_tokenize_impl(
|
int32_t llama_tokenize_impl(
|
||||||
const struct llama_vocab & vocab,
|
const struct llama_vocab & vocab,
|
||||||
|
|
452
src/llama.cpp
452
src/llama.cpp
|
@ -345,6 +345,8 @@ enum llm_kv {
|
||||||
LLM_KV_TOKENIZER_MERGES,
|
LLM_KV_TOKENIZER_MERGES,
|
||||||
LLM_KV_TOKENIZER_BOS_ID,
|
LLM_KV_TOKENIZER_BOS_ID,
|
||||||
LLM_KV_TOKENIZER_EOS_ID,
|
LLM_KV_TOKENIZER_EOS_ID,
|
||||||
|
LLM_KV_TOKENIZER_EOT_ID,
|
||||||
|
LLM_KV_TOKENIZER_EOM_ID,
|
||||||
LLM_KV_TOKENIZER_UNK_ID,
|
LLM_KV_TOKENIZER_UNK_ID,
|
||||||
LLM_KV_TOKENIZER_SEP_ID,
|
LLM_KV_TOKENIZER_SEP_ID,
|
||||||
LLM_KV_TOKENIZER_PAD_ID,
|
LLM_KV_TOKENIZER_PAD_ID,
|
||||||
|
@ -357,14 +359,20 @@ enum llm_kv {
|
||||||
LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP,
|
LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP,
|
||||||
LLM_KV_TOKENIZER_HF_JSON,
|
LLM_KV_TOKENIZER_HF_JSON,
|
||||||
LLM_KV_TOKENIZER_RWKV,
|
LLM_KV_TOKENIZER_RWKV,
|
||||||
LLM_KV_TOKENIZER_PREFIX_ID,
|
LLM_KV_TOKENIZER_FIM_PRE_ID,
|
||||||
LLM_KV_TOKENIZER_SUFFIX_ID,
|
LLM_KV_TOKENIZER_FIM_SUF_ID,
|
||||||
LLM_KV_TOKENIZER_MIDDLE_ID,
|
LLM_KV_TOKENIZER_FIM_MID_ID,
|
||||||
LLM_KV_TOKENIZER_EOT_ID,
|
LLM_KV_TOKENIZER_FIM_PAD_ID,
|
||||||
LLM_KV_TOKENIZER_EOM_ID,
|
LLM_KV_TOKENIZER_FIM_REP_ID,
|
||||||
|
LLM_KV_TOKENIZER_FIM_SEP_ID,
|
||||||
|
|
||||||
LLM_KV_ADAPTER_TYPE,
|
LLM_KV_ADAPTER_TYPE,
|
||||||
LLM_KV_ADAPTER_LORA_ALPHA,
|
LLM_KV_ADAPTER_LORA_ALPHA,
|
||||||
|
|
||||||
|
// deprecated:
|
||||||
|
LLM_KV_TOKENIZER_PREFIX_ID,
|
||||||
|
LLM_KV_TOKENIZER_SUFFIX_ID,
|
||||||
|
LLM_KV_TOKENIZER_MIDDLE_ID,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::map<llm_kv, const char *> LLM_KV_NAMES = {
|
static const std::map<llm_kv, const char *> LLM_KV_NAMES = {
|
||||||
|
@ -422,57 +430,65 @@ static const std::map<llm_kv, const char *> LLM_KV_NAMES = {
|
||||||
{ LLM_KV_ATTENTION_SLIDING_WINDOW, "%s.attention.sliding_window" },
|
{ LLM_KV_ATTENTION_SLIDING_WINDOW, "%s.attention.sliding_window" },
|
||||||
{ LLM_KV_ATTENTION_SCALE, "%s.attention.scale" },
|
{ LLM_KV_ATTENTION_SCALE, "%s.attention.scale" },
|
||||||
|
|
||||||
{ LLM_KV_ROPE_DIMENSION_COUNT, "%s.rope.dimension_count" },
|
{ LLM_KV_ROPE_DIMENSION_COUNT, "%s.rope.dimension_count" },
|
||||||
{ LLM_KV_ROPE_FREQ_BASE, "%s.rope.freq_base" },
|
{ LLM_KV_ROPE_FREQ_BASE, "%s.rope.freq_base" },
|
||||||
{ LLM_KV_ROPE_SCALE_LINEAR, "%s.rope.scale_linear" },
|
{ LLM_KV_ROPE_SCALE_LINEAR, "%s.rope.scale_linear" },
|
||||||
{ LLM_KV_ROPE_SCALING_TYPE, "%s.rope.scaling.type" },
|
{ LLM_KV_ROPE_SCALING_TYPE, "%s.rope.scaling.type" },
|
||||||
{ LLM_KV_ROPE_SCALING_FACTOR, "%s.rope.scaling.factor" },
|
{ LLM_KV_ROPE_SCALING_FACTOR, "%s.rope.scaling.factor" },
|
||||||
{ LLM_KV_ROPE_SCALING_ATTN_FACTOR, "%s.rope.scaling.attn_factor" },
|
{ LLM_KV_ROPE_SCALING_ATTN_FACTOR, "%s.rope.scaling.attn_factor" },
|
||||||
{ LLM_KV_ROPE_SCALING_ORIG_CTX_LEN, "%s.rope.scaling.original_context_length" },
|
{ LLM_KV_ROPE_SCALING_ORIG_CTX_LEN, "%s.rope.scaling.original_context_length" },
|
||||||
{ LLM_KV_ROPE_SCALING_FINETUNED, "%s.rope.scaling.finetuned" },
|
{ LLM_KV_ROPE_SCALING_FINETUNED, "%s.rope.scaling.finetuned" },
|
||||||
{ LLM_KV_ROPE_SCALING_YARN_LOG_MUL, "%s.rope.scaling.yarn_log_multiplier" },
|
{ LLM_KV_ROPE_SCALING_YARN_LOG_MUL, "%s.rope.scaling.yarn_log_multiplier" },
|
||||||
|
|
||||||
{ LLM_KV_SPLIT_NO, "split.no" },
|
{ LLM_KV_SPLIT_NO, "split.no" },
|
||||||
{ LLM_KV_SPLIT_COUNT, "split.count" },
|
{ LLM_KV_SPLIT_COUNT, "split.count" },
|
||||||
{ LLM_KV_SPLIT_TENSORS_COUNT, "split.tensors.count" },
|
{ LLM_KV_SPLIT_TENSORS_COUNT, "split.tensors.count" },
|
||||||
|
|
||||||
{ LLM_KV_SSM_CONV_KERNEL, "%s.ssm.conv_kernel" },
|
{ LLM_KV_SSM_CONV_KERNEL, "%s.ssm.conv_kernel" },
|
||||||
{ LLM_KV_SSM_INNER_SIZE, "%s.ssm.inner_size" },
|
{ LLM_KV_SSM_INNER_SIZE, "%s.ssm.inner_size" },
|
||||||
{ LLM_KV_SSM_STATE_SIZE, "%s.ssm.state_size" },
|
{ LLM_KV_SSM_STATE_SIZE, "%s.ssm.state_size" },
|
||||||
{ LLM_KV_SSM_TIME_STEP_RANK, "%s.ssm.time_step_rank" },
|
{ LLM_KV_SSM_TIME_STEP_RANK, "%s.ssm.time_step_rank" },
|
||||||
{ LLM_KV_SSM_DT_B_C_RMS, "%s.ssm.dt_b_c_rms" },
|
{ LLM_KV_SSM_DT_B_C_RMS, "%s.ssm.dt_b_c_rms" },
|
||||||
|
|
||||||
{ LLM_KV_WKV_HEAD_SIZE, "%s.wkv.head_size" },
|
{ LLM_KV_WKV_HEAD_SIZE, "%s.wkv.head_size" },
|
||||||
|
|
||||||
{ LLM_KV_TOKENIZER_MODEL, "tokenizer.ggml.model" },
|
{ LLM_KV_TOKENIZER_MODEL, "tokenizer.ggml.model" },
|
||||||
{ LLM_KV_TOKENIZER_PRE, "tokenizer.ggml.pre" },
|
{ LLM_KV_TOKENIZER_PRE, "tokenizer.ggml.pre" },
|
||||||
{ LLM_KV_TOKENIZER_LIST, "tokenizer.ggml.tokens" },
|
{ LLM_KV_TOKENIZER_LIST, "tokenizer.ggml.tokens" },
|
||||||
{ LLM_KV_TOKENIZER_TOKEN_TYPE, "tokenizer.ggml.token_type" },
|
{ LLM_KV_TOKENIZER_TOKEN_TYPE, "tokenizer.ggml.token_type" },
|
||||||
{ LLM_KV_TOKENIZER_TOKEN_TYPE_COUNT, "tokenizer.ggml.token_type_count" },
|
{ LLM_KV_TOKENIZER_TOKEN_TYPE_COUNT, "tokenizer.ggml.token_type_count" },
|
||||||
{ LLM_KV_TOKENIZER_SCORES, "tokenizer.ggml.scores" },
|
{ LLM_KV_TOKENIZER_SCORES, "tokenizer.ggml.scores" },
|
||||||
{ LLM_KV_TOKENIZER_MERGES, "tokenizer.ggml.merges" },
|
{ LLM_KV_TOKENIZER_MERGES, "tokenizer.ggml.merges" },
|
||||||
{ LLM_KV_TOKENIZER_BOS_ID, "tokenizer.ggml.bos_token_id" },
|
{ LLM_KV_TOKENIZER_BOS_ID, "tokenizer.ggml.bos_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_EOS_ID, "tokenizer.ggml.eos_token_id" },
|
{ LLM_KV_TOKENIZER_EOS_ID, "tokenizer.ggml.eos_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_UNK_ID, "tokenizer.ggml.unknown_token_id" },
|
{ LLM_KV_TOKENIZER_EOT_ID, "tokenizer.ggml.eot_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_SEP_ID, "tokenizer.ggml.seperator_token_id" },
|
{ LLM_KV_TOKENIZER_EOM_ID, "tokenizer.ggml.eom_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_PAD_ID, "tokenizer.ggml.padding_token_id" },
|
{ LLM_KV_TOKENIZER_UNK_ID, "tokenizer.ggml.unknown_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_CLS_ID, "tokenizer.ggml.cls_token_id" },
|
{ LLM_KV_TOKENIZER_SEP_ID, "tokenizer.ggml.seperator_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_MASK_ID, "tokenizer.ggml.mask_token_id" },
|
{ LLM_KV_TOKENIZER_PAD_ID, "tokenizer.ggml.padding_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_ADD_BOS, "tokenizer.ggml.add_bos_token" },
|
{ LLM_KV_TOKENIZER_CLS_ID, "tokenizer.ggml.cls_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_ADD_EOS, "tokenizer.ggml.add_eos_token" },
|
{ LLM_KV_TOKENIZER_MASK_ID, "tokenizer.ggml.mask_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_ADD_PREFIX, "tokenizer.ggml.add_space_prefix" },
|
{ LLM_KV_TOKENIZER_ADD_BOS, "tokenizer.ggml.add_bos_token" },
|
||||||
{ LLM_KV_TOKENIZER_REMOVE_EXTRA_WS, "tokenizer.ggml.remove_extra_whitespaces" },
|
{ LLM_KV_TOKENIZER_ADD_EOS, "tokenizer.ggml.add_eos_token" },
|
||||||
{ LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP, "tokenizer.ggml.precompiled_charsmap" },
|
{ LLM_KV_TOKENIZER_ADD_PREFIX, "tokenizer.ggml.add_space_prefix" },
|
||||||
{ LLM_KV_TOKENIZER_HF_JSON, "tokenizer.huggingface.json" },
|
{ LLM_KV_TOKENIZER_REMOVE_EXTRA_WS, "tokenizer.ggml.remove_extra_whitespaces" },
|
||||||
{ LLM_KV_TOKENIZER_RWKV, "tokenizer.rwkv.world" },
|
{ LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP, "tokenizer.ggml.precompiled_charsmap" },
|
||||||
{ LLM_KV_TOKENIZER_PREFIX_ID, "tokenizer.ggml.prefix_token_id" },
|
{ LLM_KV_TOKENIZER_HF_JSON, "tokenizer.huggingface.json" },
|
||||||
{ LLM_KV_TOKENIZER_SUFFIX_ID, "tokenizer.ggml.suffix_token_id" },
|
{ LLM_KV_TOKENIZER_RWKV, "tokenizer.rwkv.world" },
|
||||||
{ LLM_KV_TOKENIZER_MIDDLE_ID, "tokenizer.ggml.middle_token_id" },
|
{ LLM_KV_TOKENIZER_FIM_PRE_ID, "tokenizer.ggml.fim_pre_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_EOT_ID, "tokenizer.ggml.eot_token_id" },
|
{ LLM_KV_TOKENIZER_FIM_SUF_ID, "tokenizer.ggml.fim_suf_token_id" },
|
||||||
{ LLM_KV_TOKENIZER_EOM_ID, "tokenizer.ggml.eom_token_id" },
|
{ LLM_KV_TOKENIZER_FIM_MID_ID, "tokenizer.ggml.fim_mid_token_id" },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_PAD_ID, "tokenizer.ggml.fim_pad_token_id" },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_REP_ID, "tokenizer.ggml.fim_rep_token_id" },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_SEP_ID, "tokenizer.ggml.fim_sep_token_id" },
|
||||||
|
|
||||||
{ LLM_KV_ADAPTER_TYPE, "adapter.type" },
|
{ LLM_KV_ADAPTER_TYPE, "adapter.type" },
|
||||||
{ LLM_KV_ADAPTER_LORA_ALPHA, "adapter.lora.alpha" },
|
{ LLM_KV_ADAPTER_LORA_ALPHA, "adapter.lora.alpha" },
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
{ LLM_KV_TOKENIZER_PREFIX_ID, "tokenizer.ggml.prefix_token_id" },
|
||||||
|
{ LLM_KV_TOKENIZER_SUFFIX_ID, "tokenizer.ggml.suffix_token_id" },
|
||||||
|
{ LLM_KV_TOKENIZER_MIDDLE_ID, "tokenizer.ggml.middle_token_id" },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LLM_KV {
|
struct LLM_KV {
|
||||||
|
@ -6139,14 +6155,14 @@ static void llm_load_vocab(
|
||||||
vocab.type = LLAMA_VOCAB_TYPE_NONE;
|
vocab.type = LLAMA_VOCAB_TYPE_NONE;
|
||||||
|
|
||||||
// default special tokens
|
// default special tokens
|
||||||
vocab.special_bos_id = -1;
|
vocab.special_bos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_eos_id = -1;
|
vocab.special_eos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_unk_id = -1;
|
vocab.special_unk_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_sep_id = -1;
|
vocab.special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_pad_id = -1;
|
vocab.special_pad_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_cls_id = -1;
|
vocab.special_cls_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_mask_id = -1;
|
vocab.special_mask_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.linefeed_id = -1;
|
vocab.linefeed_id = LLAMA_TOKEN_NULL;
|
||||||
|
|
||||||
// read vocab size from metadata
|
// read vocab size from metadata
|
||||||
if (!ml.get_key(LLM_KV_VOCAB_SIZE, vocab.n_vocab, false)) {
|
if (!ml.get_key(LLM_KV_VOCAB_SIZE, vocab.n_vocab, false)) {
|
||||||
|
@ -6163,16 +6179,16 @@ static void llm_load_vocab(
|
||||||
vocab.special_bos_id = 1;
|
vocab.special_bos_id = 1;
|
||||||
vocab.special_eos_id = 2;
|
vocab.special_eos_id = 2;
|
||||||
vocab.special_unk_id = 0;
|
vocab.special_unk_id = 0;
|
||||||
vocab.special_sep_id = -1;
|
vocab.special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_pad_id = -1;
|
vocab.special_pad_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_cls_id = -1;
|
vocab.special_cls_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_mask_id = -1;
|
vocab.special_mask_id = LLAMA_TOKEN_NULL;
|
||||||
} else if (tokenizer_model == "bert") {
|
} else if (tokenizer_model == "bert") {
|
||||||
vocab.type = LLAMA_VOCAB_TYPE_WPM;
|
vocab.type = LLAMA_VOCAB_TYPE_WPM;
|
||||||
|
|
||||||
// default special tokens
|
// default special tokens
|
||||||
vocab.special_bos_id = -1;
|
vocab.special_bos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_eos_id = -1;
|
vocab.special_eos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_unk_id = 100;
|
vocab.special_unk_id = 100;
|
||||||
vocab.special_sep_id = 102;
|
vocab.special_sep_id = 102;
|
||||||
vocab.special_pad_id = 0;
|
vocab.special_pad_id = 0;
|
||||||
|
@ -6208,22 +6224,22 @@ static void llm_load_vocab(
|
||||||
// default special tokens
|
// default special tokens
|
||||||
vocab.special_bos_id = 11;
|
vocab.special_bos_id = 11;
|
||||||
vocab.special_eos_id = 11;
|
vocab.special_eos_id = 11;
|
||||||
vocab.special_unk_id = -1;
|
vocab.special_unk_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_sep_id = -1;
|
vocab.special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_pad_id = -1;
|
vocab.special_pad_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_cls_id = -1;
|
vocab.special_cls_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_mask_id = -1;
|
vocab.special_mask_id = LLAMA_TOKEN_NULL;
|
||||||
} else if (tokenizer_model == "t5") {
|
} else if (tokenizer_model == "t5") {
|
||||||
vocab.type = LLAMA_VOCAB_TYPE_UGM;
|
vocab.type = LLAMA_VOCAB_TYPE_UGM;
|
||||||
|
|
||||||
// default special tokens
|
// default special tokens
|
||||||
vocab.special_bos_id = -1;
|
vocab.special_bos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_eos_id = 1;
|
vocab.special_eos_id = 1;
|
||||||
vocab.special_unk_id = 2;
|
vocab.special_unk_id = 2;
|
||||||
vocab.special_sep_id = -1;
|
vocab.special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_pad_id = 0;
|
vocab.special_pad_id = 0;
|
||||||
vocab.special_cls_id = -1;
|
vocab.special_cls_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_mask_id = -1;
|
vocab.special_mask_id = LLAMA_TOKEN_NULL;
|
||||||
|
|
||||||
const int precompiled_charsmap_keyidx = gguf_find_key(ctx, kv(LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP).c_str());
|
const int precompiled_charsmap_keyidx = gguf_find_key(ctx, kv(LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP).c_str());
|
||||||
if (precompiled_charsmap_keyidx != -1) {
|
if (precompiled_charsmap_keyidx != -1) {
|
||||||
|
@ -6246,11 +6262,11 @@ static void llm_load_vocab(
|
||||||
vocab.type = LLAMA_VOCAB_TYPE_RWKV;
|
vocab.type = LLAMA_VOCAB_TYPE_RWKV;
|
||||||
|
|
||||||
// default special tokens
|
// default special tokens
|
||||||
vocab.special_bos_id = -1;
|
vocab.special_bos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_eos_id = -1;
|
vocab.special_eos_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_unk_id = -1;
|
vocab.special_unk_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_sep_id = -1;
|
vocab.special_sep_id = LLAMA_TOKEN_NULL;
|
||||||
vocab.special_pad_id = -1;
|
vocab.special_pad_id = LLAMA_TOKEN_NULL;
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error(format("unknown tokenizer: '%s'", tokenizer_model.c_str()));
|
throw std::runtime_error(format("unknown tokenizer: '%s'", tokenizer_model.c_str()));
|
||||||
}
|
}
|
||||||
|
@ -6334,7 +6350,7 @@ static void llm_load_vocab(
|
||||||
} else if (
|
} else if (
|
||||||
tokenizer_pre == "chatglm-bpe") {
|
tokenizer_pre == "chatglm-bpe") {
|
||||||
vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_CHATGLM4;
|
vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_CHATGLM4;
|
||||||
vocab.special_bos_id = -1;
|
vocab.special_bos_id = LLAMA_TOKEN_NULL;
|
||||||
} else if (
|
} else if (
|
||||||
tokenizer_pre == "viking") {
|
tokenizer_pre == "viking") {
|
||||||
vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_VIKING;
|
vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_VIKING;
|
||||||
|
@ -6460,44 +6476,6 @@ static void llm_load_vocab(
|
||||||
|
|
||||||
// determine the newline token: LLaMA "<0x0A>" == 10 == '\n', Falcon 193 == '\n'
|
// determine the newline token: LLaMA "<0x0A>" == 10 == '\n', Falcon 193 == '\n'
|
||||||
if (vocab.type == LLAMA_VOCAB_TYPE_SPM) {
|
if (vocab.type == LLAMA_VOCAB_TYPE_SPM) {
|
||||||
// For Fill-In-the-Middle (FIM)/infill models which where converted
|
|
||||||
// prior to support of FIM special tokens in GGUF, the following
|
|
||||||
// will allow those models to continue to work. The general names
|
|
||||||
// of the known models are currently CodeLlama (LLM_ARCH_LLAMA) and
|
|
||||||
// CodeGemma (LLM_ARCH_GEMMA). This can potentially be removed once
|
|
||||||
// new versions of these models have been published.
|
|
||||||
std::string gen_name;
|
|
||||||
ml.get_key(LLM_KV_GENERAL_NAME, gen_name, false);
|
|
||||||
|
|
||||||
std::transform(gen_name.begin(), gen_name.end(), gen_name.begin(),
|
|
||||||
[](unsigned char c){ return std::tolower(c); });
|
|
||||||
|
|
||||||
if (gen_name.find("code") != std::string::npos) {
|
|
||||||
if (model.arch == LLM_ARCH_LLAMA
|
|
||||||
&& 32010 < vocab.id_to_token.size()
|
|
||||||
&& vocab.id_to_token[32007].text.find("<PRE>") != std::string::npos
|
|
||||||
&& vocab.id_to_token[32008].text.find("<SUF>") != std::string::npos
|
|
||||||
&& vocab.id_to_token[32009].text.find("<MID>") != std::string::npos
|
|
||||||
&& vocab.id_to_token[32010].text.find("<EOT>") != std::string::npos) {
|
|
||||||
vocab.special_prefix_id = 32007;
|
|
||||||
vocab.special_suffix_id = 32008;
|
|
||||||
vocab.special_middle_id = 32009;
|
|
||||||
vocab.special_eot_id = 32010;
|
|
||||||
} else if (model.arch == LLM_ARCH_GEMMA
|
|
||||||
&& 107 < vocab.id_to_token.size()
|
|
||||||
&& vocab.id_to_token[67].text == "<|fim_prefix|>"
|
|
||||||
&& vocab.id_to_token[69].text == "<|fim_suffix|>"
|
|
||||||
&& vocab.id_to_token[68].text == "<|fim_middle|>"
|
|
||||||
&& vocab.id_to_token[107].text == "<end_of_turn>") {
|
|
||||||
vocab.special_prefix_id = 67;
|
|
||||||
vocab.special_suffix_id = 69;
|
|
||||||
vocab.special_middle_id = 68;
|
|
||||||
// TODO: this is not EOT, it is "file separator" token, needs fix
|
|
||||||
// https://huggingface.co/google/codegemma-7b-it/blob/9b1d9231388358c04d90bd003458f5070d97db44/tokenizer_config.json#L565-L572
|
|
||||||
//vocab.special_eot_id = 70;
|
|
||||||
vocab.special_eot_id = 107;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
vocab.linefeed_id = llama_byte_to_token_impl(vocab, '\n');
|
vocab.linefeed_id = llama_byte_to_token_impl(vocab, '\n');
|
||||||
} catch (const std::exception & e) {
|
} catch (const std::exception & e) {
|
||||||
|
@ -6525,18 +6503,26 @@ static void llm_load_vocab(
|
||||||
// special tokens
|
// special tokens
|
||||||
{
|
{
|
||||||
const std::vector<std::pair<enum llm_kv, int32_t &>> special_token_types = {
|
const std::vector<std::pair<enum llm_kv, int32_t &>> special_token_types = {
|
||||||
{ LLM_KV_TOKENIZER_BOS_ID, vocab.special_bos_id },
|
{ LLM_KV_TOKENIZER_BOS_ID, vocab.special_bos_id },
|
||||||
{ LLM_KV_TOKENIZER_EOS_ID, vocab.special_eos_id },
|
{ LLM_KV_TOKENIZER_EOS_ID, vocab.special_eos_id },
|
||||||
{ LLM_KV_TOKENIZER_UNK_ID, vocab.special_unk_id },
|
{ LLM_KV_TOKENIZER_EOT_ID, vocab.special_eot_id },
|
||||||
{ LLM_KV_TOKENIZER_SEP_ID, vocab.special_sep_id },
|
{ LLM_KV_TOKENIZER_EOM_ID, vocab.special_eom_id },
|
||||||
{ LLM_KV_TOKENIZER_PAD_ID, vocab.special_pad_id },
|
{ LLM_KV_TOKENIZER_UNK_ID, vocab.special_unk_id },
|
||||||
{ LLM_KV_TOKENIZER_CLS_ID, vocab.special_cls_id },
|
{ LLM_KV_TOKENIZER_SEP_ID, vocab.special_sep_id },
|
||||||
{ LLM_KV_TOKENIZER_MASK_ID, vocab.special_mask_id },
|
{ LLM_KV_TOKENIZER_PAD_ID, vocab.special_pad_id },
|
||||||
{ LLM_KV_TOKENIZER_PREFIX_ID, vocab.special_prefix_id },
|
{ LLM_KV_TOKENIZER_CLS_ID, vocab.special_cls_id },
|
||||||
{ LLM_KV_TOKENIZER_SUFFIX_ID, vocab.special_suffix_id },
|
{ LLM_KV_TOKENIZER_MASK_ID, vocab.special_mask_id },
|
||||||
{ LLM_KV_TOKENIZER_MIDDLE_ID, vocab.special_middle_id },
|
{ LLM_KV_TOKENIZER_FIM_PRE_ID, vocab.special_fim_pre_id },
|
||||||
{ LLM_KV_TOKENIZER_EOT_ID, vocab.special_eot_id },
|
{ LLM_KV_TOKENIZER_FIM_SUF_ID, vocab.special_fim_suf_id },
|
||||||
{ LLM_KV_TOKENIZER_EOM_ID, vocab.special_eom_id },
|
{ LLM_KV_TOKENIZER_FIM_MID_ID, vocab.special_fim_mid_id },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_PAD_ID, vocab.special_fim_pad_id },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_REP_ID, vocab.special_fim_rep_id },
|
||||||
|
{ LLM_KV_TOKENIZER_FIM_SEP_ID, vocab.special_fim_sep_id },
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
{ LLM_KV_TOKENIZER_PREFIX_ID, vocab.special_fim_pre_id },
|
||||||
|
{ LLM_KV_TOKENIZER_SUFFIX_ID, vocab.special_fim_suf_id },
|
||||||
|
{ LLM_KV_TOKENIZER_MIDDLE_ID, vocab.special_fim_mid_id },
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const auto & it : special_token_types) {
|
for (const auto & it : special_token_types) {
|
||||||
|
@ -6567,22 +6553,21 @@ static void llm_load_vocab(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// find EOT token: "<|eot_id|>", "<|im_end|>", "<end_of_turn>", etc.
|
// auto-detect special tokens by text
|
||||||
//
|
// TODO: convert scripts should provide these tokens through the KV metadata LLM_KV_TOKENIZER_...
|
||||||
// TODO: convert scripts should provide this token through the KV metadata LLAMA_KV_TOKENIZER_EOT_ID
|
// for now, we apply this workaround to find the tokens based on their text
|
||||||
// for now, we apply this workaround to find the EOT token based on its text
|
|
||||||
if (vocab.special_eot_id == -1) {
|
for (const auto & t : vocab.token_to_id) {
|
||||||
for (const auto & t : vocab.token_to_id) {
|
// find EOT token: "<|eot_id|>", "<|im_end|>", "<end_of_turn>", etc.
|
||||||
|
if (vocab.special_eot_id == LLAMA_TOKEN_NULL) {
|
||||||
if (false
|
if (false
|
||||||
// TODO: gemma "<end_of_turn>" is exported as a normal token, so the following check does not work
|
|
||||||
// need to fix convert script
|
|
||||||
//vocab.id_to_token[t.second].type == LLAMA_TOKEN_TYPE_CONTROL &&
|
|
||||||
|| t.first == "<|eot_id|>"
|
|| t.first == "<|eot_id|>"
|
||||||
|| t.first == "<|im_end|>"
|
|| t.first == "<|im_end|>"
|
||||||
|| t.first == "<|end|>"
|
|| t.first == "<|end|>"
|
||||||
|| t.first == "<end_of_turn>"
|
|| t.first == "<end_of_turn>"
|
||||||
|| t.first == "<|endoftext|>"
|
|| t.first == "<|endoftext|>"
|
||||||
|| t.first == "<EOT>"
|
|| t.first == "<EOT>"
|
||||||
|
|| t.first == "<|end▁of▁sentence|>" // DeepSeek
|
||||||
) {
|
) {
|
||||||
vocab.special_eot_id = t.second;
|
vocab.special_eot_id = t.second;
|
||||||
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
@ -6590,23 +6575,118 @@ static void llm_load_vocab(
|
||||||
__func__, t.first.c_str());
|
__func__, t.first.c_str());
|
||||||
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// find EOM token: "<|eom_id|>"
|
// find EOM token: "<|eom_id|>"
|
||||||
//
|
if (vocab.special_eom_id == LLAMA_TOKEN_NULL) {
|
||||||
// TODO: convert scripts should provide this token through the KV metadata LLAMA_KV_TOKENIZER_EOM_ID
|
if (false
|
||||||
// for now, we apply this workaround to find the EOM token based on its text
|
|| t.first == "<|eom_id|>"
|
||||||
if (vocab.special_eom_id == -1) {
|
) {
|
||||||
const auto & t = vocab.token_to_id.find("<|eom_id|>");
|
vocab.special_eom_id = t.second;
|
||||||
if (t != vocab.token_to_id.end()) {
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
vocab.special_eom_id = t->second;
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
if ((vocab.id_to_token[t->second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
__func__, t.first.c_str());
|
||||||
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
__func__, t->first.c_str());
|
}
|
||||||
vocab.id_to_token[t->second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_PRE token: "<|fim_prefix|>", "<fim-prefix>", "<PRE>", etc.
|
||||||
|
if (vocab.special_fim_pre_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|fim_prefix|>" // Qwen
|
||||||
|
|| t.first == "<fim-prefix>"
|
||||||
|
|| t.first == "<|fim▁begin|>" // DeepSeek
|
||||||
|
|| t.first == "<PRE>"
|
||||||
|
) {
|
||||||
|
vocab.special_fim_pre_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_SUF token: "<|fim_suffix|>", "<fim-suffix>", "<SUF>", etc.
|
||||||
|
if (vocab.special_fim_suf_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|fim_suffix|>" // Qwen
|
||||||
|
|| t.first == "<fim-suffix>"
|
||||||
|
|| t.first == "<|fim▁hole|>" // DeepSeek
|
||||||
|
|| t.first == "<SUF>"
|
||||||
|
) {
|
||||||
|
vocab.special_fim_suf_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_MID token: "<|fim_middle|>", "<fim-middle>", "<MID>", etc.
|
||||||
|
if (vocab.special_fim_mid_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|fim_middle|>" // Qwen
|
||||||
|
|| t.first == "<fim-middle>"
|
||||||
|
|| t.first == "<|fim▁end|>" // DeepSeek
|
||||||
|
|| t.first == "<MID>"
|
||||||
|
) {
|
||||||
|
vocab.special_fim_mid_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_PAD token: "<|fim_pad|>", "<fim-pad>", "<PAD>", etc.
|
||||||
|
if (vocab.special_fim_pad_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|fim_pad|>" // Qwen
|
||||||
|
|| t.first == "<fim-pad>"
|
||||||
|
|| t.first == "<PAD>"
|
||||||
|
) {
|
||||||
|
vocab.special_fim_pad_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_REP token: "<|fim_repo|>", "<fim-repo>", "<REP>", etc.
|
||||||
|
if (vocab.special_fim_rep_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|fim_repo|>" // Qwen
|
||||||
|
|| t.first == "<|repo_name|>"
|
||||||
|
|| t.first == "<fim-repo>"
|
||||||
|
|| t.first == "<REPO>"
|
||||||
|
) {
|
||||||
|
vocab.special_fim_rep_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find FIM_SEP token: "<|file_sep|>"
|
||||||
|
if (vocab.special_fim_sep_id == LLAMA_TOKEN_NULL) {
|
||||||
|
if (false
|
||||||
|
|| t.first == "<|file_sep|>" // Qwen
|
||||||
|
) {
|
||||||
|
vocab.special_fim_sep_id = t.second;
|
||||||
|
if ((vocab.id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) {
|
||||||
|
LLAMA_LOG_WARN("%s: control-looking token: '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n",
|
||||||
|
__func__, t.first.c_str());
|
||||||
|
vocab.id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6634,17 +6714,17 @@ static void llm_load_vocab(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vocab.special_eos_id != -1 && vocab.special_eog_ids.count(vocab.special_eos_id) == 0) {
|
if (vocab.special_eos_id != LLAMA_TOKEN_NULL && vocab.special_eog_ids.count(vocab.special_eos_id) == 0) {
|
||||||
vocab.special_eog_ids.insert(vocab.special_eos_id);
|
vocab.special_eog_ids.insert(vocab.special_eos_id);
|
||||||
LLAMA_LOG_WARN("%s: special_eos_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
LLAMA_LOG_WARN("%s: special_eos_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vocab.special_eot_id != -1 && vocab.special_eog_ids.count(vocab.special_eot_id) == 0) {
|
if (vocab.special_eot_id != LLAMA_TOKEN_NULL && vocab.special_eog_ids.count(vocab.special_eot_id) == 0) {
|
||||||
vocab.special_eog_ids.insert(vocab.special_eot_id);
|
vocab.special_eog_ids.insert(vocab.special_eot_id);
|
||||||
LLAMA_LOG_WARN("%s: special_eot_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
LLAMA_LOG_WARN("%s: special_eot_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vocab.special_eom_id != -1 && vocab.special_eog_ids.count(vocab.special_eom_id) == 0) {
|
if (vocab.special_eom_id != LLAMA_TOKEN_NULL && vocab.special_eog_ids.count(vocab.special_eom_id) == 0) {
|
||||||
vocab.special_eog_ids.insert(vocab.special_eom_id);
|
vocab.special_eog_ids.insert(vocab.special_eom_id);
|
||||||
LLAMA_LOG_WARN("%s: special_eom_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
LLAMA_LOG_WARN("%s: special_eom_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__);
|
||||||
}
|
}
|
||||||
|
@ -6838,20 +6918,24 @@ static void llm_load_print_meta(llama_model_loader & ml, llama_model & model) {
|
||||||
LLAMA_LOG_INFO("%s: general.name = %s\n", __func__, model.name.c_str());
|
LLAMA_LOG_INFO("%s: general.name = %s\n", __func__, model.name.c_str());
|
||||||
|
|
||||||
// special tokens
|
// special tokens
|
||||||
if (vocab.special_bos_id != -1) { LLAMA_LOG_INFO( "%s: BOS token = %d '%s'\n", __func__, vocab.special_bos_id, vocab.id_to_token[vocab.special_bos_id].text.c_str() ); }
|
if (vocab.special_bos_id != -1) { LLAMA_LOG_INFO( "%s: BOS token = %d '%s'\n", __func__, vocab.special_bos_id, vocab.id_to_token[vocab.special_bos_id].text.c_str() ); }
|
||||||
if (vocab.special_eos_id != -1) { LLAMA_LOG_INFO( "%s: EOS token = %d '%s'\n", __func__, vocab.special_eos_id, vocab.id_to_token[vocab.special_eos_id].text.c_str() ); }
|
if (vocab.special_eos_id != -1) { LLAMA_LOG_INFO( "%s: EOS token = %d '%s'\n", __func__, vocab.special_eos_id, vocab.id_to_token[vocab.special_eos_id].text.c_str() ); }
|
||||||
if (vocab.special_unk_id != -1) { LLAMA_LOG_INFO( "%s: UNK token = %d '%s'\n", __func__, vocab.special_unk_id, vocab.id_to_token[vocab.special_unk_id].text.c_str() ); }
|
if (vocab.special_eot_id != -1) { LLAMA_LOG_INFO( "%s: EOT token = %d '%s'\n", __func__, vocab.special_eot_id, vocab.id_to_token[vocab.special_eot_id].text.c_str() ); }
|
||||||
if (vocab.special_sep_id != -1) { LLAMA_LOG_INFO( "%s: SEP token = %d '%s'\n", __func__, vocab.special_sep_id, vocab.id_to_token[vocab.special_sep_id].text.c_str() ); }
|
if (vocab.special_eom_id != -1) { LLAMA_LOG_INFO( "%s: EOM token = %d '%s'\n", __func__, vocab.special_eom_id, vocab.id_to_token[vocab.special_eom_id].text.c_str() ); }
|
||||||
if (vocab.special_pad_id != -1) { LLAMA_LOG_INFO( "%s: PAD token = %d '%s'\n", __func__, vocab.special_pad_id, vocab.id_to_token[vocab.special_pad_id].text.c_str() ); }
|
if (vocab.special_unk_id != -1) { LLAMA_LOG_INFO( "%s: UNK token = %d '%s'\n", __func__, vocab.special_unk_id, vocab.id_to_token[vocab.special_unk_id].text.c_str() ); }
|
||||||
if (vocab.special_cls_id != -1) { LLAMA_LOG_INFO( "%s: CLS token = %d '%s'\n", __func__, vocab.special_cls_id, vocab.id_to_token[vocab.special_cls_id].text.c_str() ); }
|
if (vocab.special_sep_id != -1) { LLAMA_LOG_INFO( "%s: SEP token = %d '%s'\n", __func__, vocab.special_sep_id, vocab.id_to_token[vocab.special_sep_id].text.c_str() ); }
|
||||||
if (vocab.special_mask_id != -1) { LLAMA_LOG_INFO( "%s: MASK token = %d '%s'\n", __func__, vocab.special_mask_id, vocab.id_to_token[vocab.special_mask_id].text.c_str() ); }
|
if (vocab.special_pad_id != -1) { LLAMA_LOG_INFO( "%s: PAD token = %d '%s'\n", __func__, vocab.special_pad_id, vocab.id_to_token[vocab.special_pad_id].text.c_str() ); }
|
||||||
|
if (vocab.special_cls_id != -1) { LLAMA_LOG_INFO( "%s: CLS token = %d '%s'\n", __func__, vocab.special_cls_id, vocab.id_to_token[vocab.special_cls_id].text.c_str() ); }
|
||||||
|
if (vocab.special_mask_id != -1) { LLAMA_LOG_INFO( "%s: MASK token = %d '%s'\n", __func__, vocab.special_mask_id, vocab.id_to_token[vocab.special_mask_id].text.c_str() ); }
|
||||||
|
|
||||||
if (vocab.linefeed_id != -1) { LLAMA_LOG_INFO( "%s: LF token = %d '%s'\n", __func__, vocab.linefeed_id, vocab.id_to_token[vocab.linefeed_id].text.c_str() ); }
|
if (vocab.linefeed_id != -1) { LLAMA_LOG_INFO( "%s: LF token = %d '%s'\n", __func__, vocab.linefeed_id, vocab.id_to_token[vocab.linefeed_id].text.c_str() ); }
|
||||||
if (vocab.special_prefix_id != -1) { LLAMA_LOG_INFO( "%s: PRE token = %d '%s'\n", __func__, vocab.special_prefix_id, vocab.id_to_token[vocab.special_prefix_id].text.c_str() ); }
|
|
||||||
if (vocab.special_suffix_id != -1) { LLAMA_LOG_INFO( "%s: SUF token = %d '%s'\n", __func__, vocab.special_suffix_id, vocab.id_to_token[vocab.special_suffix_id].text.c_str() ); }
|
if (vocab.special_fim_pre_id != -1) { LLAMA_LOG_INFO( "%s: FIM PRE token = %d '%s'\n", __func__, vocab.special_fim_pre_id, vocab.id_to_token[vocab.special_fim_pre_id].text.c_str() ); }
|
||||||
if (vocab.special_middle_id != -1) { LLAMA_LOG_INFO( "%s: MID token = %d '%s'\n", __func__, vocab.special_middle_id, vocab.id_to_token[vocab.special_middle_id].text.c_str() ); }
|
if (vocab.special_fim_suf_id != -1) { LLAMA_LOG_INFO( "%s: FIM SUF token = %d '%s'\n", __func__, vocab.special_fim_suf_id, vocab.id_to_token[vocab.special_fim_suf_id].text.c_str() ); }
|
||||||
if (vocab.special_eot_id != -1) { LLAMA_LOG_INFO( "%s: EOT token = %d '%s'\n", __func__, vocab.special_eot_id, vocab.id_to_token[vocab.special_eot_id].text.c_str() ); }
|
if (vocab.special_fim_mid_id != -1) { LLAMA_LOG_INFO( "%s: FIM MID token = %d '%s'\n", __func__, vocab.special_fim_mid_id, vocab.id_to_token[vocab.special_fim_mid_id].text.c_str() ); }
|
||||||
if (vocab.special_eom_id != -1) { LLAMA_LOG_INFO( "%s: EOM token = %d '%s'\n", __func__, vocab.special_eom_id, vocab.id_to_token[vocab.special_eom_id].text.c_str() ); }
|
if (vocab.special_fim_pad_id != -1) { LLAMA_LOG_INFO( "%s: FIM PAD token = %d '%s'\n", __func__, vocab.special_fim_pad_id, vocab.id_to_token[vocab.special_fim_pad_id].text.c_str() ); }
|
||||||
|
if (vocab.special_fim_rep_id != -1) { LLAMA_LOG_INFO( "%s: FIM REP token = %d '%s'\n", __func__, vocab.special_fim_rep_id, vocab.id_to_token[vocab.special_fim_rep_id].text.c_str() ); }
|
||||||
|
if (vocab.special_fim_sep_id != -1) { LLAMA_LOG_INFO( "%s: FIM SEP token = %d '%s'\n", __func__, vocab.special_fim_sep_id, vocab.id_to_token[vocab.special_fim_sep_id].text.c_str() ); }
|
||||||
|
|
||||||
for (const auto & id : vocab.special_eog_ids) {
|
for (const auto & id : vocab.special_eog_ids) {
|
||||||
LLAMA_LOG_INFO( "%s: EOG token = %d '%s'\n", __func__, id, vocab.id_to_token[id].text.c_str() );
|
LLAMA_LOG_INFO( "%s: EOG token = %d '%s'\n", __func__, id, vocab.id_to_token[id].text.c_str() );
|
||||||
|
@ -19428,7 +19512,7 @@ struct llama_context * llama_new_context_with_model(
|
||||||
}
|
}
|
||||||
|
|
||||||
LLAMA_LOG_INFO("%s: KV self size = %7.2f MiB, K (%s): %7.2f MiB, V (%s): %7.2f MiB\n", __func__,
|
LLAMA_LOG_INFO("%s: KV self size = %7.2f MiB, K (%s): %7.2f MiB, V (%s): %7.2f MiB\n", __func__,
|
||||||
(float)(memory_size_k + memory_size_v) / (1024.0f * 1024.0f),
|
(float)(memory_size_k + memory_size_v) / (1024.0f * 1024.0f),
|
||||||
ggml_type_name(type_k), (float)memory_size_k / (1024.0f * 1024.0f),
|
ggml_type_name(type_k), (float)memory_size_k / (1024.0f * 1024.0f),
|
||||||
ggml_type_name(type_v), (float)memory_size_v / (1024.0f * 1024.0f));
|
ggml_type_name(type_v), (float)memory_size_v / (1024.0f * 1024.0f));
|
||||||
}
|
}
|
||||||
|
@ -21325,6 +21409,10 @@ llama_token llama_token_eos(const struct llama_model * model) {
|
||||||
return llama_token_eos_impl(model->vocab);
|
return llama_token_eos_impl(model->vocab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_eot(const struct llama_model * model) {
|
||||||
|
return llama_token_eot_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
llama_token llama_token_cls(const struct llama_model * model) {
|
llama_token llama_token_cls(const struct llama_model * model) {
|
||||||
return llama_token_cls_impl(model->vocab);
|
return llama_token_cls_impl(model->vocab);
|
||||||
}
|
}
|
||||||
|
@ -21361,8 +21449,28 @@ llama_token llama_token_suffix(const struct llama_model * model) {
|
||||||
return llama_token_suffix_impl(model->vocab);
|
return llama_token_suffix_impl(model->vocab);
|
||||||
}
|
}
|
||||||
|
|
||||||
llama_token llama_token_eot(const struct llama_model * model) {
|
llama_token llama_token_fim_pre(const struct llama_model * model) {
|
||||||
return llama_token_eot_impl(model->vocab);
|
return llama_token_fim_pre_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_suf(const struct llama_model * model) {
|
||||||
|
return llama_token_fim_suf_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_mid(const struct llama_model * model) {
|
||||||
|
return llama_token_fim_mid_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_pad(const struct llama_model * model) {
|
||||||
|
return llama_token_fim_pad_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_rep(const struct llama_model * model) {
|
||||||
|
return llama_token_fim_rep_impl(model->vocab);
|
||||||
|
}
|
||||||
|
|
||||||
|
llama_token llama_token_fim_sep(const struct llama_model * model) {
|
||||||
|
return llama_token_fim_sep_impl(model->vocab);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue