2023-04-14 02:15:40 +00:00
|
|
|
#ifndef LLMODEL_H
|
|
|
|
#define LLMODEL_H
|
2023-06-01 11:57:10 +00:00
|
|
|
|
2023-04-14 02:15:40 +00:00
|
|
|
#include <string>
|
|
|
|
#include <functional>
|
|
|
|
#include <vector>
|
2023-05-31 19:37:25 +00:00
|
|
|
#include <string_view>
|
|
|
|
#include <fstream>
|
2023-05-05 00:01:32 +00:00
|
|
|
#include <cstdint>
|
2023-04-14 02:15:40 +00:00
|
|
|
|
2023-06-01 14:51:46 +00:00
|
|
|
class Dlhandle;
|
|
|
|
|
2023-04-14 02:15:40 +00:00
|
|
|
class LLModel {
|
|
|
|
public:
|
2023-05-31 19:37:25 +00:00
|
|
|
class Implementation {
|
|
|
|
LLModel *(*construct_)();
|
2023-04-14 02:15:40 +00:00
|
|
|
|
2023-05-31 19:37:25 +00:00
|
|
|
public:
|
|
|
|
Implementation(Dlhandle&&);
|
2023-06-01 15:16:33 +00:00
|
|
|
Implementation(const Implementation&) = delete;
|
|
|
|
Implementation(Implementation&&);
|
2023-06-01 14:51:46 +00:00
|
|
|
~Implementation();
|
2023-05-31 21:04:01 +00:00
|
|
|
|
2023-05-31 19:37:25 +00:00
|
|
|
static bool isImplementation(const Dlhandle&);
|
|
|
|
|
|
|
|
std::string_view modelType, buildVariant;
|
|
|
|
bool (*magicMatch)(std::ifstream& f);
|
2023-06-01 14:51:46 +00:00
|
|
|
Dlhandle *dlhandle;
|
2023-05-31 19:37:25 +00:00
|
|
|
|
2023-06-01 14:51:46 +00:00
|
|
|
// The only way an implementation should be constructed
|
2023-05-31 19:37:25 +00:00
|
|
|
LLModel *construct() const {
|
|
|
|
auto fres = construct_();
|
2023-06-01 14:51:46 +00:00
|
|
|
fres->m_implementation = this;
|
2023-05-31 19:37:25 +00:00
|
|
|
return fres;
|
|
|
|
}
|
|
|
|
};
|
2023-06-01 11:57:10 +00:00
|
|
|
|
2023-04-14 02:15:40 +00:00
|
|
|
struct PromptContext {
|
2023-04-25 12:38:29 +00:00
|
|
|
std::vector<float> logits; // logits of current context
|
|
|
|
std::vector<int32_t> tokens; // current tokens in the context window
|
|
|
|
int32_t n_past = 0; // number of tokens in past conversation
|
|
|
|
int32_t n_ctx = 0; // number of tokens possible in context window
|
|
|
|
int32_t n_predict = 200;
|
|
|
|
int32_t top_k = 40;
|
|
|
|
float top_p = 0.9f;
|
|
|
|
float temp = 0.9f;
|
|
|
|
int32_t n_batch = 9;
|
|
|
|
float repeat_penalty = 1.10f;
|
|
|
|
int32_t repeat_last_n = 64; // last n tokens to penalize
|
2023-04-25 15:20:51 +00:00
|
|
|
float contextErase = 0.75f; // percent of context to erase if we exceed the context
|
2023-05-31 19:37:25 +00:00
|
|
|
// window
|
2023-04-14 02:15:40 +00:00
|
|
|
};
|
2023-05-31 19:37:25 +00:00
|
|
|
|
|
|
|
explicit LLModel() {}
|
|
|
|
virtual ~LLModel() {}
|
|
|
|
|
|
|
|
virtual bool loadModel(const std::string &modelPath) = 0;
|
|
|
|
virtual bool isModelLoaded() const = 0;
|
|
|
|
virtual size_t stateSize() const { return 0; }
|
|
|
|
virtual size_t saveState(uint8_t */*dest*/) const { return 0; }
|
|
|
|
virtual size_t restoreState(const uint8_t */*src*/) { return 0; }
|
2023-04-25 12:38:29 +00:00
|
|
|
virtual void prompt(const std::string &prompt,
|
2023-04-27 15:08:15 +00:00
|
|
|
std::function<bool(int32_t)> promptCallback,
|
|
|
|
std::function<bool(int32_t, const std::string&)> responseCallback,
|
|
|
|
std::function<bool(bool)> recalculateCallback,
|
2023-04-25 12:38:29 +00:00
|
|
|
PromptContext &ctx) = 0;
|
2023-06-02 03:15:58 +00:00
|
|
|
virtual bool evalTokens(PromptContext &ctx, const std::vector<int32_t> &tokens) = 0;
|
2023-05-31 21:04:01 +00:00
|
|
|
virtual void setThreadCount(int32_t /*n_threads*/) {}
|
2023-05-21 20:45:29 +00:00
|
|
|
virtual int32_t threadCount() const { return 1; }
|
2023-04-25 15:20:51 +00:00
|
|
|
|
2023-06-01 14:51:46 +00:00
|
|
|
const Implementation& implementation() const {
|
|
|
|
return *m_implementation;
|
2023-05-31 21:04:01 +00:00
|
|
|
}
|
|
|
|
|
2023-06-01 14:51:46 +00:00
|
|
|
static const std::vector<Implementation>& implementationList();
|
|
|
|
static const Implementation *implementation(std::ifstream& f, const std::string& buildVariant);
|
2023-05-31 19:37:25 +00:00
|
|
|
static LLModel *construct(const std::string &modelPath, std::string buildVariant = "default");
|
|
|
|
|
2023-06-02 14:57:21 +00:00
|
|
|
static inline void setImplementationsSearchPath(const std::string& path) {
|
|
|
|
m_implementations_search_path = path;
|
|
|
|
}
|
|
|
|
static inline const std::string& implementationsSearchPath() {
|
|
|
|
return m_implementations_search_path;
|
|
|
|
}
|
|
|
|
|
2023-04-25 15:20:51 +00:00
|
|
|
protected:
|
2023-06-01 14:51:46 +00:00
|
|
|
const Implementation *m_implementation = nullptr;
|
2023-05-31 19:37:25 +00:00
|
|
|
|
2023-06-02 03:15:58 +00:00
|
|
|
void recalculateContext(PromptContext &promptCtx, std::function<bool(bool)> recalculate);
|
2023-06-02 14:57:21 +00:00
|
|
|
static std::string m_implementations_search_path;
|
|
|
|
|
2023-04-14 02:15:40 +00:00
|
|
|
};
|
2023-04-18 13:46:03 +00:00
|
|
|
#endif // LLMODEL_H
|