Skip to content

wangtz0607/mie

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MIE

Usage

High-Level API
#include <cstdio>
#include <print>
#include <string>
#include <vector>

#include "mie/chat_templates/Message.h"
#include "mie/chat_templates/Role.h"
#include "mie/llms/Llama3.h"
#include "mie/models/KVCache.h"
#include "mie/samplers/RandomSampler.h"

int main() {
    mie::Llama3<float> llm;

    if (!mie::load("path/to/Llama-3.2-1B-Instruct-FP32", llm)) {
        // error: failed to load llm
    }

    mie::RandomSampler<float> sampler;
    sampler.config().temperature = 0.6;
    sampler.config().topP = 0.95;
    sampler.config().topK = 50;

    mie::KVCache<float> cache;

    std::vector<mie::Message> messages{
        {mie::Role::kSystem, "You are a helpful assistant."},
        {mie::Role::kUser, "How do I make a cake?"},
    };

    for (const std::string &token : llm(messages, cache, sampler)) {
        std::print("{}", token);
        fflush(stdout);
    }
}
Low-Level API
#include <cstdint>
#include <cstdio>
#include <print>
#include <string>
#include <vector>

#include <Eigen/Dense>

#include "mie/chat_templates/Llama3ChatTemplate.h"
#include "mie/chat_templates/Message.h"
#include "mie/chat_templates/Role.h"
#include "mie/models/KVCache.h"
#include "mie/models/Llama3Model.h"
#include "mie/samplers/RandomSampler.h"
#include "mie/tokenizers/Llama3Tokenizer.h"

using Vector = Eigen::RowVector<float, Eigen::Dynamic>;

int main() {
    mie::Llama3Model<float> model;

    if (!mie::load("path/to/Llama-3.2-1B-Instruct-FP32", model)) {
        // error: failed to load model
    }

    mie::Llama3Tokenizer tokenizer;

    if (!mie::load("path/to/Llama-3.2-1B-Instruct-FP32", tokenizer)) {
        // error: failed to load tokenizer
    }

    mie::Llama3ChatTemplate chatTemplate;

    mie::RandomSampler<float> sampler;
    sampler.config().temperature = 0.6;
    sampler.config().topP = 0.95;
    sampler.config().topK = 50;

    mie::KVCache<float> cache;

    std::vector<mie::Message> messages{
        {mie::Role::kSystem, "You are a helpful assistant."},
        {mie::Role::kUser, "How do I make a cake?"},
    };

    std::string input = chatTemplate(messages);

    std::vector<uint32_t> inputIds = tokenizer(input);

    for (;;) {
        Vector logits = model(inputIds, cache).bottomRows(1);

        uint32_t id = sampler(logits);

        std::string token = tokenizer.convertIdToToken(id);

        std::print("{}", token);
        fflush(stdout);

        inputIds.push_back(id);
    }
}
LLM Model Tokenizer Chat Template
Llama 3 (Grattafiori et al., 2023) Llama3<T> Llama3Model<T> Llama3Tokenizer Llama3ChatTemplate
Qwen 2 (Yang et al., 2024) Qwen2<T> Qwen2Model<T> Qwen2Tokenizer Qwen2ChatTemplate

Supported Model Architectures

  • Llama
  • Qwen 2

Supported Precisions

  • FP32
  • BF16 (Eigen::bfloat16)

Build

Linux macOS Windows
≥ 3.17
GCC Clang
≥ 14 ≥ 18
CMake
≥ 3.20
sudo apt-get install libeigen3-dev libicu-dev libpcre2-dev
cd <repo-dir>
mkdir build && cd build
cmake \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_CXX_COMPILER=g++-14 \
  -DMIE_ARCH_NATIVE=ON \
  <backend-specific-options> \
  -G Ninja \
  ..
cmake --build .
Backend Installation <backend-specific-options>
None (None) -DMIE_BACKEND=None
OpenBLAS Detail -DMIE_BACKEND=BLAS -DBLA_VENDOR=OpenBLAS
MKL Detail -DMIE_BACKEND=MKL

License

MIE is licensed under the MIT license.

About

A minimal CPU inference engine

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages