前言

【CMU 11-868】课程面向研究生开设,聚焦“从算法到工程”的大语言模型系统构建全过程。课程内容包括但不限于:

  • GPU 编程与自动微分:掌握 CUDA kernel 调用、并行编程基础,以及深度学习框架设计原理
  • 模型训练与分布式系统:学习高效的训练算法、通信优化(ZeRO、FlashAttention)、分布式训练框架(DDP、GPipe、Megatron-LM)。
  • 模型压缩与加速:量化(GPTQ)、稀疏化(MoE)、编译技术(JAX、Triton)、以及推理时的服务化设计(vLLM、CacheGen)。
  • 前沿技术与系统实践:涵盖检索增强生成(RAG)、多模态 LLM、RLHF 系统,以及端到端的在线维护和监控。

一、如何设计一个深度学习框架(How to design a deep learning framework)

1.1 TensorFlow 的设计理念(Design ideas in TensorFlow)

  1️⃣ 深度学习框架(Deep Learning Frameworks (also for LLMs))

  • 可灵活定义任何神经网络;
    • 支持未来的自定义算子/层;
  • 对机器学习工程师而言高效实用;
    • 隐藏底层细节(无需编写cuda);
    • 自动微分(无需手动推导梯度计算);
  • 在大规模训练和推理中具有高效性;
    • 能根据数据和模型大小自动扩展;
    • 自动硬件加速;

  2️⃣ 深度学习编程框架(Deep Learning Programming Framework)

  • 使用数据流图(数据在计算图中流动)来制定机器学习计算;
  • TensorFlow是一个用于表达机器学习算法的接口,也是一个用于执行此类算法的实现工具;
  • PyTorch是一个用于张量计算、深度学习和自动微分的编程框架;
方面 PyTorch TensorFlow JAX NumPy
主要用途 深度学习 深度学习 数值计算与机器学习 数值计算
编程范式 动态(即时执行,Eager) 静态图(Graph)或即时执行 函数式编程(函数变换) 过程式
自动求导 动态计算图 Autograd 静态 / 动态计算图 基于函数变换的 grad / jit 不支持
硬件支持 CPU / GPU / TPU CPU / GPU / TPU CPU / GPU / TPU 仅 CPU
易用性 非常 Pythonic 学习曲线稍陡 Pythonic + 函数式 非常简单,原生 Python
生态系统 PyTorch Lightning、TorchVision 等 TensorBoard、TFX 等 与 NumPy 高度集成 无完整生态
并行能力 DataParallel / DDP 多 GPU tf.distribute 多 GPU / TPU pmap 多 GPU / TPU 不支持并行

  3️⃣ TensorFlow框架(TensorFlow)

  核心思想:将数值计算表示为计算图。

  • 图节点是具有任意数量输入和输出的运算;
  • 图的边是在节点之间流动的张量;
  • 张量:多维数组。

  4️⃣ 作为张量的数据(Data as a Tensor)

  张量是多维数组。是向量和矩阵的推广。

  tf.constant([[1, 2], [3, 4]])是一个元素类型为int32的2x2张量。

  PyTorch对应的语法为:torch.tensor([[1., 2.], [3., 4.]])

  5️⃣ Tensorflow中的计算图(Computation Graph in Tensorflow)

  对于下面的过程:
h = 𝑅 𝐸 𝐿 𝑈 ( 𝑊 𝑥 + 𝑏 ) ℎ = 𝑅𝐸𝐿𝑈(𝑊𝑥 + 𝑏) h=RELU(Wx+b)
在这里插入图片描述

  TensorFlow框架的代码实现如下:

import tensorflow as tf
b = tf.Variable(tf.zeros((100,)))
W = tf.Variable(tf.random_uniform((784, 100), -1, 1))
x = tf.placeholder(tf.float32, (1, 784))
h = tf.nn.relu(tf.matmul(x, W) + b)

1.2 TensorFlow/PyTorch 中的基本图节点类型(Basic Graph node types in Tensorflow/Pytorch)

  1️⃣ 变量节点(Variable Node)

  定义:tf.Variable(initial_value=None, trainable=None, name=None)

  • 变量是有状态的节点,它们会输出其当前值。
  • 状态在图的多次执行中被保留。‘
  • 主要是参数。

  示例:b = tf.Variable(tf.zeros((100,)))
h = 𝑅 𝐸 𝐿 𝑈 ( 𝑊 𝑥 + 𝑏 ) ℎ = 𝑅𝐸𝐿𝑈(𝑊𝑥 + 𝑏) h=RELU(Wx+b)

在这里插入图片描述

  2️⃣ 占位符节点(Placeholder Node (Tensorflow v1))

  定义:tf.placeholder

  • 表示输入、标签……;
  • 值在执行时输入;
  • TensorFlow v2中的占位符无需明确定义;

  示例:x = tf.placeholder(tf.float32, (1, 784))
