DLAI-碳意识笔记-全-

DLAI 碳意识笔记(全)

001:课程介绍 🌱

在本课程中,我们将学习如何通过选择合适的时间和地点运行AI工作负载,来显著降低其碳排放。我们将了解电网能源结构、碳排放强度等核心概念,并学习使用相关工具来实践碳意识计算。

欢迎来到《面向生成式AI开发者的碳意识计算》课程,本课程是与谷歌云合作开发的。

我是吴恩达,很高兴本课程的讲师是Nikkita Namjihi。

她是谷歌云的开发者倡导者,同时也是“永久冻土发现门户”项目的谷歌研究员。

该项目是一个利用人工智能追踪北极永久冻土变化的倡议。

她在可持续发展领域工作超过五年,对于如何减少AI工作负载的二氧化碳排放拥有丰富的实践经验可以分享。

谢谢吴恩达。

我很高兴能与你和你的团队合作。

训练、微调乃至部署模型,尤其是生成式模型,可能是计算密集型和能源密集型的。

但如果你知道如何在云端定制运行模型任务的地点和时间,它就不必是高碳排放的。

具体来说,你可以通过选择由低碳能源供电的数据中心来运行训练任务,从而选择低二氧化碳的能源为你的训练工作供电,这些能源包括风能、太阳能、水能或核能。

在这个短期课程中,你将学习如何使用Electricity Maps API查询全球不同区域电网的能源结构组成。

同时,你将学习如何在云端选择一个由高比例无碳能源供电的数据中心来训练机器学习模型。

目前的估计是,云计算约占全球温室气体排放总量的2.5%至3.7%。

此外,AI工作流持续增长,这既是AI领域蓬勃发展的标志,也使得我们采取行动减少排放变得越来越重要。

在本课程中,你将学习如何根据温室气体核算体系企业标准来量化和报告碳排放,以及这对你作为开发者意味着什么。

Nikkita将使用Electricity Maps API、谷歌云的Vertex AI SDK和碳足迹工具来讲解这些概念。

但你学到的概念适用于多云环境,甚至仅使用本地机器的情况。

谢谢吴恩达。

我认为,当我们使用一次性塑料叉子或水瓶、乘坐飞机或给汽车加油时,更容易理解我们的环境影响。

但对于计算和机器学习这类仅仅是在写代码的事情,其影响则较难把握。

学习碳意识开发对我来说确实大开眼界。

通过本课程你将学到的一些简单步骤,你可以显著改变机器学习工作负载的碳影响。

也请务必坚持到课程结束,在那里你将探索一个仪表板,它能帮助你基于你对碳排放、成本和延迟等因素的权衡,选择最优的谷歌云区域。

课程最后还将概述可持续云计算领域一些令人兴奋的研究。

许多人共同努力制作了这门课程。我要感谢来自谷歌云的John Abbel、Cynthia Wu、Klan Davajav和Jeff Sternberg,来自DeepLearning.AI的Eddie Shu也为本课程做出了贡献。

在第一课中,你将学习与计算基础设施和碳排放相关的能源和电网知识。

你还将通过一个交互式地图探索全球各地的区域碳排放强度。

这听起来很棒。

让我们进入下一个视频,开始学习吧。

002:机器学习的碳足迹 🌱

在本节课中,我们将学习机器学习生命周期中的碳足迹。我们将了解模型训练和推理,特别是大型语言模型,如何产生显著的碳排放。同时,我们也会熟悉影响这个碳足迹大小的关键因素和决策。


能源与电网基础

首先,我们需要了解与计算基础设施和碳排放相关的一些能源和电网基础知识。

运行任何计算工作负载,无论是机器学习还是其他任务,都需要以电力形式存在的能源。这些能源通常来自会释放二氧化碳的来源。因此,云计算实际上排放的全球温室气体比商业航空业还要多。根据“转变项目”的数据,估计云计算占全球温室气体排放的2.5%至3.7%。请注意,这些数字是针对一般云计算,而非特指机器学习工作负载。

以下是我们的电网工作原理的简要概述:

  • 能源由发电厂生产。
  • 这些发电厂可能从排放碳的化石燃料(如煤炭或天然气)或非碳排放源(如风能或太阳能)获取能源。
  • 然后,这些能源通过输电线路和变电站网络(即电网)输送到我们的家庭、办公室、餐厅、医院,甚至数据中心。

每个区域电网的碳排放源和非碳排放源的混合比例是不同的。例如,法国严重依赖核能,瑞典依赖水力,德克萨斯依赖天然气。即使在特定的区域电网内,碳强度也可能因一天中的不同时间而变化,因为像太阳能这样的能源只在白天可用。

如果你想了解你连接的是哪个区域电网,以及为你的笔记本电脑、冰箱和家中灯光供电的是哪种能源,你可以查看Electricity Maps。他们提供量化数据,显示超过50个国家每小时电力的碳密集程度。


机器学习生命周期的碳足迹

机器学习生命周期的每一步都有碳足迹。在我们开始编写代码之前,与我们用于训练、托管和存储机器学习模型的所有物理硬件(CPU、GPU、服务器和物理数据中心)相关的碳排放就已经存在。

创建所有这些基础设施需要原材料提取、制造、运输,并且每一步都伴随着环境成本。这通常被称为隐含碳,指的是给定物品或产品在供应链中产生的所有排放。这些排放通常是机器学习生命周期中最难估算的,因为供应链相当复杂。

现在,稍微容易计算的是训练和服务机器学习模型所产生的排放。换句话说,来自计算的排放。训练机器学习模型或使用它们进行推理,都需要能源来为服务器供电和冷却。无论是在海量数据集上进行预训练以生成基础大语言模型,还是在自定义数据集上进行训练以产生微调模型,甚至在用户与基于大语言模型的应用程序交互的推理时间,所有这些都需要能源,并且所有这些都有碳足迹。

这个足迹可能因多种因素而有很大差异。例如,马萨诸塞大学阿默斯特分校的Strubell等人发现,使用神经架构搜索训练一个Transformer模型所产生的碳排放,相当于五辆汽车在其使用寿命内产生的排放。如果你不熟悉,这里的神经架构搜索指的是一种自动化神经网络设计的技术。

但谷歌研究人员的一篇论文显示,训练相同的Transformer模型实际上更接近0.00004辆汽车的排放量。这是一个巨大的差异,它突显了训练策略、硬件和数据中心效率以及位置等因素如何对碳排放产生巨大影响。作为一名具有碳意识的开发者,你可以采取措施来降低机器学习工作负载的碳排放,而这正是我们将在本短期课程中学习的内容。

请注意,虽然在整个机器学习生命周期中跟踪和理解排放非常重要,但在本课程中,你将只关注计算产生的排放。你将学习一些关于服务端(即推理,当你的模型在生产中使用时)排放的知识,但总体重点将放在训练上,因为这更容易计算,并且与模型服务的碳影响相比,目前已有更多研究。


如何估算碳排放

