LLM八股问答

1 Temperature为0时理论上应该可以复现模型输出,但实际上工程实现中并不能完整复现一模一样的输出为什么

很多同学第一反应都会说浮点数精度问题,但如果答案停在这里面,试官往往会继续追问,因为你答的只是现象,不是根本原因,这道题真正想考的是你对大模型推理阶段确定性到底是如何被一步步破坏的理解深度?下面我们把这个问题完整拆一遍。

首先我们得明确temperature等于零在理论上意味着什么。当你把温度参数设为零的时候,模型会切换到贪心解码模式,也就是在每一步生成时都选择概率最高的那个token。从数学上讲,这就是在做argmax操作,不涉及任何概率采样。按理说,给定相同的输入和模型权重,每次推理的logic应该是完全一样的,那最终输出自然也应该一致。但现实是。

即使你把temperature设为零,把seed也固定了同样的,prompt发给GPT4很可能还是会得到不同的输出。这种现象让很多工程师抓狂,也让open AI的技术人员在早期表示过困惑,那问题到底出在哪儿呢?


下面这张表格直观展示了导致非确定性的几个核心原因及其影响层面。

影响因素影响层面直观解释导致不一致的机制
🔄 浮点数运算与并行计算硬件/数值计算计算机处理小数时存在精度限制,且并行计算时运算顺序不固定。浮点数加法不满足结合律,即 (a + b) + c ≠ a + (b + c)。GPU并行计算时,求和顺序的微小差异会累积,可能导致两个本应非常接近的token概率排名发生逆转。
🏗️ MoE架构的路由效应模型架构/服务部署模型由多个“专家”子网络组成,系统动态决定每个词由哪个专家处理。在生产环境中,多个用户的请求会被打包(批处理)以提高效率。如果你的请求每次被批处理时,其“邻居”请求不同,可能会导致其中关键token被路由到不同的专家,从而产生不同输出。这对于GPT-4等采用MoE架构的模型是常见现象。
📦 动态批处理与调度服务化/工程部署云服务为了资源效率,会动态地将多个用户请求组合成一个批次进行处理。同一请求在不同时间发送,其所在的批次组合可能不同。调度策略和批次构成的差异,可能改变模型内部的计算路径,即使模型本身是传统架构(非MoE),也可能引入不确定性。
⚙️ 框架与算子实现软件库/底层优化深度学习框架(如PyTorch)为了追求速度,默认允许一些非确定性的算法实现。一些底层操作(如矩阵乘法、卷积)在GPU上可能有多种实现方式,框架会根据效率动态选择。这些实现可能因使用原子操作等策略,导致每次运行的数值结果有细微差别。
💻 硬件异构性基础设施云服务商可能拥有不同型号的GPU集群。你的请求可能这次落在A100上,下次落在H100上。不同硬件架构的驱动、计算内核可能略有不同,从而导致微小的数值差异。

💡 如何尽量提升一致性?

虽然无法保证100%的确定性,但你可以采取以下措施来最大限度地提高输出的一致性:

  • 基础设置:此外,始终设置 temperature=0,并确保 top_p=1,避免任何显式的采样随机性。

  • 利用种子参数:如果API提供商支持,设置 seed参数。这能固定随机数生成器的初始状态,但请注意,它主要控制采样随机性,无法解决上述的数值和系统级非确定性。

  • 自托管模型

  • 如果一致性至关重要,可以考虑在自己的服务器上部署开源模型。这样你可以:

  • 设置PyTorch的确定性标志:torch.use_deterministic_algorithms(True),但这可能会降低性能。

  • 固定硬件和环境,避免异构性带来的影响。

  • 添加重试逻辑:如果业务要求严格一致性,可以实现输出验证和重试机制

💎 总结

简单来说,temperature=0仅能消除解码策略层的随机性,但无法消除整个复杂推理栈**(从数值计算、模型架构到服务化部署)**中固有的非确定性。理解这些深层原因,有助于你更合理地设计和使用LLM应用。

FAQ:基础知识

浮点运算的非确定性:

温度为0理论上应该让模型始终选择概率最高的token,但在实际计算中,GPU的浮点运算本身存在微小的不确定性。不同的硬件、不同的计算顺序、甚至同一GPU在不同时间的计算,都可能在小数点后很多位产生微小差异。当多个token的概率非常接近时,这些微小差异就可能导致选择不同的token。

举例说明:假设模型在生成下一个词时,“很好”的概率是0.500000001,“非常好”的概率是0.499999999。这两个概率极其接近,但由于GPU计算时的微小误差,第一次运行时可能算出”很好”概率更高,第二次运行时由于计算顺序略有不同,可能算出”非常好”概率更高。就像你用计算器算一个很复杂的公式,按不同的顺序按键,最后可能在小数点后第10位出现差异。

并行计算的影响:

现代GPU为了提高效率会进行并行计算,而并行操作的执行顺序可能不完全一致。浮点数的加法不满足严格的结合律(例如 (a+b)+c 和 a+(b+c) 可能有微小差异),这意味着不同的累加顺序会产生略微不同的结果。

