挖个坑,记录一下寒假读的一些paper和入门mlsys的过程。

关于os

学习了rCore

LLM Learning

RAG

理论提出

在2020年之前,学术界已有将检索与生成结合的零星尝试,但尚未形成系统化的方法论。2020年,这一领域迎来了两个具有里程碑意义的工作:Facebook在论文Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks正式提出”RAG”概念并将其应用于知识密集型任务,同时Google的REALM通过在预训练阶段融入潜在知识检索器,显著提升了开放域问答的性能。

ChatGPT发布后,RAG研究更是进入了加速发展的黄金时期。在这个过程中,RAG技术逐渐从单一的检索-生成框架,演化为包含多跳推理、记忆增强和多模态等复杂功能的综合系统。

Naive RAG

2020年10月,Meta团队在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中首次定义Naive RAG架构,确立了”索引-检索-生成”三阶段流程:

  • 索引(Indexing):索引首先清理和提取各种格式的原始数据,如 PDF、 HTML、 Word 和 Markdown,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本被分割成更小的、可消化的块(chunk)。然后使用嵌入模型将块编码成向量表示,并存储在向量数据库中。这一步对于在随后的检索阶段实现高效的相似性搜索至关重要。
  • 检索(Retrieval):在收到用户查询(Query)后,RAG 系统采用与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最高 k (Top-K)块,显示最大的相似性查询。这些块随后被用作 prompt 中的扩展上下文。
  • 生成(Generation):提出的查询(Query)和选定的文档(Chunks)被合成为一个连贯的提示,大语言模型负责生成回复。

Advanced RAG

Advanced RAG 的雏形源于对 Naive RAG(索引→检索→生成)的局限性突破。早期研究者发现单纯依赖向量检索存在 语义鸿沟 (如用户提问模糊或需多跳推理时检索失效)和 信息冗余 (检索结果重复或无关)等问题。为此,Meta、微软等团队开始探索全流程优化框架,提出 检索前预处理 、检索后精炼以及Embedding模型优化等方向:

  • 预索引优化
    • 多粒度分块策略:引入滑动窗口分割、语义分块等策略,解决长文本切分导致的语义断裂问题(如将文档按段落、章节动态划分)
    • 引入元数据:把元数据嵌入块中提升检索效率(标题、摘要、作者、时间、实体信息)
    • 混合索引:结合 BM25关键词匹配 与 向量语义检索,平衡精确召回与语义理解能力。
    • 假设性问题:让LLM为每个块生成一个问题,保存问题与文本块的映射关系,将这些问题存入向量数据库中。在检索时,先基于向量问题数据库进行查询搜索,找到相似问题后,然后在检索后路由到原始文本块,并将它们作为上下文发送给LLM以获得答案。这种方法通过查询与假设性问题之间更高的语义相似性,提高了搜索质量。
    • HyDE(Hypothetical Document Embeddings):通过逆向逻辑方法,让LLM给定查询生成一个假设性回应,然后使用其向量和查询向量来提高搜索质量。
  • 后索引优化
    • ReRank:重新排序以将最相关的信息重新定位到提示的边缘是一个简单的想法。
    • Prompt Compression:重点在于压缩不相关的上下文,突出关键段落,并减少整体上下文长度。
  • Embedding优化
    • Fine-tuning Embedding:微调的目的是增强检索内容和查询之间的相关性。通常,微调嵌入的方法分为在特定领域上下文中调整嵌入和优化检索步骤。特别是在处理进化或稀有术语的专业领域,这些定制的嵌入方法可以提高检索相关性。
    • Dynamic Embedding:动态嵌入根据单词出现的上下文进行调整,不同于为每个单词使用单个向量的静态嵌入,理想情况下,嵌入应该包含尽可能多的上下文,以确保“healthy”的结果。
  • 查询转换
    • 查询转换利用LLM作为推理引擎来修改用户输入,以提高检索质量。对于更复杂的用户查询,可以基于LLM将其进行子查询拆解,分别得到子查询的关联上下文信息后整合到一起提供给LLM生成初始复杂问题的最终答案。当涉及到多轮上下文对话中,如果利用历史对话补齐当前对话信息完整性,以实现更准确的信息检索同样涉及到查询转换。

Modular RAG

Modular RAG 将传统 RAG 系统的线性流程拆分为 独立可插拔的模块 (如检索器、预处理器、生成器等),每个模块专注于特定功能(如查询优化、混合检索、生成控制),支持像“乐高积木”一样自由组合。

