Lummy's blog

Lummy's blog

从零开始构建PhotonInfer推理引擎2
Created2025-10-16|PhotonInfer
从零开始构建PhotonInfer推理引擎2 本文详细解析PhotonInfer项目PR2的核心设计理念和技术实现,聚焦模型权重读取、mmap内存映射、tokenizer机制和张量抽象,带你深入理解现代推理引擎的数据加载和计算技术。 📋 文章导览 项目背景:PR2的核心定位 设计哲学:内存映射与零拷贝理念 核心组件:权重加载、tokenizer、张量抽象、文件格式解析 关键代码:mmap实现与数据结构详解 性能优化:为什么mmap能大幅提升性能? 教学价值:PR2教会了我们什么? 🎯 项目背景:PR2的核心使命从PR1到PR2:基础设施到数据加载PR1建立了现代C++20基础设施,PR2则实现了高效的数据加载系统: 123456// PR2完成的核心功能✅ 内存映射权重加载(mmap + RAII)✅ 多格式模型支持(FP32/INT8量化)✅ TikTokenizer实现(Base64 + 贪心匹配)✅ 张量抽象层(Eigen集成)✅ 完整的文件格式解析 PR2的技术挑战深度学习推理引擎面临的核心问题: 大模型加载:7B参数模型需要14GB内存,如何高效加载? 内...
从零开始构建PhotonInfer推理引擎1
Created2025-10-15|PhotonInfer
从零开始构建PhotonInfer推理引擎1 本文详细解析PhotonInfer项目PR1的核心设计理念和技术实现,适合B站教学视频系列,带你深入理解现代C++在深度学习框架中的应用。 📋 文章导览 项目背景:什么是PhotonInfer? 设计哲学:PR1的核心技术理念 核心组件:四个基础模块深度剖析 关键代码:实战讲解重要实现 教学价值:这PR1教会了我们什么? 🎯 项目背景:从零构建推理引擎PhotonInfer是什么?PhotonInfer是一个从零开始构建的现代C++20深度学习推理框架,专注于大语言模型推理,目标是打造一个: 🏗️ 教育性强:代码清晰,易于理解和学习 🚀 性能导向:现代C++特性,高效内存管理 🔧 模块化设计:清晰的架构,便于扩展 PR1的定位:基础设施奠基PR1作为项目的第一阶段,建立了完整的基础架构: 123456// PR1完成的核心功能✅ 现代C++20类型系统(Concepts + 类型安全)✅ Rust风格错误处理(Result<T, E>)✅ 设备无关内存管理(CPU/CUDA统一接口)✅ RAII自动资源...
第一章:让代码跑起来!构建响应式框架的起点
Created2025-08-28|Reaction
第一章:让代码跑起来!构建响应式框架的起点在本章中,我们将从零开始搭建 Reaction 响应式框架的基本工程结构,并实现几个关键的核心组件:DataSource、Expression 和 Resource。这些组件将构成我们响应式框架的计算骨架。 我们的目标是让如下代码成功编译并通过测试: 12345678910auto a = reaction::var(1);auto b = reaction::var(3.14);EXPECT_EQ(a.get(), 1);EXPECT_EQ(b.get(), 3.14);auto ds = reaction::calc([](int aa, double bb) { return aa + bb; }, a, b);auto dds = reaction::calc([](auto aa, auto dsds) { return std::to_string(aa) + std::to_string(dsds); }, a, ds);ASSERT_FLOAT_EQ(ds.get(), 4.14);...
第九章:触发模式的实现
Created2025-05-28|Reaction
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109TEST(ReactionTest, TestChangeTrig) { auto a = reaction::var(1); auto b = reaction::var(2); auto c = reaction::var(3); int triggerCountA = 0; int triggerCountB = 0; auto ds = reaction::calc<reaction::AlwaysTrig>([&triggerCountA](int aa, double bb...
第八章:节点关系图的实现
Created2025-05-27|Reaction
第八章:节点关系图的实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677TEST(ReactionTest, TestSelfDependency) { auto a = reaction::var(1); auto dsA = reaction::calc([](int aa) { return aa; }, a); EXPECT_THROW(dsA.reset([&]() { return a() + dsA(); }), std::runtime_error);}TEST(ReactionTest, TestCycleDependency) { auto a = reaction::var(1); auto b = reactio...
第七章:表达式模板的使用
Created2025-05-13|Reaction
第七章:表达式模板的使用在实现表达式模板之前,我们先做一些准备工作。 首先实现action之间的依赖,一个action可以触发其他的action: 123456789101112131415161718TEST(ReactionTest, TestAction){ auto a = reaction::var(1); auto b = reaction::var(3.14); auto at = reaction::action([](int aa, double bb) { std::cout << "a = " << aa << '\t' << "b = " << bb << '\t'; }, a, b); bool trigger = false; auto att = reaction::action([...
第六章:编译期反射 private 成员
Created2025-05-09|Reaction
第六章:编译期反射 private 成员 上一章我们已经介绍了对于聚合类型的编译期反射,本章我们介绍对于非聚合类型如何反射。 首先看一下知乎的 YKIKO 在有状态黑魔法中提到的例子:👉 https://zhuanlan.zhihu.com/p/646752343 1234567891011121314#include <iostream>class Bank { double money = 999'999'999'999;public: void check() const { std::cout << money << std::endl; }};template <auto mp>struct Thief {};template struct Thief<&Bank::money>; 这里的 &Bank::money 是一个成员变量指针,不同于普通的指针,它并不依赖于某个对象,而表示该成员...
第五章:编译期反射初探!
Created2025-05-09|Reaction
第五章:编译期反射初探!在前面,我们提到了除了标签分发,还可以通过编译期反射来判断类的成员有没有某个类型。 反射是程序在运行时或编译期能够**“自我检查、自我操作”的能力**。 程序可以“知道自己有哪些类、成员变量、类型信息”,甚至动态地访问和修改它们。 编译期反射:在编译期间就可以分析、枚举、获取类型的成员信息。 C++26 正式加入反射: 123456789101112#include <meta>struct A { int x; double y; };consteval void analyze() { using namespace std::meta; auto info = reflexpr(A); // 反射出类型信息 auto members = members_of(info); // 获取所有成员 for (auto m : members) { std::println("Member: {}", name...
第三章:实现数据源的生命周期管理
Created2025-05-07|Reaction
第三章:实现数据源的生命周期管理设计目标回顾在前两章中,我们已经建立了Reaction框架的基础结构,本章将重点解决以下问题: 实现数据源的拷贝和移动语义 使用智能指针和引用计数管理内存 确保用户只持有弱引用,强引用由ObserverGraph统一管理 核心设计:桥接模式与智能指针管理1. 桥接模式的应用桥接模式(Bridge Pattern)是面向对象设计中的经典模式,其核心思想是将抽象(Abstraction)与实现(Implementation)分离,使二者可以独立变化。这种分离通过组合(Composition)而非继承(Inheritance)实现,是”组合优于继承”原则的典型体现。 在Reaction框架中,我们通过以下结构实现桥接模式: 123456template <typename ReactType>class React { /* 抽象接口层 */ };template <typename TriggerPolicy, typename InvalidStrategy, typename Type, typename....
第四章:让数据源作为成员变量
Created2025-05-03|Reaction
第四章:让数据源作为成员变量在本章中,我们将实现 constVar、action 和 field。 我们的目标是让如下代码成功编译并通过测试: 12345678910TEST(ReactionTest, TestConst) { auto a = reaction::var(1); auto b = reaction::constVar(3.14); auto ds = reaction::calc([](int aa, double bb) { return aa + bb; }, a, b); ASSERT_FLOAT_EQ(ds.get(), 4.14); a.value(2); ASSERT_FLOAT_EQ(ds.get(), 5.14); // b.value(4.14); // compile error;} 123456789TEST(ReactionTest, TestAction) { auto a = reaction::var(1); auto b ...
12
avatar
Lummy
Articles
12
Tags
6
Categories
2
Follow Me
Announcement
https://space.bilibili.com/52334696
Recent Posts
从零开始构建PhotonInfer推理引擎22025-10-16
从零开始构建PhotonInfer推理引擎12025-10-15
第一章:让代码跑起来!构建响应式框架的起点2025-08-28
第九章:触发模式的实现2025-05-28
第八章:节点关系图的实现2025-05-27
Categories
  • PhotonInfer2
  • Reaction10
Tags
Modern-Cpp TMP Reactive-programming \[Reactive-programming, C++, Modern-Cpp, TMP] PhotonInfer C++
Archives
  • October 2025 2
  • August 2025 1
  • May 2025 7
  • April 2025 2
Website Info
Article Count :
12
Unique Visitors :
Page Views :
Last Update :
©2025 By LummyFramework Hexo 7.3.0|Theme Butterfly 5.4.2