微信扫码
添加专属顾问
编者按:在大语言模型(LLMs)的部署及其相关的算力扩容过程中,更换 GPU 是否也可能会对模型的输出产生重大影响?这个问题的答案对于确保 LLMs 在不同硬件环境下的一致性和可靠性至关重要。
我们今天为大家带来的这篇文章,作者的核心观点是:即使在相同的开发环境、系统配置和随机种子下,不同的 GPU 也会导致 LLMs 产生不同的模型输出。
作者通过实验证明,在使用 Nvidia Tesla T4 和 Nvidia A10G 两种不同 GPU 的情况下,Mistral-7b-v0.1 模型对相同的输入产生了不同的输出。这种差异主要源于 GPU 在并行计算处理、硬件架构和模型量化的影响等方面的不同。随着提示词长度的增加,这种不准确性会被放大,因为更长的提示词需要进行更多计算,从而加剧了不准确性的传播。在使用多个 GPU 扩展时,如果采用模型分片策略,理论上可能会因计算分布的不同而导致结果产生变化,但实践中 PyTorch 的设计似乎保证了结果的一致性。
作者 | Anis Zakari
编译 | 岳扬
大多数技术工程师都了解,依赖库或依赖组件的版本不同都可能会导致系统行为产生变化。但在大语言模型(Large Language Models)领域,由于算力需求巨大,在训练和推理任务中我们都极度依赖 GPU。然而,很少有人真正意识到,更换 GPU 也会对 LLMs 的输出产生影响。
假如你想创建两个完全一致的开发环境:
本文将进行一次实验来强调这一现象,说明差异出现的位置及其原因。
Note:如果对实验过程的重现或具体代码不感兴趣,可以跳过本文展示代码片段,直接阅读“7. 为什么同样的 inputs 和同样的 LLMs 在两块不同 GPU 上生成的模型响应会有如此大的差别?”这部分内容。即便不看前面的代码片段,Conclusion 部分仍然有助于我们理解其中的原理。
有一天,我和一些人讨论为什么 OpenAI 和 Anthropic 的那些模型在设计时没有被构建为确定性的系统。我解释说,它们可能采用了混合专家模型(Mixture of Experts, MoE)方法[1],偶尔不会将 tokens 路由给最优的专家模型,因为这些专家模型可能正忙于处理其他 tokens,所以可能会导致模型响应的不一致。
另一个因素可能是 OpenAI 为了提高效率而对 queries 进行了批量处理。batches size 会根据传入的 queries 数量而变化,可能会改变 GPU 的计算策略,从而导致不同的模型响应。
当有人指出,“不同的 GPU 也可能导致出现不同的模型响应,不是吗?”时,我们之间的对话开始变得耐人寻味起来了。
仔细想一想……当我们使用 OpenAI API 时,实际上是有一台远程服务器帮我们执行计算并返回模型响应。现在,如果这台机器并非总是在相同的算力基础设施上运行,那么最终得到的模型响应就不会相同。
想到这一点,可能就会出现其他问题:
这些问题促使我想设置一个实验来突出这一现象,并探究它可能造成的影响有多大。
为了突出这一现象,我将设置两个完全相同的开发环境,它们唯一的区别在于其所使用的 GPU:第一个开发环境中使用的是 Nvidia Tesla T4,第二个开发环境使用的便是 Nvidia A10G。然后,我们将使用 Mistral-7b-v0.1 进行测试,看看会发生什么。
要在 notebook 中运行实验,请按照以下步骤操作。
1. 配置 CUDA 版本
2. 配置 transformers 和其他依赖
3. 设置随机种子(random seeds)
注释 1:
仅设置 transformers.set_seed 应该就足够了,但我还是想要确保万无一失。
注释 2:
本例使用的是 Python 3.10。
要从 Hugging Face 中加载 Mistral-7B-v0.1 模型,我们需要在环境变量 HF_TOKEN 中设置 Hugging Face tokens。
本文将会使用量化版本的模型,降低计算精度来减少 GPU 的内存占用。
我们将使用 transformers 库中的 pipeline 来简化从大语言模型(LLMs)生成模型响应的过程。
为了确保模型输出是可预测和一致的,我们希望从大语言模型的 vocabulary 中持续预测出最有可能的 tokens,因此我们可以将 top_k 设置为 1 或将 temperature 设置为接近 0 的值。
此外,为了简单起见,我们将把 max_new_tokens 参数设置为 1,这样 LLMs 就能只用单个 token 完成提示词。
当给出提示词序列 “I enjoy walking in the” 时,大语言模型(LLMs)只会生成一个单词:“woods”。如果大语言模型(LLMs)正确地生成并输出了这个单词,我们就可以继续进行实验了。
为了能够使用这两块 GPU,我通过 AWS SageMaker 启动了 ml.g4dn.xlarge (T4) 和 ml.g5.xlarge (A10G) 实例。
让我们尝试运行一个简单的 query :
T4 和 A10G 给我的模型响应是一样的:
到目前为止一切进展顺利。不过,这只是一个简短的 query 。在 RAG(检索增强生成)的应用场景里,我们通常会处理成千上万个 tokens 。现在让我们使用在 Hugging Face 上托管的 llama-2-arxiv-papers-chunked 数据集来进行更大规模的 query 测试。
在下面的代码示例中,我将模仿 RAG 的工作方式,使用数据集索引 0、4518、4519 和 799 处获取的文本片段。其中第 4518 和 4519 个数据块(chunks)讨论了 “Llama 2”,而其他片段则没有提及。我们期待 LLMs 能基于这些上下文信息回答:“Llama 2 有什么特别之处?”该提示词大概有 1,400 个 tokens 长。
T4 模型的输出如下:
A10G 模型的输出如下:
确实很有趣。乍一看,由于两个模型响应开头相同,区别却不太明显。但在“等等(etc)……”之后,两者就有所差异了。
T4 模型输出如下:“etc… This also means you can trust the output more since everything inside will be consistent across different runs!…”
A10G 模型输出如下:“etc… This also means you can be more confident when asking questions specifically related to topics covered within those texts…”
想知道使用相同 GPU 的两个开发环境是否会产生相同的模型输出?我进行了一系列测试,结果确实完全相同。
最终,这些模型响应因为 LLMs 的自回归特性而变得截然不同。由于下一个 token 是根据之前的 tokens 选择的,任何细微的变化都会引发一连串的连锁反应,就像蝴蝶效应(butterfly effect)一样。
请注意,这些模型响应并没有像提示词中所要求的那样基于所提供的上下文。LLMs 并没有完全遵循指导性提示词(instructions),但这并不是很重要。
因为我们假设 LLMs 总是基于前面的 tokens 选择概率(probabilities)最高的 token,所以我们可以肯定,区别在于如何在 GPU 上计算该概率(probabilities),下面让我们来看一看如何计算该概率~
为了打印出每个被选中 token 的概率,我们将绕过常规处理流程(pipeline),直接使用 tokenizer 和 model.generate 方法。这样我们就能设置 return_dict_in_generate=True 和 output_scores=True。接着,我们就可以进行计算(compute)操作、对其进行归一化操作(normalize),并将 transition scores(译者注:在自然语言处理领域,尤其是使用自回归模型生成文本时,模型会为每个 next token 分配一个概率分数,这个分数反映了该 token 作为 tokens 序列中 next token 的可能性大小。) 转换为概率(probabilities)。
上述代码会显示每个 token 的 ID、解码后的 token 以及其对应的概率(probability)。此处我只列出相关的模型输出内容,因为完整的内容非常长。
T4 Output:
A10G Output:
好了,现在事情变得越来越有趣了。T4 和 A10G 上的概率值(probabilities)并不完全一致。一般情况下,这样并不会影响 tokens 的排序序列(无法在生成的 tokens 序列中察觉到任何不同),但有时候确实会造成影响。
例如,在 T4 模型中,“trust” 出现的概率为 18.74 %,而在 A10G 上,“be” 出现的概率则更高,达到了 18.62 %。从这一点来看,由于大语言模型的自回归特性,生成的内容将会出现偏差(diverge)。
注释:量化大语言模型会降低计算精度(calculation precision),导致这类差异变得更为常见。
现在,一个非常合理的问题就出现了:“为什么计算结果会因为 GPU 的不同而产生差异呢?”
虽然我不是 CUDA expert(译者注:这类人能够熟练使用 CUDA C/C++ 编程语言来开发高性能的并行计算应用,并了解如何优化 GPU 上的计算任务来获得最佳性能。),但我进行过一些研究。不同 GPU 之间的计算差异可以归因于以下几个因素:
并行计算处理(Parallel Computation Handling):
GPUs 的特点是能够高效地并行处理大量的计算任务。然而,不同 GPU 在管理这些并行任务时可能会有所差异,从而影响到运算顺序以及内存的访问方式。
这一点非常重要,因为在编程过程中,即使是数值大小相差很大的简单加法也可能是不满足结合律的(non-associative),从而影响到精确计算(precise calculations)的准确性。所谓 “Non-associativity” 是指:(a + b) + c ≠ a + (b + c)。
因此,计算任务会被分割开来,独立进行处理,然后以non-associative方式组合在一起。因此,这些部分的内容如何重新组合会影响到最终结果。
这里有一个关于非联合型计算(non-associative computation)的简单示例:
对于大语言模型(LLMs),数百万次的计算可能会因为重复出现的微小误差而导致出现偏差(diverge),进而影响到序列生成过程中的字词选择。
硬件架构(Hardware Architecture):
不同型号的 GPU,如 Nvidia Tesla T4 和 Nvidia A10G ,具备不同的硬件架构。这些硬件架构能够优化模型各个方面的性能,包括并行处理能力(parallel processing capabilities)、内存带宽(memory bandwidth)和计算单元(compute units)。
例如,T4 模型采用了 Turing[2] 架构,而 A10G 模型基于 Ampere[3] 架构。
不同的模型架构意味着在浮点运算(floating-point arithmetic)、内存访问模式(memory access patterns)和其他底层操作上有着不同的实现方式。即使这些实现方式(implementations)存在细微差别,也可能会导致计算结果出现差异。
例如,与针对更高计算精度而进行优化的模型架构相比,为了计算速度而优化的模型架构可能会产生不同的模型响应,即便两者都在执行相同的浮点运算。
模型量化的影响(Quantization Effects):
通过模型量化(Quantizing)来降低计算精度可以节省内存资源和计算资源,但这样做也会引入额外的误差源(sources of error)。这些误差的影响因 GPU 对低精度运算(lower precision arithmetic)的处理方式不同而不同。
由于模型量化(quantization)过程中涉及到对数值的近似处理,因此不同的 GPU 在处理这些近似值时可能会有所差异,从而最终会导致 token 的预测概率产生变化。
这个问题问得非常好,非常感谢!: )
如果只是简单地增加相同型号的 GPU 数量(例如,从单个 A10G GPU 扩展到拥有 4 个 A10G GPU 的实例),是否还有必要担心?
使用多个 GPU 进行推理时,有几种策略可供选择:
我们已经证明了,即便是相同的开发环境(environment)、系统配置(settings)和随机种子(seed),不同的 GPU 也会导致 LLMs 产生不同的结果。随着提示词长度的增长,这种不准确性(inaccuracies)也会随之增加,因为更长的提示词需要更多的算力,这会加剧不准确性(inaccuracies)的传播并促进两个 GPU 之间的差异。此外,在进行模型量化的情况下,这种效应更加显著。
我并不是说这种情况一定是灾难性的,但这是我们在处理 LLMs 的部署时需要注意的一个因素。
如果我们开发时使用的 GPU 与生产环境中使用的 GPU 不同,应该设置测试实验确保性能仍然保持在可接受的范围内。如果我们计划将 LLMs 扩展到拥有不同 GPU 的新实例上,这一点也很重要。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-10
OpenAI 重磅推出超级 APP 及 GPT 5.6
2026-07-10
GPT-5.6 正式开放:三个型号一起放出完整成绩单,ultra 其实是 4 个智能体并行
2026-07-10
GPT-5.6深夜上线,首发实测,Claude Fable5 慌了!
2026-07-10
刚刚,GPT-5.6全面上线,Codex被合并,生产力工具ChatGPT Work来了
2026-07-09
Claude Design 迎来一次重大更新
2026-07-09
GPT-Live:当 AI 学会一边听你说话,一边回应你
2026-07-09
一文读懂Harness Engineering!
2026-07-09
GPT-6要来了!OpenAI彻底抛弃4T旧底座
2026-04-15
2026-04-24
2026-04-17
2026-04-14
2026-04-24
2026-05-19
2026-04-22
2026-04-24
2026-04-24
2026-04-16
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。