新闻详情

新闻详情

首页 / 资讯中心 / 详情

【torch报错处理】RuntimeError: probability tensor contains either `inf`, `nan` or element < 0:从定位到修复的完整排查路

发布时间:2026/10/1 14:38:24来源:尧图网络
【torch报错处理】RuntimeError: probability tensor contains either `inf`, `nan` or element < 0:从定位到修复的完整排查路
1. 报错现场还原probability tensor 里到底混进了什么RuntimeError: probability tensor contains either inf, nan or element 0这个报错第一次见的人基本都会懵明明前面 loss 还在正常下降怎么突然就炸了而且它不像 shape mismatch 那样直接告诉你哪一维对不上只丢一句“概率张量里有 inf、nan 或者负数”剩下的全靠自己查。先说清楚它是什么。这个报错来自 PyTorch 的torch.multinomial以及内部调用它的torch.distributions.Categorical。当你做文本生成采样、强化学习动作采样、或者任何“按概率抽一个索引”的操作时PyTorch 会先检查传入的 probability tensor 是否合法每个元素必须落在[0, 1]区间内且整行求和不能是 0 或 nan。只要有一个元素是inf、nan或者出现负数就直接抛这个 RuntimeError。它能做什么判断其实它是一道“最后防线”。真正的问题往往发生在更早的地方logits 溢出、softmax 数值不稳定、mask 填充把某些位置设成了-inf之后又参与了归一化、混合精度下float16表示范围不够导致上溢。这个报错只是把上游的数值污染暴露出来了。适合谁看如果你正在跑 HuggingFacegenerate()、自己写的自回归采样循环、PPO/DPO 里的动作分布、或者任何带multinomial/Categorical的代码并且遇到了这个报错那这篇就是给你写的。我试过在 batch size 只有 1、完全没有 padding 的情况下也触发它所以别以为“我没用 pad 就跟我无关”。先建立一个直觉概率张量出问题99% 不是采样那一步的错而是它上游的 logits 已经烂了。所以排查方向永远是往上游走而不是在multinomial那一行加 try/except。下面给一个最小可复现的例子你可以直接跑感受一下报错长什么样import torch # 构造一个含 nan 的 logits logits torch.tensor([[1.0, float(nan), 3.0]]) probs torch.softmax(logits, dim-1) print(probs) # tensor([[0.2689, nan, 0.7311]]) torch.multinomial(probs, num_samples1) # RuntimeError: probability tensor contains either inf, nan or element 0再构造一个负数场景这个更隐蔽因为 softmax 之后理论上不会有负数但如果你手动拼了一个概率张量就会中招probs torch.tensor([[0.5, -0.1, 0.6]]) torch.multinomial(probs, num_samples1) # 同样报这个错看到没报错本身信息量很少但它指向的是一整条数值链路。接下来我们先把环境准备好再逐段拆解。2. 前置准备用 TaoToken 快速搭一个可调试的推理环境排查这类数值问题最怕的就是环境本身不稳定一会儿 CUDA 版本不对一会儿模型权重加载失败把真正的 bug 淹没了。所以第一步是把推理环境固定下来让每次跑出来的结果可复现。我一般会用一个统一的 API 入口来跑模型对话和调试这样不用在本地反复折腾权重和显存。TaoToken 的官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 它提供模型对话、Coding Plan、控制台和 API Keys 等入口。对于这篇的排查场景我们主要用它来快速验证“同样的 prompt 在不同精度下会不会触发 nan”省去本地加载大模型的等待时间。具体来说你需要拿到一个 API Key然后就可以用统一的 Base URL 去请求模型。API 地址是 https://taotoken.net/api 注意这个地址不带 UTM 参数直接用于代码里的base_url。控制台和 Key 管理在 https://taotoken.net/console 和 https://taotoken.net/api-keys 模型对话页面在 https://taotoken.net/chat 接入文档在 https://taotoken.net/doc 。为什么排查数值问题要先搭这个因为你需要一个“对照组”。本地跑崩了你可以立刻用同一个 prompt 走 API 跑一遍如果 API 侧正常说明问题出在你本地的精度设置或代码逻辑如果 API 侧也崩那可能是 prompt 本身触发了模型的极端输出。这种对照能帮你快速缩小范围。安装依赖很简单pip install openai torch transformers然后配置一个最小的调用脚本把 base_url 指向 TaoTokenfrom openai import OpenAI client OpenAI( api_key你的_TAOTOKEN_API_KEY, base_urlhttps://taotoken.net/api ) resp client.chat.completions.create( modelclaude-3-5-sonnet, messages[{role: user, content: how are you}] ) print(resp.choices[0].message.content)这段代码的作用是建立一个稳定的外部参照。当你本地generate()报probability tensor错误时把同样的输入丢给这个脚本看它是否正常返回。如果正常那基本可以锁定是你本地精度或采样代码的问题。另外如果你要做长期的编码调试或者 Agent 相关的实验可以考虑 TaoToken 的 Coding Plan入口在 https://taotoken.net/coding-plan 它更适合需要反复跑、反复改的场景。Claude Code 相关的接入文档在 https://taotoken.net/doc 里面有 Anthropic 兼容的配置说明。环境准备好之后我们进入正题怎么一步步定位到那个烂掉的概率张量。3. 可复制配置从 logits 到 probs 的数值稳定改造这一节是核心我会给你一套可以直接抄的配置和代码片段覆盖最常见的三种触发场景softmax 前未做数值稳定、logits 溢出、mask 填充异常。先看第一种也是最常见的直接对原始 logits 做 softmax然后送进 multinomial。问题在于当 logits 里有很大的值时exp()会溢出成inf归一化之后就会出现inf/inf nan。import torch def unstable_sample(logits): probs torch.softmax(logits, dim-1) return torch.multinomial(probs, num_samples1) logits torch.tensor([[1000.0, 999.0, 998.0]], dtypetorch.float16) print(unstable_sample(logits)) # 大概率报 probability tensor contains inf/nan修复方式是改用log_softmax配合multinomial的 log 概率输入或者手动减去最大值。PyTorch 的torch.multinomial其实支持直接传 log 概率吗不支持它只接受概率。但torch.distributions.Categorical接受 logits内部会做稳定处理。所以更稳的写法是def stable_sample(logits): # 减去最大值防止 exp 溢出 logits logits - logits.max(dim-1, keepdimTrue).values probs torch.softmax(logits, dim-1) # 再做一次 clamp兜底 probs torch.clamp(probs, min0.0, max1.0) return torch.multinomial(probs, num_samples1)第二种场景混合精度下的 logits 溢出。float16的最大表示范围大约是 65504而bfloat16的指数位和float32一样范围大得多但尾数精度低。如果你用float16跑大模型logits 很容易超过 65504 变成inf。这时候可以在加载模型时指定dtypefrom transformers import AutoModelForCausalLM, AutoTokenizer model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-7b-hf, torch_dtypetorch.bfloat16, # 用 bfloat16 替代 float16 device_mapauto ) tokenizer AutoTokenizer.from_pretrained(meta-llama/Llama-2-7b-hf)如果你用的是 HuggingFace 的generate()可以在generate里传do_sampleTrue和temperature但注意temperature太低会让分布过于尖锐反而放大数值问题。实测下来temperature0.7到1.0之间比较稳。第三种场景mask 填充异常。当你用attention_mask或者手动构造-infmask 时如果整行都被 mask 成-infsoftmax 之后整行都是nan。检查方法def check_mask(logits, attention_mask): # 检查是否有整行被完全 mask masked logits.masked_fill(attention_mask 0, float(-inf)) all_masked torch.isinf(masked).all(dim-1) if all_masked.any(): print(f警告第 {all_masked.nonzero().flatten().tolist()} 行被完全 mask) return masked还有一个容易被忽略的点tokenizer.pad_token的设置。有些模型默认没有 pad token如果你手动设成[PAD]但模型词表里没有可能会在 embedding 层产生异常值。可以尝试设成tokenizer.unk_token或者tokenizer.eos_token具体看模型。下面给一个完整的、可复制的采样函数把上面几种防护都加上import torch def safe_multinomial(logits, attention_maskNone, temperature1.0): logits: [batch, vocab] attention_mask: [batch, vocab] 或 None # 1. 温度缩放 logits logits / temperature # 2. mask 处理避免整行 -inf if attention_mask is not None: logits logits.masked_fill(attention_mask 0, float(-inf)) # 检查整行被 mask 的情况 all_masked torch.isinf(logits).all(dim-1) if all_masked.any(): raise ValueError(存在整行被 mask 的样本请检查 attention_mask) # 3. 减去最大值数值稳定 logits logits - logits.max(dim-1, keepdimTrue).values # 4. softmax 得到概率 probs torch.softmax(logits, dim-1) # 5. 检测 nan/inf if torch.isnan(probs).any() or torch.isinf(probs).any(): raise ValueError(softmax 后出现 nan/inf请检查 logits) # 6. clamp 兜底防止极小负数 probs torch.clamp(probs, min0.0, max1.0) # 7. 重新归一化保证和为 1 probs probs / probs.sum(dim-1, keepdimTrue) return torch.multinomial(probs, num_samples1)这套配置基本能覆盖 80% 的场景。如果你用的是transformers的generate()它内部已经做了不少稳定处理但如果你自己写了采样循环就一定要把上面这些防护加上。另外如果你在本地反复调试精度问题很痛苦可以用 TaoToken 的模型对话页面快速验证同一个 prompt 在服务端的表现入口在 https://taotoken.net/chat 这样能帮你判断是模型本身的问题还是你本地环境的问题。4. 验证请求用最小复现代码确认修复生效配置写好了怎么确认真的修好了不能只看“不报错了”还要看数值是否健康。这一节给你一套验证动作包括 nan/inf 检测、clamp 前后对比、以及一个完整的端到端请求示例。先写一个检测函数专门用来在采样前拦截异常import torch def diagnose_probs(probs, nameprobs): print(f--- {name} 诊断 ---) print(fshape: {probs.shape}) print(fdtype: {probs.dtype}) print(f是否有 nan: {torch.isnan(probs).any().item()}) print(f是否有 inf: {torch.isinf(probs).any().item()}) print(f最小值: {probs.min().item()}) print(f最大值: {probs.max().item()}) print(f每行和: {probs.sum(dim-1)}) # 检查是否有负数 if (probs 0).any(): print(f存在负数位置: {(probs 0).nonzero()})然后构造一个会触发问题的 logits跑一遍修复前后的对比# 构造极端 logits logits torch.tensor([[500.0, 400.0, 300.0]], dtypetorch.float16) # 修复前 probs_bad torch.softmax(logits, dim-1) diagnose_probs(probs_bad, 修复前) # 你会看到 inf 或 nan # 修复后 logits_stable logits - logits.max(dim-1, keepdimTrue).values probs_good torch.softmax(logits_stable, dim-1) probs_good torch.clamp(probs_good, min0.0, max1.0) probs_good probs_good / probs_good.sum(dim-1, keepdimTrue) diagnose_probs(probs_good, 修复后) # 应该看到正常的概率分布跑完这个对比你就能直观看到“减最大值”这一步有多关键。修复前的概率张量要么是inf要么是nan修复后是干净的[0,1]分布。接下来做一个端到端的验证用 HuggingFace 模型跑一次采样确认generate()不再报错。from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_name meta-llama/Llama-2-7b-hf tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto ) prompt Explain the theory of relativity in simple terms. inputs tokenizer(prompt, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens50, do_sampleTrue, temperature0.8, top_p0.9, pad_token_idtokenizer.eos_token_id ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))如果这段代码能正常输出说明你的精度设置和采样参数是健康的。如果还是报probability tensor错误那就回到第 3 节检查是不是 mask 或者 pad_token 的问题。再给一个用 TaoToken API 做对照验证的脚本确认服务端对同一个 prompt 的处理from openai import OpenAI client OpenAI( api_key你的_TAOTOKEN_API_KEY, base_urlhttps://taotoken.net/api ) resp client.chat.completions.create( modelclaude-3-5-sonnet, messages[{role: user, content: Explain the theory of relativity in simple terms.}], temperature0.8 ) print(resp.choices[0].message.content)如果本地崩、API 正常那问题就在本地精度或代码如果两边都崩那可能是 prompt 触发了模型的极端输出需要换 prompt 或者调整采样参数。验证通过的标准很简单连续跑 10 次不同的 prompt都不再出现probability tensor报错并且输出的文本语义正常。如果偶尔还有那就把diagnose_probs挂到你的采样循环里看是哪一步漏了防护。5. 常见错排查401、local proxy failed、reading choices、OAuth 对照表排查过程中除了probability tensor本身你还可能撞上一堆周边报错。这些报错容易把人带偏所以单独列出来对照。先说你最可能遇到的401 Unauthorized。如果你在用 TaoToken API 做对照验证Key 填错了或者没带Bearer前缀就会返回 401。检查你的api_key是否正确以及base_url是不是https://taotoken.net/api。注意不要写成带 UTM 的地址那个是给网页跳转用的API 调用要用干净的/api。第二个local proxy failed。这个通常出现在你本地设置了网络代理但代理不可用或者配置冲突。排查方法是检查环境变量HTTP_PROXY/HTTPS_PROXY是否指向了一个失效的地址。如果你在公司内网可能需要走内网代理具体问运维。注意这里说的是正常的网络代理配置问题不涉及任何绕过网络管理的手段。第三个reading choices相关的报错。这个一般出现在你解析 API 返回时resp.choices为空或者结构不对。比如你用了错误的 model 名称服务端返回了错误信息而不是正常的 completion这时候resp.choices[0]就会 IndexError。检查方法是先打印完整的resp看error字段有没有内容。第四个OAuth相关。如果你在接入 Claude Code 或者某些需要 OAuth 的工具可能会遇到 token 过期或者 scope 不对的报错。这时候需要重新走一遍授权流程确保拿到的 token 有正确的权限。TaoToken 的接入文档在 https://taotoken.net/doc 里面有详细的配置说明。为了让你更清楚我列一个对照表报错关键词可能原因排查动作401 UnauthorizedAPI Key 错误或缺失检查 key 和 base_urllocal proxy failed本地代理配置失效检查 HTTP_PROXY 环境变量reading choices返回结构异常打印完整 resp 看 errorOAuthtoken 过期或 scope 不足重新授权检查权限probability tensorlogits 数值污染按第 3 节加防护另外如果你在用 CC Switch、Cline MCP 或者 Codex 的auth.json记得把三件套配全Base URL、Key、Model ID。缺一个都会导致连接失败。比如 Codex 的auth.json里需要明确写base_url和api_keyModel ID 也要和请求里的一致。还有一个坑torch版本差异。有朋友反馈从 2.4 降级到 2.1 之后同样的代码不报错了。这说明不同版本在softmax或multinomial的底层实现上可能有数值处理差异。但降级不是长久之计更稳的做法还是在自己代码里加数值稳定处理不要依赖框架版本的“运气”。如果你在排查过程中发现某个 prompt 特别容易触发可以把它单独拎出来用diagnose_probs逐层打印 logits、softmax 后的 probs、以及 clamp 后的结果定位到底是哪一步开始出现 nan。6. 语义一致 CTA把排查流程固化成你的调试习惯到这里probability tensor contains either inf, nan or element 0的完整排查路径就讲完了。核心就一句话这个报错是症状不是病因真正的病灶在 logits 的数值稳定性上。把第 3 节的safe_multinomial函数保存下来以后所有涉及采样的代码都走这个入口基本能避免 90% 的同类问题。再配合第 4 节的diagnose_probs在关键节点打印数值状态出问题时能第一时间定位。如果你需要快速验证模型行为、做对照实验可以用 TaoToken 的模型对话页面入口在 https://taotoken.net/chat API 调用统一走 https://taotoken.net/api 。Key 在 https://taotoken.net/api-keys 管理接入文档在 https://taotoken.net/doc 。长期做编码和 Agent 实验的话Coding Plan 在 https://taotoken.net/coding-plan 。最后留一个实用技巧在你的训练或推理循环里加一个全局的数值检查钩子每隔 N 步检查一次 logits 和 probs 的 min/max/mean一旦发现异常就打印当前 batch 的输入和 mask 状态。这样你就不用等到multinomial抛错才发现问题而是能在数值刚开始恶化的时候就介入。这个习惯比任何单次修复都值钱。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

