跳转到内容

TensorFlow 面试题

9 道题
分类
AI 与大模型
子分类
ml
题目数
9 道
已阅读 0 / 9 题
1 TensorFlow 计算图:静态图、动态图与 Eager Execution

答案:

TensorFlow 的计算图(Computational Graph)经历了从静态图到默认动态图(Eager Execution)的演进,核心差异在于算子的执行时机与优化空间。

  • 静态图(Graph Mode / tf.Graph):TF 1.x 默认模式。算子先被构建为有向无环图(DAG),节点为 Operation,边为 Tensor。优势在于可对图进行常量折叠、算子融合、内存优化、跨设备并行等编译期优化;典型工作流为 构建图 → tf.Session().run() 执行。
  • 动态图(Eager Execution):TF 2.x 默认模式。算子在 Python 调用时立即执行并返回具体数值(NumPy ndarray),与 PyTorch 一致。优势在于调试直观、支持 Python 控制流原语、模型可视为普通 Python 函数。
  • tf.function 桥接@tf.function 装饰器将 Python 函数 trace 一次,转换为可调用的 ConcreteFunction,内部使用 AutoGraph 将 Python 控制流(if/for/while)转换为图原语(tf.cond/tf.while_loop),兼顾易用性与静态图性能。
import tensorflow as tf

# Eager 模式:默认即动态
@tf.function  # 装饰后将函数编译为静态图
def forward(x, w, b):
    return tf.matmul(x, w) + b
维度静态图 (TF 1.x)Eager (TF 2.x)tf.function
执行时机Session.run 触发立即执行首次调用 trace,后续走图
调试能力需 tfdbg/Session 输出直接 print/断点需关闭优化或用 tf.print
性能优化全图优化子图优化(grappler)
控制流需 tf.cond/tf.while_loop原生 PythonAutoGraph 自动转换
分布式部署graph.as_graph_def() 直接序列化需 tf.function 转换导出 SavedModel 友好
2 Keras API:Sequential、Functional API 与 Model Subclassing

答案:

tf.keras 提供三种模型构建范式,灵活度与复杂度递增。

  • Sequential API:线性栈式模型,仅支持单输入单输出、无分支结构。适合快速搭建 MLP、CNN 简单堆叠。
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten
model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])
  • Functional API:以层调用形式构建 DAG,支持多输入/多输出、残差连接、共享层。生产环境最常用,便于通过 plot_model 导出结构图。
from tensorflow.keras import Model, Input
from tensorflow.keras.layers import Dense, Concatenate

input_a = Input(shape=(32,), name='input_a')
input_b = Input(shape=(64,), name='input_b')
x = Concatenate()([input_a, input_b])
output = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[input_a, input_b], outputs=output)
  • Model Subclassing:继承 tf.keras.Model,在 __init__ 定义层、在 call 中显式编写前向传播。最大灵活度,可写自定义训练逻辑,但失去了序列化与 model.summary() 的部分便利性。
class MyModel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = Dense(64, activation='relu')
        self.dense2 = Dense(10)
    def call(self, x, training=False):
        x = self.dense1(x)
        return self.dense2(x)

选型:优先 Functional API,调试或实现新型算子时使用 Subclassing,原型验证或教学场景使用 Sequential。

3 tf.data 流水线与 tf.function 编译优化

答案:

tf.data.Dataset 提供高性能输入管道,配合 tf.function 编译可消除 Python 与 TF 运行时的桥接开销。

  • 核心算子链from_tensor_slices/from_generator 创建数据源 → map(可并行 num_parallel_calls=tf.data.AUTOTUNE)→ batch/shuffle/repeatprefetch(tf.data.AUTOTUNE') 异步预取。
  • 性能优化原则
    • prefetch 重叠数据准备与模型计算
    • map 内做向量化,避免 per-element Python 逻辑
    • num_parallel_callsprefetch buffer 均设为 AUTOTUNE,由运行时根据 CPU/GPU 负载自动调优
    • 顺序 cache → shuffle → batch → map → prefetchshuffle → batch → cache → map → prefetch 在内存占用与随机性上各有取舍
  • tf.function 关键点
    • 第一次调用 trace 建图,后续调用直接执行图;输入张量 dtype/shape 变化会触发 retrace
    • input_signature=[tf.TensorSpec(shape, dtype)] 锁定签名避免多次 trace
    • tf.function(experimental_relax_shapes=True) 放宽 shape 限制
    • 函数内仅可使用 TF 原语(tf.cond/tf.while_loop/AutoGraph 转换后的控制流)
def preprocess(image, label):
    image = tf.cast(image, tf.float32) / 255.0
    return image, label

ds = (tf.data.Dataset.from_tensor_slices((x_train, y_train))
      .shuffle(10000)
      .map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
      .batch(32)
      .prefetch(tf.data.AUTOTUNE))

@tf.function
def train_step(x, y):
    with tf.GradientTape() as tape:
        logits = model(x, training=True)
        loss = loss_fn(y, logits)
    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))
    return loss

