在我的第一个故事中,我花时间优化了代码,将计算时间减少了 90%,之后我很想知道我的改动所节省的二氧化碳当量。受微软 DevBlog 的启发,我决定根据 Sara Bergman 的文章开发自己的方法。.
在本文中,我们将介绍这一过程的每个阶段,并将其划分为三个不同的部分:

每个部分都将在 Azure ML Studio 的笔记本上实际实现。.
步骤 1:剖析代码
第一步的目标非常简单:找出代码的内存和 CPU 消耗量。就我们的机器而言,将考虑三个主要参数:
我们可以很容易地在网上找到近似功率使用效率(PUE)的信息,但测量 Python 笔记本的 CPU 和内存消耗却不那么简单。目前有许多解决方案(timeit、cProfile、psutil),但它们更侧重于时间剖析,而非 CPU 和内存消耗。.
由于需要评估的代码位于运行在 Linux(18.04.1-Ubuntu SMP)上的 JupyterLab 实例中,因此为了所有权和简单起见,我决定用 Bash 编写自己的剖析脚本,在一个永久循环中测量我的机器消耗。.
第一个脚本用于每秒测量精确的内存使用量,保存为 memory_profiler.sh :

第二个脚本用于测量最后一分钟内每秒的 CPU 平均消耗量,保存为 cpu_profiler.sh :

但有了这两个脚本还不够,我还需要知道代码运行的确切时间。为此,我在笔记本的顶部添加了一个单元格 :

还有一个单元格,在我笔记本的最下面:

现在一切都准备就绪,我只需要......:
1.确保我的环境没有被后台运行的其他任务污染,点击 "全部关闭 "按钮关闭所有正在运行的实例

2.打开终端实例,在后台运行 memory_log.sh 脚本
./memory_log.sh
3.打开另一个终端实例,在后台运行 cpu_log.sh 脚本
./cpu_log.sh
4.实例化并运行所有笔记本单元

整个笔记本运行后,我可以在每个终端按 CTRL + C 键停止两个 Linux 脚本,检查内存日志和 cpu.log 文件是否已成功创建,并利用添加了 datetime.now() 的两个单元格记下笔记本执行的开始时间和结束时间。.

现在,我已经掌握了下一阶段计算所需的一切。.
步骤 2:计算成能量
现在,我们已经收集了所有关于资源消耗的 data 数据,可以开始将所有数据转换成千瓦时(代表能源消耗的单位)。.
为此,我们将使用以下公式:

让我们先来看看 CPU 的相关指标。.
第一步,我将 cpu.log 文件的内容复制到谷歌电子表格中,然后用它来计算平均 CPU 消耗量:

我在工作表上做了一些处理(将文本拆分为列、删除未使用的列、添加列名),以便获得更方便使用的内容:

我的笔记本电脑从 12:33:20 运行到 13:14:09,因此我只需添加一个公式,返回这些时间之间 cpu_1 的平均值,然后用平均值除以我的机器的 CPU 数量即可:

我现在明白了,我的笔记本正在平均使用 8.038 个 CPU 在执行的 40 分钟内,相当于 平均 CPU 占用率为 100.47%。.
但我的 CPU 消耗量有多大?
这取决于所使用的 CPU 型号。 Azure 微软文档. .在我进行实验时(2021 年 10 月),我的机器使用的是 4 种不同类型的英特尔至强 CPU 中的一种:
- 英特尔至强白金版 8270
- 英特尔至强白金版 8171M
- 英特尔至强处理器 E5-2697 v4
- 英特尔至强 E5-2673 v3 @ 2.40GHz
在英特尔网站上查找后,我能够使用热设计功率(TDP)将 CPU 型号与它们的功耗相匹配,TDP 表示处理器在所有内核都激活的基本频率下运行时的平均功率(以瓦为单位)。.