h = 𝑅 𝐸 𝐿 𝑈 ( 𝑊 𝑥 + 𝑏 ) ℎ = 𝑅𝐸𝐿𝑈(𝑊𝑥 + 𝑏) h=RELU(Wx+b)
在这里插入图片描述

  3️⃣ 数学运算(Mathematical Operations)

  • 矩阵乘法:tf.linalg.matmul(a, b)(PyTorch:torch.matmul(a, b));
  • 元素相加:tf.math.add(a, b)(PyTorch:torch.add(a, b));
  • 激活函数:tf.nn.relu(a)(ReLU: R e L u ( x ) = { 0 , x ≤ 0 x , x > 0 ReLu(x)=\begin{cases}0, & x\leq0 \\ x, & x>0\end{cases} ReLu(x)={0,x,x0x>0,PyTorch:torch.nn.ReLU(a))。

  示例: h = R e L U ( W x + b ) h=ReLU(Wx + b) h=ReLU(Wx+b)

在这里插入图片描述

  4️⃣ 运行图(Running the Graph)

  在TensorFlow v1中,要通过会话部署图:绑定到特定的执行上下文(例如CPU、GPU)。

with tf.Session() as s:
	…
	s.run() 

在这里插入图片描述

  5️⃣ 定义损失(Defining Loss)

  • 为标签使用占位符;
  • 使用标签和预测构建损失节点;
prediction = tf.nn.softmax(...) #Output of neural network
label = tf.placeholder(tf.float32, [100, 10])
cross_entropy = -tf.reduce_sum(label * tf.log(prediction), axis=1)

  6️⃣ 梯度计算(Gradient Computation)

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
  • tf.train.GradientDescentOptimizer 是一个优化器对象;
  • tf.train.GradientDescentOptimizer(lr).minimize(cross_entropy) 会向计算图中添加优化操作;
  • TensorFlow 图节点附加了梯度运算;
  • 通过自动微分计算相对于参数的梯度;

1.3 总体设计原则(Overall design principles)

  1️⃣ TensorFlow的核心构造(Core TensorFlow Constructs)

  • 所有节点都返回张量;
  • 节点的计算方式对于TensorFlow框架是无法区分的(How a node computes is indistinguishable to TensorFlow);
  • 在TensorFlow v1中:元编程——构建用于实际计算的图。此时尚未进行任何计算!
  • TensorFlow 2 版本具有即时执行模式,计算会立即执行(本质上是构建图并应用计算)。

  2️⃣ 设计原则(Design Principles)

  • 基本运算符的数据流图;
  • 延迟执行(两阶段):
    • 1、定义程序,即带有占位符的符号数据流图,本质上是构建计算图;
    • 2、在可用设备集上执行程序的优化版本。

  3️⃣ 动态流控制(Dynamic Flow Control)

  问题:支持包含条件和迭代控制流的机器学习算法,例如

  • 循环神经网络(RNN)和长短期记忆网络(LSTM);
  • 自回归解码器(Autoregressive decoder);

  解决方案:添加条件(if语句)和迭代(while循环)编程结构。

  4️⃣ TensorFlow架构(TensorFlow Architecture)

  核心部分采用C++编写,非常低的开销;

  具有用于指定/驱动运算的不同前端,支持Python和C++,同时易于添加更多语言;

在这里插入图片描述

  5️⃣ TensorFlow实现(TensorFlow Implementation)

  • 半解释型;
  • 每个基本操作调用一次GPU内核;
  • 可通过自定义C++进行批量操作;
  • 保证数据流图中的基本类型安全(图构建时出错)。

在这里插入图片描述

二、动手实现一个迷你Tensorflow(Hands-on practice to implement a mini-tensorflow)

  作业链接:https://github.com/llmsystem/llmsys_code_examples/tree/mai n/mini_tensorflow

  请按照说明在以下位置填写代码:

  https://github.com/llmsystem/llmsys_code_examples/blob/mai n/mini_tensorflow/mini_tensorflow.ipynb

  完整代码提供于:

  https://github.com/llmsystem/llmsys_code_examples/blob/mai n/mini_tensorflow/mini_tensorflow_full.ipynb

  

三、程序在TensorFlow框架的执行(Execution in Tensorflow)

  1️⃣ Tensorflow执行关键组件(Tensorflow Execution Key Components)

  类似于MapReduce、Apache Hadoop、Apache Spark等。

在这里插入图片描述

  2️⃣ 客户端(Client)

在这里插入图片描述

  3️⃣ 主节点(Master)

在这里插入图片描述

  4️⃣ 计算图划分(Computation Graph Partition)

在这里插入图片描述
在这里插入图片描述

  5️⃣ 执行(Execution)

在这里插入图片描述

  6️⃣ 同步与异步(Synchronous vs Asynchronous)

  • 由节点决定:用于屏障的队列节点;
  • 同步速度几乎与异步相当;
  • 默认模型是异步的;

  7️⃣ 容错(Fault Tolerance)

  假设:

  • 细粒度操作:“任务不太可能频繁失败,以至于单个操作需要容错能力” );
  • “许多学习算法不需要强一致性”;

  解决方案:用户级检查点(提供2个操作):

  • save():将一个或多个张量写入检查点文件;
  • restore():从检查点文件中读取一个或多个张量。

  8️⃣ 性能(Performance)

  单节点性能:

在这里插入图片描述

  分布式吞吐量:

在这里插入图片描述

推荐课外阅读资料

  TensorFlow论文:https://www.usenix.org/system/files/conference/osdi16/osdi16-abadi.pdf

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