现在,让我们深入探讨为什么训练和服务机器学习模型首先会产生碳足迹。简而言之,运行任何类型的计算工作负载(无论是否机器学习)都需要电力形式的能源,而这种能源通常来自会释放二氧化碳的来源。

以下是关键见解:如果我们能找出特定区域电网的碳强度(我们刚刚看到了如何使用Electricity Maps应用程序做到这一点),并且我们知道机器学习训练或服务应用程序消耗的能源量以及这个工作负载在哪里运行,那么我们就可以估算其碳排放。

那么,我们如何估算机器学习训练任务释放了多少碳呢?

  1. 获取每单位能源的碳排放量:即每千瓦时等效二氧化碳克数。你经常会听到这被称为碳强度。我们从为你的计算基础设施供电的电网获取这个数据。
  2. 乘以能源消耗估算:将这个数字乘以你训练机器学习模型所使用的能源量的估算值。
  3. 得出碳排放估算:由此,你可以估算出该训练任务导致的碳排放量。

到目前为止,你已经学会了如何找到为电网供电的碳排放源和非碳排放源的混合比例。但拼图的另一部分呢?训练一个大语言模型到底需要多少电力?

我们可以用以下公式测量能源消耗(以千瓦时为单位):

千瓦时 = 训练小时数 × 处理器数量 × 每个处理器的平均功率

其中,处理器可能是CPU,但对于机器学习训练来说,更可能是GPU或TPU。

请注意,如果你在云中训练,使用的能源不仅包括运行计算所需的电力,还包括运行数据中心(如冷却系统)的开销。因此,你需要乘以一个称为电力使用效率 的因子来估算训练任务的总用电量。PUE是衡量数据中心计算效率的标准方法。它的计算方式是:数据中心使用的总能源除以仅用于计算的能源。

例如,假设你的工作负载消耗100千瓦时,运行它的数据中心的PUE是1.5。这意味着从电网的实际消耗是150千瓦时,其中50千瓦时用于运行数据中心的开销,100千瓦时用于实际运行你工作负载的硬件。

正如我们刚才讨论的,要从千瓦时估算碳排放,你需要乘以工作负载运行所在电网的碳强度。


大语言模型的能源消耗

你可能会记得,大语言模型需要大量的预训练时间和大量的处理器。量化所需计算量的一种方法是GPU年,即单个GPU完成特定任务需要一年的计算量。你可以用作计量单位的一个特定GPU是NVIDIA V100 GPU。

例如,在2020年,GPT-3花费了405个NVIDIA V100 GPU年来训练。换句话说,如果你使用单个NVIDIA V100 GPU,训练GPT-3将需要405年。所以,幸好他们不止有一个可用的GPU。

在论文《测量AI和云实例的碳强度》中,研究人员估算了不同Transformer模型消耗的能源。他们训练了一个60亿参数的Transformer模型,训练了达到完全训练所需时间的13%,他们发现这导致了13,812.4千瓦时的能源消耗。根据美国能源信息署的数据,这实际上超过了美国家庭一年的平均能源消耗。该论文的作者估计,一次完整的训练运行将消耗大约103,500千瓦时。

大语言模型规模庞大,并且在大量数据上进行训练,这意味着它们会消耗大量能源。

好消息是,你通常不需要从头开始训练一个大语言模型。通过提示工程,你可能能够让一个模型完成你需要的任务,而无需运行训练甚至微调任务。但请记住,每次使用这些模型进行推理(做出预测或生成文本)时,仍然需要能源。

在论文《耗电的处理:是什么推动了AI部署的成本》中,研究人员估计,Stable Diffusion XL Base 1.0模型每1000次推理产生1.594克二氧化碳。为了提供一些背景,这意味着每向该模型发出1000次推理请求,大致相当于一辆普通汽油动力汽车行驶四英里所产生的排放。

为了更容易找到更高效的模型,Hugging Face的LLM性能排行榜实际上包含了能源估算和每千瓦时生成的令牌数。你会看到这些模型在推理时所需的能源量差异很大。还有ML能源排行榜,它通过每个模型生成响应所消耗的平均GPU能源来比较各种开源模型。如果你想将能源消耗作为大语言模型选择标准的一部分,这些排行榜是可以使用的资源。


如何成为碳意识开发者

到目前为止,你已经了解了生成式AI以及更广泛的计算如何产生碳足迹,你知道了碳足迹的来源以及如何估算它。现在你可能在想,我为什么要关心这些?我实际上能做些什么呢?

我认为,你作为一名开发者可以对这些排放产生影响的想法起初可能看起来有点令人望而生畏。我的意思是,归根结底,你只是在某处连接到某个电网的机器上运行一个任务。但实际上,你可以实施一些策略来成为一名具有碳意识的开发者。

以下是几个重要的策略:

1. 选择训练位置和时间
真正影响碳排放的一个因素是训练模型的位置和一天中的训练时间。正如前面提到的,不同的区域电网有不同的能源混合比例,并且这种比例在一天中也会波动。如果你在云上运行工作负载,这意味着某些云区域连接到的电网有更高比例的碳排放源在运行。因此,你选择在哪里训练模型会产生很大影响。不同的区域电网可能有显著不同的碳排放特征,即使是地理上接近的区域。如果你在一个拥有100%无碳能源的地点运行机器学习训练任务,实际上计算产生的碳排放为零。在接下来的课程中,我们将使这个概念更具体,并看看如何检索电网碳强度的实时信息。

一个更复杂的策略不仅仅是选择平均碳强度低的地点,而是在一天中无碳能源更多的时候运行灵活的工作负载。这种技术有时被称为“追随阳光和风”。其基本思想是将工作负载转移到可再生能源充足的时间和地点。这可能意味着你将机器学习训练任务推迟到当天晚些时候,当可再生能源更多时(例如中午太阳能产能最高时)。但它甚至可能意味着更复杂的事情,比如暂停和恢复工作负载,以最小化一天或一周内的总排放量。

2. 选择低PUE的云提供商
如果你在云中训练或托管模型,可以尝试选择PUE低的云提供商。同样,PUE是电力使用效率。这个数字实际上差异很大。例如,谷歌数据中心的平均PUE是1.10,在某些场景下甚至低至1.06。而根据Uptime Institute的2021年数据中心调查,全球数据中心平均PUE约为1.57。这意味着在相同的计算量下,电力和碳排放几乎高出50%。

3. 使用高效硬件
论文《机器学习的碳足迹将趋于稳定然后缩小》的作者指出,与通用处理器相比,使用针对机器学习训练优化的处理器(如TPU或一些更新的GPU,如NVIDIA V100或NVIDIA A100)实际上可以将每瓦性能提高2到5倍。

4. 考虑模型大小与效率
正如我们之前谈到的,生成式AI的一个好处是,尽管模型很大,训练时间很长,但你通常不需要从头开始训练。你通常根本不需要训练模型。虽然生成式AI的趋势一直是追求越来越大的模型,但更专业化、有针对性且更小的模型通常也能完成任务。

在整个软件生命周期中,有许多不同的策略可以降低碳排放,并且这个领域有越来越多有趣且富有启发性的研究。但这些只是针对机器学习的一些重要建议。


