1 · 源码总览:从 API 外壳到设备 kernel
TensorFlow 2.22.0 的目录分层、边界和初始化方式
源码规模与阅读策略
本地快照约有 26,923 个文件,其中核心 tensorflow 树包含 Python、C++ 头文件和实现、构建规则、测试及多语言绑定。大仓库的正确入口不是从根目录顺序阅读,而是先选一条可观察的业务链,再沿着对象和注册表向下走。
用户代码
↓
tensorflow/python/ops + eager + framework
↓ (pybind / C API / generated op wrappers)
tensorflow/core/common_runtime + core/framework
↓
OpRegistry / KernelRegistry / Device
↓
CPU/GPU/TPU kernel + allocator + thread pooltensorflow/python 是“语言适配层”
Python 层做四类事情:
- 把 Python 值、
TypeSpec、CompositeTensor和结构化参数转成 TensorFlow 可理解的输入; - 管理 eager/graph/function 的当前上下文;
- 维护 Python 对象与 C++ handle、变量、资源、梯度 tape 的生命周期;
- 暴露 Keras、
tf.data、SavedModel 等用户体验。
这解释了为什么 tensorflow/python/eager/execute.py 只有几百行,却连接了大量生成的 op wrapper:它是统一的参数归一化和派发汇合点,而不是每个算子的实现。
tensorflow/core 是运行时骨架
core/framework 定义值对象与协议:Tensor、TensorShape、NodeDef、GraphDef、OpKernel、Status。core/common_runtime 负责把协议变成一次运行:设备管理、executor、函数库、内存、资源和 session。
一个重要设计是“协议与策略分离”:Tensor 不知道具体 op 如何计算,OpKernel 不负责全局调度,Executor 也不直接写每个设备的数学逻辑。它们通过注册表和接口组合。
初始化不是一个函数,而是一组懒路径
TensorFlow 启动时不会立即创建所有设备和所有 kernel。Python Context.ensure_initialized() 会在需要时建立 C API context;C++ 侧再发现 device、加载/注册函数、创建 executor 和相关缓存。这样既支持纯 CPU 的轻量使用,也保留多设备、远程执行和分布式初始化能力。
版本边界
这份拆解使用 RELEASE.md 的 Release 2.22.0 作为基准。当前快照的 .bazelversion 是 7.7.0,依赖通过 MODULE.bazel、WORKSPACE、third_party 和 Python requirements lock 组合管理。版本号不仅是发布信息,还会进入 GraphDef、API golden files、算子兼容性与构建工具链。
源码锚点
README.md:公共定位、安装方式、支持范围。RELEASE.md:2.22.0 破坏性变更和主要改动。MODULE.bazel/WORKSPACE:Bazel 模块与仓库初始化。tensorflow/core/framework/:跨后端共享的协议对象。tensorflow/core/common_runtime/:本地执行与资源管理。tensorflow/tools/api/:公开 Python API 生成与检查。