由于每次执行代码时使用的 CPU 都会发生变化,我决定取这四个 CPU 的平均 TDP,即 158.75 在这种情况下。.
我现在发现这两个 计算机 (=1.0047) 和 抄送 (=158.75)
现在让我们看看内存日志文件
按照与之前相同的流程,我将文件内容复制到谷歌工作表中,将文本分栏并排列,得到以下格式:............:

然后,我对 C 列应用平均值公式,得出 平均内存使用率 在 12:33:20 和 13:14:09 之间,单位为 MB。我将这个数字除以 1024,换算成 GB。.

为了估算 1GB data 的耗电量,我将遵循以下经验法则 这里 :每 8GB 3 瓦,即 0.375 瓦/GB,以及 1.88W 我总共使用了 5.015GB 内存。.
我现在发现 请联系 (=1.88).需要注意的是,内存消耗的电能似乎比 CPU 消耗的电能少 85 倍,因此可以跳过内存消耗的电能,以获得准确度稍低但速度更快的评估结果。.
由于我不使用任何 GPU,我可以直接使用最后一个缺失的术语:"Power Usage Effectiveness"(功率使用效率)。PUE 是一个比率,它决定了 data 中心除托管 cloud 服务(如冷却、无功功率补偿、照明......)外,还用于其他方面的能量。
看一看 2015 年微软 Datacenter 概况介绍, 其新的 data 中心的平均 PUE 为 1.125. .这就是我们在本例中将采用的数字,但更严谨的方法是找出用于计算的 data 中心的实际 PUE。.
现在我们有了方程的所有项,让我们来算一算!

由于我们的代码在 12:33:20 至 13:14:09 之间运行,执行时间为 40 分 49 秒(相当于 0.68 小时)。这意味着它总共消耗了 0.1238 千瓦
步骤 3:评估影响
碳测量之旅的最后一步,我们现在需要评估电力消耗的影响,这在很大程度上取决于能源消耗的地点。为了计算出这一影响,我们将使用碳强度系数,我们可以很容易地在以下网站找到该系数 电力地图网站, 该项目旨在收集、预处理和统一来自 150 个地区的公共电力 data。.

当我计算我的代码在荷兰运行时产生的二氧化碳影响时,碳影响值为每千瓦 487 克。因此,我的代码的影响值为 487 * 0.1238 = 487 * 0.1238 = 0.1238。 60.3 gCO2eq.
这个数值看似很低,但如果我的代码全年每天都在运行,其影响就会达到 60.3 * 365.25 = 60.3 * 365.25 = 365.25。 每年 22.0 千克二氧化碳当量。.
但与其他活动相比,它能代表什么呢? 如果我们将其与汽车的使用进行比较,以 2019 年所有新车的平均二氧化碳排放量, 这相当于一次 180 公里旅行的足迹。.
使用 monconvertisseurco2.fr 我可以使用由法国国家机构 “国家环境和能源管理署”(ADEME)收集的 “基准碳 ”开放式 data 获取更多等效活动。.

结论
我们做到了
我们对代码进行了剖析,以获得内存和 CPU 的使用情况,并将这些数据计算成耗电量,评估了对 CO2eq 的影响,从而更好地了解了代码的碳足迹。这是一个重要的里程碑,让我们回过头来看看代码对环境的影响,并强调代码优化的重要性。.
在这个具体案例中,如前所述 在关于如何跟踪和避免 Jupiter Lab 性能瓶颈的第一部分中, 而仅仅优化一行代码,我就节省了 90% 的计算时间和 92% 的 CO2eq 影响,从每年 22kgCO2eq 降至不到 2kgCO2eq。.
现在,包括 Azure 在内的大多数 cloud 提供商平台都承诺 对环境不产生任何影响 得益于碳抵消项目。然而,环境专家们一致认为,尽管碳抵消项目是有效和重要的、, 仅靠碳补偿项目不足以控制我们的活动对地球的影响, 而且 最好的解决办法仍然是从源头上减少排放, 就像这个优化项目一样。.
这也是我们 Artefact 通过不同的环保举措努力推广的理念!

博客







