这次我们不聊某个具体模型,而是先看一个近期很明显的反差:SpaceX 的收入在快速上涨,AI 公司的支出却在以数十亿美元为单位持续燃烧。这句话不是我编出来的,SpaceX revenue rockets while AI spending burns billions本身就是最近不少技术讨论里反复出现的标题。
把这两个信息放在一起,最值得追问的不是股价,而是工程问题:AI 的钱到底花到哪了,为什么还没变成稳定的业务能力?
本文不分析财报,也不评价 SpaceX 的商业动作,只站在技术工程角度把“AI 烧钱”拆开:钱主要烧在训练、推理、实验这三件事上,然后给出可落地的降本路径。你会看到 AI 成本构成、本地部署环境准备、推理服务启动、API 批量调用、显存与耗时观察、常见问题排查,以及一套适合技术团队的落地建议。
1. 先看现象:AI 支出为什么“烧得快”
1.1 三笔钱:训练、推理、实验
AI 项目花钱不是单次的,而是持续的。绝大多数团队的成本压力来自三个部分。
第一是训练成本。大模型训练需要大规模 GPU 集群,数据清洗、预训练、微调、对齐,每一轮都要重新消耗算力。训练一次模型不只是“跑一个脚本”,还要反复调整数据配比、学习率、模型结构,任何一个环节不合理都可能让整轮训练白费。
第二是推理成本。模型训练完并不是终点,上线后还要不断响应真实请求。在线服务必须保持可用状态,GPU 不能随便关机,用户请求来了就要立刻计算。即使每次请求只消耗几秒算力,乘以每天上万次调用,累计起来的 GPU 时长非常可观。
第三是实验成本。团队在开发阶段会频繁尝试不同提示词、不同参数、不同模型版本。单个实验看起来不多,但一整天跑下来,GPU 利用率可能很高,产出的有效结果却很少。这种“反复试错”的隐性成本,往往比训练和推理更难统计。
1.2 从 SpaceX 的工程方式看复用
SpaceX 最值得技术团队学习的不是火箭本身,而是“复用”和“快速迭代”这两个思路。火箭一级回收后重新使用,降低了单次发射成本;AI 工程里同样存在大量可复用资产:已经调好的提示词模板、稳定的模型版本、可复用的推理服务、标准化的数据流水线。如果每个项目都从零开始训练或重复搭建环境,成本自然失控。
复用不意味着不做新东西,而是把已经验证过的能力沉淀下来。比如同一个推理服务可以同时服务多个业务,同一个向量数据库可以支撑多个检索应用,同一个评测集可以反复衡量模型变化。这些资产只要做好版本管理,后续每个项目都能省下一部分算力和开发时间。
1.3 技术团队应该盯住的成本指标
控制 AI 支出不能只靠“感觉”,要用数据说话。下面几个指标建议每个使用 AI 模型的团队都建立监控。
| 指标 | 观察方式 | 说明 |
|---|---|---|
| 单次请求成本 | 总 GPU 成本 / 总请求数 | 判断每个业务请求的算力消耗是否合理 |
| GPU 利用率 | nvidia-smi持续采样 | 利用率长期过低说明资源没被充分利用 |
| 请求平均耗时 | API 网关日志或推理框架日志 | 耗时异常通常意味着需要压缩上下文或并发 |
| 排队等待时间 | 服务端监控 | 排队时间变长说明并发能力到达瓶颈 |
| 失败重试率 | 应用日志 | 重试率过高会成倍放大推理成本 |
这套指标不需要一开始就做得很重。先用日志和监控工具把数据记下来,每周看一眼趋势,就能发现问题。
2. AI 成本控制路径速览
没有一种方案能解决所有“AI 烧钱”问题,但可以按路径组合使用。下面这张表把主要控制思路整理到一起。
| 控制路径 | 核心思路 | 关键手段 | 适用场景 |
|---|---|---|---|
| 训练端降本 | 小模型 + 高质量数据 | 数据清洗、领域预训练、LoRA 微调 | 垂直领域任务,不需要超大通用模型 |
| 推理端降本 | 本地部署 + 模型量化 | 开源模型、4bit/8bit 量化、批处理 | 需要控制 API 费用且对数据隐私有要求 |
| 平台工程化 | 资源池化 + 自动扩缩容 | Kubernetes、GPU 调度、闲置回收 | 多个团队共享 GPU 资源 |
| 应用端降本 | 缓存 + 检索增强 + 小模型路由 | Redis 缓存、RAG、意图分类 | 高频重复请求较多,第一轮不必要调用大模型 |
| 评测端降本 | 固定评测集 + 回归测试 | 自动化评测脚本 | 防止模型升级后效果回退,减少无效实验 |
这些路径可以单独使用,也可以组合。先判断当前团队最缺的是推理效率还是训练效率,再决定优先投入哪一项。
3. 本地部署开源模型:环境准备
3.1 硬件与系统检查清单
本地部署大模型之前,先确认环境是否满足要求。这里给出的是通用检查项,具体版本需要以实际项目文档为准。
- 操作系统:Linux 是主流选择,Windows 也可以跑,但需要额外处理 CUDA 环境。
- GPU 驱动:确保
nvidia-smi能正常输出显卡信息。 - CUDA 版本:与推理框架和 PyTorch 版本匹配。
- Python 版本:建议使用 3.10 或更高版本,具体看项目依赖。
- 磁盘空间:模型权重文件可能很大,需要预留足够空间。
- 内存:推理大模型时,CPU 内存也会被占用,不能只看显存。
先执行下面这条命令,确认 GPU 驱动和显存状态正常:
nvidia-smi如果输出为空或报错,先解决驱动问题,再继续后面的部署。
3.2 Python 与 GPU 环境
建议用虚拟环境隔离依赖,不要直接装在系统 Python 里。这里用 conda 创建环境作为示例:
conda create -n llm python=3.10 -y conda activate llm激活环境后,再按照推理框架的说明安装 PyTorch、CUDA 版依赖和模型运行库。不同框架的安装命令差别较大,不要照搬别人的命令,要以项目 README 为准。
3.3 模型权重与量化
本地部署可以从开源模型开始,并根据显卡显存选择合适的量化方式。量化可以降低显存占用,但可能会带来少量效果损失,所以上线前必须用固定评测集做效果对比。
- 显存较小:优先考虑量化版本模型,比如 4bit 或 8bit。
- 显存充足:可以尝试未量化版本,效果更稳定。
- 上下文长度:模型支持的上下文越长,占用的显存越高,测试时先从小长度开始。
模型下载后,建议统一放在一个独立的模型目录中,例如:
/models /base-model /quantized-model这样后续切换模型版本时,不需要修改业务代码。
4. 安装部署与启动方式
4.1 通用推理服务启动模板
下面以常见的 OpenAI 兼容推理服务为例,展示启动一个本地推理服务的基本方式。实际命令需要按你选择的推理框架和模型路径调整。
python -m vllm.entrypoints.openai.api_server \ --model /path/to/model \ --dtype auto \ --max-model-len 4096 \ --port 8000这里几个参数分别说明:
--model:模型权重所在路径。--dtype:使用自动精度,部分量化模型需要手动指定。--max-model-len:最大上下文长度,先给一个较小的值,跑稳后再调大。--port:服务端口,默认 8000,如果冲突就换成 8001 或 9000。
如果你的环境不是 vLLM,命令会不同。理解参数含义后,再切换到对应框架的文档。
4.2 启动后如何确认服务可用
服务启动后,先看控制台日志有没有Uvicorn running或类似的监听提示。然后在另一个终端访问接口:
curl http://127.0.0.1:8000/v1/models如果返回模型列表,说明服务已经起来。如果连接失败,优先检查端口、防火墙和进程日志。
4.3 用 systemd 守护进程
本地服务直接在前台运行,关闭终端就停了。生产环境建议用 systemd 守护进程,异常退出后自动拉起。下面是一个通用模板:
[Unit] Description=Local LLM Inference Service After=network.target [Service] User=your_user WorkingDirectory=/path/to/project ExecStart=/path/to/python -m vllm.entrypoints.openai.api_server --model /path/to/model --port 8000 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target保存为/etc/systemd/system/llm.service后,执行:
sudo systemctl daemon-reload sudo systemctl enable llm sudo systemctl start llm这样服务可以开机自启,崩溃后自动重启。路径和用户需要替换成实际环境。
5. 功能测试与效果验证
5.1 基础生成测试
先用最简单的请求验证生成能力。这里用 curl 调用 OpenAI 兼容接口:
curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "/path/to/model", "messages": [{"role": "user", "content": "你好,请用一句话介绍你自己。"}], "max_tokens": 128, "temperature": 0.2 }'判断成功的标准是返回结果包含choices,并且内容不是空字符串。如果超时,先看服务端日志有没有显存不足或请求排队提示。
5.2 连续请求与并发测试
单个请求成功不代表生产可用。接着做连续请求测试,观察显存占用和响应耗时。
启动一个实时监控:
watch -n 1 nvidia-smi然后在另一个终端连续发送多个请求,观察:
- 显存占用是否稳定。
- 是否有请求排队。
- 响应耗时是否波动明显。
第一次测试建议只开一个并发,稳定后再增加到 2、4、8。并发不是越高越好,过高的并发会导致显存溢出或请求互相争抢。
5.3 长文本与批量任务观察
如果你的业务需要处理长文本,要单独测一次长输入。输入长度接近模型上限时,显存占用会显著增加。如果出现out of memory,需要降低max-model-len、减小 batch size,或者使用量化模型。
批量任务不能直接在单次请求里塞太多内容。更好的方式是准备一个输入目录,每个任务一个文本文件,然后让脚本按队列逐个调用服务。这样不仅方便中断恢复,也方便统计每个任务的耗时和失败原因。
5.4 输出质量与幻觉检查
成本控制不能只看速度,还要看质量。准备一组固定测试题,覆盖业务常见问题,每次模型升级或参数调整后都跑一遍,对比答案是否准确。
这里要特别关注“AI 幻觉”:模型可能生成看起来很合理、但实际上是错误的内容。在线生成类和内容生成类业务,必须加上人工复核或规则校验,不能直接无审核对外输出。
6. 接口 API 与批量任务
6.1 为什么先做 API
把模型服务封装成 API 的最大好处,是业务代码和模型解耦。业务团队不需要关心模型文件放在哪里,也不需要手动启动进程,只需要调用接口。对于批量任务,API 层可以统一控制并发、超时和重试策略。
在本地部署阶段,API 服务只需要监听127.0.0.1,避免外部访问。如果需要被其他机器访问,再根据内网环境调整监听地址,并做好访问控制。
6.2 Python 批量调用通用模板
下面是一个 Python 批量调用示例。它使用线程池并发请求,并捕获异常,避免单次失败影响整个任务。
import requests from concurrent.futures import ThreadPoolExecutor, as_completed API_URL = "http://127.0.0.1:8000/v1/chat/completions" def call_model(prompt): payload = { "model": "/path/to/model", "messages": [{"role": "user", "content": prompt}], "max_tokens": 256, "temperature": 0.2, } resp = requests.post(API_URL, json=payload, timeout=120) resp.raise_for_status() return resp.json() # 实际使用时,把 prompt_list 换成从文件或数据库读取的内容 prompt_list = [ "任务一:总结这段文本", "任务二:提取关键信息", "任务三:生成标题", ] with ThreadPoolExecutor(max_workers=2) as executor: futures = {executor.submit(call_model, p): p for p in prompt_list} for future in as_completed(futures): try: result = future.result() print(result["choices"][0]["message"]["content"]) except Exception as exc: print(f"任务失败: {exc}")这个示例里max_workers=2是保守值。实际并发数需要根据显存、模型大小和请求耗时来调整,不要一上来就开几十个并发。
6.3 队列与失败重试
批量任务量大时,直接并发请求容易把服务打满,所以建议加一个简单队列。每次从队列取一个任务,成功后记录结果,失败则判断是否重试。
重试要注意两点:
- 设置最大重试次数,避免死循环。
- 失败任务写入单独日志,方便排查。
比如可以把所有失败文本保存到failed.jsonl,之后单独重新跑。这样即使一次任务跑了几千条,也不会因为少量失败而全部重来。
7. 资源占用与性能观察
7.1 实时观察 GPU
GPU 是 AI 推理中最贵的资源,先用监控把它看清楚:
watch -n 1 nvidia-smi重点看四个字段:
Memory-Usage:显存占用,判断模型是否加载成功。GPU-Util:计算单元利用率。Power:功耗,判断是否真正在计算。Temperature:温度,过高时要注意散热。
如果显存占用高但利用率长期很低,说明服务可能在做无用等待,需要检查并发和队列配置。
7.2 CPU 与 GPU 推理差异
CPU 推理不是不能用,但速度通常比 GPU 慢很多,尤其是在大模型场景下。CPU 推理的优势是部署简单,不依赖独立显卡,适合低并发、离线任务。
如果你既没有 GPU,又只是想验证功能,可以先用 CPU 跑一个小模型。跑通流程后再切到 GPU,不要拿 CPU 的耗时当作最终性能。
7.3 降低显存占用的常见方式
显存不足是本地部署最常见的问题。可以从以下几个方面尝试:
- 使用量化版本模型。
- 降低最大上下文长度。
- 减小 batch size 或并发数。
- 关闭多余的后台进程,释放显存。
- 换用参数量更小的模型。
每一种方式都有取舍,不能只看显存数字,还要重新跑质量测试。比如模型换了量化版本后,要在同一组测试题上确认效果没有明显回退。
8. 常见问题与排查方法
部署和调用过程中,问题大概率会出现在环境、依赖、资源、接口这四个层面。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 服务启动后页面打不开 | 端口被占用或服务未启动 | 检查日志和端口 | 更换端口或重启服务 |
nvidia-smi没有输出 | 显卡驱动未安装或损坏 | 查看驱动安装状态 | 重新安装匹配驱动 |
| 依赖安装失败 | Python 版本或 CUDA 版本不匹配 | 查看错误日志和版本号 | 按要求重新创建环境 |
| 模型文件缺失 | 权重没有下载完整 | 检查模型目录文件大小 | 重新下载并校验 |
| 显存溢出 | 上下文太长或并发过高 | 观察nvidia-smi | 降低长度或并发 |
| 请求超时 | 模型响应慢或队列堆积 | 看服务日志和耗时 | 降低 batch 或增加超时时间 |
| API 返回 404 | 接口路径不对 | 查看服务文档 | 换成实际接口路径 |
| 批量任务卡住 | 单条请求一直占用资源 | 查看线程和显存 | 设置请求超时并增加重试 |
| 输出质量不稳定 | 温度过高或提示词不稳定 | 固定测试集对比 | 降低温度或固定随机种子 |
| 端口冲突 | 另一个进程占用端口 | 查找进程 PID | 杀掉旧进程或换端口 |
每遇到一个问题,先看日志,再动配置。不要凭感觉改参数,否则容易引入新问题。
9. 最佳实践与合规边界
9.1 工程化建议
- 第一次测试先用小参数。模型加载成功后,再逐步增大上下文和并发。
- 保留一套最小可运行配置。把启动命令、依赖版本、模型路径写清楚,放到项目 README 里。
- 模型文件、输入素材、输出结果分目录管理。避免几百个临时文件堆在一起。
- 批量任务必须加日志和失败重试。没有日志的任务,失败了很难定位。
- API 服务默认只监听本机。外部访问要加认证和 IP 白名单。
- 每次更换模型或参数,都要用同一组测试题回归对比。
9.2 版权、隐私与使用边界
AI 能力越强,越要注意使用边界。
- 使用模型生成图片、视频、声音或文本时,要确保素材版权合法。
- 涉及人脸、声音、肖像等内容,必须获得本人明确授权。
- 涉及个人隐私的数据,不能随意送入在线 API 或非授权环境。
- 内容生成类业务必须有审核机制,不能直接无约束对外发布。
- 批量调用外部服务时,要遵守服务条款和频率限制。
这些不是附加要求,而是工程上线的一部分。忽略合规问题,成本控制做得再好,也可能在业务上线时停滞。
10. 总结与下一步
回到开头那个反差:SpaceX 收入飙升,AI 支出却在烧钱。真正拉开差距的不是烧钱多少,而是钱有没有变成可复用的工程能力。AI 项目想控制成本,路径其实很清晰:先看清训练、推理、实验三部分支出,再用本地部署、量化、API 批量调用、资源监控等手段把每一笔算力花在明处。
下一步不要急着买更多 GPU,先做一次小规模对照实验。选一个开源模型,准备一组固定测试文本,记录 GPU 利用率、单次请求耗时和失败率。跑通后,再把 API 接入现有系统,用队列方式处理批量任务。这样一轮下来,你对自己环境的真实容量和成本就有底了。