h3.c画布与时长选择指南:512到768p分辨率和帧数配置的最佳实践 2026/10/1 15:25:57

h3.c画布与时长选择指南:512到768p分辨率和帧数配置的最佳实践

h3.c画布与时长选择指南:512到768p分辨率和帧数配置的最佳实践 【免费下载链接】h3.c MiniMax H3 inference engine for Mac computers 项目地址: https://gitcode.com/gh_mirrors/h3/h3.c h3.c 是面向 Apple Silicon 的 MiniMax H3 原生视频推理引擎&#x…

阅读更多 →
【CANN比赛】算子开发比赛 2026/10/1 15:25:57

【CANN比赛】算子开发比赛

【全局生态】 【码力全开特辑】一张图看懂CANN:技术架构与编程开发全景_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11nac68EEZ/?spm_id_from333.337.search-card.all.click&vd_source1f3f694d074ce0ac334eb3023001f728 【Cube算子】 【2024CANN训…

阅读更多 →
告别繁杂的科研写作事务!Paperxie 一站式 AI 写作工具真心安利 2026/10/1 15:25:57

告别繁杂的科研写作事务!Paperxie 一站式 AI 写作工具真心安利

前言 临近毕业季,不少同学一边实习备考,一边埋头打磨自己的学术文章,时间被拆解得支离破碎。 着手准备一篇完整的学术文章,第一道难关就是文献处理:外文资料晦涩难懂,中文文献堆积如山,梳理研究…

