<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>BF16 on KnightLiブログ</title>
        <link>https://www.knightli.com/ja/tags/bf16/</link>
        <description>Recent content in BF16 on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Wed, 22 Apr 2026 22:40:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/ja/tags/bf16/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>大規模モデルでよく使われるテンソル型入門: FP32、FP16、BF16、TF32、FP8</title>
        <link>https://www.knightli.com/ja/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/</link>
        <pubDate>Wed, 22 Apr 2026 22:40:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/ja/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/</guid>
        <description>&lt;p&gt;大規模モデルの学習、推論、デプロイに触れ始めると、すぐに &lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt;、&lt;code&gt;FP8&lt;/code&gt; という略称を見かけるようになります。これらはモデルの説明欄に添えられた小さなラベルのように見えますが、実際の意味はそれ以上に大きいです。&lt;/p&gt;
&lt;p&gt;これらの型は、数値をメモリ上にどう保持し、計算中にどう表現するかを決めます。そしてそれは、学習の安定性、推論速度、さらには 1 枚の GPU でどれだけ大きなモデルを扱えるかにまで影響します。&lt;/p&gt;
&lt;p&gt;そのため、大規模モデルの精度トレードオフを本当に理解したいなら、特定モデルのベンチマークを見る前に、まずこれらのテンソル型が何であり、なぜそのように設計されているのかを押さえるのが近道です。&lt;/p&gt;
&lt;h2 id=&#34;テンソル型は何を決めているのか&#34;&gt;テンソル型は何を決めているのか
&lt;/h2&gt;&lt;p&gt;大規模モデルの本質は、膨大なパラメータを使った行列演算です。そしてテンソル型とは、その数値をメモリ上でどう保持し、計算中にどう表現するかという形式です。&lt;/p&gt;
&lt;p&gt;このトレードオフは、たいてい次の三つの軸に集約されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;精度&lt;/li&gt;
&lt;li&gt;VRAM 使用量&lt;/li&gt;
&lt;li&gt;計算速度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは画像フォーマットに少し似ています。可逆形式は細部を多く保てますが、容量が大きく、読み込みも遅くなります。圧縮形式は人間に見えにくい情報を一部捨てる代わりに、サイズを小さくし処理を速くします。大規模モデルが同じような折衷を受け入れられるのは、非常に多くのパラメータの中では、ごく小さな数値の違いが最終出力に大きく影響しないことが多いからです。&lt;/p&gt;
&lt;p&gt;そのため、モデルの世界にはさまざまな精度フォーマットが存在します。&lt;/p&gt;
&lt;h2 id=&#34;数値はどう表現されるのか&#34;&gt;数値はどう表現されるのか
&lt;/h2&gt;&lt;p&gt;各フォーマットを見る前に、まず浮動小数点数の基本構造を押さえておくと理解しやすくなります。浮動小数点数は通常、次の三つの部分からできています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;符号ビット: 正負を決める&lt;/li&gt;
&lt;li&gt;指数ビット: 数値の表現範囲を決める&lt;/li&gt;
&lt;li&gt;仮数ビット: 数値の細かさを決める&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大規模モデルでは仮数精度も重要ですが、多くの場合それ以上に問題になりやすいのが、指数ビット不足による表現範囲の狭さです。これがオーバーフローや学習不安定性につながります。多くのテンソル型設計は、限られた bit 数を「範囲」と「細かさ」の間でどう配分するか、という問題だと考えるとわかりやすいです。&lt;/p&gt;
&lt;p&gt;まずは次の図で全体像をつかむと理解しやすいです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tensor-format-overview.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP32、FP16、BF16、TF32、FP8 のビット構成の全体像&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;fp32-最も安定するが高価&#34;&gt;FP32: 最も安定するが高価
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;FP32&lt;/code&gt; は最も伝統的な単精度浮動小数点形式で、合計 32 bit、つまり 4 バイトです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp32-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP32 ビット構成図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;長所はわかりやすいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数値範囲が広い&lt;/li&gt;
&lt;li&gt;精度が高い&lt;/li&gt;
&lt;li&gt;学習が最も安定しやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その一方で、欠点も明確です。VRAM を大きく消費します。&lt;/p&gt;
&lt;p&gt;非常に大ざっぱに見積もるなら、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;VRAM 使用量 ≈ パラメータ数 × 1 パラメータあたりのバイト数
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;となります。&lt;/p&gt;
&lt;p&gt;もし 27B モデルの重みをすべて &lt;code&gt;FP32&lt;/code&gt; で持つなら、重みだけでおよそ&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;27B × 4 bytes ≈ 108GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;が必要です。&lt;/p&gt;
&lt;p&gt;しかも、ここには活性値、KV Cache、オプティマイザ状態、そのほかの実行時オーバーヘッドは含まれていません。つまり、現代の大規模モデル推論や学習において、&lt;code&gt;FP32&lt;/code&gt; はもはや標準というより、「最も安定な基準形式」に近い存在です。&lt;/p&gt;
&lt;h2 id=&#34;fp16-サイズは半分ただし安定性はやや弱い&#34;&gt;FP16: サイズは半分、ただし安定性はやや弱い
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;FP16&lt;/code&gt; は各パラメータを 2 バイトに圧縮し、&lt;code&gt;FP32&lt;/code&gt; と比べてメモリ使用量をほぼ半分にします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp16-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP16 ビット構成図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;同じ 27B モデルで重みサイズだけを見ると、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;27B × 2 bytes ≈ 54GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;になります。&lt;/p&gt;
&lt;p&gt;これだけでも、なぜ多くのデプロイ手順で 27B モデルの VRAM 要件が 50GB 前後になるのかを説明できます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FP16&lt;/code&gt; の利点は明快です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VRAM 圧力が大きく下がる&lt;/li&gt;
&lt;li&gt;スループットが高い&lt;/li&gt;
&lt;li&gt;初期の mixed precision 学習で広く使われた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし弱点は、指数ビットが少なく、動的範囲が狭いことです。大規模モデル学習ではこれがオーバーフローを起こしやすくし、loss scaling のような補助技法を必要とするため、運用がやや面倒になります。&lt;/p&gt;
&lt;p&gt;そのため &lt;code&gt;FP16&lt;/code&gt; は今も一般的ですが、多くの場面では最も扱いやすい選択肢ではなくなっています。&lt;/p&gt;
&lt;h2 id=&#34;bf16-大規模モデル時代により実用的な半精度&#34;&gt;BF16: 大規模モデル時代により実用的な半精度
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;BF16&lt;/code&gt; も 2 バイトですが、&lt;code&gt;FP16&lt;/code&gt; とは設計思想が異なります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/bf16-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;BF16 ビット構成図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;指数範囲を大きく確保することで、動的範囲を &lt;code&gt;FP32&lt;/code&gt; に近づけ、その代わり仮数精度を一部削っています。この折衷は大規模モデルに特に向いています。というのも、多くのモデルは仮数の数 bit より、まず範囲不足に敏感だからです。&lt;/p&gt;
&lt;p&gt;そのため、現在では多くの学習フレームワーク、大規模モデルの論文、実際のデプロイ環境が &lt;code&gt;BF16&lt;/code&gt; を好む傾向にあります。&lt;/p&gt;
&lt;p&gt;感覚的には次のように捉えるとわかりやすいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VRAM コストは &lt;code&gt;FP16&lt;/code&gt; に近い&lt;/li&gt;
&lt;li&gt;安定性は &lt;code&gt;FP32&lt;/code&gt; に近い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ある 27B のデプロイ手順が 50GB 前後の VRAM を要求し、別の最適化された手順が 30GB 近くまで下がるなら、前者はまだ &lt;code&gt;FP16/BF16&lt;/code&gt; の層に留まり、後者はより低精度や量子化に踏み込んでいることが多いです。&lt;/p&gt;
&lt;h2 id=&#34;tf32-vram-削減ではなく-fp32-ワークフローの高速化&#34;&gt;TF32: VRAM 削減ではなく FP32 ワークフローの高速化
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;TF32&lt;/code&gt; は「また別の省メモリ形式」と誤解されやすいですが、役割はかなり違います。&lt;/p&gt;
&lt;p&gt;一般的には、指数範囲を大きく保ちつつ、仮数精度を短くした計算形式として捉えるとわかりやすいです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tf32-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;TF32 計算形式図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;ただし重要なのは、&lt;code&gt;TF32&lt;/code&gt; は &lt;code&gt;FP16/BF16&lt;/code&gt; のように重み保存のための形式というより、Tensor Core 上で使われる内部計算形式に近いという点です。&lt;/p&gt;
&lt;p&gt;これは主に NVIDIA が新しい GPU 世代で提供している計算モードであり、目的は VRAM 使用量を下げることではなく、もともと &lt;code&gt;FP32&lt;/code&gt; ベースだった学習ワークフローを、大きくコード変更せずに高速化することです。&lt;/p&gt;
&lt;p&gt;要点を一言で言えば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表向きは &lt;code&gt;FP32&lt;/code&gt; ワークフローのまま&lt;/li&gt;
&lt;li&gt;行列演算の内部でより高速な近似計算を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということです。&lt;/p&gt;
&lt;p&gt;したがって &lt;code&gt;TF32&lt;/code&gt; が解決するのは「&lt;code&gt;FP32&lt;/code&gt; が遅い」という問題であり、「&lt;code&gt;FP32&lt;/code&gt; が VRAM を食いすぎる」という問題ではありません。同じモデルで VRAM 要件が大きく変わる理由を考えるとき、&lt;code&gt;TF32&lt;/code&gt; は主因ではありません。&lt;/p&gt;
&lt;h2 id=&#34;fp8-さらに圧縮するがより高度な工学が必要&#34;&gt;FP8: さらに圧縮するが、より高度な工学が必要
&lt;/h2&gt;&lt;p&gt;さらに先へ進むと &lt;code&gt;FP8&lt;/code&gt; があります。1 つの数値をさらに少ない bit 数で表現し、メモリ帯域と保存コストをさらに下げます。&lt;/p&gt;
&lt;p&gt;これは単一の形式というより、代表的には &lt;code&gt;E4M3&lt;/code&gt; と &lt;code&gt;E5M2&lt;/code&gt; という二つの変種として現れます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp8-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP8 の代表的な変種の図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;ただし &lt;code&gt;FP8&lt;/code&gt; の代償も明確です。bit 数がここまで少なくなると、範囲と精度を同時に保つのが難しくなります。そのため実際の工学では、順伝播、逆伝播、勾配など段階ごとに異なる変種を使ってバランスを取ることがよくあります。&lt;/p&gt;
&lt;p&gt;この系統は、より攻めた方針を表しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;さらなる精度低下を受け入れる&lt;/li&gt;
&lt;li&gt;その代わり保存コストとスループットを改善する&lt;/li&gt;
&lt;li&gt;より成熟したハードウェアとフレームワークが必要になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将来性は高いですが、一般ユーザーが日常的に意識する分岐点としては、依然として &lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt; が中心です。&lt;/p&gt;
&lt;h2 id=&#34;なぜこれらの型を理解することが重要なのか&#34;&gt;なぜこれらの型を理解することが重要なのか
&lt;/h2&gt;&lt;p&gt;最初はこれらの略称を、ダウンロードページに書かれた実装上の細部だと捉えがちです。ですが実際には、学習やデプロイをどう理解するかそのものに関わってきます。&lt;/p&gt;
&lt;p&gt;たとえば、同じ GPU を見ていても、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なぜ学習では数値安定性がそれほど重視されるのか&lt;/li&gt;
&lt;li&gt;なぜ推論では量子化や低精度がすぐ話題になるのか&lt;/li&gt;
&lt;li&gt;なぜパラメータ数が近いモデルでもデプロイ難易度が大きく違うのか&lt;/li&gt;
&lt;li&gt;なぜある形式は重み保存向きで、別の形式は計算経路向きなのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった疑問が出てきます。&lt;/p&gt;
&lt;p&gt;こうした問いを突き詰めていくと、結局は「精度、範囲、メモリ、速度をどう交換するか」という一点に戻ってきます。&lt;/p&gt;
&lt;p&gt;だから &lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt;、&lt;code&gt;FP8&lt;/code&gt; を理解することは、単に用語集を読めるようになるためではありません。学習設定、推論エンジン、デプロイ要件を見たときに、その数字の裏で何が交換されているのかを理解するためです。&lt;/p&gt;
&lt;h2 id=&#34;実用的な覚え方&#34;&gt;実用的な覚え方
&lt;/h2&gt;&lt;p&gt;最初から細かな仕様を全部覚えたくないなら、まずは次の順で捉えると実用的です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FP32&lt;/code&gt;: 最も安定、最も高価&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FP16&lt;/code&gt;: VRAM は減るが、範囲は狭い&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BF16&lt;/code&gt;: &lt;code&gt;FP16&lt;/code&gt; に近い VRAM で、より大規模モデル向きの安定性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TF32&lt;/code&gt;: 主に &lt;code&gt;FP32&lt;/code&gt; の遅さを改善し、VRAM 削減は主目的ではない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FP8&lt;/code&gt;: さらに攻めた圧縮と高速化の路線&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tensor-format-summary.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;代表的なテンソル型のまとめ図&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;こうしておけば、モデル配布ページに &lt;code&gt;fp16&lt;/code&gt;、&lt;code&gt;bf16&lt;/code&gt;、&lt;code&gt;fp8&lt;/code&gt; と書かれていても、あるいはデプロイ手順ごとに VRAM 要件が大きく違っていても、それが単なる表記の違いではなく、精度予算と工学的な選択の違いだとわかるようになります。&lt;/p&gt;
&lt;h2 id=&#34;結び&#34;&gt;結び
&lt;/h2&gt;&lt;p&gt;大規模モデルにおけるテンソル型の話は、表面上は bit 数の話に見えても、本質的には工学的なトレードオフの話です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt;、&lt;code&gt;FP8&lt;/code&gt; に絶対的な優劣はありません。それぞれが、安定性、範囲、精度、メモリ、速度のどこに重みを置くかが違うだけです。&lt;/p&gt;
&lt;p&gt;この層が見えるようになると、学習論文を読むときも、推論設定を調整するときも、異なるデプロイ戦略を比べるときも、ずっと要点をつかみやすくなります。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
