10/27(火) · 12:11
第2章 後半: SSD、GPU、配列とモデルの容量
『日本語技術教科書 Vol.0』の第2章 後半。SSD、GPU、配列とモデルの容量を、2 人の掛け合いで解説する。
この回を聴く
0:0012:11
音声を読み込めませんでした。記事は下で読めます。
AIこの記事は AI の Claude が書きました。
- SSD は内部で位置を付け替えながら書くため、実際の書き込み量は頼んだ量とは別に数える。
- GPU の効果は、計算だけでなく、データの運搬、配列の置き方、運ぶ量と計算量のつり合いで決まる。
- LLM の容量は、重みに加えて KV キャッシュと一時領域、学習なら勾配や更新の状態まで数える。
教材の 2.4 節から 2.6 節まで。
2.4.1〜2.4.2 SSD とファイルの読み出し
『日本語技術教科書 ボリュームゼロ』の第2章後半は、ファイルの中身がメモリに着くまでの道のりから始まる。SSD は電源を落としても内容が消えない装置だが、CPU はそのファイルを直接つかんで計算するのではなく、OS が使えるメモリへ中身を持ってくる。途中のページキャッシュに目当てがあれば SSD へ頼み直さずに済み、無ければ装置へ依頼して転送の完了を待つ。同じ読み出しでも、費用はこの違いで変わる。
教材の仮の数字では、依頼のたびに 80 マイクロ秒の固定の待ちがあり、転送は毎秒 3 ギガバイトとする。4 キビバイトは約 81.4 マイクロ秒、1 メビバイトは約 430 マイクロ秒になる。1 メビバイトを 4 キビバイトずつ 256 回に分けて頼むと、固定の待ちを 256 回払うので、1 メビバイトを一度に頼む場合と時間がそろわない。Python の例は 2 バイトを書いて読み戻すが、読み戻しが一瞬でも、直前の内容が OS の置き場に残っているだけかもしれず、SSD の速さの印にはならない。
SSD の内部では、NAND の読み書きがページ単位、消去が複数ページをまとめたブロック単位になる。そのため変換の層が、外から見える位置と実際の置き場所の対応表を持ち、上書きのつもりでも別のページへ書く。教材の小さな例は 4 ページで 1 ブロックで、更新は空きページへの書き込みと表の付け替えで済むが、古いブロックに残った有効な 3 ページは、消す前に別の場所へ移す。利用者が 4 キビバイトを更新しただけでも、中では 16 キビバイトの書き込みになり、この比の 4 が書込み増幅である。
2.5.1〜2.5.2 GPU と転送
GPU は、大量の独立したデータに同じ形の計算を一斉にかける構成である。1 つの命令で複数の値を扱う発想が SIMD で、スレッドが各自の状態を持ったまま群で同じ命令に乗る形が SIMT にあたる。教材の分岐の例では、8 つの位置のうち前半 4 つが処理 A、後半 4 つが処理 B で、群は一度にどちらかしか進められないため、A の間は後半が休み、B の間は前半が休む。これが分岐発散である。
GPU の内部の置き場も、レジスタ、共有メモリ、グローバルメモリと段が分かれ、名前に近さを思わせる語があっても速いとは限らない。隣り合う番地をそろって読めばまとめて運べる。
別基板の GPU は自分専用のメモリを持つので、CPU とのあいだで運搬が生じる。教材の例では、256 メビバイトを毎秒 16 ギガバイトで送ると片道約 16.78 ミリ秒で、往復と計算 5 ミリ秒を合わせて約 38.55 ミリ秒になる。CPU なら 30 ミリ秒で済む仕事だと、この仮定では GPU の経路のほうが遅い。GPU に仕事を頼む関数が返っても仕事が済んだ保証はないので、前後だけ測ると依頼の手間しか映らないことがある。教材の制作環境には GPU が無く、この数字は実測ではないと明記されている。
2.6.1〜2.6.2 配列の置き方と性能
NumPy の配列は、値を並べたバッファと、その読み方を記した情報でできている。読み方は、型、各軸の長さ、軸ごとに 1 歩進むときのバイトの差である。2 行 3 列で 1 要素 4 バイトなら、全体は 24 バイトで、差は 12 と 4 になる。基準を番地 1000 とすると、行が 1、列が 2 の要素は 1000 + 12 + 8 で 1020 番地である。転置はこの差を入れ替えるだけで、中身は動かさない。転置した側の要素を 99 に書き換えると、元の配列の対応する要素も 99 になる。
2 つの配列を足して 3 つ目に書く例では、要素 1 つにつき 12 バイトを運び、計算は 1 回である。時間の下限は、計算量を計算能力で割った値と、運ぶ量を帯域で割った値のうち長いほうになり、運ぶ側が長ければメモリで頭打ちになる。毎秒 40 ギガバイトの帯域と毎秒 1000 億回の計算能力、要素 100 万個という仮定では、運ぶのに 0.3 ミリ秒、計算は 0.01 ミリ秒で、帯域が上限を決める。この見方がルーフラインの入口だ。
2.6.3〜2.6.4 LLM の容量
重みの量は、パラメータの数に 1 つあたりのバイト数を掛けた値である。1 億個で 2 バイトなら 200 メガバイト、約 190.73 メビバイトで、4 バイトなら約 381 メビバイトになる。量子化で小さくしても、補助の情報や作業用の場所が加わる。
そこへ KV キャッシュが増える。生成済みの部分の途中結果を残して再計算を避ける仕組みで、文が長くなるほど膨らむ。容量は、2 に層の数、同時の系列数、トークン数、KV の頭の数、頭ごとの次元、1 要素のバイト数を掛ける。層が 12、トークンが 2048 なら 48 メビバイト、トークンが倍なら 96 メビバイトで、頭を共有する工夫で KV の頭を 2 つにすれば 12 メビバイトになる。重みと合わせた約 239 メビバイトは下限で、途中の出力や一時領域は含まない。
学習では勾配なども保持するので、配列が増える。Adam を仮定した例では 1 パラメータにつき 18 バイトで、1 億個なら約 1.68 ギビバイトになるが、活性値と一時領域は含まない。推論用の 200 メガバイトだけで学習の可否は決められない。途中の値を捨てて作り直す手は計算を増やし、複数の装置へ分ければ通信と同期が加わる。
次は第3章の前半で、OS が複数の実行を守りながら、プロセスとスレッド、共有をどう扱うかを扱う。
出典
- オーナー(AI で作った教材、Web には公開していない) 日本語技術教科書 Vol.0 コンピュータからPython・機械学習・LLMへ 第2章 2026-10-18




