先确认宿主机nvidia-smi能输出gpu信息且nvidia-container-toolkit已注册为默认runtime,再用--gpus参数运行官方-gpu镜像;进容器后执行tf.config.list_physical_devices('gpu')验证,空列表说明gpu未透传成功。

确认宿主机NVIDIA驱动和nvidia-container-toolkit是否就绪
TensorFlow在Docker里用不了GPU,90%的情况不是代码问题,而是容器根本没拿到GPU设备权限。先别急着改docker run参数,先看宿主机基础环境:
-
nvidia-smi必须能正常输出GPU信息(说明驱动已装好) -
nvidia-container-toolkit必须已安装并注册为默认runtime(检查/etc/docker/daemon.json里是否有"default-runtime": "nvidia"或"runtimes": {"nvidia": ...}) - 重启Docker服务:
sudo systemctl restart docker(改完daemon.json后这步不能跳)
使用--gpus参数启动容器,而非--runtime=nvidia
旧版Docker用--runtime=nvidia,但19.03+已废弃,强行用会静默失败。正确方式是显式指定--gpus:
- 所有GPU:
docker run --gpus all -it tensorflow/tensorflow:2.15.0-gpu - 指定某张卡:
docker run --gpus device=0,2 -it ... - 限制显存(需配合TensorFlow代码中
tf.config.set_memory_growth):docker run --gpus '"device=0,capabilities=compute,utility"' ... - 如果报错
unknown flag: --gpus,说明Docker版本太低,升级到19.03+
验证TensorFlow是否真识别到GPU设备
进容器后别只信nvidia-smi,要让TensorFlow自己说话:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
print(tf.config.list_physical_devices('GPU'))
- 输出
[]?说明GPU没透传成功,回退检查前两步 - 输出非空但训练仍用CPU?检查TensorFlow镜像是否带
-gpu后缀(tensorflow/tensorflow:2.15.0是CPU版,tensorflow/tensorflow:2.15.0-gpu才是GPU版) - 遇到
Failed to get convolution algorithm?通常是cuDNN版本不匹配,优先用官方GPU镜像,别自己装CUDA
PyTorch用户误用TensorFlow镜像的典型陷阱
很多人搜“Docker GPU”顺手拉了pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime,然后在里面pip install tensorflow——这会导致CUDA运行时冲突,tf.test.is_gpu_available()返回False,且无明确报错。
- 要么统一用TensorFlow官方GPU镜像(
tensorflow/tensorflow:x.x.x-gpu) - 要么用NVIDIA官方
nvcr.io/nvidia/tensorflow:23.10-tf2-py3等认证镜像 - 绝对避免在PyTorch CUDA镜像里pip装TensorFlow GPU版
最常被忽略的是镜像标签里的-gpu后缀和CUDA版本对齐——差一个小版本,libcuda.so加载都可能失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