总结

在本节课中,我们一起学习了机器学习工作负载碳足迹的基础知识。我们探讨了碳排放的来源,包括硬件制造(隐含碳)和模型训练与推理(运营碳)。我们学习了如何通过结合电网的碳强度和工作负载的能源消耗来估算碳排放。我们还了解了影响碳足迹的关键因素,如地理位置、时间、数据中心效率、硬件选择和模型效率。最后,我们概述了作为一名开发者可以采取的实际策略,例如选择低碳区域和时间运行任务、选择高效的基础设施以及考虑使用更小的模型,从而在开发生成式AI应用时更具碳意识。

现在,让我们开始编码,看看如何获取实时碳数据,并在拥有更多无碳能源的地方训练机器学习模型。让我们进入下一课。

003:探索电网碳强度 🌍

在本节课中,我们将学习如何使用 Electricity Maps API 来探索电网的碳强度。你将了解如何获取特定区域的电力来源信息,以及生产这些电力所排放的二氧化碳量。

概述

我们将通过编写代码,调用 Electricity Maps API 的两个主要端点:一个用于获取实时碳强度数据,另一个用于获取电力来源的详细构成。这将帮助我们理解不同地区的能源清洁程度。


获取并使用 API 密钥 🔑

要使用 Electricity Maps API,你需要一个 API 密钥。在本在线课堂环境中,我们已经为你设置好了。你可以直接导入 load_end 函数并执行代码单元。

如果你想在自己的环境中运行此代码,可以访问 Electricity Maps 网站,点击“获取 API 密钥”来申请免费的个人层级密钥。


查询实时碳强度数据 ⚡

上一节我们介绍了如何获取 API 密钥,本节中我们来看看如何查询实时的电网碳强度数据。

carbon-intensity/latest 端点可以检索到最新的碳强度数据,单位是克二氧化碳当量每千瓦时。这个数值表示在特定区域,每消耗一千瓦时电力所排放的二氧化碳量。

核心概念:碳强度 = 排放的二氧化碳量 / 消耗的电量。公式表示为:
Carbon Intensity (gCO₂eq/kWh) = Total CO₂ Emissions / Total Electricity Consumed

你可以通过经纬度坐标或预定义的区域标识符来指定查询位置。我们将使用经纬度坐标。

以下是获取坐标的步骤:

  1. 打开谷歌地图。
  2. 搜索一个地点(例如:洛杉矶的圣莫尼卡码头)。
  3. 右键点击地图上的位置,选择弹出的坐标并复制。

获取坐标后,我们回到代码中。首先,创建一个包含坐标的字典。

coordinates = {
    ‘la’: 34.0100931,  # 纬度
    ‘lo’: -118.4964752 # 经度
}

接着,我们使用 Python 的 requests 库向 API 端点发送请求。需要将 API 密钥放在请求头中。

import requests
import helper

url = f"https://api.electricitymap.org/v3/carbon-intensity/latest?lat={coordinates[‘la’]}&lon={coordinates[‘lo’]}"
headers = {‘auth-token’: helper.load_api_key()}

response = requests.get(url, headers=headers)
data = response.json()
print(data)

执行代码后,你会得到一个包含碳强度值的响应。例如,在录制时,洛杉矶的碳强度是 242 克二氧化碳当量/千瓦时。这意味着在洛杉矶,每消耗一千瓦时电力,就会排放 242 克二氧化碳。

请注意,这是实时数据,你查询时看到的数字很可能与示例不同,因为电网的碳强度和能源构成在一天中会不断波动。


分析电力来源构成 🔋

仅仅知道碳强度还不够,我们还想了解是哪些能源产生了这些碳排放。为此,我们将使用另一个端点:power-breakdown/latest

这个端点可以检索一个地区电力来源的最新数据。与之前类似,我们需要构建请求 URL 并发送请求。

url = f"https://api.electricitymap.org/v3/power-breakdown/latest?lat={coordinates[‘la’]}&lon={coordinates[‘lo’]}"
response = requests.get(url, headers=headers)
power_data = response.json()

返回的数据是一个包含大量信息的字典。让我们查看几个关键的指标:

  • renewablePercentage: 来自可再生能源的电力消耗百分比。
  • fossilFreePercentage: 来自可再生能源和核能的电力消耗百分比(核能是零碳的,但不属于可再生能源)。
  • powerConsumptionBreakdown: 按能源类型(如太阳能、煤炭、天然气)细分的电力消耗构成,单位为兆瓦。

为了更直观地理解,我们可以将兆瓦值转换为百分比。首先获取总消耗量,然后计算每种能源的占比。

import numpy as np

total_consumption = power_data[‘powerConsumptionTotal’]
breakdown = power_data[‘powerConsumptionBreakdown’]

percentage_breakdown = {source: round((value / total_consumption) * 100, 2)
                        for source, value in breakdown.items()}
print(percentage_breakdown)

例如,在查询时,洛杉矶电网有相当大一部分电力来自太阳能。这些数据同样是实时且动态变化的。

注意:有时你可能看到所有数据都是零。这可能是因为该区域的能源供应商暂时没有提供数据。如果遇到这种情况,可以尝试查询其他地点或稍后再试。


动手实践:查询你所在区域 🧑‍💻

现在轮到你了。尝试查找你所在地标或区域的坐标,并使用上述端点查询碳强度和电力构成。

例如,我们可以查询台湾台北的中正纪念堂。使用提供的辅助函数 power_stats 可以更方便地获取信息。

from helper import power_stats

taipei_coords = {‘la’: 25.0343, ‘lo’: 121.5198}
intensity, breakdown = power_stats(taipei_coords[‘la’], taipei_coords[‘lo’])

print(f”碳强度: {intensity} gCO₂eq/kWh”)
print(“电力构成:”, breakdown)

运行后,你可能会看到该地的碳强度(例如 579)和详细的能源构成(可能包含煤炭、天然气、太阳能等)。请注意,Electricity Maps 并未覆盖全球所有地区。如果你的位置没有数据,可以尝试查询附近的其他地点。


总结

本节课中,我们一起学习了:

  1. 如何获取并使用 Electricity Maps API 密钥。
  2. 如何使用 carbon-intensity/latest 端点查询一个地区的实时电网碳强度。
  3. 如何使用 power-breakdown/latest 端点深入分析电力的具体来源构成。
  4. 通过动手实践,查询了不同地点的能源数据。

理解一个地区的碳强度和能源构成,是进行碳意识计算的第一步。在下一节课中,我们将利用这些信息,尝试在拥有大量零碳能源的地区训练机器学习模型,将知识付诸实践。

004:在低碳区域训练模型

在本节课中,你将尝试一种最简单且最具影响力的碳意识机器学习开发策略:在由大量无碳能源供电的地点训练模型。这个策略不需要太多努力,但正如你将看到的,它能带来相当大的回报。让我们开始尝试。

概述

