关于 lightning-cost-estimation
为使用 Lightning AI 的 Agent 提供动态成本估算指南,要求实时查询加速器价格与容量,并按硬件、运行时长和存储计算费用。
主要功能
- 01实时查询加速器价格与容量
- 02比较云服务商的 SKU
- 03按实例、时长和存储估算费用
- 04按模型需求评估硬件规格
- 05说明竞价与预留容量计费规则
适用场景
- 01为训练任务估算 GPU 费用
- 02比较不同云上的同类硬件
- 03估算多节点作业或模型服务成本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lightning-ai/ skills --skill lightning-cost-estimation安装后在 Claude Code 中输入/lightning-cost-estimation确认已加载。
详细介绍
Lightning AI 费用估算
lightning.ai/pricing 上的所有机器价格都来自同一个公开端点。**始终实时获取价格、容量和 SKU slug;切勿凭记忆报价。**这些信息都会变化,因此本文件有意不包含价格快照。
1 个 Lightning credit = 1 美元。机器分配后按秒计费;存储按天计费。 文档:计费常见问题 · 管理费用。
设置与身份验证
加速器目录无需身份验证,因此登录前即可使用普通的 curl:
curl -s "https://lightning.ai/v1/core/accelerators?cloudProvider=MACHINE" | jq '.accelerator | length'
lightning api "<path>" 会返回相同的 JSON;如果 Agent 的权限规则禁止 curl,但允许 lightning,请使用此命令。它始终会发送凭据,因此需要先运行 lightning login 或提供 API 密钥。
登录后,以下每个 curl 示例都可以替换为 lightning api "<path>":
export DEBUG=0 LIGHTNING_DEBUG=0 # an inherited DEBUG=1 logs the Authorization header; set this in every new shell
# Use the Lightning AI CLI from the current env; install or upgrade it there if it's missing or older than 2026.9.18
v=$(lightning --version 2>/dev/null | sed -n 's/^Lightning CLI version //p')
[ -n "$v" ] && [ "$(printf '%s\n' 2026.9.18 "$v" | sort -V | head -1)" = 2026.9.18 ] \
|| uv pip install -U lightning-sdk || python3 -m pip install -U lightning-sdk
lightning --version # must print "Lightning CLI version …"; if not, see the table below
lightning api "/v1/core/accelerators?cloudProvider=MACHINE"
只有在检查某个团队空间可访问哪些云时才需要身份验证(运行 lightning login,或设置 LIGHTNING_API_KEY,也可选配 LIGHTNING_USER_ID)。这里的每个示例都需要 jq。
此操作会使用 Agent 当前的环境,并在必要时将工具安装到该环境中(项目 venv、conda 环境等);之后请始终直接调用 lightning …。如果安装过程不顺利:
| 症状 | 解决方法 |
|---|---|
没有激活的环境、出现 externally-managed-environment,或与项目自身的固定版本冲突 | 单独安装:uv tool install lightning-sdk(或 pipx install lightning-sdk);如果命令不在 PATH 中,请调用 "$(uv tool dir --bin)/lightning" |
安装后仍未显示 Lightning CLI version | 其他 lightning(PyTorch Lightning 的)或未激活的环境排在前面:检查 command -v lightning,然后激活环境或调用其中的 bin/lightning |
出现 No such command、No such option 或 unexpected extra argument | CLI 版本太旧:在 command -v lightning 指向的位置升级(uv pip install -U lightning-sdk 或 uv tool upgrade lightning-sdk) |
| 安装受阻(环境或主目录为只读,或 Agent 沙箱限制) | 将每条命令作为 UV_CACHE_DIR="${TMPDIR:-/tmp}/uv" UV_TOOL_DIR="${TMPDIR:-/tmp}/uv-tools" uvx lightning-sdk … 运行 |
每次调用都出现 SSL/CA 错误,甚至 lightning --version 也如此,且仅在 Agent 沙箱内发生 | **/*.pem 读取拒绝规则屏蔽了 certifi 的 cacert.pem:允许访问该路径;不要禁用沙箱 |
出现 NameResolutionError,且仅在 Agent 沙箱内发生 | 如果 lightning api 也失败,请让用户允许访问 lightning.ai 和 *.lightning.ai(/sandbox)。如果只有 studio/job 命令或 SDK 失败,说明它们绕过了沙箱代理:只需在沙箱外运行这些命令。后台轮询器也会以相同方式静默失败 |
解析组织和团队空间(仅用于可用性检查)
价格是全局的:报价无需团队空间。但要检查用户可以在哪些云上启动机器,就需要团队空间。切勿猜测;请先解析,如果存在歧义,再询问用户:
lightning api /v1/memberships | jq -r '.memberships[] | [.ownerType, .name, .projectId] | @tsv'
PID=$(lightning api /v1/memberships | jq -r '.memberships[] | select(.name=="<teamspace>") | .projectId' | head -1)
lightning api "/v1/projects/$PID/clusters" | jq -r '.clusters[].id'
请使用 云服务提供商 表将集群 ID 映射到目录中的提供商。不要将团队空间无法启动的云作为答案报价;只能将其说明为“启用该云账户后即可使用”。
加速器目录
GET https://lightning.ai/v1/core/accelerators?cloudProvider=<PROVIDER> → {"accelerator": [ ... ]}。
与成本核算相关的字段:
| 字段 | 含义 |
|---|---|
cost | 整个实例的按需美元/小时价格,并非每块 GPU 的价格。 一款 8×H100 SKU 的价格为 36,即每块 GPU 每小时 $4.50;若按每块 GPU 报价,估算金额会膨胀 8 倍。 |
spotPrice | 可中断实例的美元/小时价格。0 表示提供商没有竞价型实例,并非免费。 竞价型实例不一定比 cost 便宜:从非零值中取 min(cost, spotPrice),并说明引用的是哪个价格。 |
family、resources.gpu、resources.gpuType | 硬件信息:H100 × 8 × nvidia-h100-80gb。跨云比较时应依据这些字段,而非 slug(见下文)。gpuType 有时会省略显存(nvidia-b200);请使用显存表。SDK 将 RTX 系列写作 RTX PRO,目录中则写作 RTXP。 |
slugMultiCloud / slug / instanceId | SKU 名称。同一硬件在不同云上的名称各不相同。 |
resources.memoryMb、.cpu、.storageGb | 主机 RAM / vCPU / 磁盘。偶尔会有错误(有一款 AWS H200 SKU 报告为 141000000 MB);报价前请检查 RAM 是否合理。 |
outOfCapacity、availableInSeconds(…Spot) | 当前是否可用,以及预计等待时间。缺货或需要等待 10⁴–10⁶ 秒的低价 SKU,并不是真正可用的报价。 |
dwsOnly / dwsCost | GCP Dynamic Workload Scheduler:排队的批处理分配,并非按需资源,因此不适用于始终在线的端点。 |
reservable / capacityBlockPrice | AWS 容量块:长期运行可享受低得多的预留价格。折扣因 SKU 而异,因此请逐个 SKU 查看;对于以周计的运行时长,应列出此价格。 |
isTierRestricted | 需要付费套餐等级;免费套餐账户无论价格如何都无法启动。 |
enabled、availableZones、clusterId | 是否已启用、所在位置,以及所属的云账户。 |
云提供商
cloudProvider= | 类型 | 集群 ID(用于 --cloud) | 备注 |
|---|---|---|---|
MACHINE | Lightning Cloud(Lightning 自有裸金属) | lightning-baremetal | 默认云。不是 SDK 中的 LIGHTNING,后者在此处只是占位符。 |
AWS | AWS | lightning-public-prod | SKU 范围最广;提供容量块。 |
GCP | GCP | gcp-lightning-public-prod | TPU 的唯一来源;部分 GPU 为 dwsOnly。 |
LAMBDA_LABS | Lambda Labs | lightning-lambda-prod | |
NEBIUS | Nebius | lightning-nebius-prod | |
VOLTAGE_PARK | Voltage Park | lightning-voltagepark-prod | |
VULTR | Vultr | — | 小众 SKU(A16/A40/A100/L40S)。 |
优先报价 Lightning Cloud,然后实时比较其他云;只有在其他云价格更低,且用户的团队空间有容量时,才推荐其他云。
从报价到启动
使用 lightning-jobs、
lightning-studios 和 lightning-deployments 使用的 --machine 名称(Python 中的 Machine.<NAME>),并通过 --cloud <cluster-id> 指定你查询价格的云;如果不指定 --cloud,任务会运行在团队空间的默认云上,费率可能不同。
--machine | 目录中的硬件 | --machine | 目录中的硬件 | |
|---|---|---|---|---|
CPU_SMALL / CPU / CPU_X_8 / CPU_X_16 | cpu-2 / cpu-4 / cpu-8 / cpu-16 | A100 … A100_X_8 | A100 × N,显存为 40 或 80 GB,视云而定 | |
DATA_PREP / _MAX / _ULTRA | data-prep-mid / -max-large / -ultra-extra-large | H100 … H100_X_8 | H100 × N | |
T4 / L4 / L40S (_X_N) | T4 / L4 / L40S × N | H200 / B200 (_X_N) | H200 / B200 × N | |
T4_SMALL | 小型 T4 | RTXP_6000 (_X_N) | RTXP × N |
A100_40GB* / A100_80GB* 会固定显存大小,但不会显示在 CLI 的 --machine 选项中;它们只能在 Python 中用作 Machine.A100_80GB_X_8,或通过 studio switch 使用。
同一硬件在不同云上的 Slug 各不相同,因此绝不要硬编码 Slug,也不要用它关联数据。 Nebius 上的 H200 是 lit-h200-1,而 Lightning Cloud 上的是 lit-h200-141gb-1;Machine.H100.slug 是 lit-h100-1,而目录中显示的是 lit-h100-80gb-1。SDK(2026.9.18+)会将这些都映射到同一台机器。请像以下配方那样,按 family + resources.gpu(以及来自 gpuType 的 VRAM)匹配;根据臆测的 Slug 筛选,会导致明明存在的机器看起来不可用。
价格查询配方
在 Shell 中加载一次(bash 或 zsh),之后每次查询报价都可以使用。
# _litfetch <PROVIDER> — catalog JSON, or an error and a non-zero exit
_litfetch() {
curl -sf --retry 3 --retry-delay 1 --max-time 20 \
"https://lightning.ai/v1/core/accelerators?cloudProvider=$1" \
|| { echo "ERROR: could not fetch the $1 catalog; don't quote from a partial result" >&2; return 1; }
}
_LITJQ='def spot: if .spotPrice > 0 then (.spotPrice*100|round/100) else "n/a" end;
def count: if .acceleratorType=="GPU" then .resources.gpu else .resources.cpu end;
def status: [ (if .outOfCapacity then "OUT-OF-CAPACITY" else empty end),
(if .dwsOnly then "DWS-ONLY" else empty end),
(if .isTierRestricted then "TIER-RESTRICTED" else empty end),
(if .reservable then "RESERVABLE" else empty end) ]
| if length==0 then "ok" else join(",") end;'
# litprice <PROVIDER> [family-regex] — one cloud's live catalog, one row per SKU
litprice() {
local json; json=$(_litfetch "${1:-MACHINE}") || return 1
printf '%s' "$json" | jq -r --arg re "${2:-.}" "$_LITJQ"'
["SKU","FAMILY","N","USD/HR","SPOT/HR","RAM_GB","WAIT_S","STATUS"],
(.accelerator[] | select(.family|test($re;"i"))
| [.slugMultiCloud, .family, count, .cost, spot,
((.resources.memoryMb|tonumber)/1024|round), .availableInSeconds, status])
| @tsv' | column -t -s $'\t'
}
# litcompare <family> <gpus> [gpuType-regex] — the same hardware on every cloud, cheapest first.
# Stops if any cloud's catalog can't be fetched: a missing cloud could hide the real winner.
litcompare() {
local p json rows=""
for p in MACHINE AWS GCP LAMBDA_LABS NEBIUS VOLTAGE_PARK VULTR; do
json=$(_litfetch "$p") || return 1
rows+=$(printf '%s' "$json" | jq -r --arg p "$p" --arg f "$1" --argjson n "$2" --arg m "${3:-.}" "$_LITJQ"'
.accelerator[]
| select((.family|ascii_upcase)==($f|ascii_upcase) and .resources.gpu==$n
and ((.resources.gpuType // "")|test($m;"i")))
| [$p, .slugMultiCloud, (.resources.gpuType // "?"), .cost, spot, .availableInSeconds, status]
| @tsv')$'\n' || return 1
done
{ printf 'CLOUD\tSLUG\tGPU\tUSD/HR\tSPOT/HR\tWAIT_S\tSTATUS\n'
printf '%s' "$rows" | grep . | sort -t $'\t' -k4,4 -g; } | column -t -s $'\t'
}
# litquote <usd_per_hour> <instances> <hours> [storage_gb] [storage_days]
litquote() {
jq -n --argjson r "$1" --argjson n "$2" --argjson h "$3" \
--argjson gb "${4:-0}" --argjson d "${5:-0}" '
($r*$n*$h) as $c | (([$gb-10,0]|max) * 0.10 * ($d/30)) as $s
| { rate_per_hour: $r, instances: $n, hours: $h,
cluster_per_hour: ($r*$n*100|round/100),
compute_usd: ($c*100|round/100),
storage_usd: ($s*100|round/100),
total_usd: (($c+$s)*100|round/100) }'
}
litprice MACHINE # everything on Lightning Cloud
litprice GCP 'B200|H200' # just those families on GCP
litcompare H100 8 # every cloud's 8×H100, cheapest first
litcompare A100 1 80gb # 1×A100, 80 GB variants only
litquote 36 32 336 # 32 nodes × a $36/hr rate × 2 weeks
成本公式
时长:1 天 = 24 h · 1 周 = 168 h · 1 个月 = 730 h(或 days × 24)· 1 年 = 8760 h。
compute_usd = cost_per_hour × instances × hours # billed per second, no rounding up
spot_usd = spotPrice × instances × hours # only if spotPrice > 0
storage_usd = max(0, drive_gb − 10) × $0.10 × months # first 10 GB free, billed daily
total_usd = compute_usd + storage_usd
-
每 GPU 小时成本 =
cost / resources.gpu。 -
多节点:每节点的
cost×num_machines。在H100_X_8上设置--num-machines 32,费用按 32 × 8×H100 的费率计算。 -
推理服务:
cost× 副本数 × 小时数。使用自动伸缩时,请提供一个范围:min_replicas是你 24/7 付费的下限(缩容至零时为 0),max_replicas是上限。每 Token 的成本效益:usd_per_1M_tokens = (cost_per_hour × replicas) / (tokens_per_sec × 3600 / 1e6)tokens_per_sec是在你的批次大小下测得的总输出吞吐量:请进行基准测试,或给出一个范围。如果用户只想调用模型,请与lightning-llm-gateway中按 Token 计费的模型比较;只有在持续负载相当高时,专用 GPU 才更划算。 -
抢占式 / 可中断(
--interruptible、interruptible=True)通常可便宜 15–60%,但可能被抢占:建议用于支持检查点的训练,不要用于有服务 SLA 的场景。 -
计费覆盖整个分配时段,即
startedAt→stoppedAt,包括镜像拉取(此期间 SDK 会报告Pending)和关机。使用大型镜像的任务运行 20 分钟,可能按 28 分钟计费。请将启动时间单独列项,或给出一个范围;任务越短,差异越大。 -
存储:统计团队空间中的文件夹,而不只是 Drive。作为文件夹添加的数据按 Drive 计费;从外部连接的存储桶则由其所属云计费。两者都会显示在
/v1/projects/<pid>/data-connections下,请以isBillableFolder: true为准。Teamspace.new_folder()会创建计费类型的文件夹。对于持续数周的训练,请询问检查点和数据集大小:20 TB 约为每月 ~$2,000。 -
每个账户都包含一个免费的 4-CPU Studio;其他机器按标价计费。
每个报价都要注明假设条件:费率、实例数、小时数、抢占式还是按需、存储,以及查询价格的日期。
为模型选择硬件规格(询价前完成)
如果用户指定的是模型而不是机器,请先估算所需硬件规格,说明假设,再询价。每块 GPU 的 VRAM(目录中不一定提供):
| 系列 | VRAM/GPU | 系列 | VRAM/GPU |
|---|---|---|---|
| T4 | 16 GB | H100 | 80 GB |
| L4 | 24 GB | H200 | 141 GB |
| A100 | 40 或 80 GB(检查 gpuType) | B200 | 180 GB |
| L40S | 48 GB | RTXP (RTX PRO 6000) | 96 GB |
| A40 | 48 GB | TPU v6e | 32 GB HBM/芯片 |
推理 / 服务内存
weights_gb ≈ params_B × bytes_per_param # BF16/FP16 = 2, FP8 = 1, INT4 = 0.5
kv_cache_gb ≈ 2 × layers × kv_heads × head_dim × bytes × ctx_len × concurrency / 1e9
vram_needed ≈ weights_gb × 1.15 + kv_cache_gb # ~15% for activations/fragmentation
选择满足 vram_needed ≤ gpus × vram_per_gpu 的最小 SKU,并使张量并行度为 2 的幂。选择前先完整套用公式,并保持单位一致:“80 GB”是供应商标注,而 nvidia-smi 报告每块 H100 为 81,559 MiB ≈ 85.5 十进制 GB(H200 显示 143,771 MiB ≈ 150.8 GB,而标注为“141 GB”)。70B 模型采用 BF16 时,权重占 140 GB,加上 KV 缓存前为 140 × 1.15 = 161 GB。2×H100 的 171 GB 总量只剩约 10 GB:在适中的上下文长度和并发量下可以运行,因此在承诺更高规格前先计算 KV 缓存,或者选择 1×B200。总内存是必要条件,但并非充分条件:模型还必须能按你的张量并行度拆分到各块 GPU 上。
训练内存 = 基础权重 + 可训练状态 + 激活值:
| 方法 | 基础权重 | 可训练状态(梯度 + AdamW) | 70B,未计激活值 |
|---|---|---|---|
| 全量微调,混合精度 | BF16,2 B/参数,全部参与训练 | ~14–16 B/参数(梯度、FP32 主副本、两个 FP32 矩) | ~1.1–1.3 TB → 使用 FSDP/ZeRO-3 的多节点 |
| LoRA | 冻结,BF16(2 B/参数) | 仅适配器,通常 < 1% 的参数 | ~140 GB → 2×H100 或 1×H200/B200 |
| QLoRA | 冻结并量化为 4-bit(~0.5 B/参数) | 仅适配器 | ~35–40 GB → 一块 80 GB GPU |
每种情况下都还要加上激活值,其大小随批次大小 × 序列长度(以及 logits 的词表大小)增长;梯度检查点会以增加计算量为代价缩小激活值。小模型的激活值也可能占主导:一次 4B LoRA 运行,批次大小为 8 × 768 tokens,峰值达到 64 GB。在更大 GPU 上测得的峰值不能直接套用:这次在 H200 上测得的运行,在 80 GB H100 上发生了内存不足,因此应根据测量该数值时使用的 GPU 来估算规格。QLoRA 是 LoRA 加上对冻结基础模型进行量化(PEFT: 量化)。
训练时间(这决定了费用):
flops = 6 × params × tokens # fwd + bwd, dense transformer
gpu_hours = flops / (peak_flops × mfu × 3600)
wall_hours = gpu_hours / (num_gpus × scaling_efficiency)
cost = wall_hours × nodes × node_cost_per_hour
稠密 BF16 峰值(无稀疏性):A100 312 TFLOPS · H100/H200 989 TFLOPS · B200 ≈ 2250 TFLOPS · L40S 362 TFLOPS · L4 121 TFLOPS。采用 MFU 0.35–0.5(0.4 是合理的默认值),并假设扩展效率在 8–16 个节点时约为 0.9,在 32 个及以上节点时约为 0.8。MFU、数据加载器停顿、重启和扩展损耗会让实际数值浮动几十个百分点:请给出范围并列明假设。
示例工作流
此技能可处理的提示词:"在 32 个 8×H100 节点上训练 2 周要多少钱?"、"在 B200 上提供模型服务要花多少钱?"、"微调 Llama-70B 最便宜的方式是什么?"、"如果我保留 2 个 A100 和 5 TB 数据,每月账单是多少?"。
端到端报价:多节点训练。 此处费率仅作示例;请使用 litcompare
返回的费率。
litcompare H100 8 # pick the cheapest row that's "ok" and in the user's teamspace
litquote 36 32 336 # 32 nodes, 2 weeks, if that row is $36/hr: $1,152/hr -> $387,072
litquote 36 32 336 20480 14 # + 20 TB of checkpoints kept for the fortnight
报告时注明假设条件:"32 × 8×H100,使用 ,费率为 $36/节点/小时 = $1,152/小时;运行 2 周
(336 小时),按需费用约为 $387k,另加 20 TB 检查点的约 $955。价格获取日期:。" 只有在 spotPrice > 0 且作业会写入检查点时,才添加竞价价格;如果该行标记为
RESERVABLE,则添加容量预留价格。
其他提示词也遵循相同步骤:
- 在 Lightning Cloud 可能不提供的 GPU 系列上提供服务: 运行
litcompare B200 1和litcompare B200 8, 然后标出DWS-ONLY和OUT-OF-CAPACITY行,并将缩容至零的价格作为一个范围报价。 - 微调: 使用训练内存表确定规模(7B LoRA 可在一块 80 GB GPU 上运行),然后运行
litcompare H100 1和litquote <rate> 1 <hours>。 - 稳定的月度账单: 运行
litquote <rate> 2 730 5120 30,计算两台机器全天候运行,再加上 5 TB 的费用;如果机器并非全天运行,则传入更少的小时数(每天 8 小时 ≈ 每月 243 小时)。
原始 API 备用方案
# full record for one SKU (all capacity/quota/reservation fields)
curl -s "https://lightning.ai/v1/core/accelerators?cloudProvider=AWS" \
| jq '.accelerator[] | select(.family=="H100" and .resources.gpu==8)'
# AWS reserved capacity-block rate vs on-demand
curl -s "https://lightning.ai/v1/core/accelerators?cloudProvider=AWS" \
| jq -r '.accelerator[] | select(.reservable) | [.slugMultiCloud, .cost, .capacityBlockPrice] | @tsv'
# what a finished job actually cost (needs auth): the ground truth to check an estimate against
lightning job inspect <job-name> --teamspace <owner>/<teamspace>
作业完成并结算后,job.total_cost 会给出实际的美元费用(参见 lightning-jobs 和“注意事项”)。通过身份验证后,Teamspace("owner/teamspace").list_machines(cloud_account=<id>) 会返回 Machine 对象,其中包含该账户当前可用机器的 cost、interruptible_cost、wait_time 和 provider。从 Teamspace(...).cloud_account_objs[i].cluster_id 获取 <id>:.cloud_accounts 中的显示名称会返回空列表;如果不传参数,多个账户的行会合并,且不会标明各自所属的账户。lightning-jobs 支持按账户列出作业。跨云比较和登录前报价,请使用 REST 目录。
注意事项
- 对于所有常量,
Machine.<NAME>.cost和.interruptible_cost均为None,尽管.slug已设置,因此对象看起来已加载完整。价格来自目录或list_machines()。 - 作业首次报告终止状态时,
job.total_cost仍是临时值,并会继续增长几分钟,且没有标记说明这一点;它也可能在约一分钟内恰好显示为0.0。轮询直到连续两三次读取的值保持不变;刚完成的作业若显示0.0,应视为“尚未计算”。 - 未知的
cloudProvider值会静默返回 AWS 目录。AZURE、KUBERNETES和TENSORDOCK返回的 SKU 与 AWS 完全相同。只有表中列出的提供商经过核验;对其他提供商报价前(枚举中还列有CUDO、MITHRIL、THUNDER_CAT、CLOUDFLARE、RAFAY、SLURM),请将其响应与 AWS 的响应进行差异比较。 - 切勿根据
cloudProvider=LIGHTNING或DGX报价。 它们会返回一个内部集群条目,成本占位值为1和2。SDK 中的CloudProvider.LIGHTNING与目录中的MACHINE属于同一平台;若要在其上启动,请传入--cloud lightning-baremetal。 - 无法从平台查看已存储的字节数。 在填充并清空一个计费文件夹期间,
/v1/memberships上的currentStorageBytes没有变化。请根据已知的上传数据量估算存储量。 - 对已报价的任何内容进行启动前,务必先向用户确认;此技能仅提供报价。