译:内存分析

内存分析简介

在这个系列的原文博客文章中,你将学习如何收集有关程序与内存交互的高层次信息。这个过程通常被称为内存分析。内存分析帮助你理解应用程序随时间变化的内存使用情况,并帮助你构建程序行为的正确心理模型。以下是它可以回答的一些问题:

  • 程序的总内存消耗是多少,以及它随时间如何变化?
  • 程序何时何地进行堆分配?
  • 哪些代码位置分配了最大量的内存?
  • 程序每秒访问多少内存?

当开发者谈论内存消耗时,他们通常指的是堆使用情况。实际上,堆是大多数应用程序中最大的内存消费者,因为它容纳了所有动态分配的对象。但堆并不是唯一的内存消费者。为了完整性,让我们提及其他内存消费者:

  • 栈:应用程序中帧栈使用的内存。应用程序中的每个线程都有自己的栈内存空间。通常,栈的大小只有几MB,如果超出限制,应用程序将崩溃。总的栈内存消耗与系统中运行的线程数量成正比。
  • 代码:用于存储应用程序及其库的代码(指令)的内存。在大多数情况下,它对内存消耗的贡献不大,但也有例外。例如,Clang C++编译器和Chrome浏览器拥有庞大的代码库,它们的二进制文件中有数十MB的代码段。

接下来,我们将介绍内存使用(memory usage)内存足迹(memory footprint)或者翻译成内存占用这两个术语,并看看如何对它们进行分析。

注: 主要是通过工具分析内存使用情况,尽量利用局部性原理:时间局部性和空间局部性,提高性能。

Performance Analysis and Tuning on Modern CPU 中文翻译

📚

这是一本名为Performance Analysis and Tuning on Modern CPU书籍的源文件存储库的中文翻译,原版由 Denis Bakhvalov 等人编写。

  • 原版电子书:https://book.easyperf.net/perf_book
  • 中文翻译(第一版):https://book.douban.com/subject/36243215/

原作者第二版正在进行中! 计划的更改在谷歌文档中进行了概述。计划中的新目录在 new_toc.md 中。

目的

  • 虽然已经有翻译的书籍;但是想follow更新,借助 『chatGPT』/『gemini/moonshot(kimi)』 翻译成中文,(加速学习节奏,掌握,并举一反三)
  • 英文源书是开源的,翻译成中文工作也持续更新,也是开源的,可以作为学习资料, 在线阅读可编辑,希望一起参与改进。
  • 对每章节的内容通过 『chatGPT』/『gemini/moonshot(kimi)』 进行归纳总结,结巩固知识点,并对课后练习进行回答,并验证答案。
  • 最后整体勘误,定搞。

[!TIP]

  • 授之以鱼不如授之以渔, 使用AI赋能。
  • 性能优化分析数据可以借助『chatGPT』分析。
  • 『chatGPT』和『moonshot(kimi)』 翻译效果差不多(相同的prompt),但是当问文中的规划练习和代码练习时,『moonshot(kimi)』不能理解问题,不过长文本上传根据章节翻译和归纳总结不错,毕竟不用翻墙就可以使用。

在线阅读地址: https://weedge.github.io/perf-book-cn/zh/

中文版PDF(推荐): https://raw.githubusercontent.com/weedge/perf-book-cn/main/perf-book-cn.pdf

逝去的奶奶

天上的每一颗星 都是爱过我们的人

听说,地上少个人,天上多颗星,每一颗闪烁的星星都在跟地上的亲人说话。

但愿,今夜有星。

但愿,星星会闪。

– 人生大事

简单踏实就好,奶奶经常给说的话,一直记着。【step by step, 懂得珍惜】

构建一个简单的数据库[golang版]

上篇文章使用chatGPT翻译了db_tutorial 文章,文中使用的是c语言开发; 这篇文章使用chatGPT根据db_tutorial中的c源码,使用golang进行重写, 测试的ruby代码使用python进行重写;同理其他语言也适用。

注:利用已有知识结构,通过chatGPT来生成另一种表达(现实中这种转换经常出现,比如一个基础知识点,嚼碎了,揉烂了,底层相通,表达方式不同,变了个花样玩,而且还能通过认知差来盈利,也许精细利己主义会利益最大化吧),使用AGI工具进行效率编码的一种小小实践。在实践过程中,chatGPT生成的代码不可能都能正常运行,需要调试下(特别是指针操作)。

整体实现代码:https://github.com/weedge/baby-db/tree/main/golang

主要的btree数据结构为leafNode 和 internalNode,叶子节点表数据存放在value中,id存放在key中,序列化和遍历操作需要额外偏移操作;这里仅实现简单的insert和select操作。

leafNode

internalNode

[译]构建一个简单的数据库

用 C 从头开始编写 SQLite 克隆;

注:用chatGPT翻译+人工稍微整理下,耗时一个多小时整理完成,使用这个简单的db from scratch试下效果, 代码简单;现在高中甚至初中生有在学这个。

原文地址: https://cstack.github.io/db_tutorial/

数据库如何工作?

  • 数据以什么格式保存?(在内存和磁盘上)
  • 它什么时候从内存移动到磁盘?
  • 为什么一张表只能有一个主键?
  • 回滚事务如何进行?
  • 索引是如何格式化的?
  • 全表扫描何时以及如何发生?
  • 准备好的语句以什么格式保存?

简而言之,数据库是如何工作的

为了理解,我正在用 C 从头开始构建sqlite的克隆,并且我将记录我的过程。

“我无法创造的东西,我就不明白。What I cannot create, I do not understand” ——理查德·费曼

sqlite 架构(https://www.sqlite.org/arch.html)

LLM 知识点 All u need

LLM知识点

上图给出了学习LLM所需要的知识点。

该文主要是梳理LLM基础结构知识点,模型结构大多相同,以llama2模型结构为切入点,梳理相关知识点,以便构建整体知识体系,可方便快速阅读其他论文的改进点;结合参考学习中给出的链接补充基础知识。

译:掌握 LLM 技术:推理优化

llm-optimize-deploy

将transformer层叠以创建大型模型会在各种语言任务中带来更高的准确性、少样本学习能力,甚至接近人类的新兴能力。这些基础模型在训练过程中成本高昂,而在推理过程中(一个经常发生的成本)可能需要大量内存和计算资源。如今最受欢迎的大型语言模型(LLMs)可以达到数百亿到数千亿个参数的规模,并且根据使用情况,可能需要处理长输入(或上下文),这也会增加成本。

本文讨论了LLM推理中最紧迫的挑战,以及一些实用的解决方案。读者应该对transformer架构和注意力机制有基本的理解。理解LLM推理的复杂性至关重要,我们将在接下来的部分进行介绍。

:上篇译文有对 transformer 有相关的介绍,以及相关编码笔记入门;或者深入学习CS25: Transformers United V2 video