Started inference engine

This commit is contained in:
Tim O\'Neil committed 2025-09-13 12:45:42 -07:00
1 parent d89095e49b
commit 7797629673
61 files changed
+7832 -200

No files matched your search

+37
View File
@@ -0,0 +1,37 @@
#pragma once
#include "lm/core/tensor.hpp"
#include <vector>
#include <memory>
namespace lm {
class MultiHeadAttention {
public:
MultiHeadAttention(size_t d_model, size_t num_heads, float dropout = 0.1f);
std::vector<Tensor> parameters() const;
void set_training(bool training);
Tensor forward(const Tensor& query, const Tensor& key, const Tensor& value,
const Tensor& mask = Tensor()) const;
private:
Tensor split_heads(const Tensor& x) const;
Tensor combine_heads(const Tensor& x) const;
Tensor scaled_dot_product_attention(const Tensor& q, const Tensor& k,
const Tensor& v, const Tensor& mask) const;
Tensor apply_dropout(const Tensor& input, float dropout_rate) const;
size_t d_model_;
size_t num_heads_;
size_t d_k_;
float dropout_;
bool training_ = false;
Tensor w_q_;
Tensor w_k_;
Tensor w_v_;
Tensor w_o_;
};
} // namespace lm
+54
View File
@@ -0,0 +1,54 @@
// Enhanced conversation_model.hpp
#pragma once
#include "transformer_model.hpp"
#include "bpe_tokenizer.hpp"
#include "context_manager.hpp"
#include <string>
#include <vector>
#include <memory>
namespace lm {
class ConversationModel {
public:
ConversationModel(size_t vocab_size,
size_t d_model = 512,
size_t n_layers = 6,
size_t n_heads = 8,
size_t d_ff = 2048,
float dropout = 0.1);
// Train the model
void train(const std::vector<std::string>& conversations);
// Generate a response with context management
std::string generate_response(const std::string& user_input);
// Context management
void clear_context();
void set_system_prompt(const std::string& prompt);
size_t get_context_token_count() const;
// Save and load
bool save_model(const std::string& path);
bool load_model(const std::string& path);
// Set tokenizer
void set_tokenizer(std::shared_ptr<BPETokenizer> tokenizer) {
tokenizer_ = tokenizer;
context_manager_ = std::make_unique<ContextManager>(2048, 20);
}
private:
std::shared_ptr<BPETokenizer> tokenizer_;
std::unique_ptr<TransformerModel> transformer_;
std::unique_ptr<ContextManager> context_manager_;
std::string system_prompt_;
// Format conversation for training
std::string format_conversation(const std::vector<std::string>& turns);
};
} // namespace lm
@@ -0,0 +1,32 @@
#pragma once
#include "lm/core/tensor.hpp"
#include <vector>
namespace lm {
class FeedForward {
public:
FeedForward(size_t d_model, size_t d_ff, float dropout = 0.1f);
std::vector<Tensor> parameters() const;
void set_training(bool training);
Tensor forward(const Tensor& input) const;
private:
Tensor apply_dropout(const Tensor& input, float dropout_rate) const;
Tensor gelu(const Tensor& input) const;
size_t d_model_;
size_t d_ff_;
float dropout_;
bool training_ = false;
Tensor w1_;
Tensor b1_;
Tensor w2_;
Tensor b2_;
};
} // namespace lm
@@ -0,0 +1,34 @@
// include/lm/models/language_model.hpp
#pragma once
#include <vector>
#include <cstdint>
#include <string>
#include "../core/tensor.hpp"
namespace lm {
using TokenID = uint32_t;
class LanguageModel {
public:
virtual ~LanguageModel() = default;
// Pure virtual methods that must be implemented
virtual std::vector<Tensor> get_parameters() const = 0;
virtual void set_parameters(const std::vector<Tensor>& params) = 0;
virtual Tensor forward(const std::vector<TokenID>& input) = 0;
virtual Tensor forward(const std::vector<TokenID>& input,
const std::vector<TokenID>& targets) = 0;
// Optional virtual methods with default implementations
virtual size_t get_vocab_size() const { return 0; }
virtual size_t get_max_sequence_length() const { return 0; }
// Serialization
virtual void save(const std::string& path) const = 0;
virtual void load(const std::string& path) = 0;
};
} // namespace lm
@@ -0,0 +1,32 @@
#pragma once
#include "lm/core/tensor.hpp"
#include "lm/models/attention.hpp"
#include "lm/models/feed_forward.hpp"
#include "lm/models/layer_norm.hpp"
#include <memory>
#include <vector>
namespace lm {
class TransformerBlock {
public:
TransformerBlock(size_t d_model, size_t num_heads, size_t d_ff, float dropout);
std::vector<Tensor> parameters() const;
void set_training(bool training);
Tensor forward(const Tensor& input, const Tensor& mask = Tensor()) const;
private:
size_t d_model_, num_heads_, d_ff_;
float dropout_;
bool training_ = false;
std::unique_ptr<MultiHeadAttention> attention_;
std::unique_ptr<FeedForward> feed_forward_;
std::unique_ptr<LayerNorm> norm1_;
std::unique_ptr<LayerNorm> norm2_;
};
} // namespace lm
+60
View File
@@ -0,0 +1,60 @@
// transformer_model.hpp
#pragma once
#include <vector>
#include <cstdint>
#include <memory>
#include <cmath>
#include <random>
#include <iostream>
#include "lm/tokenizer/token_types.hpp"
namespace lm {
class TransformerModel {
public:
TransformerModel(size_t vocab_size,
size_t d_model = 512,
size_t n_layers = 6,
size_t n_heads = 8,
size_t d_ff = 2048,
float dropout = 0.1);
~TransformerModel();
// Forward pass
std::vector<float> forward(const std::vector<TokenID>& input_tokens);
// Training methods
void train_step(const std::vector<TokenID>& input_tokens,
const std::vector<TokenID>& target_tokens);
float calculate_loss(const std::vector<float>& logits,
const std::vector<TokenID>& targets);
// Generation methods
std::vector<TokenID> generate(const std::vector<TokenID>& context,
size_t max_length = 100,
float temperature = 1.0);
// Serialization
bool save(const std::string& filename);
bool load(const std::string& filename);
// Get model info
size_t get_vocab_size() const { return vocab_size_; }
size_t get_d_model() const { return d_model_; }
private:
class Impl;
std::unique_ptr<Impl> pimpl_;
// Model parameters
size_t vocab_size_;
size_t d_model_;
size_t n_layers_;
size_t n_heads_;
size_t d_ff_;
float dropout_;
};
} // namespace lm