常见陷阱:在 tf.function 内调用 print 仅在 trace 时执行一次;tf.Variable 创建应在函数外;Python 整数/字符串 list 会触发重追踪。

4 分布式训练策略:MirroredStrategy / MultiWorkerMirroredStrategy / TPUStrategy / ParameterServerStrategy

答案:

tf.distribute.Strategy 抽象统一了多卡多机训练,核心机制是数据并行(每 worker 持有完整模型副本,按 batch 维度切分数据)与梯度同步

  • MirroredStrategy:单机多卡同步训练。每张 GPU 持有模型副本,使用 AllReduce(默认 NCCL)同步梯度,等效于 tf.distribute.NcclAllReduce。适合单机 1-8 卡,配置最简单:
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    model = build_model()
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(train_dataset, epochs=10)
  • MultiWorkerMirroredStrategy:多机多卡同步训练,本质是 Mirrored 在多机的扩展,依赖 TF_CONFIG 环境变量声明 cluster spec(worker/parameter_server 角色、IP:PORT)。同步原语默认 CollectiveOps(基于 gRPC/RDMA),大模型训练可换 HierarchicalCopyAllReduce 优化跨机带宽。
  • TPUStrategy:TPU Pod 上的同步训练,使用 experimental_initialize=True 与 TPU 拓扑感知 layout。experimental.DistributeAcrossReplicasAndHosts 自动将 batch 切分到 8 核 chip 与多 host。
  • ParameterServerStrategy:异步训练,适用于超大规模稀疏模型(推荐系统、Embedding 巨表)。Parameter Server 持有变量,Worker 仅做前向/反向,通过 ParameterServerStrategyTF_CONFIGparameter_server 角色配置。生产中常配合 TF_CONFIG 动态注入或 cluster_resolver(KubeFlow/Cloud TPUs)自动发现。
策略拓扑同步性适用场景
MirroredStrategy单机多卡同步 AllReduce单机 1-8 GPU 中等模型
MultiWorkerMirroredStrategy多机多卡同步 Collective数据中心规模 Dense 模型
TPUStrategyTPU Pod同步 XLAGoogle Cloud TPU 训练
ParameterServerStrategy多机 PS-Worker异步稀疏特征、大 Embedding

关键 API

  • strategy.scope():在该上下文内创建的变量/层为可分发副本
  • strategy.run(fn, args=...):在每个 replica 上执行 fn
  • strategy.experimental_distribute_dataset(ds):自动切分 batch 到 replicas
5 SavedModel 格式与模型导出

答案:

SavedModel 是 TensorFlow 推荐的语言无关、平台无关的序列化格式,包含完整计算图、权重、签名(Signatures)、变量与 assets。

  • 目录结构
saved_model/
├── saved_model.pb          # MetaGraphDef(计算图 + 签名)
├── variables/
│   ├── variables.data-00000-of-00001
│   └── variables.index     # 变量清单
├── assets/                 # 额外资源(词表、图片等)
└── assets.extra/           # 由用户附加
  • 导出方式
# 方式一:使用 tf.saved_model.save(支持 Keras/Subclass)
tf.saved_model.save(model, export_dir='/path/to/saved_model')

# 方式二:Keras 专用 model.export('export_dir')
model.export('/path/to/saved_model')
  • 签名(Signature):定义输入输出契约,通过 @tf.function(input_signature=[...]) + tf.saved_model.save(..., signatures=...) 注册。常见签名包括 serving_default(推理)、train(继续训练)。
  • 加载方式
    • Python:tf.saved_model.load(export_dir) 返回包含具体函数的对象
    • C++:tensorflow::LoadSavedModel
    • Java/JS:分别通过 SavedModelBundle.loadtf.loadGraphModel
    • 命令行:saved_model_cli show --dir /path --all 查看签名与输入输出
  • 版本演进
    • TF 1.x 的 GraphDef/Checkpoint 组合被 SavedModel 取代
    • TF 2.x 推荐 SavedModel 而非 H5(.h5 丢失计算图,无法部署到 TF Serving/TFLite/TF.js)

最佳实践

  1. 训练时使用 Keras .h5 断点续训,最终导出使用 SavedModel
  2. 导出前调用 model.predict() 做一次 warm up 触发 trace
  3. 通过 signatures 显式定义推理签名,避免输入 shape 模糊
