碳足迹追踪工具:量化模型训练的碳排放

FreeGuideOnline 最新 2026-06-21

bash pip install codecarbon


### 步骤1:设置实验并启动追踪

CodeCarbon提供两种使用模式:手动显式追踪,或通过装饰器自动追踪。这里采用更灵活的显式模式。

```python
import torch
import torch.nn as nn
import torch.optim as optim
from codecarbon import EmissionsTracker

# 初始化追踪器,可指定输出文件、项目名称等
tracker = EmissionsTracker(
    output_dir="./emissions",
    project_name="mnist_classifier",
    log_level="info"
)
tracker.start()   # 开始记录硬件能耗和排放

# ---- 这里是你的模型定义和训练代码 ----
# 模拟一个简单的训练循环
model = nn.Sequential(nn.Flatten(), nn.Linear(28*28, 128), nn.ReLU(), nn.Linear(128, 10))
optimizer = optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.CrossEntropyLoss()

# 虚构数据
X = torch.randn(64, 1, 28, 28)
y = torch.randint(0, 10, (64,))

for epoch in range(5):
    optimizer.zero_grad()
    output = model(X)
    loss = loss_fn(output, y)
    loss.backward()
    optimizer.step()
# ---- 训练结束 ----

emissions = tracker.stop()   # 停止追踪并获取总排放数据
print(f"Total emissions: {emissions} kg CO2eq")

步骤2:解读输出结果

停止追踪后,CodeCarbon会在指定目录生成一个CSV文件,包含以下关键字段:

  • timestamp:实验时间。
  • project_name:项目名称。
  • duration:监控时长(秒)。
  • emissions:总排放量(千克CO2当量)。
  • energy_consumed:总能耗(kWh)。
  • country_name / region:检测到的电网区域及碳强度。
  • on_cloud / cloud_provider:是否在云上及供应商。

同时,你也可以访问CodeCarbon的本地或在线仪表板,通过图形化界面对比多次实验。

步骤3:优化碳排放的技巧

拿到排放数据只是第一步,下一步是根据数据优化。以下是几条行之有效的策略:

  • 选择低碳区域:在云上训练时,选取碳强度低的区域(例如,Azure的某个区域可能使用大量可再生能源)。
  • 优化硬件的功率效率:更新更高效的GPU(如从K80迁移到A100)可能显著降低单位计算量的功耗。
  • 控制训练时长:采用早停(early stopping)、学习率衰减等策略避免无效迭代。
  • 动态频率调节:GPU的动态电压和频率调节(DVFS)可降低空闲/轻载时的功耗,CodeCarbon默认会考虑。
  • 使用更高效的模型架构:轻量级网络、模型蒸馏、剪枝等均可降低整体计算量。

使用CarbonTracker自动记录实验

如果你希望更自动地记录每次训练,CarbonTracker的装饰器模式非常方便。安装后,只需在训练函数上添加一个装饰器:

pip install carbontracker
from carbontracker.tracker import CarbonTracker

@CarbonTracker(epochs=5, monitor_epochs=-1, interpretable=True)
def train_model():
    # 你的模型训练代码,无需额外调用start/stop
    pass

train_model()

它会在工作目录生成详细的日志文件和绘图,包括每轮排放的变化趋势图。

使用ML CO2 Impact进行预训练估算

有时你并不想真实跑一遍代码,而是想快速对比云实例的碳排放。使用ML CO2 Impact的计算器:

from mlco2 import impact

# 估算在p3.2xlarge(含一张V100 GPU)上运行10小时的碳排放
emission = impact.compute(
    hardware_type="v100",
    hours_used=10,
    provider="aws",
    region="us-east-1"
)
print(f"Estimated emissions: {emission} kg CO2eq")

所有支持的硬件、提供商及区域列表可在官方文档中查到。该方法误差通常在10%~20%以内,非常适合实验规划阶段。

将碳追踪集成到MLOps流程中

为了让绿色AI成为团队习惯,可以将碳排放指标作为ML实验的元数据,与模型精度、损失一同记录。例如,在MLflow中记录:

import mlflow
with mlflow.start_run():
    tracker = EmissionsTracker()
    tracker.start()
    # ... 训练 ...
    emissions = tracker.stop()
    mlflow.log_metric("co2_emissions_kg", emissions)