在本节中,我们将学习如何通过选择在低碳强度的云区域运行计算任务,来减少机器学习训练工作的碳足迹。我们将首先在本地训练一个简单的模型,然后将其迁移到Google Cloud Vertex AI平台,并特意选择一个拥有大量无碳能源(如风能)的数据中心区域来执行训练。

本地模型训练

首先,我们将在本地Jupyter Notebook中训练一个机器学习模型。以下是具体步骤。

我们首先导入必要的库,包括NumPy、Scikit-learn和TensorFlow。

import numpy as np
from sklearn.datasets import make_blobs
import tensorflow as tf

接着,我们使用Scikit-learn的make_blobs函数创建数据集。这个函数会生成一个包含四个不同类别的训练数据集。如果你对这个函数和具体的分类任务背景感兴趣,可以参考吴恩达机器学习专项课程的第二门课“高级算法”,其中使用了相同的例子。

# 创建数据集
X_train, y_train = make_blobs(n_samples=1000, centers=4, n_features=2, random_state=42)

创建数据集后,我们构建模型。本课中模型的具体细节并不重要,我们只需要一个可以训练的模型。这里我们构建一个包含两个层的简单模型。

# 创建模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='relu', input_shape=(2,)),
    tf.keras.layers.Dense(4, activation='softmax')
])

模型构建完成后,我们需要编译它。编译过程需要指定损失函数和优化器。如果你使用过Keras,这个过程会很熟悉;如果没有,也无需担心。

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

现在,我们已经准备好了训练数据和模型,可以调用model.fit开始训练。我们将运行200个周期。由于模型和数据量都很小,训练会很快完成。

# 训练模型
history = model.fit(X_train, y_train, epochs=200, verbose=0)

滚动到输出底部,可以看到损失函数在下降,这表明模型正在学习。

利用云计算的灵活性

在云端训练模型的一个好处是,在选择训练地点时具有灵活性。如果你所在地的电网碳强度很高,你对电力的来源控制有限。但通过使用云计算,你可以选择在低碳电网的区域运行计算工作负载。

这正是我们接下来要做的:在Google Cloud上运行相同的训练代码,并选择一个平均碳强度非常低的数据中心位置。

在开始之前,我们需要了解一些关于Google机器学习平台Vertex AI的知识。为了在Vertex AI上运行代码,我们需要完成三个主要步骤:

  1. 导入并初始化Vertex AI Python SDK。
  2. 将训练代码写入一个文件。
  3. 配置并提交一个将运行此代码的训练任务。

下面我们逐一完成这些步骤。

步骤一:初始化Vertex AI Python SDK

我们从一个已编写好的辅助函数开始,它会导入凭证和项目ID。

如果你不熟悉Google Cloud,这里有一些基础知识:首先导入aiplatform,这是Google Cloud上的机器学习平台。然后调用initialize函数,传入项目ID和凭证。项目ID是对你的Google Cloud项目的引用,所有服务、计算资源都包含在其中。凭证则是用于身份验证的密钥。

# 假设辅助函数已设置好项目ID和凭证
project_id = ‘your-project-id‘
credentials = ‘your-credentials‘

import vertexai
from google.cloud import aiplatform

# 初始化Vertex AI
aiplatform.init(project=project_id, credentials=credentials)

初始化完成后,我们就可以从本笔记本访问Vertex AI服务了。

步骤二:将训练代码写入文件

接下来,我们不直接在笔记本中运行训练代码,而是将其写入一个文件,然后在Vertex AI上运行该文件。

首先,我们使用笔记本的%%writefile魔法命令创建一个文件。这里将其命名为task.py。按照惯例,主要的训练代码文件常被命名为task.py,但你可以使用其他名称。

%%writefile task.py
# 导入库
import numpy as np
from sklearn.datasets import make_blobs
import tensorflow as tf

# 创建数据集
X_train, y_train = make_blobs(n_samples=1000, centers=4, n_features=2, random_state=42)

# 创建模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation=‘relu‘, input_shape=(2,)),
    tf.keras.layers.Dense(4, activation=‘softmax‘)
])

# 编译模型
model.compile(optimizer=‘adam‘,
              loss=‘sparse_categorical_crossentropy‘,
              metrics=[‘accuracy‘])

# 训练模型
model.fit(X_train, y_train, epochs=200, verbose=0)
print(“训练完成!“)

执行此单元格后,会创建一个名为task.py的文件。你可以使用cat task.py命令查看文件内容,确认它包含了我们指定的所有代码:导入库、创建数据集、创建模型、编译模型以及训练模型。

步骤三:创建并运行训练任务

现在,我们已经定义了要在Vertex AI上执行的训练代码,接下来需要创建并运行一个训练任务。我们将使用Vertex AI Python SDK中的“自定义训练任务”功能。

以下是创建自定义训练任务时需要传递的几个重要参数:

  • display_name: 任务的字符串标识符。
  • script_path: Python文件的路径(即task.py)。
  • container_uri: 运行训练任务所需的Docker镜像。Vertex AI为TensorFlow、PyTorch、Scikit-learn和XGBoost提供了预构建的镜像,无需自己编写Dockerfile。
  • staging_bucket: 用于存储训练任务过程中可能产生的任何中间产物的云存储桶。
  • location: 我们希望运行此工作负载的数据中心位置。这是关键,我们将选择一个拥有大量无碳能源的区域。

在运行任务之前,我们需要先选择区域并创建存储桶。

选择低碳区域

Google为其每个数据中心区域提供了平均碳强度值。通过查阅相关文档,我们可以找到低碳区域。例如:

  • europe-west9(巴黎):由于法国拥有大量核能,属于低碳区域。
  • southamerica-east1(圣保罗):巴西拥有大量水力和太阳能,碳强度也较低。
  • us-central1(爱荷华州):拥有大量风能,被标记为低碳区域。

我们将选择us-central1作为运行机器学习训练任务的区域。

region = ‘us-central1‘

创建云存储桶

接下来,我们需要创建一个云存储桶来存放临时文件。存储桶名称必须是全局唯一的,因此我们生成一个唯一标识符附加到桶名上。

import random
import string

def generate_uuid(length=8):
    return ‘‘.join(random.choices(string.ascii_lowercase + string.digits, k=length))

unique_id = generate_uuid()
print(f“唯一标识符: {unique_id}“)

from google.cloud import storage

storage_client = storage.Client(project=project_id, credentials=credentials)
bucket_name = f“carbon-course-bucket-{unique_id}“
bucket = storage_client.create_bucket(bucket_name, location=region)
print(f“存储桶 ‘{bucket_name}‘ 已在区域 ‘{region}‘ 中创建。“)

重要提示:存储桶必须创建在计划运行训练任务的同一区域,以避免跨区域传输数据带来的额外碳排放和延迟。

提交训练任务

现在,所有准备工作都已就绪,我们可以创建自定义训练任务了。

# 定义训练任务
job = aiplatform.CustomTrainingJob(
    display_name=“deep-learning-ai-course-example“,
    script_path=“task.py“,
    container_uri=“us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-15:latest“, # 示例TensorFlow镜像URI
    staging_bucket=f“gs://{bucket_name}“,
    location=region
)

