機械を持つか、一回ごとに払うか
モデルを自前で動かすとは、自分で面倒を見る機械で動かすことです。借りるとは、一回ごとに他の人へ払うことです。費用の増え方は、二つで違います。
安い方は、呼び出しの回数で変わります。計算で境目が分かり、リストで、計算が忘れたものが分かります。
このレッスンのゴール
メモ
モデルを自前で動かすかどうかを、決められる。
キーワード
| ことば | いみ |
|---|---|
| 自前 | 自分の機械でモデルを動かすこと |
| 借りる | 一回ごとに他の人へ払うこと |
| 損益分岐点 | 二つの費用が等しくなる回数 |
| 処理能力 | 機械 1 台が一か月にこなせる回数 |
| 障害 | サービスが止まっている時間 |
学生が入力するセルは、このプレビューでは空白です。
増え方が違う二つの費用
借りる費用は、一回ごとに同じなので、まっすぐに増えます。自前は階段の費用です。機械 1 台がこなせる回数は決まっていて、1 台ずつ丸ごと買います。機械の面倒を見る人の費用もかかります。
損益分岐点は、二つの費用が等しくなる回数です。それを超えると、自前が安くなります。
架空の金額、千円、一か月
| 月の回数 | 借りる | 自前 |
|---|---|---|
| 300,000 | 900 | 2,400 |
| 1,000,000 | 3,000 | 3,300 |
| 1,200,000 | 3,600 | 3,300 |
| 2,000,000 | 6,000 | 5,100 |
学生が入力するセルは、このプレビューでは空白です。
計算が忘れるもの
値段の計算は、決定ではありません。夜に機械が故障したときの障害は、計算に入っていません。ソフトの更新の手間も、遊んでいる機械も入っていません。個人情報を誤って扱ったときの費用も入っていません。
反対側も入っていません。データが建物の外に出せないなら、いくら安くても、借りることはできません。
よくある間違い
注意
「機械を持てば、一回ごとはただだ」と考えがちです。機械も人も障害対応も、毎月払い続けます。階段と人を入れて損益分岐点を求め、それでも抜けているものを挙げます。
モデル用の補助を書く(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 price = 3;' 'const machine = 900;' 'const capacity = 600000;' 'const people = 1500;' 'function rent(calls) {' ' return Math.floor(calls * price / 1000);' '}' 'function host(calls) {' ' return Math.ceil(calls / capacity) * machine + people;' '}' > host.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
費用を計算するスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"月の回数 | 借りる | 自前 | 安いのは\");' ' for (const calls of [300000, 600000, 1000000, 1200000, 2000000]) {' ' const pick = host(calls) < rent(calls) ? \"自前\" : \"借りる\";' ' console.log(calls + \" | \" + rent(calls) + \" | \" + host(calls) + \" | \" + pick);' ' }' ' console.log(\"単純な損益分岐点: \" + Math.ceil((machine + people) * 1000 / price) + \" 回\");' >> host.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
費用を計算するスクリプトを書く(3)
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();' >> host.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
費用を計算する
docker exec -w /home/node/project agent node host.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| 300000 | 900 | 2400 | 借りる | 少ない回数では、借りる方が安い |
| 1000000 | 3000 | 3300 | 借りる | 二台目を買うので、自前が跳ね上がる |
| 1200000 | 3600 | 3300 | 自前 | ここで自前が勝つ |
| 単純な損益分岐点: 800000 回 | 早すぎる。階段を無視している |
| 返事: ... | モデルの一文。言葉は毎回違う |
学生が入力するセルは、このプレビューでは空白です。