mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-29 08:41:22 +00:00 
			
		
		
		
	 34fcc5a4ac
			
		
	
	34fcc5a4ac
	
	
	
		
			
			* First attempt * No permute during convert (fixes qk tensors), proper norm application. * RoPE = NeoX * Coherence! * Migrate xielu params from tensors to hyperparameters * Simple CUDA kernel * Revert stupid LLM refactorings * Chat template support * configchecker / flake8 errors * Reorder unary.cu * I do conclude that LLMs are, in fact, stupid. * Fix after merge * Final newline * Make xIELU an UNARY_OP * Final newline * Correctly account for parameter shift * Argh. * Update ggml/src/ggml-cpu/unary-ops.cpp Co-authored-by: Georgi Gerganov <ggerganov@gmail.com> * Refactor: remove unused methods, inline and factorize softplus, add const modifiers * Revert CUDA changes, implement xIELU as a separate OP * Pesky newline * Add float2half / half2float for F16 inputs/outputs * CUDA variants, attempt 2 * Actually, attempt 3 * Update ggml/src/ggml-cuda/unary.cu Co-authored-by: Johannes Gäßler <johannesg@5d6.de> * Missing convert header * Proper formula and reference for xIELU in the comments. * Modify unary-ops.cpp to add the functor-based logic besides the template system to retain optimizations * Apply suggestions from code review Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com> * Add tensor mappings for Apertus to global list instead * Fix lazy on scalars * Update ggml/src/ggml-cuda/unary.cu Co-authored-by: Johannes Gäßler <johannesg@5d6.de> * Add comment about the constraints on positive/negative alpha * Change `softplus` to `ggml_softplus` --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com> Co-authored-by: Johannes Gäßler <johannesg@5d6.de> Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com>
		
			
				
	
	
		
			124 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include "chat.h"
 | |
| #include "json-partial.h"
 | |
| #include "regex-partial.h"
 | |
| 
 | |
| #include <nlohmann/json.hpp>
 | |
| 
 | |
| #include <optional>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| class common_chat_msg_partial_exception : public std::runtime_error {
 | |
|   public:
 | |
|     common_chat_msg_partial_exception(const std::string & message) : std::runtime_error(message) {}
 | |
| };
 | |
| 
 | |
| class common_chat_msg_parser {
 | |
|     std::string input_;
 | |
|     bool is_partial_;
 | |
|     common_chat_syntax syntax_;
 | |
|     std::string healing_marker_;
 | |
| 
 | |
|     size_t pos_ = 0;
 | |
|     common_chat_msg result_;
 | |
| 
 | |
|   public:
 | |
|     common_chat_msg_parser(const std::string & input, bool is_partial, const common_chat_syntax & syntax);
 | |
|     const std::string & input() const { return input_; }
 | |
|     size_t pos() const { return pos_; }
 | |
|     const std::string & healing_marker() const { return healing_marker_; }
 | |
|     const bool & is_partial() const { return is_partial_; }
 | |
|     const common_chat_msg & result() const { return result_; }
 | |
|     const common_chat_syntax & syntax() const { return syntax_; }
 | |
| 
 | |
|     void move_to(size_t pos) {
 | |
|         if (pos > input_.size()) {
 | |
|             throw std::runtime_error("Invalid position!");
 | |
|         }
 | |
|         pos_ = pos;
 | |
|     }
 | |
|     void move_back(size_t n) {
 | |
|         if (pos_ < n) {
 | |
|             throw std::runtime_error("Can't move back that far!");
 | |
|         }
 | |
|         pos_ -= n;
 | |
|     }
 | |
| 
 | |
|     // Get the substring of the input at the given range
 | |
|     std::string str(const common_string_range & rng) const;
 | |
| 
 | |
|     // Appends to the result.content field
 | |
|     void add_content(const std::string & content);
 | |
| 
 | |
|     // Appends to the result.reasoning_content field
 | |
|     void add_reasoning_content(const std::string & reasoning_content);
 | |
| 
 | |
|     // Adds a tool call to the result. If the tool call is too incomplete (e.g. name empty), it won't add anything.
 | |
|     bool add_tool_call(const std::string & name, const std::string & id, const std::string & arguments);
 | |
| 
 | |
|     // Adds a tool call using the "name", "id" and "arguments" fields of the json object
 | |
|     bool add_tool_call(const nlohmann::ordered_json & tool_call);
 | |
| 
 | |
|     // Adds an array of tool calls using their "name", "id" and "arguments" fields.
 | |
|     bool add_tool_calls(const nlohmann::ordered_json & arr);
 | |
| 
 | |
|     // Adds a tool call using the short form: { "tool_name": { "arg1": val, "arg2": val } }
 | |
|     bool add_tool_call_short_form(const nlohmann::ordered_json & tool_call);
 | |
| 
 | |
|     void finish();
 | |
| 
 | |
|     bool consume_spaces();
 | |
| 
 | |
|     void consume_literal(const std::string & literal);
 | |
| 
 | |
|     bool try_parse_reasoning(const std::string & start_think, const std::string & end_think);
 | |
| 
 | |
|     std::string consume_rest();
 | |
| 
 | |
|     struct find_regex_result {
 | |
|         std::string prelude;
 | |
|         std::vector<common_string_range> groups;
 | |
|     };
 | |
| 
 | |
|     std::optional<find_regex_result> try_find_regex(const common_regex & regex, size_t from = std::string::npos, bool add_prelude_to_content = true);
 | |
| 
 | |
|     bool try_consume_literal(const std::string & literal);
 | |
| 
 | |
|     std::optional<find_regex_result> try_find_literal(const std::string & literal);
 | |
| 
 | |
|     find_regex_result consume_regex(const common_regex & regex);
 | |
| 
 | |
|     std::optional<find_regex_result> try_consume_regex(const common_regex & regex);
 | |
| 
 | |
|     std::optional<common_json> try_consume_json();
 | |
|     common_json consume_json();
 | |
| 
 | |
|     struct consume_json_result {
 | |
|         nlohmann::ordered_json value;
 | |
|         bool is_partial;
 | |
|     };
 | |
| 
 | |
|     /*
 | |
|         Consume (possibly partial) json and converts specific subtrees to (possibly truncated) JSON strings.
 | |
| 
 | |
|         By default, object keys can't be truncated, nor can string values (their corresponding key is removed,
 | |
|         e.g. `{"foo": "bar", "baz": "b` -> `{"foo": "bar"}`
 | |
| 
 | |
|         But one can allow subpaths to be kept truncated, and possibly json-dumped to truncated json strings
 | |
|         - with `content_paths={{"foo"}}` -> `{"foo": "b` -> {"foo": "b"}`
 | |
|         - with `args_paths={{"foo"}}` -> `{"foo": {"b` -> `{"foo": "{b"}`
 | |
|     */
 | |
|     consume_json_result consume_json_with_dumped_args(
 | |
|         const std::vector<std::vector<std::string>> & args_paths = {},
 | |
|         const std::vector<std::vector<std::string>> & content_paths = {}
 | |
|     );
 | |
|     std::optional<consume_json_result> try_consume_json_with_dumped_args(
 | |
|         const std::vector<std::vector<std::string>> & args_paths = {},
 | |
|         const std::vector<std::vector<std::string>> & content_paths = {}
 | |
|     );
 | |
| 
 | |
|     void clear_tools();
 | |
| };
 |