# 运行训练任务
model = job.run()

执行job.run()后,Vertex AI会在后台置备计算资源,运行我们写在task.py中的训练代码。训练完成后,计算资源会被自动删除。

任务日志会打印出一个链接(在在线课堂环境中可能无法点击),在你的个人项目中,你可以通过此链接在云控制台查看任务状态、耗时等信息。

由于需要置备资源,这个训练任务可能需要大约3到5分钟完成,比直接在笔记本中运行要慢。对于这个小模型来说,这种开销显得比较明显。然而,在现实世界中,训练任务通常需要数小时甚至数天,这种置备开销就会被平摊,相对影响很小。

清理资源

训练任务完成后,为了清理在线课堂环境中的额外资源,我们需要删除刚刚创建的存储桶。

# 删除存储桶(force=True确保删除非空桶)
bucket.delete(force=True)
print(f“存储桶 ‘{bucket_name}‘ 已删除。“)

总结

在本节课中,我们一起学习并实践了降低机器学习训练工作碳足迹的最简单且最有效的措施之一:选择在低碳区域运行计算任务。

我们首先在本地训练了一个简单的模型,然后将其迁移到Google Cloud Vertex AI平台。通过查阅Google Cloud的碳强度文档,我们选择了平均碳强度较低、拥有大量风能的us-central1(爱荷华州)区域来重新训练我们的模型。这个策略对于降低计算任务的碳足迹非常有效。

机器学习训练任务通常是批处理作业,对延迟不敏感,这使其非常适合应用此类策略。你可以在选择运行程序和存储数据的位置时拥有更大的灵活性。

在下一节课中,我们将尝试一种略有不同的方法:使用实时数据来指导我们选择训练地点。我们下节课再见。

005:利用实时能源数据进行低碳训练 🌱

在本节课中,我们将基于前两节课程的内容,学习如何利用来自Electricity Maps的实时电力数据,为机器学习模型训练选择碳排放最低的区域。我们将通过编写代码,查询实时碳强度,并据此动态选择最“绿色”的云区域来运行训练任务。


概述

之前,我们学习了如何在Google Cloud上运行训练任务,并了解了如何根据平均碳强度指标选择低碳区域。本节课程将更进一步,我们将利用Electricity Maps的API获取实时的电网碳强度数据,并据此做出更精确、更动态的决策。我们将编写两个核心函数:一个用于查询特定区域的实时碳强度,另一个用于从候选区域列表中找出当前碳强度最低的区域。


准备工作

首先,我们需要导入必要的库并加载API密钥,这与上一节课的步骤类似。

import requests
import json
from helper import load_secret
api_key = load_secret(“electricity_maps_api_key”)

注意:在在线课堂环境中,打印出的api_key是隐藏的,无法直接使用。您需要在自己的项目中配置真实的API密钥。


估算数据中心的坐标

为了查询特定Google Cloud区域的碳强度,我们需要该区域的大致坐标。虽然我们不知道数据中心的确切位置,但可以通过区域名称在谷歌地图上找到代表性坐标。例如,对于us-central1区域(位于美国爱荷华州),我们可以使用该州某个主要城市的坐标作为近似值。

我们将创建一个字典,包含多个支持Vertex AI的Google Cloud区域及其近似坐标。

vertex_regions = {
    “us-central1”: {“lat”: 41.8780, “lon”: -93.0977}, # 爱荷华州,得梅因
    “northamerica-northeast1”: {“lat”: 45.5017, “lon”: -73.5673}, # 加拿大,蒙特利尔
    “europe-west6”: {“lat”: 47.3769, “lon”: 8.5417}, # 瑞士,苏黎世
    “asia-northeast3”: {“lat”: 37.5665, “lon”: 126.9780}, # 韩国,首尔
    “australia-southeast1”: {“lat”: -37.8136, “lon”: 144.9631} # 澳大利亚,墨尔本
}

这个字典将作为我们选择训练区域的“候选名单”。


查询单个区域的实时碳强度

接下来,我们编写第一个函数carbon_intensity。这个函数接收区域名称,调用Electricity Maps API,并返回该区域电网的当前碳强度值(单位:克CO₂当量/千瓦时)。

以下是该函数的代码,我们将逐行解析:

def carbon_intensity(vertex_regions, api_key, region):
    try:
        # 1. 从大字典中获取目标区域的坐标信息
        region_obj = vertex_regions[region]
        # 2. 构建API请求URL
        url = f“https://api.electricitymap.org/v3/carbon-intensity/latest?lat={region_obj[‘lat’]}&lon={region_obj[‘lon’]}”
        # 3. 发送GET请求,携带API密钥
        response = requests.get(url, auth=(api_key, ‘’))
        # 4. 解析返回的JSON数据
        data = json.loads(response.content)
        # 5. 提取并返回碳强度值
        return int(data[‘carbonIntensity’])
    except Exception as e:
        # 错误处理:如果API调用失败,打印错误并返回None
        print(f“Error getting carbon intensity for {region}: {e}”)
        return None

让我们以asia-northeast3区域为例,手动执行函数中的关键步骤,以便理解:

  1. region_obj = vertex_regions[“asia-northeast3”]:获取首尔的坐标 {‘lat’: 37.5665, ‘lon’: 126.9780}
  2. 构建URL:https://api.electricitymap.org/v3/carbon-intensity/latest?lat=37.5665&lon=126.9780
  3. 发送请求并解析响应。打印出的数据可能类似:{‘zone’: ‘KR’, ‘carbonIntensity’: 416}
  4. 函数最终返回整数值 416。这个值会根据实时电力情况不断变化。

找出碳强度最低的区域

有了查询单个区域碳强度的能力后,我们需要一个方法来找出所有候选区域中,当前碳强度最低的那个。这就是第二个函数cleanest的任务。

以下是cleanest函数的代码和解析:

def cleanest(vertex_regions, api_key):
    carbon_intensity_for_regions = []
    for region_name in vertex_regions:
        try:
            # 为每个区域计算实时碳强度
            ci = carbon_intensity(vertex_regions, api_key, region_name)
            if ci is not None:
                # 将区域原有信息与新查询到的碳强度合并成一个新字典
                new_entry = {**vertex_regions[region_name], **{‘name’: region_name, ‘carbon_intensity’: ci}}
                carbon_intensity_for_regions.append(new_entry)
        except Exception as e:
            print(f“Skipping {region_name} due to error: {e}”)

    # 找出碳强度值最小的那个字典
    cleanest_region = min(carbon_intensity_for_regions, key=lambda x: x[‘carbon_intensity’])
    return cleanest_region

关键步骤解析

  1. 我们创建一个空列表carbon_intensity_for_regions
  2. 遍历vertex_regions字典中的每个区域。
  3. 对每个区域,调用carbon_intensity函数获取实时碳强度ci
  4. 使用 {**dict1, **dict2} 的语法,将原始坐标字典、区域名称和新的碳强度值合并成一个新字典,并添加到列表中。
  5. 循环结束后,使用min函数和lambda键,从列表中找出carbon_intensity值最小的那个字典,即为最清洁的区域。

