根治 PyTorch CUDA `pynvml` 弃用警告:直接修改 `torch/cuda/__init__.py` 的实践记录
2026/6/5 1:15:59 网站建设 项目流程

根治 PyTorch CUDApynvml弃用警告:直接修改torch/cuda/__init__.py的实践记录


【笔记】消除 “FutureWarning: The pynvml package is deprecated”警告


1. 问题现象

在 Windows 环境下运行 ComfyUI(或任何基于 PyTorch 的 CUDA 应用)时,控制台会在 PyTorch 初始化阶段抛出一条FutureWarning

H:\PythonProjects3\Win_ComfyUI\.venv\Lib\site-packages\torch\cuda\__init__.py:61: FutureWarning: The pynvml package is deprecated. Please install nvidia-ml-py instead. import pynvml # type: ignore[import]

虽然这条警告不影响 CUDA 的正常使用,也不会阻断程序运行,但在每次启动时污染日志输出,尤其在使用--verbose或排查其他问题时,显得格外扎眼。

2. 根因分析

这条警告的源头并非 PyTorch 本身,而是pynvml这个包的设计策略。

  • pynvml13.x 的本质:当前 PyPI 上的pynvml已经演变成一个兼容 shim(垫片)。它内部完全依赖nvidia-ml-py提供 NVML(NVIDIA Management Library)的 Python 绑定,但会在被import时主动抛出FutureWarning,提醒用户迁移。
  • PyTorch 的行为:PyTorch 在torch.cuda初始化时,硬编码了import pynvml来获取驱动版本、显存信息等。由于它先尝试导入pynvml,自然就触发了 shim 层的警告。
  • 环境的现状:通过pipdeptree可以确认,nvidia-ml-py已经正确安装,且被flashinfer-pythoninference等包直接依赖;而pynvmlRequired-by为空,说明没有硬依赖它的上层包。

因此,真正提供功能的是nvidia-ml-py,而pynvml只是一个多此一举的警告发射器

pipdeptree--reverse--packages pynvml

3. 解决思路:让 PyTorch 直接对接底层库

与其用环境变量或warnings.filterwarnings去“捂嘴”屏蔽警告,不如从源头根治:让 PyTorch 跳过pynvml这个 shim,直接导入nvidia-ml-py

由于 PyTorch 后续代码中大量使用了pynvml.nvmlInit()pynvml.nvmlDeviceGetCount()等调用,我们只需要在导入时做一个别名映射,让pynvml这个命名空间直接指向nvidia-ml-py即可。这样无需改动 PyTorch 的任何业务逻辑,实现零侵入式修复。

4. 具体操作步骤

定位文件(请根据你的实际虚拟环境路径调整):

H:\PythonProjects3\Win_ComfyUI\.venv\Lib\site-packages\torch\cuda\__init__.py

找到对应代码块(大约在第 59~61 行):

try:ifnot_version.hip:importpynvml# type: ignore[import]


修改后的代码

try:ifnot_version.hip:# import pynvml # type: ignore[import]importnvidia_ml_pyaspynvml

关键细节

  • 保持缩进:确保新添加的import nvidia_ml_py as pynvml与原import pynvml的缩进完全一致(4 个空格),否则 Python 解释器会抛出IndentationError
  • 注释而非删除:将原行注释掉,而不是直接删除。这样一旦需要回滚,只需取消注释即可,无需记忆修改内容。
  • 添加书签:在编辑器(如 VS Code、PyCharm、Notepad++ 等)中为该行添加书签。PyTorch 重装(pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu126 --force-reinstall)会覆盖此文件,书签能帮你下次快速定位并重新修改。
pip install torch==2.7.1torchvision==0.22.1torchaudio==2.7.1--index-url https://download.pytorch.org/whl/cu126--force-reinstall

5. 验证效果

保存文件后,重启 ComfyUI。观察日志:

  • 修改前FutureWarning: The pynvml package is deprecated...出现在torch/cuda/__init__.py:61
  • 修改后:该位置警告完全消失,且 CUDA 初始化、GPU 检测、显存查询等功能一切正常

6. 注意事项与回溯策略

事项说明
虚拟环境隔离修改仅作用于当前.venv,不会影响系统 Python 或其他项目的 PyTorch 安装
PyTorch 重装执行torch重装 后,__init__.py会被覆盖,需重新执行上述修改。这也是建议添加书签的原因
版本兼容性nvidia-ml-py是 NVML 的官方 Python 绑定,API 与旧pynvml完全兼容,不存在功能风险
备份建议如果你担心改坏,可先复制一份__init__.py__init__.py.bak

7. 与其他方案的对比

为什么推荐直接改源码,而不是其他更“温和”的手段?

方案缺点
set PYTHONWARNINGS=ignore::FutureWarning过于粗暴,会同时屏蔽项目中其他可能有价值的FutureWarning
sitecustomize.pywarnings.filterwarnings需要额外维护一个文件,且属于“掩耳盗铃”,警告的触发逻辑仍在运行
直接pip uninstall pynvml虽然pipdeptree显示无依赖,但某些 ComfyUI 自定义节点可能硬编码import pynvml,卸载后可能导致其报错

相比之下,修改torch/cuda/__init__.py的别名导入是风险最低、最优雅的根治方案:它保留了pynvml包在环境中的存在(安抚可能依赖它的第三方插件),同时让 PyTorch 直接走官方库,彻底消除警告。

8. 总结

这是一次典型的“面向源码排障”实践。通过分析依赖树的实际指向,我们发现pynvml已经退化为无实质功能的警告层,而 PyTorch 恰好是这个警告的触发者。利用 Pythonimport ... as ...的别名机制,我们在 PyTorch 内部做了一个无缝的“拨乱反正”,既保留了环境兼容性,又实现了日志的彻底清净。

下次重装 / 升级 PyTorch 后,只需凭借编辑器书签回到同一位置,重复一次注释与替换,即可继续享受零警告的启动体验。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询