<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Flash Attention on KnightLiブログ</title>
        <link>https://www.knightli.com/ja/tags/flash-attention/</link>
        <description>Recent content in Flash Attention 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/flash-attention/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>
        
    </channel>
</rss>
