mcpField
L
lightning-cost-estimation

lightning-cost-estimation

github.com/lightning-ai云与 DevOps961 次安装2 周前更新
代码仓库

关于 lightning-cost-estimation

为使用 Lightning AI 的 Agent 提供动态成本估算指南,要求实时查询加速器价格与容量,并按硬件、运行时长和存储计算费用。

主要功能

  1. 01实时查询加速器价格与容量
  2. 02比较云服务商的 SKU
  3. 03按实例、时长和存储估算费用
  4. 04按模型需求评估硬件规格
  5. 05说明竞价与预留容量计费规则

适用场景

  1. 01为训练任务估算 GPU 费用
  2. 02比较不同云上的同类硬件
  3. 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 argumentCLI 版本太旧:在 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 / instanceIdSKU 名称。同一硬件在不同云上的名称各不相同。
resources.memoryMb、.cpu、.storageGb主机 RAM / vCPU / 磁盘。偶尔会有错误(有一款 AWS H200 SKU 报告为 141000000 MB);报价前请检查 RAM 是否合理。
outOfCapacity、availableInSeconds(…Spot)当前是否可用,以及预计等待时间。缺货或需要等待 10⁴–10⁶ 秒的低价 SKU,并不是真正可用的报价。
dwsOnly / dwsCostGCP Dynamic Workload Scheduler:排队的批处理分配,并非按需资源,因此不适用于始终在线的端点。
reservable / capacityBlockPriceAWS 容量块:长期运行可享受低得多的预留价格。折扣因 SKU 而异,因此请逐个 SKU 查看;对于以周计的运行时长,应列出此价格。
isTierRestricted需要付费套餐等级;免费套餐账户无论价格如何都无法启动。
enabled、availableZones、clusterId是否已启用、所在位置,以及所属的云账户。
云提供商
cloudProvider=类型集群 ID(用于 --cloud)备注
MACHINELightning Cloud(Lightning 自有裸金属)lightning-baremetal默认云。不是 SDK 中的 LIGHTNING,后者在此处只是占位符。
AWSAWSlightning-public-prodSKU 范围最广;提供容量块。
GCPGCPgcp-lightning-public-prodTPU 的唯一来源;部分 GPU 为 dwsOnly。
LAMBDA_LABSLambda Labslightning-lambda-prod
NEBIUSNebiuslightning-nebius-prod
VOLTAGE_PARKVoltage Parklightning-voltagepark-prod
VULTRVultr—小众 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_16cpu-2 / cpu-4 / cpu-8 / cpu-16A100 … A100_X_8A100 × N,显存为 40 或 80 GB,视云而定
DATA_PREP / _MAX / _ULTRAdata-prep-mid / -max-large / -ultra-extra-largeH100 … H100_X_8H100 × N
T4 / L4 / L40S (_X_N)T4 / L4 / L40S × NH200 / B200 (_X_N)H200 / B200 × N
T4_SMALL小型 T4RTXP_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
T416 GBH10080 GB
L424 GBH200141 GB
A10040 或 80 GB(检查 gpuType)B200180 GB
L40S48 GBRTXP (RTX PRO 6000)96 GB
A4048 GBTPU v6e32 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 没有变化。请根据已知的上传数据量估算存储量。
  • 对已报价的任何内容进行启动前,务必先向用户确认;此技能仅提供报价。

评论

支持 Markdown