LLM Serving

关于CPU调度算法,迁移至GPU调度以及并发LLM Serving

今天去蹭了隔壁John班的os课,听了关于CPU调度算法的讲解,感觉很有启发。

基本概念

CPU-I/O 突发周期 (CPU-I/O Burst Cycle):进程执行由 CPU 执行(CPU burst)和 I/O 等待(I/O burst)交替循环组成。

CPU 调度器 (CPU Scheduler):从内存中准备好执行的进程中选择一个,并为其分配 CPU。

抢占与非抢占调度:

非抢占 (Non-preemptive):进程保持 CPU 直到终止或切换到等待状态。

抢占 (Preemptive):系统可以强行剥夺当前运行进程的 CPU,这可能导致竞态条件,需要同步机制。

分派器 (Dispatcher):负责将 CPU 控制权交给选中的进程,包括上下文切换和跳转到用户程序的适当位置。分派延迟(Dispatch latency)是指分派器停止一个进程并启动另一个进程所花费的时间。

调度准则 (Scheduling Criteria)

为了评估调度算法的优劣,通常参考以下指标:

  • CPU 利用率 (CPU utilization):使 CPU 尽可能处于忙碌状态。

  • 吞吐量 (Throughput):单位时间内完成执行的进程数量。

  • 周转时间 (Turnaround time):执行特定进程所需的时间(从提交到完成)。

  • 等待时间 (Waiting time):进程在就绪队列中等待的时间总和。

  • 响应时间 (Response time):从提交请求到产生首次响应(而非结果输出)的时间。

调度算法 (Scheduling Algorithms)

先到先服务 (FCFS)

原理:按进程到达的先后顺序进行调度。

缺点:平均等待时间通常较长;存在护航效应 (Convoy effect),即短进程排在长进程后面等待。

最短作业优先 (SJF)

原理:优先分配给下一次 CPU 突发时间最短的进程。

特点:在给定一组进程时,平均等待时间达到最小。

难题:很难知道下一个 CPU 突发的准确长度,通常通过指数平均法进行预测。

轮转调度 (Round Robin, RR)

原理:专门为分时系统设计,每个进程分配一个小的单位时间,称为时间片 (time quantum)。

规则:时间片用完后,进程被抢占并放回就绪队列末尾。

性能:取决于时间片大小;若时间片过大,退化为 FCFS;若过小,上下文切换开销显著。

优先级调度 (Priority Scheduling)

原理:每个进程关联一个优先级(整数),CPU 分配给优先级最高的进程。

问题:饥饿 (Starvation),低优先级进程可能永远无法运行。

解决方法:老化 (Aging),随着时间的推移增加等待进程的优先级。

多级反馈队列 (Multilevel Feedback Queue)

原理:将就绪队列拆分为多个独立队列,每个队列有自己的调度算法。

特点:允许进程在队列间移动。占用 CPU 过久的进程会被移到低优先级队列(惩罚),而等待过久的进程会被移到高优先级队列(奖励/老化)。

一些idea

读了一篇论文。2026_arxiv_justitia.pdf。读一篇paper了解bg感觉是最初学者友好的了,bg是任务并行 LLM 智能体的兴起:在解决诸如长文本摘要合并或复杂数学问题等多步逻辑时,系统通常会并发执行多个 LLM 推理任务,这类工作负载被称为“任务并行 LLM 智能体” 。Justitia 没有让所有并发的智能体去平分资源,而是计算出它们在绝对公平分配下的预期“完成顺序”,然后按照这个顺序,让优先级高的智能体独占或“饱和”地使用资源 。这种做法大幅降低了系统的平均完成时间,同时确保没有任何智能体会比在“平分资源”模式下完成得更晚 。Justitia 的核心是一个调度算法,基于智能体的预期完成时间来动态调整资源分配。通过这种方式,Justitia 能够在保持系统高效运行的同时,显著提升任务并行 LLM 智能体的性能表现。

完成顺序的计算:为了高效地确定前面提到的“预期完成顺序”,Justitia 借鉴了传统网络数据包调度中的虚拟时间($V(t)$)算法 。该算法允许系统在智能体到达时,一次性计算出其虚拟完成时间并作为调度优先级,后续无需反复刷新状态,极大地降低了调度开销 。

有端联想:是一种SJF,但又不完全是,因为它保证了当前在GPU上执行的进程利用所有资源执行任务,直到任务结束,不存在中途被抢占的情况。