TensorFlow:用 C++ 内核撑起 Python 训练到多端部署
谷歌开源的机器学习框架,C++ 编写内核,Python 定义网络与训练流程,再经 SDK 部署到服务器或移动端,覆盖模型构建、训练、部署全链路。
装完 tensorflow 之后敲下的第一行 import tensorflow as tf,加载的并不是一个 Python 包,而是一层薄薄的 Python 绑定——真正的计算图、算子内核、设备调度都在下面那层 C++ 里。这个分层决定了 TensorFlow 的很多行为:为什么它能同时给出 Python 和 C++ 的稳定 API,为什么训练脚本能一路走到 Android 手机上跑,为什么一个 tf.add(1, 2) 也要绕一圈 .numpy() 才能拿到值。
从这条分层线索切进去,比从头讲「什么是深度学习框架」更能看清这个项目。
一句话概括它的形状:两端是接口,中间是内核
README 的定位是 "an end-to-end open source platform for machine learning"——端到端。这个词不是修辞,它对应一条真实存在的链路:
- 入口端:Python 和 C++ 两套稳定 API(stable APIs),其他语言有 API 但不保证向后兼容(non-guaranteed backward compatible)。
- 中间层:C++ 写成的核心,承担图/算子/设备执行。
- 出口端:SDK 形式的部署能力,README 的构建产物表里明确列出了 Android(指向 LiteRT)和树莓派(Raspberry Pi 0/1、2/3 的 Python 3 wheel)这类目标。
所以它的架构可以按「接口层 / 内核层 / 部署层」来读,而不是按「前端 / 后端」:
| 层 | 组成 | 职责 | 素材依据 |
|---|---|---|---|
| 语言接口层 | Python API、C++ API(稳定);其他语言 API(不保证兼容) | 定义网络结构、组织训练流程、调用算子 | README 明确区分 stable 与 non-guaranteed 两类 API |
| 核心执行层 | C++ 实现的计算核心 | 承载算子执行与设备调度,是 Python 调用的实际落点 | 项目语言为 C++;tf.add(...).numpy() 说明 Python 侧拿到的是需显式取值的结果对象 |
| 设备与加速层 | CUDA GPU 支持(Ubuntu / Windows)、Device Plugins(DirectX、macOS Metal) | 把计算落到具体硬件 | README 安装段与 Device Plugins 说明 |
| 部署与产物层 | pip 包(tensorflow / tensorflow-cpu)、nightly 包、Android(LiteRT)、树莓派 wheel | 把训练好的模型送到服务器、移动端、边缘设备 | README 安装段 + Official Builds 表 |
| 周边工具层 | TensorBoard(可视化)、Official Models、Examples、Codelabs | 训练观测、参考实现、上手材料 | README Resources 段 |
这张表里最值得盯的是第一行和第四行:接口层分「稳定 / 不保证」两档,这解释了这个项目为什么体量大却仍然能用——Python 和 C++ 是你敢依赖的契约,其余语言接口是尽力而为。部署层按产物而不是按语言切分,同一个框架通过不同的构建产物落到不同设备上。
数据怎么从 Python 流到硬件
README 给的第一个程序小到不能再小,但它把整条链路暴露了:
shell$ python
python>>> import tensorflow as tf >>> tf.add(1, 2).numpy() 3 >>> hello = tf.constant('Hello, TensorFlow!') >>> hello.numpy() b'Hello, TensorFlow!'
两个细节值得停一下。
第一,tf.add(1, 2) 返回的不是 3,而是一个张量对象,要 .numpy() 才取回 Python 数值。这说明 Python 侧的操作是构造并执行一个计算对象,结果留在框架自己的表示里,转回 Python 是显式动作。同一行里 tf.constant('Hello, TensorFlow!') 的 .numpy() 返回 b'Hello, TensorFlow!'——字节串,因为张量底层是定长数值/字节缓冲,不是 Python 的 str。
第二,这两个例子一个走数值加法、一个走字符串常量,都在同一套 API 下成立。这就是「稳定 API」的含义:不管底下落到 CPU 还是 GPU,写法不变。
安装侧同样按「你要哪种产物」分流:
shellpip install tensorflow
这一条装的是带 CUDA GPU 支持的版本(Ubuntu 和 Windows)。只要 CPU 的话用更小的包:
shellpip install tensorflow-cpu
想升级加 --upgrade。DirectX 和 macOS Metal 这类设备不走主包,走 Device Plugins。要测最新代码用 tf-nightly / tf-nightly-cpu。想自己编译就照 install guide 的 build from source 走。
一个项目,多种构建产物
README 的 Official Builds 表是理解「多端部署」最实在的材料。它列的不是功能,是产物:
| 构建类型 | 产物去向 |
|---|---|
| Linux CPU | PyPI(tf-nightly) |
| Linux GPU | PyPI(tf-nightly) |
| Linux XLA | TBA |
| macOS | PyPI(tf-nightly) |
| Windows CPU | PyPI(tf-nightly) |
| Windows GPU | PyPI(tf-nightly) |
| Android | LiteRT |
| Raspberry Pi 0 / 1 | Python 3 wheel(armv6l) |
| Raspberry Pi 2 / 3 | Python 3 wheel(armv7l) |
读法:桌面和服务器端统一收敛到 PyPI 的 nightly 包;移动端走 LiteRT;树莓派这种 ARM 边缘设备给的是架构对应的 wheel(armv6l 和 armv7l 分开)。Linux XLA 一栏写的是 TBA,说明这条产物线在 README 写作时还没给出确定链接——这类「没填」的地方,比任何宣传语都更能说明项目的真实状态。
社区维护的平台和配置另有一张表,在 TensorFlow SIG Build 的 Community Builds Table 里。也就是说官方产物之外还有一层社区构建,覆盖面比官方表更宽。
从「能训」到「能改」:补丁流程也是架构的一部分
一个 2015 年创建、至今仍在推送的仓库,使用者迟早会遇到「我需要基于某个版本打补丁」的场景——修 bug 或堵安全漏洞。README 专门写了 Patching guidelines,四步:
- clone 仓库,切到目标版本对应的分支(例如 2.8 版本切
r2.8); - 应用改动(cherry-pick)并解决冲突;
- 跑 TensorFlow 测试,确认通过;
- 从源码构建 pip 包。
这四步反过来印证了前面的分层:Python 包是构建产物,不是源码本身。要改内核行为,必须回到源码、编译、再产出 wheel。这也是为什么「装 TensorFlow」和「改 TensorFlow」是两个量级的动作。
和同主题项目比,它站在哪
把素材里的对照项目摆在一起,定位差异很清楚:
| 项目 | 语言 | 约星标 | 它解决的问题 | 与 TensorFlow 的关系 |
|---|---|---|---|---|
| TensorFlow | C++ | 201081 | 从模型构建、训练到多端部署的完整链路 | — |
| PyTorch | Python | 104530 | 张量 + 动态神经网络,训练时像写普通 Python 一样逐行调试 | 最直接的同类竞争者;TensorFlow 的差异化在 C++ 内核 + 稳定 C++ API + 明确的部署产物线 |
| OpenCV | C++ | 91156 | 经典视觉算法 + 深度学习推理(可加载 ONNX 等模型) | 不是训练框架,是推理与图像处理侧;在「部署后怎么用模型」上与之相邻 |
| stable-diffusion-webui | Python | 165041 | 给 Stable Diffusion 套浏览器界面,不写代码调参出图 | 应用层工具,消费模型而非提供训练框架 |
| d2l-zh | Python | 81568 | 中文深度学习教材,Jupyter 里边读边跑 | 学习入口,不是框架 |
| cs-video-courses | 未标注 | 83658 | 计算机科学视频课程清单 | 与框架无直接关系,属自学资源 |
这张表能推出一个判断:PyTorch 和 TensorFlow 争的是「定义并训练模型」这一层,OpenCV 占的是「推理与视觉处理」这一层,stable-diffusion-webui 占的是「应用界面」这一层。 TensorFlow 的特殊之处在于它同时往两端伸:往下用 C++ 内核和 C++ 稳定 API 抓住执行与嵌入场景,往上用部署产物(Android / 树莓派 / 服务器)抓住落地场景。PyTorch 在素材里的描述重心是「研究者训练时逐行调试」——这是易用性与灵活性上的取向,和 TensorFlow「端到端平台」的取向不同。
注意星标数只能说明关注度,不能直接换算成能力高低:stable-diffusion-webui 星标比 PyTorch 还高,但它是应用不是框架。把不同层的项目放在一张表里排名次是误读,按层看才对。
谁该用它,谁该绕开
从素材能落地的判断有三条。
该用:你需要一条从 Python 训练脚本直通移动端或边缘设备的路径。README 的产物表把 Android(LiteRT)和树莓派 wheel 摆在明面上,这是「训练完还要部署到非服务器设备」的明确信号。你也需要 C++ 侧的稳定接口——README 说得很清楚,Python 和 C++ 是 stable API,其他语言不保证向后兼容,如果你的生产系统是 C++ 的,这个区分很关键。
可以缓一缓:如果你的工作主要是研究阶段反复改网络结构、逐行调试前向计算,素材里 PyTorch 的描述正是对着这个场景写的。TensorFlow 的强项在链路完整,不在「改一行看一行」的轻量迭代。
别搞混:OpenCV 能加载 ONNX 做推理,stable-diffusion-webui 能出图,d2l-zh 能教你原理——它们都不是训练框架。选型时先确认自己在哪一层:训练、推理、应用、学习,四层各有各的工具。
上手路径
素材给出的最短路径就是三步:装包、进 Python、跑那两个例子。
shellpip install tensorflow
python>>> import tensorflow as tf >>> tf.add(1, 2).numpy() 3 >>> hello = tf.constant('Hello, TensorFlow!') >>> hello.numpy() b'Hello, TensorFlow!'
跑通之后往哪走,README 的 Resources 段给了明确的路标:Tutorials 学用法,Official Models 看官方参考实现,Examples 看示例,Codelabs 做动手练习,TensorBoard 做训练可视化。想把模型送到设备上,就去看 LiteRT(Android)和构建产物表里对应平台的条目。
事实清单
- 源码:github.com/tensorflow/tensorflow
- 官网:tensorflow.org
- 许可:Apache-2.0
- 语言:C++
- 星标 201081 · forks 79637 · open issues 3397
- 仓库创建:2015-11-07 · 最近推送:2026-10-18
- topics:deep-learning, deep-neural-networks, distributed, machine-learning, ml, neural-network, python, tensorflow
- 稳定 API:Python、C++;其他语言 API 不保证向后兼容
- 安装方式:
pip install tensorflow(含 CUDA GPU 支持,Ubuntu / Windows)、pip install tensorflow-cpu(纯 CPU 小包)、Docker、源码构建、tf-nightly/tf-nightly-cpu - 非 CUDA 设备(DirectX、macOS Metal)通过 Device Plugins 支持
- 官方构建目标:Linux CPU/GPU/XLA、macOS、Windows CPU/GPU、Android(LiteRT)、Raspberry Pi 0/1 与 2/3
最后一条值得再强调一次:topics 里同时有 distributed 和 python,而语言标的是 C++——这不是矛盾,正是这个项目的结构本身。Python 是给人写训练流程的,C++ 是给机器执行和嵌入的,distributed 说明它把执行摊到了多设备上。三者叠在一起,才构成「端到端」这三个字的具体含义。