6 TFX(TensorFlow Extended)端到端流水线

答案:

TFX 是 Google 开源的生产级 ML 流水线框架,将数据验证、特征工程、训练、评估、部署串联为可编排 DAG,定位类比 Kubeflow Pipelines / Airflow 的 ML 领域版本。

  • 核心组件
    • ExampleGen:从 CSV/BigQuery/TFRecord 摄入数据,生成 tf.Example 记录
    • StatisticsGen / SchemaGen / ExampleValidator:数据统计推断 Schema,校验训练-服务偏差(training-serving skew)与异常值
    • Transform:使用 tf.transform 执行特征工程(归一化、分桶、词表),关键点是在导出图内完成预处理,保证训练与服务时特征处理一致
    • Trainer:运行 trainer_fn 函数,输出 SavedModel
    • Tuner / Trainer(TFX 1.x):超参搜索(KerasTuner)与训练分离
    • Evaluator:对候选模型做 Fairness Indicators/Model Analysis 切片评估,对比 baseline(EvalConfig 中指定)
    • Pusher:将验证通过的模型推送到 TF Serving / TF Lite / TF.js / Vertex AI
  • 编排器(Orchestrator):TFX 本身不调度,依赖 Airflow / Kubeflow Pipelines / Vertex Pipelines 等外部编排器。组件以 ComponentSpec(输入/输出/参数)形式注册为有向无环图。
  • 元数据(ML Metadata, MLMD):所有产物(数据集、模型、指标)写入元数据库(MySQL/SQLite),支持血缘追溯与实验复现。
# Trainer 函数示例
def trainer_fn(fn_args: TrainerFnArgs):
    tf_transform_output = tft.TFTransformOutput(fn_args.transform_graph_path)
    train_dataset = input_fn(fn_args.train_files, tf_transform_output, 32)
    model = build_keras_model()
    model.fit(train_dataset, epochs=fn_args.train_steps // 32)
    signatures = {'serving_default': serving_default_fn(tf_transform_output)}
    model.save(fn_args.serving_model_dir, signatures=signatures)

适用场景:需要持续训练(CT)、数据-模型血缘追踪、训练-服务一致性的生产 ML 系统;中小项目可直接使用 Vertex AI / SageMaker 等托管平台简化版。

7 TensorFlow Serving 部署与模型版本管理

答案:

TF Serving 是面向生产环境的高性能模型服务系统,支持多模型、多版本、动态加载、热更新与 gRPC/RESTful API。

  • 架构组件
    • Servables:被服务化的对象,通常为一个 SavedModel
    • Loaders:管理 Servable 生命周期(Load/Unload)
    • Sources:文件系统 / RPC 通知 Loader 加载新版本
    • Managers:维护 Servable 全生命周期,按版本号管理
    • Core:通过 Manager 暴露 gRPC(端口 8500)与 REST(端口 8501)接口
  • 模型仓库结构
/models/
└── my_model/
    ├── 1/        # 版本号目录(整数)
    │   ├── saved_model.pb
    │   └── variables/
    ├── 2/
    └── 3/

数字目录名即版本号,TF Serving 默认加载最大版本号。可通过 --model_config_file 加载 models.config 一次性配置多模型与标签。

  • 部署方式
    • Docker 官方镜像tensorflow/serving:latest-gpu,挂载 /models 目录并通过环境变量 MODEL_NAME 指定
    • Kubernetes:通过 Deployment + ConfigMap 挂载 PVC,配合 NodePort/Ingress 暴露 8500/8501
    • BentoML / TF Serving Operator:CNCF 生态对 TF Serving 的 K8s 封装
# 启动 TF Serving
docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/models,target=/models \
  -e MODEL_NAME=my_model -t tensorflow/serving

# REST 推理
curl -X POST http://localhost:8501/v1/models/my_model:predict \
  -d '{"instances": [[1.0, 2.0, 3.0, 4.0]]}'
  • 高级特性
    • 动态配置:通过 ModelConfigService gRPC 动态调整加载策略
    • 批处理(AsynchronousBatch):合并多个并发请求降低 GPU 空闲
    • 监控指标:Prometheus exporter 暴露 request_countrequest_latency
    • 热更新:监控 models.config 文件变化,平滑过渡请求到新版本
8 TensorRT 推理优化与 TF-TRT

答案:

NVIDIA TensorRT 是面向 NVIDIA GPU 的高性能深度学习推理优化器,通过算子融合、精度校准、内核自动调优实现数倍加速。

  • 核心优化手段
    • 层/张量融合(Layer & Tensor Fusion):将 Conv+BN+ReLU 合并为单一 CUDA kernel,减少访存与 launch 开销
    • 精度校准(Precision Calibration):FP32 → FP16/INT8,在 1% 以内精度损失下获得 ~2-4x 加速
    • 内核自动选择(Kernel Auto-tuning):遍历候选 CUDA kernel 选取对当前 shape 最优的实现
    • 动态张量显存(Dynamic Tensor Memory):复用中间张量显存,降低峰值占用
    • 多流执行(Multi-Stream Execution):并发处理多个推理请求
  • TF-TRT 集成
from tensorflow.python.compiler.tensorrt import trt_convert as trt

# 将 SavedModel 转为 TF-TRT 优化模型
converter = trt.TrtGraphConverterV2(
    input_saved_model_dir='/path/to/saved_model',
    precision_mode=trt.TrtPrecisionMode.FP16  # 或 INT8
)
converter.convert()
converter.save('/path/to/trt_model')

# 或使用 TRTEngineOp 局部优化
params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
    precision_mode='FP16',
    max_batch_size=64,
    minimum_segment_size=3
)
converter = trt.TrtGraphConverterV2(input_saved_model_dir='...', **params)
  • TensorFlow Serving 加载 TRT 模型:TF Serving 2.x 容器内置 TensorRT,--enable_tensorrt 即可对 SavedModel 中的 TRTEngineOp 子图自动优化。
  • ONNX 路径:先 tf2onnx 导出 ONNX,再用 trtexec 编译为 TensorRT engine,部署到 Triton Inference Server(TF Serving 的超集)。