运行这个函数,可能会返回类似的结果:{‘lat’: 45.5017, ‘lon’: -73.5673, ‘name’: ‘northamerica-northeast1’, ‘carbon_intensity’: 36}。这意味着当前时刻,加拿大蒙特利尔区域的电网碳强度最低。


在最优区域运行训练任务

找到最清洁的区域后,我们就可以在那里启动训练任务了。这需要在该区域创建一个新的存储桶(Bucket),因为训练任务的暂存桶必须与计算区域位于同一位置。

# 1. 获取最清洁的区域信息
best_region_info = cleanest(vertex_regions, api_key)
best_region_name = best_region_info[‘name’] # 例如:’northamerica-northeast1’

# 2. 为该区域创建唯一的存储桶名称和存储桶
import uuid
bucket_name = f“cleaner-bucket-{uuid.uuid4()}”
storage_client = storage.Client()
bucket = storage_client.create_bucket(bucket_name, location=best_region_name)

# 3. 使用Vertex AI在该区域提交自定义训练任务
from google.cloud import aiplatform
aiplatform.init(project=your_project_id, location=best_region_name)

job = aiplatform.CustomTrainingJob(
    display_name=“dl-ai-course-cleaner”,
    script_path=“task.py”,
    container_uri=“gcr.io/cloud-aiplatform/training/tf-cpu.2-12:latest”,
    staging_bucket=bucket_name
)

# 4. 运行训练任务
model = job.run()

通过对比,我们发现新区域(碳强度36)的碳强度远低于之前使用的us-central1区域(碳强度416),这意味着此次训练产生的碳排放约为之前的1/11,减排效果显著。


关于实时数据的注意事项

使用实时碳强度数据选择训练时机和地点,对于短时间任务(如本例)可以显著降低排放。但对于长达数天或更久的训练任务,其减排效果可能被“平均化”,因为电网的碳强度在一天中会波动。

Electricity Maps API 提供了一个/carbon-intensity/history端点,可以查询历史碳强度数据(通常按小时间隔)。这有助于估算长时间训练任务的整体碳排放。

# 查询历史碳强度数据示例
history_url = f“ https://api.electricitymap.org/v3/carbon-intensity/history?lat=45.5017&lon=-73.5673 ”
history_response = requests.get(history_url, auth=(api_key, ‘’))
history_data = json.loads(history_response.content)
print(history_data) # 将输出过去一段时间内每小时的平均碳强度

总结

在本节课中,我们一起学习了如何利用实时能源数据进行低碳AI模型训练:

  1. 基础准备:我们导入了必要的库,加载了API密钥,并创建了Google Cloud区域及其近似坐标的字典。
  2. 核心函数一:我们编写了carbon_intensity函数,用于查询任一指定区域的实时电网碳强度。
  3. 核心函数二:我们编写了cleanest函数,该函数遍历所有候选区域,调用第一个函数,并智能地找出当前碳强度最低的最优区域。
  4. 实践应用:我们利用cleanest函数的返回结果,在碳强度最低的区域创建了存储桶并成功提交了Vertex AI训练任务,实现了基于实时数据的动态低碳调度。
  5. 深入思考:我们讨论了实时数据策略对长时任务效果的局限性,并介绍了查询历史碳强度数据的方法,以便进行更全面的碳排放估算。

通过本节课,你掌握了利用实时外部数据优化AI工作负载碳足迹的关键技能。在下一节课中,我们将从一个更宏观的视角,学习如何评估云计算整体使用的碳排放。

006:理解你的Google Cloud碳足迹 🌍

在本节课中,我们将学习如何使用Google Cloud碳足迹工具。该工具通过自动估算您所有Google Cloud使用所产生的温室气体排放,为您提供一个更全面的碳足迹衡量标准。

准备工作与核心概念

上一节我们介绍了如何通过区域选择来优化碳排放。本节中,我们来看看如何获取和分析Google Cloud服务的完整碳足迹数据。

我们将使用Google Cloud,因此需要导入身份验证函数以获取凭据和项目ID。

# 导入必要的库
from google.cloud import bigquery
import pandas as pd

在深入代码之前,您需要了解碳通常是如何被测量和量化的。温室气体核算体系标准定义了三个类别,称为范围1、范围2和范围3。这些类别帮助组织衡量其碳影响,每个类别的具体构成因组织的业务类型和活动而异。

  • 范围2:这是我们本课程迄今为止讨论的重点。它涵盖了购买电力、供暖和制冷所产生的所有间接排放。当我们讨论碳与计算时,范围2最相关,因为它包括了因连接到电网而在Google Cloud数据中心用电所产生的排放。
  • 范围1:这包括组织控制的来源产生的直接排放,例如厨房的燃气灶,或者如果您运营一支班车车队,用于运行班车的燃料。在Google Cloud数据中心的背景下,范围1可能包括现场备用发电机等。
  • 范围3:这涵盖了来自您不控制的资产的所有间接排放。这包括从供应商处购买的物品、废物处理以及任何类型的商务旅行等类别。就Google Cloud而言,这可能包括生产数据中心中GPU所产生的排放。

碳影响不仅仅包括我们目前关注的、来自电力生产的范围2排放。通过将范围1和范围3纳入我们的估算,我们可以更全面地了解我们的影响。具体到本课将讨论的碳足迹工具和数据,您看到的是Google数据中心运营的范围1、2和3排放。作为开发者,您对Google Cloud的使用实际上属于您的范围3排放。

访问碳足迹数据

对于您在本课程之外的个人项目,您需要将碳足迹数据导出到BigQuery。我已为本课程完成了此设置,因此您无需进行设置。但如果您想为自己的项目尝试此操作,并了解您在Google Cloud中可能进行的任何工作的碳数据,让我快速展示如何在云控制台中操作。

在云控制台中,您可以输入“Carbon footprint”。然后从这里,点击“导出”按钮,选择要将数据导出到的项目,然后点击“配置导出”。完成此操作后,您可以进行一些不同的自定义设置,可以保留所有默认设置,唯一需要设置的是BigQuery中数据集的名称,您希望将所有数据传输到该数据集。然后您可以点击“保存”。完成此设置并导出数据后,您将能够访问它。

回到笔记本,使用BigQuery Python客户端,我们将编写一个函数来执行BigQuery查询。该函数将SQL查询字符串作为输入,在BigQuery中执行它,结果将以Pandas DataFrame的形式返回。

def run_bq_query(sql):
    """
    执行BigQuery查询并返回Pandas DataFrame。
    """
    # 创建BigQuery客户端
    client = bigquery.Client(project=project_id, credentials=credentials)
    # 设置作业配置
    job_config = bigquery.QueryJobConfig()
    # 执行查询
    query_job = client.query(sql, job_config=job_config)
    # 获取作业ID(可选,便于调试)
    job_id = query_job.job_id
    # 等待作业完成并转换为DataFrame
    df = query_job.to_dataframe()
    # 打印完成信息
    print(f"作业 {job_id} 已完成。")
    return df

探索数据

