当前位置: 首页 > news >正文

模型学习系列之精度

背景

  • 模型配置中,精度BF16,FP8

BF16

  • 定义:16bit浮点,1符号+8指数+7位数,比FP32少16位尾数,但保留完整指数范围。

  • 特点:显存BF16占2字节(Byte);吞吐量BF16是FP32的2倍;数值稳定性与FP32相当(动态范围 ≈ 10⁻³⁸~10³⁸)

  • 场景:BF16训练任何规模的Transformer/LLM, 默认半精度

  • 硬件要求

    • NVIDIA A100 或 H100
    • AMD MI250 或 MI300
    • Intel Gaudi 2/3
    • Google TPU v4/v5
  • 框架:PyTorch 2.1+、TensorFlow 2.15+均支持BF16

  • 用法

    • 训练:开启开关
    # PyTorch
    # 训练脚本里一行即可
    model = model.to(dtype=torch.bfloat16)
    # 或者直接用 amp
    with torch.cuda.amp.autocast(dtype=torch.bfloat16):loss = model(input)# Transformers
    training_args = TrainingArguments(bf16=True,          # 一行打开...
    )
    
    • 推理:精度策略(几乎不管)

      • 前向、反向、权重、梯度、优化器状态 全部可以 BF16
      • 只有极少数场景(如梯度累加求和、Adam 的 exp_avg/exp_avg_sq)框架会内部用 FP32 累加,用户无感。
    • 验证

      • 直接跑训练500-1000 step, 看loss曲线与FP32是否重合。
      • 推理可直接用同一份BF16权重,无需额外量化脚本;
      • 精度掉点<0.1%即视为无损。
  • 总结:BF16数值稳定,半精度,训练首选。

FP8

  • 定义:8 bit浮点,分两种子格式(E4M3、E5M2), 只有2-3位尾数,指数位缩到4~5位。

  • 特点:显存FP8占1字节(byte), FP8峰值算力是BF16的2倍;数值容易不稳,FP8范围小,需要混合精度保护。动态范围 ≈ 10⁻⁶~10⁴(E4M3)或 10⁻¹⁴~10⁴(E5M2)

  • 场景

    • 训练超大模型(>70B)且GPU支持FP8 Tensor Core
    • 推理高Batch、高并发场景
    • 量化实验验证对精度影响可接受时。
  • 硬件要求

    • NVIDIA H100
    • Grace Hopper
    • Intel Gaudi3
    • Graphcore Bow-2000
  • 框架:PyTorch 2.1+、TensorFlow 2.15+均支持FP8

  • 使用

    • 训练

      • 开启开关
      # PyTorch(H100)
      torch.backends.cuda.enable_flash_sdp(True)          # 开启 Flash-Attention
      torch.backends.cudnn.allow_tf32 = True
      torch.set_float8_matmul_precision('high')           # 全局启用 FP8 GEMM
      with torch.fp8_autocast(enabled=True):              # 上下文loss = model(input)
      
      • 精度策略
      计算阶段建议格式备注
      前向 / 反向 GEMMFP8 (E4M3)权重、激活、梯度
      梯度累加FP32 累加器防止误差累积
      优化器状态BF16 / FP32Adam 一阶、二阶矩用 BF16,主权重 FP32
      敏感算子 (LayerNorm, Softmax, Embedding, MoE-Gate)FP16 或 BF16直接跳过 FP8,避免精度崩
      • 动态缩放(必配)
      # 延迟缩放(Delayed Scaling)
      from torch.cuda.amp import GradScaler
      scaler = torch.cuda.amp.GradScaler(init_scale=2.**14, growth_interval=1000)# 按 Tile/Block 缩放(NVIDIA MXFP8)
      每 128×128 权重块、1×128 激活 tile 单独 amax 缩放
      
      • 验证
      # 训练 1000 step,对比 FP32/BF16 loss 曲线;
      # 每 100 step 做一次 amax 分布直方图,确保无饱和。
      
  • 推理

    • 离线量化(一次转权重)
    # NVIDIA AMMO
    ammo quantize --model llama3_70b_fp16 \--output llama3_70b_fp8 \--dtype fp8_e4m3 \--calib-dataset wikitext-2-raw# Graphcore PopRTpython -m poprt.cli --input_model model.onnx \--output_model model_fp8.onnx \--precision fp8 --quantize
    • 在线量化(无需更改模型)
    # TensorRT-LLM
    from tensorrt_llm import LLM, QuantMode
    llm = LLM(model_dir, quant_mode=QuantMode.FP8)# StableDiffusion WebUI
    在设置页勾选 “Enable FP8 precision for SDXL” → 保存 → 重启即可
    
    • 缩放因子加载
    # TensorRT-LLM 会自动寻找 model.fp8_scales.json;如缺失,需手动调用
    config.set_flag(trt.BuilderFlag.FP8)
    config.add_optimization_profile(fp8_scale=scale_tensor)
    
  • 验证

    • 跑 1 k sample,比较 FP16 vs FP8 的 BLEU/ROUGE 或 CLIP-SIM 指标;
    • 显存下降 ≥ 1.8 GB、吞吐提升 ≥ 1.3× 视为合格。
  • 总结:把「FP8 开关 + 缩放策略 + 高精度累加」三板斧配好,就能在训练把显存和算力各砍半,在推理把显存再砍半。

总结

  • BF16:稳半精,训练首选;FP8:激进省,超大模型和推理神器。
http://www.lryc.cn/news/612203.html

相关文章:

  • 应急响应-windows篇
  • JAVA中关于多线程的学习和使用
  • 猫头虎AI分享:Claude Opus 新版 4.1 在 SWE-bench Verified 上准确率达到了 74.5%,在多文件代码重构方面表现突出
  • [AI 生成] 大数据数仓面试题
  • AI巨模型对决2025:五强争霸,谁能称王?
  • C++音视频流媒体开发面试题:音视频基础
  • 企业知识库:RAG技术实现流程总览(一)
  • 控制服务和守护进程-systemctl
  • C语言route命令详解:网络路由管理的核心工具
  • MaxKB 使用 MCP 连接 Oracle (免安装 cx_Oracle 和 Oracle Instant Client)
  • 搭建SAP S/4HANA虚拟机的安装与配置指南
  • 基于最大似然估计的卡尔曼滤波与自适应模糊PID控制的单片机实现
  • jdk动态代理如何实现
  • 力扣经典算法篇-45-回文数(数字处理:求余+整除,字符串处理:左右指针)
  • Unity笔记(二)——Time、Vector3、位置位移、角度、旋转、缩放、看向
  • 【历史人物】【范仲淹】简历与生平
  • 看不见的伪造痕迹:AI时代的鉴伪攻防战
  • NAT转化
  • 後端開發技術教學(二) 條件指令、循環結構、定義函數
  • 在 Visual Studio Code 中免费使用 Gemini 2.5 Pro API
  • 力扣面试150(48/150)
  • cacti
  • qt6 cmake vscode加载qrc图片资源
  • Milvus 向量数据库内存使用相关了解
  • 《第十篇》深入解析 `MilvusKBService`:基于 Milvus 的知识库服务实现
  • Vscode 解决 git插件Failed to connect to github.com port 443 connection timed out
  • FastAPI(未结束)
  • 实名认证 —— 腾讯云驾驶证识别接口
  • Spring_事务
  • docker相关操作记录