趋近智
训练大型语言模型常会遇到计算瓶颈。标准的32位浮点数()虽然准确,但会消耗大量内存和计算资源。混合精度训练使用较低精度的格式,如16位浮点数()和bfloat16(),以减轻这些问题。了解这些格式的特点是有效使用它们的第一步。
浮点数是计算机用来模拟实数的方式。每种格式都使用固定数量的位,通常分为三部分:符号位(表示数字是正数还是负数)、指数(表示数字的量级或范围)和尾数(表示精度或有效数字)。这些格式之间的考量归结为它们如何在指数和尾数之间分配位。
IEEE 754标准单精度浮点格式,通常称为,使用32位。这通常是深度学习 (deep learning)框架和科学计算中的默认格式。
尽管稳定,但它需要大量资源。每个参数 (parameter)需要4字节存储空间,且涉及数字的计算耗费计算力 (compute)。对于拥有数十亿参数的模型来说,这很快成为一个瓶颈。
import torch
# 创建一个FP32张量(PyTorch默认)
fp32_tensor = torch.tensor([1.0, 2.0, 3.0])
print(f"数据类型: {fp32_tensor.dtype}")
print(f"每个元素的内存占用(字节): {fp32_tensor.element_size()}")
# 输出:
# 数据类型: torch.float32
# 每个元素的内存占用(字节): 4
IEEE 754半精度格式,或称,与相比将位数减半,仅使用16位。
Inf)或下溢(小梯度变为零,停止学习)。范围受限需要谨慎处理,常需要梯度缩放等技术(我们将在本章稍后介绍)以将值保持在可表示的范围内。
import torch
# 创建一个FP16张量
fp16_tensor = torch.tensor([1.0, 2.0, 3.0]).half() # 或 .to(torch.float16)
print(f"数据类型: {fp16_tensor.dtype}")
print(f"每个元素的内存占用(字节): {fp16_tensor.element_size()}")
# 演示范围问题(下溢)
small_val_fp32 = torch.tensor(1e-7, dtype=torch.float32)
small_val_fp16 = small_val_fp32.half()
print(f"FP32中的小值: {small_val_fp32}")
print(f"FP16中的小值: {small_val_fp16}") # 可能变为 0.0
# 输出:
# 数据类型: torch.float16
# 每个元素的内存占用(字节): 2
# FP32中的小值: 9.999999974752427e-08
# FP16中的小值: 0.0
BFloat16,或称,是谷歌大脑开发的另一种16位格式。与相比,它提供了不同的考量。
的较低精度通常被认为是深度学习 (deep learning)训练中可接受的,因为对于范围变化的稳定性通常比极高的精度更为重要。它已成为混合精度训练的热门选择,特别是对于大型模型。
import torch
# 检查BF16是否可用(需要特定的硬件/PyTorch版本)
bf16_available = torch.cuda.is_bf16_supported()
print(f"BF16可用: {bf16_available}")
if bf16_available:
# 创建一个BF16张量
bf16_tensor = (torch.tensor([1.0, 2.0, 3.0])
.bfloat16()) # 或 .to(torch.bfloat16)
print(f"数据类型: {bf16_tensor.dtype}")
print(
f"每个元素的内存占用(字节): {bf16_tensor.element_size()}"
)
# 演示范围(比FP16更好地处理小值)
small_val_bf16 = small_val_fp32.bfloat16()
print(
f"BF16中的小值: {small_val_bf16}"
) # 表示其量级,但精度较低
# 示例输出(如果支持BF16):
# BF16可用: True
# 数据类型: torch.bfloat16
# 每个元素的内存占用(字节): 2
# BF16中的小值: 9.9609375e-08
else:
print("当前硬件/PyTorch版本不支持BF16。")
以下是主要特点的简要总结:
| 特性 | FP32(单精度) | FP16(半精度) | BF16(BFloat16) |
|---|---|---|---|
| 总位数 | 32 | 16 | 16 |
| 符号位 | 1 | 1 | 1 |
| 指数位 | 8 | 5 | 8 |
| 尾数位 | 23 | 10 | 7 |
| 动态范围 | 宽 | 窄 | 宽(与FP32相同) |
| 精度 | 高 | 中 | 低 |
| 每个值的内存占用 | 4 字节 | 2 字节 | 2 字节 |
| 稳定性风险 | 低 | 高(范围) | 低(精度) |
| 硬件支持 | 普遍 | 广泛 | 较新加速器 |
了解这些基本差异对于实施混合精度训练时做出明智决策非常重要。尽管和都提供了内存和潜在的速度优势,但它们不同的范围和精度特点会带来不同的稳定性考量和性能取舍,我们将在后续章节中讨论这些。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•