<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LLM on KnightLiブログ</title>
        <link>https://www.knightli.com/ja/tags/llm/</link>
        <description>Recent content in LLM on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Thu, 23 Apr 2026 00:15:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/ja/tags/llm/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>GPU 推論速度テストでよく見る指標の意味: FA、pp512、tg128、Q4_0 とは何か</title>
        <link>https://www.knightli.com/ja/2026/04/23/how-to-read-llm-cuda-scoreboard-fa-pp512-tg128-q4-0/</link>
        <pubDate>Thu, 23 Apr 2026 00:15:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/ja/2026/04/23/how-to-read-llm-cuda-scoreboard-fa-pp512-tg128-q4-0/</guid>
        <description>&lt;p&gt;ローカル LLM や GPU 推論速度テストを見始めると、すぐに &lt;code&gt;FA&lt;/code&gt;、&lt;code&gt;pp512&lt;/code&gt;、&lt;code&gt;tg128&lt;/code&gt;、&lt;code&gt;Q4_0&lt;/code&gt; といった略称に出会います。どれも性能指標のように見えますが、文脈がないとかなりわかりにくいです。&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;CUDA Scoreboard for Llama 2 7B, Q4_0 (no FA)
&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;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;span class=&#34;lnt&#34;&gt;2
&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;pp512 t/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tg128 t/s
&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;これらを分解して理解しないままだと、この種の速度テストが何を測っているのか、また異なる GPU の結果をどう比較すべきかが見えてきません。&lt;/p&gt;
&lt;p&gt;この記事では、どの GPU を買うべきかではなく、GPU 推論速度テストでよく出てくる指標そのものを整理します。&lt;/p&gt;
&lt;h2 id=&#34;まずタイトル行全体が何を言っているのか&#34;&gt;まずタイトル行全体が何を言っているのか
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CUDA Scoreboard for Llama 2 7B, Q4_0 (no FA)&lt;/code&gt; のような一行には、すでにかなり多くの前提が含まれています。&lt;/p&gt;
&lt;p&gt;少なくとも次の四つの情報があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CUDA&lt;/code&gt;: NVIDIA GPU の CUDA 経路で測っている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Llama 2 7B&lt;/code&gt;: テスト対象は &lt;code&gt;Llama 2&lt;/code&gt; の &lt;code&gt;7B&lt;/code&gt; モデル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Q4_0&lt;/code&gt;: モデルは 4-bit 量子化形式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no FA&lt;/code&gt;: &lt;code&gt;Flash Attention&lt;/code&gt; を有効にしていない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまりこれは要するに、&lt;/p&gt;
&lt;p&gt;「NVIDIA GPU 上で、ある量子化済み LLM を、特定の推論経路で動かしたときの速度テスト」&lt;/p&gt;
&lt;p&gt;という意味になります。&lt;/p&gt;
&lt;h2 id=&#34;fa-とは何か-flash-attention&#34;&gt;FA とは何か: Flash Attention
&lt;/h2&gt;&lt;p&gt;ここでいう &lt;code&gt;FA&lt;/code&gt; は &lt;code&gt;Flash Attention&lt;/code&gt; の略です。&lt;/p&gt;
&lt;p&gt;これは大規模モデルの学習や推論で非常に重要な最適化のひとつで、主に Attention 計算の実装を高速化するための技術です。Transformer 系モデルでは、Attention 部分が最も重い処理のひとつだからです。&lt;/p&gt;
&lt;p&gt;従来の Attention 実装には次のような問題があります。&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;code&gt;Flash Attention&lt;/code&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;数学的には通常の Attention と等価で、精度を落とす近道ではない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、現在の推論・学習系フレームワークでは重要な最適化として扱われています。&lt;/p&gt;
&lt;h2 id=&#34;no-fa-とは何か&#34;&gt;no FA とは何か
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;FA&lt;/code&gt; が &lt;code&gt;Flash Attention&lt;/code&gt; なら、&lt;code&gt;no FA&lt;/code&gt; は単純に &lt;code&gt;Flash Attention&lt;/code&gt; を使っていないという意味です。&lt;/p&gt;
&lt;p&gt;つまり、そのベンチマークはより伝統的な Attention 実装で測られています。&lt;/p&gt;
&lt;p&gt;なぜわざわざ &lt;code&gt;no FA&lt;/code&gt; と書くのかというと、主に次の理由があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比較用の基準として残したい&lt;/li&gt;
&lt;li&gt;ハードウェアやソフトウェアの都合で &lt;code&gt;FA&lt;/code&gt; を使えないケースがある&lt;/li&gt;
&lt;li&gt;条件の違うスコアを混ぜて読まれないようにしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;したがって &lt;code&gt;no FA&lt;/code&gt; は「GPU が弱い」という意味ではありません。より正確には、&lt;/p&gt;
&lt;p&gt;「このスコアは Flash Attention を使わない条件で測られた」&lt;/p&gt;
&lt;p&gt;という意味です。&lt;/p&gt;
&lt;h2 id=&#34;q4_0-とは何か-量子化形式&#34;&gt;Q4_0 とは何か: 量子化形式
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Q4_0&lt;/code&gt; は 4-bit 量子化形式のひとつです。&lt;/p&gt;
&lt;p&gt;LLM の元の重みは通常、こんな低精度では保存されていません。そのままではサイズが大きすぎるため、量子化によって重みをより少ない bit 数で表現し、一般的な GPU でも動かしやすくします。&lt;/p&gt;
&lt;p&gt;ざっくり言えば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Q&lt;/code&gt;: Quantization&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt;: 4-bit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_0&lt;/code&gt;: 具体的な量子化方式の識別&lt;/li&gt;
&lt;/ul&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;code&gt;Llama 2 7B, Q4_0&lt;/code&gt; は、「7B モデル」ではあるものの、「4-bit 量子化された 7B モデル」を意味しています。&lt;/p&gt;
&lt;h2 id=&#34;pp512-ts-とは何か&#34;&gt;pp512 t/s とは何か
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; は通常、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prompt Processing 512 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;を意味します。&lt;/p&gt;
&lt;p&gt;これは入力プロンプトを処理する速度の指標で、単位は &lt;code&gt;t/s&lt;/code&gt;、つまり &lt;code&gt;tokens per second&lt;/code&gt; です。&lt;/p&gt;
&lt;p&gt;ここでの &lt;code&gt;512&lt;/code&gt; は、テスト時の入力長が &lt;code&gt;512 token&lt;/code&gt; だったことを表しています。&lt;/p&gt;
&lt;p&gt;この指標が測っているのは「しゃべる速さ」ではなく、モデルが回答を始める前に、入力内容を読み込んで計算する速さです。言い換えると、「まずこちらの入力を読む段階」のスループットです。&lt;/p&gt;
&lt;p&gt;この段階の大きな特徴は、並列性が高いことです。&lt;/p&gt;
&lt;p&gt;入力系列はまとめて処理しやすいので、GPU はこの場面では高い並列度を活かせます。そのため &lt;code&gt;pp512&lt;/code&gt; の値は非常に大きくなることが多く、初めて見ると少し不自然に感じるほどです。&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;pp512 ≈ 14000 t/s
&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;h2 id=&#34;tg128-ts-とは何か&#34;&gt;tg128 t/s とは何か
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;tg128&lt;/code&gt; は通常、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Text Generation 128 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;を意味します。&lt;/p&gt;
&lt;p&gt;これは 128 token を連続生成したときの平均生成速度で、同じく単位は &lt;code&gt;t/s&lt;/code&gt; です。&lt;/p&gt;
&lt;p&gt;この指標は、私たちが普段感じる「モデルの返答速度」により近いです。実際に出力フェーズを測っているからです。&lt;/p&gt;
&lt;p&gt;ただし &lt;code&gt;pp512&lt;/code&gt; との最大の違いは、テキスト生成が一般に自己回帰的であることです。&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まず 1 個目の token を出す&lt;/li&gt;
&lt;li&gt;それが決まってから 2 個目を出す&lt;/li&gt;
&lt;li&gt;さらにその後に 3 個目を出す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という順番になります。&lt;/p&gt;
&lt;p&gt;そのため、入力処理のような大規模並列はかけにくく、速度はずっと低くなります。&lt;/p&gt;
&lt;p&gt;だからこそ、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt; は数万 &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt; は数百 &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった差が普通に起こります。&lt;/p&gt;
&lt;p&gt;これは測定ミスではなく、そもそも別の性質の処理を測っているためです。&lt;/p&gt;
&lt;h2 id=&#34;なぜ-pp512-と-tg128-の差がこんなに大きいのか&#34;&gt;なぜ pp512 と tg128 の差がこんなに大きいのか
&lt;/h2&gt;&lt;p&gt;ここは多くの人が最初に引っかかるポイントです。&lt;/p&gt;
&lt;p&gt;一言で言えば、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; は並列吞吐、&lt;code&gt;tg128&lt;/code&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;li&gt;そのため生成速度は入力処理よりかなり低くなりやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、GPU 間比較でも面白い現象が起きます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt; では一方が勝つ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt; では別の GPU が少し速い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということがあり得るのです。&lt;/p&gt;
&lt;p&gt;これは矛盾ではなく、一方がピーク算力寄り、他方が実際の生成経路での帯域・遅延特性に左右されているからです。&lt;/p&gt;
&lt;h2 id=&#34;ts-はどう読むべきか&#34;&gt;t/s はどう読むべきか
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;t/s&lt;/code&gt; は &lt;code&gt;tokens per second&lt;/code&gt; の略です。&lt;/p&gt;
&lt;p&gt;つまり、モデルが 1 秒あたりに何 token を処理または生成できるかを表しています。&lt;/p&gt;
&lt;p&gt;ただし注意したいのは、&lt;code&gt;token&lt;/code&gt; は「文字」でも「単語」でもなく、モデルのトークナイザが切る単位だということです。モデルや言語によって、1 token が表すテキスト量はかなり変わります。&lt;/p&gt;
&lt;p&gt;そのため &lt;code&gt;t/s&lt;/code&gt; は主に次の用途に向いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一モデル内で GPU を比べる&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;h2 id=&#34;scoreboard-を読むときにまず押さえるべき点&#34;&gt;Scoreboard を読むときにまず押さえるべき点
&lt;/h2&gt;&lt;p&gt;毎回略称に埋もれたくないなら、まず次のポイントから見れば十分です。&lt;/p&gt;
&lt;h3 id=&#34;1-テスト対象モデルは何か&#34;&gt;1. テスト対象モデルは何か
&lt;/h3&gt;&lt;p&gt;たとえば &lt;code&gt;Llama 2 7B&lt;/code&gt; なのか、量子化形式は &lt;code&gt;Q4_0&lt;/code&gt; なのか。同じモデル・同じ量子化でなければ、結果の横比較はあまり意味を持ちません。&lt;/p&gt;
&lt;h3 id=&#34;2-重要な最適化が有効かどうか&#34;&gt;2. 重要な最適化が有効かどうか
&lt;/h3&gt;&lt;p&gt;もっとも典型的なのが &lt;code&gt;FA&lt;/code&gt; です。一方は &lt;code&gt;Flash Attention&lt;/code&gt; を有効にしていて、もう一方は無効なら、そのスコアは単純には比較できません。&lt;/p&gt;
&lt;h3 id=&#34;3-入力速度を見ているのか出力速度を見ているのか&#34;&gt;3. 入力速度を見ているのか、出力速度を見ているのか
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; と &lt;code&gt;tg128&lt;/code&gt; は別物です。前者は「読み込みの速さ」、後者は「しゃべる速さ」に近いです。&lt;/p&gt;
&lt;h3 id=&#34;4-吞吐を見たいのか体感を見たいのか&#34;&gt;4. 吞吐を見たいのか、体感を見たいのか
&lt;/h3&gt;&lt;p&gt;長いプロンプトの立ち上がりを重視するなら &lt;code&gt;pp512&lt;/code&gt; が参考になります。実際の返答の滑らかさを気にするなら、&lt;code&gt;tg128&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;Q4_0&lt;/code&gt;: モデルは 4-bit 量子化されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FA&lt;/code&gt;: Flash Attention を使っているかどうか&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt;: 512 token の入力処理速度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt;: 128 token の出力生成速度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t/s&lt;/code&gt;: 1 秒あたり何 token か&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この五つだけ分かっていれば、似たような CUDA Scoreboard を見たときに、単に「どちらの数字が大きいか」ではなく、「その数字は何を測っているのか」を理解しやすくなります。&lt;/p&gt;
&lt;h2 id=&#34;結び&#34;&gt;結び
&lt;/h2&gt;&lt;p&gt;GPU ベンチマーク表が難しく見えるのは、指標そのものが神秘的だからではありません。モデル名、量子化、最適化の有無、入力処理と出力生成という別々の吞吐が、短い略称に圧縮されているからです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FA&lt;/code&gt;、&lt;code&gt;Q4_0&lt;/code&gt;、&lt;code&gt;pp512&lt;/code&gt;、&lt;code&gt;tg128&lt;/code&gt; を順に解きほぐしていけば、こうした Scoreboard は実はそれほど難しくありません。&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;
</description>
        </item>
        <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>
