AI碳足迹追踪怎么落地:用Python脚本估算推理能耗与碳排放
AI碳足迹追踪的核心不是买一套监控系统,而是把每次模型调用产生的能耗和碳排放记录下来,形成可对比的数据。
对大多数使用API或本地推理的团队来说,用Python脚本在调用链路里埋点,记录token量、推理时长和硬件功耗,再乘以电网碳强度,就能得到估算值。
本文面向零基础用户,从准备条件到脚本落地讲清楚怎么做。
先确定追踪范围和记录字段
开始写脚本前,先想清楚追踪哪类调用。
常见场景包括:调用云端大模型API、本地运行开源模型、批量跑推理任务。
不同场景记录方式不同,但核心字段可以统一:
- 调用时间、模型名称、请求ID
- 输入token数、输出token数(API通常返回usage字段)
- 推理耗时(秒),本地推理可用
time.perf_counter()记录 - 硬件类型和功耗系数(GPU型号或CPU TDP)
- 电网碳强度(gCO2/kWh),可按地区取公开平均值
如果使用云端API,优先从响应体的usage字段拿token数据;
本地推理则需自己统计。不要一开始追求精确到每瓦时,先用可复现的估算方法跑通流程。
准备环境和依赖
在Linux或macOS上准备Python 3.8+环境,安装必要库:
python3 -m venv venv
source venv/bin/activate
pip install requests pandas
如果需要读取GPU功耗,可以安装pynvml(NVIDIA显卡):
pip install nvidia-ml-py
准备一个CSV文件作为记录载体,字段固定为:timestamp,model,input_tokens,output_tokens,duration_sec,device,power_watt,carbon_intensity。
后续可以用pandas做汇总。
编写追踪脚本:在调用前后埋点
以调用一个通用大模型API为例,脚本结构分三步:记录开始时间、发起请求、解析usage并写入CSV。
关键代码如下:
import time, csv, requests
from datetime import datetime
API_URL = "https://api.example.com/v1/chat/completions"
HEADERS = {"Authorization": "Bearer YOUR_KEY"}
def track_call(prompt, model="gpt-4o-mini"):
start = time.perf_counter()
resp = requests.post(API_URL, headers=HEADERS, json={
"model": model,
"messages": [{"role": "user", "content": prompt}]
})
duration = time.perf_counter() - start
data = resp.json()
usage = data.get("usage", {})
row = {
"timestamp": datetime.utcnow().isoformat(),
"model": model,
"input_tokens": usage.get("prompt_tokens", 0),
"output_tokens": usage.get("completion_tokens", 0),
"duration_sec": round(duration, 3),
"device": "cloud_api",
"power_watt": 0,
"carbon_intensity": 475
}
with open("carbon_log.csv", "a", newline="") as f:
writer = csv.DictWriter(f, fieldnames=row.keys())
writer.writerow(row)
return data
注意:power_watt对云端API无法直接获取,
可以先填0,
后续用估算系数替代;carbon_intensity取当地电网平均碳排放因子,
中国区域可参考公开的电网平均排放因子,
单位gCO2/kWh,
不同年份有差异,
使用时注明来源和年份。
本地推理场景则需要在推理前后读取GPU功耗,例如使用pynvml采样:
from pynvml import nvmlInit, nvmlDeviceGetHandleByIndex, nvmlDeviceGetPowerUsage
nvmlInit()
handle = nvmlDeviceGetHandleByIndex(0)
power_mw = nvmlDeviceGetPowerUsage(handle) # 毫瓦
power_watt = power_mw / 1000
把采样到的平均功耗填入power_watt,再结合推理时长计算能耗:能耗(kWh) = 功率(W) × 时长(h) / 1000,碳排放(gCO2) = 能耗 × 碳强度。
汇总与验证:从日志到碳足迹报告
记录一段时间后,用pandas汇总:
import pandas as pd
df = pd.read_csv("carbon_log.csv")
df["energy_kwh"] = df["power_watt"] * df["duration_sec"] / 3600 / 1000
df["carbon_g"] = df["energy_kwh"] * df["carbon_intensity"]
print(df.groupby("model")[["energy_kwh","carbon_g"]].sum())
验证方式:检查总调用次数是否与业务日志一致,单次碳排放量是否在合理范围(例如一次短文本API调用通常远小于1gCO2,本地GPU推理则可能达到数克)。
如果数值异常大,优先检查功率单位是否混淆(瓦与毫瓦)和碳强度单位是否用错。
容易踩的坑和注意事项
- 单位混乱:功率用瓦、时间用秒、碳强度用gCO2/kWh,换算时统一到小时和千瓦,否则结果差几个数量级。
- 云端API功耗无法直接测量:不要编造精确值,可以用服务商公开的能效数据或行业估算系数,并在报告中注明估算方法。
- 碳强度不要写死:不同地区、不同时段电网碳强度会变化,建议做成配置项,按月份或地区更新。
- 日志文件并发写入:多进程同时写CSV可能丢行,生产环境建议改用SQLite或日志队列。
- 不要承诺精确碳足迹:脚本输出的是估算值,用于趋势对比和优化参考,不能替代第三方碳核算认证。
常见疑问
追踪AI碳足迹需要改模型代码吗? 不需要。
大多数情况下在调用层加埋点即可,云端API从响应中取usage,本地推理在前后计时和采样功耗,模型本身不用动。
没有GPU功耗读数怎么办? 可以用CPU TDP或GPU标称功耗乘以利用率作为近似,但要在报告中说明是估算,不能当作实测数据。
多久记录一次比较合适? 按调用次数记录即可,每次请求一行。
如果请求量很大,可以按小时聚合后再写入,避免日志膨胀。
完成以上步骤后,你就有了一个可运行的AI碳足迹追踪脚本,能输出按模型、按时间段的能耗和碳排放估算。
后续可以根据业务量调整采样频率,或把结果接入看板做持续对比。