阅读更多 →
木纹砖个性化定制电话 欣荣建材 600x600木纹地砖 阳台庭院户外铺贴适用场景 2026/10/1 15:25:57

木纹砖个性化定制电话 欣荣建材 600x600木纹地砖 阳台庭院户外铺贴适用场景

木纹砖个性化定制,为什么越来越多人开始关注?近年来,木纹砖在家装与工装领域的出现频率明显升高。它以瓷砖的材质还原实木纹理,既有木材的温润视觉,又规避了实木地板怕潮、怕虫、难打理的短板。尤其在昆明这样多雨潮湿、干湿季分…

阅读更多 →
长程Agent上下文管理:ICLR/ICML 2026核心方案与工程落地全汇总 2026/10/1 15:25:57

长程Agent上下文管理:ICLR/ICML 2026核心方案与工程落地全汇总

ICLR、ICML 2026:一文汇总长程 Agent 上下文管理大概从去年开始,我就在持续跟进长程 Agent 这个方向。原因很直接:现在大家做的 Agent 大多只能在"几轮对话"或者"单步工具调用"里表现良好,一旦把任务拉长到小…

阅读更多 →
大模型学习路线与工程化实战:从API调用到Agent、微调与本地部署 2026/10/1 15:25:48

大模型学习路线与工程化实战:从API调用到Agent、微调与本地部署

1. 大模型时代的学习生态到底长什么样过去两年,我身边不少做开发、做测试、做产品的朋友都在问同一个问题:大模型来了,我到底该学什么、用什么、从哪下手。有人一头扎进微调,结果卡在数据清洗上两周没动弹;有人上来就买…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