FEATURED · 精选文章

【AI大模型面试真题】字节LLM岗面试:BF16凭什么比FP16更适合大模型训练?

发布时间 / 2026/8/27 14:20:28
来源 / 创域科博编辑部
栏目 / 资讯中心
【AI大模型面试真题】字节LLM岗面试:BF16凭什么比FP16更适合大模型训练? 前言随着DeepSeek爆火面试中也越来越高频出现因此训练营也更新了DeepSeek系列技术的深入拆解。包括MLA、MTP、专家负载均衡、FP8混合精度训练Dual-Pipe等关键技术力求做到全网最硬核的解析~本篇文章主要对训练 LLM 以及部署应用时的精度问题进行了一些探讨和实践读过后应该会对常用的浮点数 FP16FP32BF16 有一个更好的理解~浮点数据类型在 IEEE 754-2019(2008) 标准中进行了详细的定义定义了不同精度的浮点数格式如 binary16、binary32 和 binary64分别用 16 位、32 位和 64 位二进制来表示。想要更全方位深入的了解的话可以点引用查看官方的 paper。下面进行一些常用的浮点数介绍。1、FP16FP16 也叫做 float16两种叫法是完全一样的全称是 Half-precision floating-point(半精度浮点数)在 IEEE 754 标准中是叫做 binary16。简单来说是用 16 位二进制来表示的浮点数来看一下是怎么表示的(以下图都来源于维基百科)其中# 第一种计算方式 1.1001000000 1 * 2^0 1 * 2^(-1) 0 * 2^(-2) 0 * 2^(-3) 1 * 2^(-4) 0 * 2^(-5) 0 * 2^(-6) 0 * 2^(-7) 0 * 2^(-8) 0 * 2^(-9) 1.5625 # 第二种计算方式 1.1001000000 1 576(1001000000变成10进制)/1024 1.5625所以正常情况下计算公式就是举一个例子来计算这个是 FP16(float16) 能表示的最大的正数同样这个是 FP16(float16) 能表示的最大的负数这就是 FP16(float16) 表示的范围 [-6550465504]。我们来看一些特殊情况FP16(float16) 能表示最小的正数是多少呢我们就不一一的计算了贴一个 FP16(float16) 特殊数值的情况上表中subnormal number 是指指数位为全 0 的特殊情况情况其他的也是一些常见的特殊情况。接下来看一下在 pytorch 中是如何表示的torch.finfo(torch.float16)# 结果finfo(resolution0.001,min-65504,max65504,eps0.000976562,smallest_normal6.10352e-05,tiny6.10352e-05,dtypefloat16)一些解释resolution分辨率这个浮点数类型的在十进制上的分辨率表示两个不同值之间的最小间隔。对于torch.float16分辨率是 0.001就是说两个不同的torch.float16数值之间的最小间隔是 0.001。min最小值对于torch.float16最小值是 -65504。max最大值对于torch.float16最大值是 65504。eps机器精度机器精度表示在给定数据类型下比 1 大的最小浮点数对于torch.float16机器精度是 0.000976562对应上表中的 smallest number larger than one。smallest_normal最小正规数最小正规数是大于零的最小浮点数对于torch.float16最小正规数是 6.10352e-05对应上表中的 smallest positive normal numbertiny最小非零数最小非零数是大于零的最小浮点数对于torch.float16最小非零数也是 6.10352e-05也是对应上表中的 smallest positive normal number这里要详细的解释一下resolution分辨率这个是我们以十进制来说的两个数之间的最小间隔我们看一个例子就会明白importtorch# 把10进制数转化为 torch.float16num3.141num_fp16torch.tensor(num).half()print(num_fp16)# 结果tensor(3.1406,dtypetorch.float16)num3.1415num_fp16torch.tensor(num).half()print(num_fp16)# 结果tensor(3.1406,dtypetorch.float16)# 可以看到3.141和3.1415间隔只有0.0005所以在float16下结果是一样的num3.142num_fp16torch.tensor(num).half()print(num_fp16)# 结果tensor(3.1426,dtypetorch.float16)# 可以看到结果不一样了从上面代码可以看到十进制中相隔 0.001在 float16 中才会有变化这个时候会有一个疑问难道精度只有小数点后三位那怎么之前见了很多参数都是有很多小数点的那我们来看一下全过程把 float16 变成 2 进制再把 2 进制变成 16 进制importstructdeffloat16_to_bin(num):# 将float16数打包为2字节16位使用struct.packpacked_numstruct.pack(e,num)# 解包打包后的字节以获取整数表示int_valuestruct.unpack(H,packed_num)[0]# 将整数表示转换为二进制binary_representationbin(int_value)[2:].zfill(16)returnbinary_representation num3.141num_fp16torch.tensor(num).half()print(num_fp16)binary_representationfloat16_to_bin(num_fp16)print(binary_representation)# 打印二进制表示# 结果tensor(3.1406,dtypetorch.float16)0100001001001000num3.1415num_fp16torch.tensor(num).half()binary_representationfloat16_to_bin(num_fp16)print(binary_representation)# 打印二进制表示# 结果tensor(3.1406,dtypetorch.float16)0100001001001000# 还是一样的结果num3.142num_fp16torch.tensor(num).half()print(num_fp16)binary_representationfloat16_to_bin(num_fp16)print(binary_representation)# 打印二进制表示# 结果tensor(3.1426,dtypetorch.float16)0100001001001001# 不一样了再看一下把 2 进制变成 16 进制defbinary_to_float16(binary_string):# 检查输入是否是有效的16位二进制字符串iflen(binary_string)!16:raiseValueError(输入的二进制字符串必须是16位长)# 提取组成部分符号、指数、尾数signint(binary_string[0])# 符号位exponentint(binary_string[1:6],2)# 指数位mantissaint(binary_string[6:],2)/1024.0# 尾数位除以2的10次方即1024以获得10位精度# 根据符号、指数和尾数计算float16值value(-1)**sign*(1mantissa)*2**(exponent-15)returnvalue# 10进制3.141对应float163.1406binary_representation0100001001001000# 将二进制表示转换为float16float16_valuebinary_to_float16(binary_representation)print(通过2进制转化后Float16值:,float16_value)# 结果通过2进制转化后Float16值:3.140625# 10进制3.1415对应float163.1406binary_representation0100001001001000# 将二进制表示转换为float16float16_valuebinary_to_float16(binary_representation)print(通过2进制转化后Float16值:,float16_value)# 结果通过2进制转化后Float16值:3.140625# 10进制3.142对应float163.1426binary_representation0100001001001001# 将二进制表示转换为float16float16_valuebinary_to_float16(binary_representation)print(通过2进制转化后Float16值:,float16_value)# 结果通过2进制转化后Float16值:3.142578125因为在计算机中是以 2 进制存储计算的所以转换后的 float16 值会有很多位小数但这些后面的小数是没有精度的换成 10 进制的精度是只有 0.001 的。注在 -1~1 之间精度是 0.0001因为有隐含位1的关系大家可以试一下。2、BF16BF16 也叫做 bfloat16(这是最常叫法)其实叫“BF16”不知道是否准确全称 brain floating point也是用 16 位二进制来表示的是由 Google Brain 开发的所以这个 brain 应该是 Google Brain 的第二个单词。和上述 FP16 不一样的地方就是指数位和尾数位不一样看图Sign(符号位)1 位0 表示整数1 表示负数Exponent(指数位)8 位表示整数部分偏置值是 127Fraction(尾数位)7 位表示小数部分也是隐含了首位的 1实际的尾数精度为 8 位计算公式这里要注意一下并不是所有的硬件都支持 bfloat16因为它是一个比较新的数据类型在 NVIDIA GPU 上只有 Ampere 架构以及之后的 GPU 才支持。如何判断呢很简单importtransformers transformers.utils.import_utils.is_torch_bf16_gpu_available()# 结果为True就是支持看一下在 pytorch 中是如何表示的importtorch torch.finfo(torch.bfloat16)# 结果finfo(resolution0.01,min-3.38953e38,max3.38953e38,eps0.0078125,smallest_normal1.17549e-38,tiny1.17549e-38,dtypebfloat16)这个结果就不在赘述了每个字段表示的含义和上述的是一致的主要注意的是 bfloat16 的 10 进制间隔精度是 0.01注在 -1~1 之间精度是 0.001表示范围是 [-3.40282e383.40282e38]。可以明显的看到 bfloat16 比 float16 精度降低了但是表示的范围更大了能够有效的防止在训练过程中的溢出。有兴趣的同学可以用上述代码实验一下 bfloat16~3、FP32FP32 也叫做 float32两种叫法是完全一样的全称是 Single-precision floating-point(单精度浮点数)在 IEEE 754 标准中是叫做 binary32。简单来说是用 32 位二进制来表示的浮点数看图Sign(符号位)1 位0 表示整数1 表示负数Exponent(指数位)8 位表示整数部分偏置值是 127Fraction(尾数位)23 位表示小数部分也是隐含了首位的 1实际的尾数精度为 24 位计算公式看一下在 pytorch 中是如何表示的importtorch torch.finfo(torch.float32)# 结果finfo(resolution1e-06,min-3.40282e38,max3.40282e38,eps1.19209e-07,smallest_normal1.17549e-38,tiny1.17549e-38,dtypefloat32)这个结果也不在赘述了每个字段表示的含义和上述的是一致的主要注意的是 float32 的 10 进制间隔精度是 0.000001。注在 -1~1 之间精度是 0.0000001表示范围是 [-3.40282e383.40282e38]。可以看到 float32 精度又高范围又大可是 32 位的大小对于现在大模型时代的参数量太占空间了。以上就是对常见 FP16FP32BF16 精度的浮点数的一点介绍后续会围绕下面三个问题再进行讲解大模型中不同精度占用的显存大小大模型中不同精度之间如何转换模型训练中的混合精度是什么最后为了助力朋友们跳槽面试、升职加薪、职业困境提高自己的技术本文给大家整了一套涵盖AI大模型所有技术栈的快速学习方法和笔记。目前已经收到了七八个网友的反馈说是面试问到了很多这里面的知识点。由于文章篇幅有限不能将全部的面试题答案解析展示出来有需要完整面试题资料的朋友可以扫描下方二维码免费领取哦面试题展示1、请解释一下BERT模型的原理和应用场景。答案BERTBidirectional Encoder Representations from Transformers是一种预训练的语言模型通过双向Transformer编码器来学习文本的表示。它在自然语言处理任务中取得了很好的效果如文本分类、命名实体识别等。2、什么是序列到序列模型Seq2Seq并举例说明其在自然语言处理中的应用。答案Seq2Seq模型是一种将一个序列映射到另一个序列的模型常用于机器翻译、对话生成等任务。例如将英文句子翻译成法文句子。3、请解释一下Transformer模型的原理和优势。答案Transformer是一种基于自注意力机制的模型用于处理序列数据。它的优势在于能够并行计算减少了训练时间并且在很多自然语言处理任务中表现出色。4、什么是注意力机制Attention Mechanism并举例说明其在深度学习中的应用。答案注意力机制是一种机制用于给予模型对不同部分输入的不同权重。在深度学习中注意力机制常用于提升模型在处理长序列数据时的性能如机器翻译、文本摘要等任务。5、请解释一下卷积神经网络CNN在计算机视觉中的应用并说明其优势。答案CNN是一种专门用于处理图像数据的神经网络结构通过卷积层和池化层提取图像特征。它在计算机视觉任务中广泛应用如图像分类、目标检测等并且具有参数共享和平移不变性等优势。6、请解释一下生成对抗网络GAN的原理和应用。答案GAN是一种由生成器和判别器组成的对抗性网络结构用于生成逼真的数据样本。它在图像生成、图像修复等任务中取得了很好的效果。7、请解释一下强化学习Reinforcement Learning的原理和应用。答案强化学习是一种通过与环境交互学习最优策略的机器学习方法。它在游戏领域、机器人控制等领域有广泛的应用。8、请解释一下自监督学习Self-Supervised Learning的原理和优势。答案自监督学习是一种无需人工标注标签的学习方法通过模型自动生成标签进行训练。它在数据标注困难的情况下有很大的优势。9、解释一下迁移学习Transfer Learning的原理和应用。答案迁移学习是一种将在一个任务上学到的知识迁移到另一个任务上的学习方法。它在数据稀缺或新任务数据量较小时有很好的效果。10、请解释一下模型蒸馏Model Distillation的原理和应用。答案模型蒸馏是一种通过训练一个小模型来近似一个大模型的方法。它可以减少模型的计算和存储开销并在移动端部署时有很大的优势。11、请解释一下LSTMLong Short-Term Memory模型的原理和应用场景。答案LSTM是一种特殊的循环神经网络结构用于处理序列数据。它通过门控单元来学习长期依赖关系常用于语言建模、时间序列预测等任务。12、请解释一下BERT模型的原理和应用场景。答案BERTBidirectional Encoder Representations from Transformers是一种预训练的语言模型通过双向Transformer编码器来学习文本的表示。它在自然语言处理任务中取得了很好的效果如文本分类、命名实体识别等。13、什么是注意力机制Attention Mechanism并举例说明其在深度学习中的应用。答案注意力机制是一种机制用于给予模型对不同部分输入的不同权重。在深度学习中注意力机制常用于提升模型在处理长序列数据时的性能如机器翻译、文本摘要等任务。14、请解释一下生成对抗网络GAN的原理和应用。答案GAN是一种由生成器和判别器组成的对抗性网络结构用于生成逼真的数据样本。它在图像生成、图像修复等任务中取得了很好的效果。15、请解释一下卷积神经网络CNN在计算机视觉中的应用并说明其优势。答案CNN是一种专门用于处理图像数据的神经网络结构通过卷积层和池化层提取图像特征。它在计算机视觉任务中广泛应用如图像分类、目标检测等并且具有参数共享和平移不变性等优势。16、请解释一下强化学习Reinforcement Learning的原理和应用。答案强化学习是一种通过与环境交互学习最优策略的机器学习方法。它在游戏领域、机器人控制等领域有广泛的应用。17、请解释一下自监督学习Self-Supervised Learning的原理和优势。答案自监督学习是一种无需人工标注标签的学习方法通过模型自动生成标签进行训练。它在数据标注困难的情况下有很大的优势。18、请解释一下迁移学习Transfer Learning的原理和应用。答案迁移学习是一种将在一个任务上学到的知识迁移到另一个任务上的学习方法。它在数据稀缺或新任务数据量较小时有很好的效果。19、请解释一下模型蒸馏Model Distillation的原理和应用。答案模型蒸馏是一种通过训练一个小模型来近似一个大模型的方法。它可以减少模型的计算和存储开销并在移动端部署时有很大的优势。20、请解释一下BERT中的Masked Language ModelMLM任务及其作用。答案MLM是BERT预训练任务之一通过在输入文本中随机mask掉一部分词汇让模型预测这些被mask掉的词汇。由于文章篇幅有限不能将全部的面试题答案解析展示出来有需要完整面试题资料的朋友可以扫描下方二维码免费领取哦
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