クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

モデルに必要なメモリを求める

このレッスンのあとで: モデルが必要とするメモリの量を求められる。

60分のレッスンコマンド7件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

手元のパソコンに入るか

あなたのノートパソコンのメモリは 16 GB だとします。公開されているモデルを動かしたいとき、入るかどうかは、ダウンロードの前に短い計算で分かります。

入らないモデルは、動き出しません。見込み違いは、半日の無駄になり、ときには大きなパソコンの買い直しになります。

このレッスンのゴール

メモ

モデルが必要とするメモリの量を求められる。

キーワード

ことばいみれい
パラメータモデルが学んだ数一つ
重みパラメータをすべて合わせたもの
精度数一つを何ビットで持つか16 ビット
キャッシュここまで読んだプロンプトを覚えておくメモリ
ギガバイト (GB)十億バイト

学生が入力するセルは、このプレビューでは空白です。

重みは、パラメータ数 × バイト数

モデルの中身の大半は、とても長い数の列です。一つ一つの数がパラメータです。どの数も何ビットかで保存され、8 ビットが 1 バイトです。

だから重みは、パラメータ数にバイト数を掛けたものになります。80 億個を 16 ビット(2 バイト)で持つモデルは、重みだけで 16 GB です。

モデル A、重みだけ

精度一つ分のバイト数80 億個の重み
32 ビット432 GB
16 ビット216 GB
8 ビット18 GB
4 ビット0.54 GB

学生が入力するセルは、このプレビューでは空白です。

長いプロンプトはキャッシュを増やす

モデルは読みながら、ここまでのトークンごとにメモを残します。このメモがキャッシュです。1 トークンの分は、層の数、幅、バイト数を掛けて、さらに 2 倍します。

モデル A では、2 × 32 × 1024 × 2 で、1 トークンが 131,072 バイトです。8,000 トークンなら、キャッシュは約 1 GB です。キャッシュはプロンプトとともに増え、重みは増えません。

モデル A、プロンプトの長さとキャッシュ

プロンプトのトークン数キャッシュ
1,0000.13 GB
8,0001.05 GB
32,0004.19 GB

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

「ダウンロードが 16 GB なら、動かすのも 16 GB だ」と考えがちです。重みは一部にすぎません。キャッシュはプロンプトとともに増え、パソコンにも空きが要ります。キャッシュを足し、五分の一を空けておきます。

モデル用の補助を書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// 応答に含まれるトークン数。なければ null。' 'function count(data, name) {' '  return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

モデル用の補助を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' '  try {' '    const res = await fetch(base + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"status \" + res.status);' '    const d = await res.json();' '    return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' '  } catch (error) {' '    console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' '    return { text: sample, inTokens: null, outTokens: null, recorded: true };' '  }' '}' 'module.exports = { ask };' >> model.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

メモリを計算するスクリプトを書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const model = { billions: 8, layers: 32, kvWidth: 1024 };' 'const BITS = [32, 16, 8, 4];' 'function weightsGB(bits) {' '  return model.billions * bits / 8;' '}' > mem.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

メモリを計算するスクリプトを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function cacheGB(tokens) {' '  const perToken = 2 * model.layers * model.kvWidth * 2;' '  return perToken * tokens / 1000000000;' '}' >> mem.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

メモリを計算するスクリプトを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  console.log(\"モデル A: 80 億パラメータ、キャッシュは 16 ビット\");' '  for (const bits of BITS) {' '    const total = weightsGB(bits) + cacheGB(8000);' '    console.log(bits + \" ビット: 重み \" + weightsGB(bits) + \" GB、合計 \" + total.toFixed(2) + \" GB\");' '  }' '  console.log(\"1000 トークンのキャッシュ: \" + cacheGB(1000).toFixed(2) + \" GB\");' '  console.log(\"32000 トークンのキャッシュ: \" + cacheGB(32000).toFixed(2) + \" GB\");' >> mem.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

メモリを計算するスクリプトを書く(4)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' '  const q = \"プロンプトが長いと、なぜメモリが増えるのかを、短い一文で書いてください。\";' '  const sample = \"プロンプトのトークンごとにモデルがメモを残すので、長いほどキャッシュが大きくなるからです。\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 60);' '  console.log(\"返事: \" + reply.text);' '}' 'main();' >> mem.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

メモリを計算する

コマンド
docker exec -w /home/node/project agent node mem.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

何もダウンロードしない

このラボには GPU もモデルのファイルもありません。モデル A は架空で、どの大きさも計算です。ラボのモデルへの短い呼び出しは、一文を書かせるだけです。

モデルが答えないときは、Run が先に「記録済みサンプル」を表示します。計算の結果は同じです。

出力の例

行示していること
32 ビット: 重み 32 GB、合計 33.05 GB元の精度では、小さなパソコンに入らない
4 ビット: 重み 4 GB、合計 5.05 GBビットを減らすと、メモリがずっと減る
32000 トークンのキャッシュ: 4.19 GB長いプロンプトは、本当の負担になる
返事: ...モデルの一文。言葉は毎回違う

学生が入力するセルは、このプレビューでは空白です。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。