1.2 环境搭建与第一次图上排程 本节摘要:本节完成三件事:装好 TensorFlow 并确认 GPU 可用性,理解"pip 包名、版本对齐、CUDA 组件"三层结构各自的职责,跑通第一段张量代码并解释其中最常见的三个现象——打印无值、GPU 未识别、包名混乱。环境是排程室的厂房,厂房验收标准就一条:你写的每一行代码都能按预期被执行与观测。 本节能力清单 阅读完本节,你应当能够: 用 pip 在独立虚拟环境中安装 TensorFlow 2.x 并验证版本; 判断自己的机器该走 CPU 路线还是 GPU 路线,知道 GPU 版对 CUDA 与 cuDNN 的版本对齐要求; 现场运行第一段张量代码,并对输出格式逐字段解读; 排查"import 慢、GPU 不识别、版本冲突"三类环境故障。
本节摘要:本节完成三件事:装好 TensorFlow 并确认 GPU 可用性,理解"pip 包名、版本对齐、CUDA 组件"三层结构各自的职责,跑通第一段张量代码并解释其中最常见的三个现象——打印无值、GPU 未识别、包名混乱。环境是排程室的厂房,厂房验收标准就一条:你写的每一行代码都能按预期被执行与观测。
阅读完本节,你应当能够:
环境问题几乎都源于一个认知偏差:把 TensorFlow 当成一个孤立包。它其实是三层结构的组合——最上层是 Python 包本体,中层是设备运行时,最下层是驱动与加速库。CPU 路线下中层由框架内置实现兜底,装完即用;GPU 路线下中层依赖 NVIDIA 的 CUDA 与 cuDNN,版本必须与 TensorFlow 版本精确对齐,错一格就报"无法找到 GPU"。所以装之前先做决定:只是学习与中小规模实验,CPU 完全够用(加州房价、影评这类案例 CPU 几分钟内能跑完);要训练 CNN、GAN 这类视觉模型,再走 GPU 路线。
# 1. 建独立虚拟环境,避免与已有科学计算包冲突 python -m venv tf-env # Windows 激活: tf-env\Scripts\activate # Linux 或 macOS 激活: source tf-env/bin/activate # 2. 安装 TensorFlow 2.x(CPU 与 GPU 支持从 2.x 起合并为同一个包) pip install tensorflow # 3. 验证版本 python -c "import tensorflow as tf; print(tf.__version__)" # 预期输出(示例): # 2.16.1
包名是历史遗留重灾区:1.x 时代 CPU 包叫 tensorflow、GPU 包叫 tensorflow-gpu;2.x 起两者合并,tensorflow-gpu 已废弃。看到旧文档让你装 tensorflow-gpu,直接忽略——那是上个版本的排程室。

装完先跑一段"验收代码",逐行确认排程室各项能力就位:
import tensorflow as tf # 验收一:版本与编译信息 print(tf.__version__) # 例如 2.16.1 # 验收二:GPU 是否被识别 print(tf.config.list_physical_devices('GPU')) # CPU 机器输出:[] # GPU 机器输出:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] # 验收三:最小计算能否执行 a = tf.constant([[1.0, 2.0], [3.0, 4.0]]) print(tf.reduce_sum(a)) # 输出:tf.Tensor(10.0, shape=(), dtype=float32)
输出行 tf.Tensor(10.0, shape=(), dtype=float32) 有三个字段值得念一遍:10.0 是值(Eager 模式下立即算出);shape=() 表示标量——空括号就是零维;dtype=float32 是类型,TensorFlow 默认浮点都是 32 位,因为训练吞吐对精度损失不敏感、对带宽极其敏感。这三个字段在后面每一节都会反复出现,现在养成读输出的习惯。
故障一,import 卡住十几秒。多半是 CUDA 库加载与设备探测的开销,属正常现象;若每次 import 都极慢且报 GPU 警告,说明装了 GPU 期望却没配好驱动,可以用环境变量把 GPU 日志关掉先跑起来:
import os # 屏蔽设备探测日志,让输出干净 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf print("loaded") # 输出:loaded
故障二,GPU 列表为空但明明有卡。按顺序查三处:驱动版本是否达到该 TensorFlow 版本的最低要求;CUDA 与 cuDNN 版本是否与官方对照表一致;nvidia-smi 能否正常显示显卡。三层结构里任何一层错位,最上层都会静默回退到 CPU——不报错,只是变慢,这是最难察觉的失败方式。
故障三,装完 import 直接报符号缺失或 numpy 冲突。TensorFlow 对 numpy 版本有区间要求,虚拟环境里单独升级或降级 numpy 通常即可解决。这也是坚持虚拟环境的理由:厂房脏了可以整个拆掉重建,不动全局。
# 限制 GPU 显存增长:防止整卡显存被一次占满 gpus = tf.config.list_physical_devices('GPU') if gpus: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) print("memory growth enabled") else: print("no gpu found") # 输出示例:memory growth enabled # 不设置时 TensorFlow 默认吞掉几乎全部显存, # 同机跑其他程序会直接 OOM。
⚠️ 常见坑:在 Jupyter 里装完 TensorFlow 不重启内核,import 到的还是旧环境。装完必重启内核——这是"装了却 import 不到"的头号原因。
💡 关键直觉:环境验收别只看"能不能 import",要看"在哪台设备上跑"。训练脚本里打印一次
list_physical_devices,能避免一次跑了几小时才发现一直在用 CPU 的惨案。
tensorflow-gpu 已废弃。set_memory_growth。下节进入正题:认识排程室里的货物——张量。