现在我们有了函数,让我们尝试一些查询来调查数据。我们将使用SQL来完成,但如果您不是SQL专家,请不要担心,我也不是。我们将一起学习几个基本的SQL命令,您可以用它们从这些数据中获取大量信息。

首先,我们将查看数据的一个子集,只提取数据集的前五行,以便了解这些数据中实际包含什么,以及所有“范围2”、“范围3”等字段的含义。

SELECT *
FROM `your-project-id.carbon_footprint.sample_data`
LIMIT 5

我们可以调用上面定义的 run_bq_query 函数来获取数据。

sample_df = run_bq_query(query)
print(sample_df)

此表中的每一行代表特定Google Cloud服务在特定项目中一个月时间范围内的排放量。这些实际上是我在Google Cloud中三个项目的真实数据。您将看到我在不同时间使用的不同Google Cloud服务,用于我创建的所有演示、机器学习内容和课程。

浏览这些列,您会注意到没有一个单独的列叫“排放量”。这是因为有几种不同的计算和报告这个数字的方式。让我们放大一个名为 carbon_footprint_kg_co2e 的列。这个字段有三个嵌套列:scope1scope2scope3,即我们之前讨论的范围。

这些数字告诉我们什么?这是我从一些Google Cloud项目编译的碳足迹数据。具体来说,这一行(如果我们打印出服务列的值)来自名为“Cloud Run”的服务,这是一个特定的Google Cloud项目。这里的范围1、2和3数字告诉我们那个月我的Cloud Run使用所产生的排放。

  • 查看这里的 scope2,您可以看到 4.966e-05 是范围2产生的排放,这是通过估算执行此计算工作负载的当地电网提供的电力所产生的温室气体排放得出的。
  • 这是 scope1 的值。
  • 这是 scope3 的值。

在碳足迹工具中,这两个数字是通过获取Google Cloud总的范围1和范围3排放,然后根据您特定的Google Cloud使用情况进行分配来计算的。

因此,综合来看,当我们查看我对Cloud Run的使用时,重要的不仅仅是这里的范围2排放(即发电产生的排放),这个碳足迹工具还为我们提供了因运营和运行我实际运行此工作负载的数据中心而产生的额外排放的估算。

请注意:您可能已经注意到,这里的 scope2 有一个额外的键叫 location_based。这指的是在特定Google Cloud服务的使用中消耗电力所排放的实际二氧化碳当量。之所以将其作为一个特定的键标出,是因为未来这里还会有一个基于市场的值,该值会考虑Google Cloud为该工作负载购买的可再生能源,但目前数据中还没有这个数字,所以您无需担心,可以忽略它。但如果您想知道为什么范围2有一个特定的键,而范围1和范围3没有,这就是原因。但数字仍然是相同的,这里的数字才是您需要关心的。

除了这个 carbon_footprint_kg_co2e 列,如果您滚动查看,还会看到 carbon_footprint_total_kg_co2e。如果您想知道所有三个范围的总排放量,而不仅仅是范围2的电力使用排放,这就是需要查看的字段。我们可以实际测试一下,确保计算正确,因为如果我们把这里的范围1、2和3的值相加,应该得到这里的总位置数字。

# 验证总和
total_emissions = (sample_df.iloc[0]['carbon_footprint_kg_co2e']['scope1'] +
                   sample_df.iloc[0]['carbon_footprint_kg_co2e']['scope2']['location_based'] +
                   sample_df.iloc[0]['carbon_footprint_kg_co2e']['scope3'])
print(f"范围1+2+3总和: {total_emissions}")
print(f"总排放字段值: {sample_df.iloc[0]['carbon_footprint_total_kg_co2e']['location_based']}")

因此,尽管在本课程中我们主要讨论了范围2排放,但如果我们想全面了解我们的影响,加入范围1和范围3并查看这里的总数,将为我们提供更好的碳排放估算。

运行分析查询

现在我们已经快速浏览了数据,可以运行哪些有趣的分析查询呢?

查询1:特定服务的范围2总排放

如果我们想知道某一特定服务(例如BigQuery)的发电总排放量,可以运行以下查询:

SELECT SUM(carbon_footprint_kg_co2e.scope2.location_based) AS total_scope2_emissions
FROM `your-project-id.carbon_footprint.sample_data`
WHERE service.description = 'BigQuery'

查询2:按月份、区域和服务查看特定项目的排放细分

如果您想查看特定项目在所有三个范围(不仅仅是范围2)上,跨月份、区域和服务的碳排放细分,可以运行一个更复杂的查询:

SELECT
  usage_month,
  service.description,
  location,
  carbon_footprint_total_kg_co2e.location_based AS total_emissions_kg_co2e
FROM `your-project-id.carbon_footprint.sample_data`
WHERE project.number = 11111  -- 替换为您的项目ID
ORDER BY usage_month, service.description

查询3:计算特定项目的总排放量

如果您想知道特定项目在所有三个范围上的总排放量,可以运行以下查询:

SELECT
  project.number,
  SUM(carbon_footprint_total_kg_co2e.location_based) AS total_carbon_emissions_kg_co2e
FROM `your-project-id.carbon_footprint.sample_data`
GROUP BY project.number

运行此查询后,您可以看到数据中三个项目的总碳排放量。为了给您一点背景信息,根据德国非营利组织的数据,从伦敦往返纽约一次,每位乘客会产生约986公斤的二氧化碳。这里的一个项目产生的排放量略少于两次伦敦到纽约的往返航班,而这仅仅来自于训练机器学习模型和构建演示(这是我在这些项目中所做的工作)。

如果我们实际上只是使用这里的查询对这三个数字求和,我们可以看到我在这些项目中所有Google Cloud活动的总排放量。将这个数字除以986(每位乘客从伦敦往返纽约产生的二氧化碳公斤数),我们得到接近29。这意味着,仅仅通过在这些Google Cloud项目中训练ML模型、构建演示以及我做的所有其他事情,我产生的排放量接近29次往返纽约的航班。

这个数字让我个人感到非常惊讶。我认为,当我们使用一次性塑料或给汽车加油时,很容易看到我们对环境的影响,因为这些行为更具体。但在笔记本中执行单元格、运行代码有时感觉非常抽象,因此很难将我们编写代码时所做的事情与实际对环境可能产生的影响联系起来。能够像这样看到我的碳足迹数据,并如此清晰地看到这些数字,对我来说真的很有启发性。

使用Pandas进行本地分析

现在轮到您试验数据了,看看是否有其他有趣的查询想要运行。如果您像我一样,对SQL不太熟悉,这些数据实际上足够小,您可以将其加载到本笔记本的Pandas DataFrame中,这样就可以使用Pandas来分析数据。

让我快速展示一下如何操作:

# 将所有数据加载到Pandas DataFrame中
query_all = """
SELECT *
FROM `your-project-id.carbon_footprint.sample_data`
"""
full_df = run_bq_query(query_all)
# 现在您可以使用Pandas方法(如groupby, sum, plot等)分析full_df
print(full_df.head())
print(full_df.groupby('service.description')['carbon_footprint_total_kg_co2e'].sum())