举例说明:想象你要计算100个数字的总和,你可以从左往右加,也可以分成10组同时加再合并。在纸上算应该结果一样,但在计算机里,由于精度限制,这两种方式可能得出略微不同的结果。比如模型计算”今天天气”这个输入的特征时,第一次可能按顺序1→2→3→4处理,第二次可能是(1+2)和(3+4)同时处理再合并,最终得到的数值可能在小数点后第8位有差异。

随机种子和采样机制:

某些LLM服务即使temperature=0,内部仍可能保留一些随机性组件,比如用于打破平局的随机种子、dropout层(如果未正确关闭)、或者某些优化策略。不同的API调用可能使用不同的随机种子。

举例说明:就像抛硬币决定选择哪个答案。当模型发现”天气晴朗”和”天气不错”的概率完全一样都是50%时,它需要某种方式来”打破平局”。如果每次调用时使用的随机数不同(比如第一次是12345,第二次是67890),那么第一次可能选”天气晴朗”,第二次可能选”天气不错”。这就像你掷骰子,即使规则一样,每次结果可能不同。

关于MoE架构中批处理导致输出不一致的现象:

MoE的路由器在做决策时,不仅看当前这个请求,还会考虑整个批次的负载均衡。为了避免某个专家过载而其他专家闲置,路由器会动态调整分配策略。

具体举例

假设你发送请求:“解释量子计算的原理”

场景:

  • 你的请求恰好和其他9个用户的请求被打包在一起
  • 这9个”邻居”都在问数学问题:“解方程”、“计算积分”、“证明定理”等
  • 路由器发现”数学专家”已经被这9个请求占满了
  • 对于你请求中的关键token”量子”,路由器本来想分配给”物理专家”(专家#3),但发现”物理专家”现在比较空闲
  • 同时为了负载均衡,“量子”这个token最终被路由到了**“物理专家”(专家#3)**处理
  • 输出结果:“量子计算是利用量子叠加和量子纠缠等物理现象进行信息处理的新型计算方式…”(偏物理角度)

为什么temperature=0也无法避免:

即使temperature=0(总是选概率最高的),但”概率最高”这个结果本身就受到了专家路由的影响。不同专家处理同一个token会产生不同的特征表示,后续的概率分布自然也就不同了。这不是采样的随机性,而是计算路径本身就变了。

2

项目和八股 1.grpo哪个阶段最耗时 2.rollout采样 3.使用过 verl 框架吗 4.verl 框架为什么需要重新 forward 计算 log probs 5.dapo 的几个创新 - clip-higher - Dynamic Sampling - token级别优势计算 6.大模型推理优化 答了deepspeed 等 不行 说这个是训练方面的 - 推理主要分为两个阶段 prefill+decoder - 量化:用低精度比如int8保存 参数 激活值 KVcache - KVCache 量化(vllm也采取了pageAttention,将KV cache当成虚拟内存+页表 按照固定的page进行管理) - GQA - flash attention

作者:技术蓄力中 链接:https://www.nowcoder.com/feed/main/detail/23e19d8300c54f2eb9ed9933aeaa5129?sourceSSR=dynamic 来源:牛客网

3(Agent算法)

3.思维链怎么检验其质量 4.Reward fuction怎么设计的 5.这个项目中哪些东西是你做的 6.AIGC项目中的数据是哪里来的 7.Agent搭建用了什么模块/包 8.新建一张ppt,手写grpo公式并详细介绍 9.介绍clip 10.手撕:单头注意力 11.手撕力扣:括号生成,给定n,输出所有可能的括号组合

作者:技术蓄力中 链接:https://www.nowcoder.com/feed/main/detail/472ab0b5105e48e4a9f56fa0aaee0a8c?sourceSSR=post 来源:牛客网

4(Agent算法)

2.在Transformer框架下,CV、NLP、语音是否可能统一? 3.大模型训练数据清洗、处理、配比的方法 4.大模型训练如何更容易提升模型性能 5.Encoder与decoder的中Attention区别? 6.Attention如何计算?为什么除以根号下Dk?mask attention是如何实现的? 7.讲GQA、MQA、MLA原理。 8.为什么要用位置编码?为什么要用sin_cos? 9.问之前实习的Agent的设计逻辑,问创新方法的实现。 10.你提到用DeepSpeed做SFT训练,请讲一下DeepSpeedZeROStage1-3的区别,以及什么时候 用FSDP会更好? 11.什么是大模型的幻觉,如何缓解 12.为什么会有复读问题,业内有哪些解决办法 13.大模型工具调用的实现方式 14.Agent的组成部分及实现方法 15.问Agent的工具tool的设计,是否是workflow形式。 16.了解哪些agent开发框架,例如langchain和Llamalndex,核心应用场景有何不同? 17.问数据的输入输出格式如何保证大模型输出稳定的json做了哪些工作? 18.开放题:你在大模型训练中遇到过的困难,如何解决? 19.代码题:实现一个Tokenizer

作者:心有所梦 链接:https://www.nowcoder.com/feed/main/detail/aa9d77b66e414b86b7170a06189a4a06?sourceSSR=dynamic 来源:牛客网