关键指标(以 ResNet-50 / V100 为例):

精度吞吐量 (img/s)相对加速比
FP32 原生 TF6001.0x
FP16 TF-TRT14002.3x
INT8 TF-TRT24004.0x
9 TensorFlow vs PyTorch:生态、易用性与生产化能力对比

答案:

TensorFlow 与 PyTorch 是当前主流深度学习框架,二者在研究-生产光谱上各有侧重。

维度TensorFlow (2.x)PyTorch (2.x)
默认执行Eager + tf.functionEager + torch.compile (TorchDynamo+Inductor)
API 风格声明式(Functional API)命令式(Pythonic 风格)
调试较好(tf.print、tfdbg)优秀(原生 Python 断点、pdb)
分布式tf.distribute.Strategy 统一抽象DDP / FSDP / DeepSpeed 多工具组合
静态图优化tf.function + Grappler + XLAtorch.compile + AOTAutograd + Inductor
部署生态TF Serving / TFLite / TF.js / TFXTorchServe / ExecuTorch / ONNX
移动端TFLite 一等公民PyTorch Mobile (ExecuTorch 新)
浏览器TF.js弱(需 ONNX 间接)
大模型支持KerasNLP / TF 端较弱transformers / accelerate / DeepSpeed 强
工业生产化TFX 完整流水线、Vertex AI 全托管依赖第三方(Kubeflow、Metaflow)
研究社区占比下降当前主流(arXiv 论文默认实现)
  • TF 优势领域
    • 移动端/嵌入式(Android/iOT)部署:TFLite 工具链成熟
    • 浏览器端推理:TF.js
    • 超大规模稀疏模型(推荐、广告):TF 生态在 Embedding 与 PS 架构有历史积累
    • TPU 训练:原生支持
  • PyTorch 优势领域
    • 研究/学术:API 更 Pythonic,社区接受度更高
    • LLM 训练/推理:Hugging Face、Megatron-LM、vLLM、SGLang 等主流工具默认 PyTorch
    • 新型编译优化:TorchDynamo 在 dynamic shape 处理上比 tf.function 更灵活

当前行业地位(截至 2025 年):

  • 研究/学术:PyTorch 占据主导(CVPR/NeurIPS 论文 >80% 使用 PyTorch)
  • LLM 训练/推理:PyTorch 几乎垄断(vLLM、SGLang、DeepSeek、Llama 均基于 PyTorch)
  • 移动端/端侧推理:TFLite 仍是事实标准(Core ML 与 ExecuTorch 追赶中)
  • 企业传统业务(CV/NLP 分类/检测):两者并存,存量 TF 模型仍大量在线运行
  • 趋势:PyTorch 在 LLM 时代进一步扩大领先;TensorFlow 在 JAX(TFP 团队转岗)与 Keras 简化下重新聚焦中小模型与端侧部署

选型建议

  • 新启动 LLM/RAG/Agent 项目:PyTorch + Hugging Face
  • 移动端/嵌入式 ML:TFLite
  • 已有 TF 1.x 存量系统:评估迁移到 TF 2.x 或 PyTorch 的成本
  • 学术研究/算法迭代:PyTorch(调试 + dynamic graph)