总结与下节预告

本节课中,我们一起学习了如何通过Google Cloud碳足迹工具,获取和分析我们使用Google Cloud所产生的完整碳排放情况。我们了解了范围1、2、3排放的区别,并实践了使用SQL和Python来查询和解读这些数据。

下一节课,我们将讨论一些后续步骤和延伸阅读材料,以及您可以在Google Cloud中采取的具体措施来降低碳足迹。我们下节课见。

007:后续步骤 🚀

在本节课中,我们将一起探索一些有趣的论文和项目,作为您碳意识旅程的延伸和启发。我们将了解实用的工具、前沿的研究模型以及超越碳排放的其他环境影响。

区域选择工具实践 🌍

上一节我们介绍了如何根据碳排放选择云服务区域。本节中我们来看看一个综合性的工具,它可以帮助您在考虑多种因素的情况下做出最佳选择。

选择实际项目的部署区域通常取决于许多其他因素,例如延迟、价格和数据位置。为了帮助您进行区域选择,您可以使用Google Cloud的区域选择器工具。

以下是使用该工具的步骤:

  • 您可以为碳排放、更低价格和延迟等不同因素指定其重要性程度。
  • 假设碳排放的重要性略低于中等,但我们非常关心价格,并且不太关心延迟。
  • 如果适用,您还可以指定流量的来源以及您计划运行的产品。
  • 指定所有这些参数后,您将获得基于您特定偏好的区域推荐。

例如,根据我的设置,工具推荐了美国爱荷华州的US Central 1区域。您可能记得,这是我们在第三课中用于训练机器学习模型的区域。后来,我还在加拿大蒙特利尔进行了训练,因为该区域在当时有更多的可再生能源可用。

如果您计划使用Google Cloud,请务必查看区域选择器。您可以使用此工具来指导您选择最佳区域,在优化碳效率的同时,也兼顾对您重要的其他因素。

前沿研究论文探索 📄

现在,让我们了解一些有趣的研究论文。如果您想更深入地了解这个领域,这些资料将非常有帮助。

第一项研究是关于一个名为GLaM(通用语言模型)的模型家族。该论文的作者表明,最大的GLaM模型(1.2万亿参数)在训练时消耗的能源仅为GPT-3的三分之一,推理所需的计算量(FLOPs)也减少了一半,同时在29个NLP任务上实现了可比的性能。

研究人员通过使用一种称为稀疏激活的专家混合架构来实现这种效率。在阅读这篇论文之前,我并不熟悉这种架构。如果您想了解更多关于其工作原理以及他们如何在能源使用方面获得这些效率提升的信息,我强烈推荐您查阅这篇论文。

除了这篇论文,如果您想了解更多关于专家混合模型的知识,Mistral AI还有一个简短的课程,其中介绍了一些相关内容。如果您想在深入研究这篇技术论文之前获得一些入门知识,请务必查看那个课程。

虽然本课程主要讨论了训练模型产生的碳足迹,但最近关于推理时能源消耗的研究也越来越多。我推荐您阅读论文《Power Hungry Processing: What’s Driving the Cost of AI Deployment?》。

该论文的作者指出,虽然对单个示例进行推理所需的计算量远少于训练同一模型,但推理发生的频率要高得多。具体来说,研究人员比较了几种不同BLOOM模型每次推理的能源使用量,以及训练和微调它们所消耗的总能源。他们用这个数字来估算,对于一个给定的模型,需要进行多少次推理,其推理成本才能达到训练成本。

他们估计,对于ChatGPT,即使假设每个用户只进行一次查询,部署该模型的能源成本在仅仅几周或几个月的部署后就会超过其训练成本。

这篇论文研究了涵盖自然语言和计算机视觉的10个任务、30个数据集和应用中的88个模型,并分析了最终任务类型、模型大小、架构和学习范式对能源效率的影响。

您还可以从这篇论文中学到,例如,提示大型语言模型执行摘要任务比要求其执行分类任务要消耗更多的能源和产生更多的碳排放。正如您可能想象的那样,图像生成比图像分类或文本生成要消耗更多的能源。

超越碳足迹:水资源影响 💧

最后,除了碳排放,生成式AI还有相关的水足迹。请记住,运行GPU和TPU的数据中心会变得非常热,冷却系统可能会蒸发大量的水以保持这些处理器的运行。最近有一些工作试图理解和量化水资源的使用。

如果您想了解更多信息,我建议您查阅论文《Making AI Less “Thirsty”》。目前这方面的研究肯定比量化计算碳足迹的研究要少。但就像过去几年我们对碳足迹的理解有了很大进步一样,我认为理解水足迹并学习如何进行某些优化,将是未来研究领域会更多关注的话题。

水资源使用是研究界最近越来越关注的一个话题。就像几年前我们并不真正理解或考虑计算的碳足迹一样,这种情况在过去几年发生了很大变化,相关研究也越来越多。我认为水资源是一个新的领域,我们将看到更多关于其真实影响以及我们如何做出改变以减少用水量和降低足迹的研究和理解。

如果您想了解这个新领域是如何开始发展的,请务必查阅这篇论文。

课程总结 🎯

本节课中我们一起学习了几个我认为非常有趣的论文和项目。我希望本课程能成为您碳意识旅程的一个起点。我认为,作为开发者和工程师,您能够产生影响,这非常令人兴奋。我希望从现在开始,您在开发软件应用程序时会开始考虑碳排放。我的意思是,我们已经习惯于考虑性能、安全性、成本等因素,因此碳排放只是需要添加到这个清单中的又一项内容。

008:结论 🎯

在本课程中,我们学习了与计算基础设施和碳排放相关的能源与电网知识。

上一节我们探讨了影响碳足迹的关键因素,本节中我们将对整个课程内容进行总结。

课程核心内容回顾 📚

你学习了模型训练和推理,特别是涉及大语言模型时,可能产生显著的碳足迹。

同时,你也熟悉了影响该碳足迹大小的关键因素和决策。

实践策略体验 🛠️

以下是课程中介绍的一种碳意识机器学习开发策略:

  • 策略:在由高比例无碳能源供电的地区训练模型。

开发者的积极影响 💡

开发者可以通过改变编码和设计机器学习应用程序的方式,对环境产生切实的积极影响。

一个具体的例子是,如果你希望立即开始贡献,Electricity Maps 应用程序是开源的。如果你发现你所在的区域电网数据缺失,甚至可以按照流程添加新的区域电网数据。

展望未来 🚀

希望这只是你碳意识之旅的开始。该领域还有更多值得探索的内容,相关研究也日益深入。期待看到你接下来构建的碳意识应用程序。

总结 📝

本节课中我们一起学习了计算,特别是大语言模型训练与推理的碳足迹问题,了解了影响碳足迹的关键决策,并实践了在无碳能源丰富的地区进行模型训练的策略。作为开发者,我们完全可以通过技术选择为环境保护做出积极贡献。

posted @ 2026-03-26 08:17  布客飞龙II  阅读(10)  评论(0)    收藏  举报