写点什么

基于昇腾适配电力潮流计算模型 PowerFlowNet

作者:Splendid2025
  • 2025-06-11
    上海
  • 本文字数:5101 字

    阅读完需:约 17 分钟

基于昇腾适配电力潮流计算模型PowerFlowNet

摘要

准确高效的潮流 (PF) 分析对于现代电网的运行和规划至关重要。因此,我们需要一种可扩展的算法,能够为小型和大型电网提供准确、快速的解决方案。由于电网可以理解为一张图,图神经网络 (GNN) 已成为一种颇具前景的方法,它通过利用底层图结构中的信息共享来提高 PF 近似的准确性和速度。在本研究中,我们介绍了 PowerFlowNet,这是一种用于 PF 近似的新型 GNN 架构,其性能与传统的牛顿-拉夫逊法相似,但在 IEEE 14 节点系统中,其速度提高了 4 倍,在法国高压电网 (6470rte) 的实际案例中,其速度提高了 48 倍。同时,它在性能和执行时间方面显著优于其他传统近似方法,例如直流潮流;因此,PowerFlowNet 将成为实际 PF 分析中极具前景的解决方案。此外,我们通过深入的实验评估验证了该方法的有效性,全面考察了 PowerFlowNet 的性能、可扩展性、可解释性和架构可靠性。此次评估深入了解了 GNN 在电力系统分析中的行为和潜在应用

1.  介绍

PowerFlowNet 是由代尔夫特理工大学和荷兰应用科学研究组织开发的一种基于深度学习的新一代智能流体模拟模型,专注于高效预测复杂流体运动与多物理场耦合现象。该模型通过融合卷积神经网络(CNN)与物理约束模块,显著提升了流体仿真的计算效率与精度,广泛应用于工程流体力学、气象预测、航空航天设计等领域。PowerFlowNet 采用自适应网格优化和并行计算技术,能够在保持高分辨率模拟的同时降低计算资源消耗。其开源框架提供从数据预处理、模型训练到实时推理的全流程工具链,为科研与工业界提供了可扩展的流体模拟解决方案。

2.   网络架构

PowerFlowNet 是一种 GNN 方法,它根据问题的部分信息(例如图 𝐴 的邻接矩阵、已知节点特征 𝑋 = [𝒙1, …, 𝒙𝑁 ]𝖳(其中未知特征填充为 0)以及每条线 (𝑖, 𝑗) ∈的边特征 𝑋𝑒 = [𝒙𝑒𝑖,𝑗]𝖳),重建每个节点的完整特征向量 𝒙̂𝑖 = (𝑉m𝑖, 𝜃𝑖, 𝑄𝑖)。我们提出的模型由一个掩码编码器和一堆我们新颖的 Power Flow 卷积层 (PowerFlowConv) 组成。首先,掩码编码层使用特征掩码对输入特征进行移位,以区分已知和未知特征。然后,如图 1 所示,编码后的图特征被输入到由独特排列的消息传递层和 TAGConv 层组成的 Power Flow 卷积运算堆栈中。这样,来自每个节点和边的信息都会被聚合,从而预测完整的特征矩阵 𝑋̂ =[𝒙̂1, …, 𝒙̂ 𝑁 ]𝖳



图 1:PowerFlowNet 模型架构由一个掩码编码器和 𝐿 PowerFlowConv 层组成。包含不完整特征信息的输入图被逐个节点地输入到掩码编码器,以生成编码后的图特征,其中每个节点 𝑛 ∈ 𝑁,且 (𝒙𝑖, 𝒎𝑖)。然后,编码后的图特征由一系列 𝐿 顺序 PowerFlowConv 层处理,每个层包含一个单步消息传递和一个高阶 TAGConv。最终生成完整的输出图。

2.1 掩码编码器

在 PF 问题中,每个节点都有不同的已知和未知特征。目标是在保持已知特征不变的情况下预测未知特征。这意味着我们的神经网络应该知道哪些特征需要预测。因此,对于每个具有特征向量 𝒙𝑖 的输入节点,我们创建一个二元掩码 𝒎𝑖 ∈ R𝐹,其中 0 表示已知特征,1 表示未知特征。例如,一个负载 (PQ) 节点的特征向量 𝒙𝑖 = (𝑉𝑚𝑖, 𝜃𝑖, 𝑄𝑖) 和未知值 𝑉𝑚 和 𝜃,其掩码为 𝒎𝑖 = (1, 1, 0, 0)。此外,我们建议使用一个能够学习表示不同类型节点的掩码编码器(参见图 1 中的掩码编码器模块)。实际上,它由两个全连接层组成,将二值掩码映射到连续值向量。值得注意的是,也可以使用固定的(非学习的)掩码嵌入,但我们的掩码编码器可以学习更灵活的掩码表示,从而提升最终性能。对于每个 𝑚𝑖 ∈ 𝑀,其中 𝑀 ∈ R𝑁×𝐹,𝒎̂𝑖 = 𝑊1𝜎(𝑊0𝒎𝑖 + 𝑏0) + 𝑏1, ∀𝑖 ∈ 𝑁,这是一个函数𝒎𝑖 ∈ {0, 1}𝐹 → 𝒎̂𝑖 ∈ R𝐹,权重矩阵𝑊0, 𝑊1 和偏差𝑏0, 𝑏1 是可训练参数。最后,为了生成编码图特征𝑋𝑙,我们将输入节点特征𝑋与学习到的表示𝒎̂𝑖进行平移,即𝒙0𝑖= 𝒙𝑖 + 𝒎̂𝑖,∀𝑖 ∈𝑁。

2.2 功率流卷积层

我们提出的架构的第二部分由 𝐿 连接的 PowerFlowConv 层组成,这些层按顺序处理编码后的图特征并预测最终的特征矩阵 𝑋̂ 𝐿,其中 𝑋̂ 𝐿=[𝒙̂𝐿1, … , 𝒙̂𝐿𝑁]𝖳 和 𝒙̂𝐿𝑖= (𝑉m𝑖, 𝜃𝑖, 𝑃𝑖, 𝑄𝑖), ∀𝑖 ∈𝑁 。每个 PowerFlowConv 层由一个初始的单跳消息传递步骤和一个𝐾跳 TAGConv 组成,TAGConv 学习自动从边缘特征 𝒙𝑒𝑖𝑗(即线路电阻和电抗)中提取信息,并将其融入相邻节点特征 𝒙𝑙𝑖。消息传递利用来自边缘特征的信息,而 TAGConv 则聚合大邻域中的节点特征。然而,在 PF 公式​​中,线路特征和节点状态都发挥着重要作用。因此,通过结合这两种技术,所提出的架构可以提供高质量的 PF 近似值。

更具体地说,我们计算传递给节点 ∀𝑖 ∈ 𝑁 的消息为



⟨𝑥𝑙𝑖, 𝑥𝑙𝑗, 𝑥𝑒𝑖,𝑗⟩ 是上述向量的串联向量,输入到带有中间 ReLU 激活函数的双层多层感知器 (MLP)。这里再次显示权重矩阵和偏置向量𝑊𝑙𝑀𝑃1, 𝑏𝑙𝑀𝑃1, 𝑊𝑙𝑀𝑃0, 𝑏𝑙𝑀𝑃0是第 𝑙 层 MLP 的可训练参数。之后,我们通过将图特征 𝑋𝑙 与消息 𝑋̂ 𝑙 相加来更新图特征 𝑋𝑙,即 𝑋̂𝑙 ← 𝑋𝑙 + 𝑋̂𝑙。然后,TAGConv 层处理信号 𝑋̂𝑙,生成新的编码图特征 𝑋𝑙+1



在 (𝐷−1∕2𝐴𝐷−1∕2) 中,图的邻接矩阵𝐴由对角度矩阵𝐷进行归一化。归一化的邻接矩阵通常用于图神经网络 (GNN) 中,以提供计算稳定性保证。然后,将第𝑙个 PowerFlowConv 层生成的编码图特征传递到下一层,直到𝑙 =𝐿。最后,在最后一层使用消息传递步骤,而丢弃 TAGConv 步骤,如图 1 所示。一般而言,GNN 适用于快速功率因数 (PF) 近似,因为它们具有函数逼近器的性质,这使得它们能够有效地捕捉电力系统中的复杂关系。此外,它们的单次突变等变性确保模型能够有效地处理输入数据,而不受总线顺序的影响,从而实现并行化,提高计算效率。与传统的迭代方法不同,该方法采用端到端机器学习范式,输入特征只需一步即可直接映射到输出特征,从而简化了流程,无需迭代收敛。

2.3 模型损失函数

选择合适的模型损失函数对于生成高质量的 PF 近似值至关重要。现有的机器学习方法通​​常使用纯物理的模型损失。然而,由于 PF 问题的非线性,仅使用物理模型损失是不够的。我们建议利用均方误差(MSE)来训练 PowerFlowNet,并开发 Masked L2 损失作为更好的评估指标。具体而言,MSE 定义为



其中𝒚𝑖表示特征的实际值,𝒙̂𝑖 表示节点𝑖的预测值。为了更精确地计算仅预测未知特征的实际误差值,我们开发了 Masked L2 损失函数。该损失函数类似于 MSE,但仅计算未知特征的误差



这里,o 是元素乘法运算符,而𝒎𝑖是节点 𝑖 的二进制掩码。

3.  实验

3.1  组件版本

hdk:24.1.rc3

cann:8.0.RC3

python:3.11.6

torch:2.1.0

torch_npu:2.1.0.post8

3.2  新建 conda 环境

conda create -n PowerFlowNet -c conda-forge python=3.11.6

(注:有时候在默认 channels 找不到 3.11.6 版本的 python,所以需要使用-c 参数手动指定在 conda-forge 中安装)




3.3  安装依赖包

3.3.1 安装 tensorboard、wandb、matplotlib、numpy、torchvision、torch-scatter、torch-geometric。

直接 pip install 安装即可



3.3.2 安装 torch&torch_npu

(1).安装 torch

pip install torch==2.1.0



(2).安装 torch_npu

a. 先下载 whl 离线包

wget https://gitee.com/ascend/pytorch/releases/download/v6.0.rc3-pytorch2.1.0/torch_npu-2.1.0.post8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl



b. pip install 安装

pip3 install torch_npu-2.1.0.post8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl



c. 查看是否安装成功



d. 验证 npu 是否可用

先 source cann

source /usr/local/Ascend/ascend-toolkit/set_env.sh

设置环境变量指定 npu 卡

export ASCEND_RT_VISIBLE_DEVICES=7

执行 python3 -c "import torch;import torch_npu; a = torch.randn(3, 4).npu(); print(a + a);"

报错



根据报错安装 decorator 和其它依赖



再次验证

成功输出



3.4  下载数据集

地址:https://surfdrive.surf.nl/files/index.php/s/Qw4RHLvI2RPBIBL

下载之后将 case118v2_edge_features.npy 和 case118v2_node_features.npy 放到 /PoweFlowNet/data/raw 目录下



3.5  执行训练

3.5.1       导包

在开始训练前,先在训练脚本中导入 torch_npu(这样才能使用 npu)

vi train_time_view.py



(注:from torch_npu.contrib import transfer_to_npu 会自动将源码中的 cuda api 更换至 torch_npu 的 api,不需要再额外手动处理)

3.5.2       训练

在命令行执行

python train_time_view.py --cfg_json ./configs/standard.json --num-epochs 5 --data-dir ./data --batch-size 128 --train_loss_fn mse_loss --lr 0.001 --case 118v2 --model MaskEmbdMultiMPN --save

进行训练




(注:源码中已经启用 DDP 的方式进行数据并行分布式训练,所以,如果想使用多卡训练,只需要设置环境变量 ASCEND_RT_VISIBLE_DEVICES 即可。例:使用前 4 卡,export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3)

输入 npu-smi info 查看显存占用



训练完成



4.   性能分析

后续如果想进行性能优化,需要用到此章节采集 profiling 性能数据,本章节将介绍两种 npu 采集 profiling 的方法。第一种是使用 torch_npu.frofile 接口的方式采集(推荐)。第二种是使用 msprof 工具进行采集。

4.1          torch_npu.profile 方式

参考 mstt: 针对训练&大模型场景,提供端到端命令行&可视化调试调优工具,帮助用户快速提高模型开发效率 - Gitee.com

vi train_time_view.py 进入训练脚本

在训练循环前添加

experimental_config = torch_npu.profiler._ExperimentalConfig(
    aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization,
    profiler_level=torch_npu.profiler.ProfilerLevel.Level1,
    l2_cache=False
)
prof = torch_npu.profiler.profile(
    activities=[
        torch_npu.profiler.ProfilerActivity.CPU,
        torch_npu.profiler.ProfilerActivity.NPU
    ],
    record_shapes=True,
    profile_memory=True,
    with_stack=True,
    experimental_config=experimental_config,
on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./profiling_data"))
在训练循环中,在合适位置添加
if epoch == 3: prof.start()
prof.step()if epoch == 3: prof.stop()
复制代码



(注:为了避免前两个 epoch 中初始化,预热阶段干扰数据,这里采集第三个 epoch 的性能数据)

保存退出,再次执行训练,即可在训练过程中采集。



输出



4.2          msprof 方式

msprof 的方式更为简单,但与 torch_npu.profile 的方式相比,缺点是不能采集单个 epoch 的数据,只能进行全量采集,具体操作如下。

参考:性能调优工具-CANN商用版8.0.RC3-昇腾社区 (hiascend.com)

直接在命令行输入 msprof + 数据保存路径 + 脚本启动命令

msprof --output=/data1 /output python train_time_view.py --cfg_json ./configs/standard.json --num-epochs 5 --data-dir ./data --batch-size 128 --train_loss_fn mse_loss --lr 0.001 --case 118v2 --model MaskEmbdMultiMPN --save



训练执行前会 Start profiling

训练结束之后会自动进行解析、导出



输出



4.3          性能对比

如果想要进行性能对比,来有针对性的调优,需要先跑出基准性能数据文件。使用 msprof-analyze 工具进行对比。

参考:profiler/msprof_analyze/compare_tools/README.md · Ascend/mstt - Gitee.com

4.3.1        安装 msprof-analyze 工具

可以直接使用 pip install msprof-analyze 的方式安装。Pypi 中有相应的源。

(注:如果安装不上,也可以使用 whl 包或源码的方式安装)

4.3.2        执行命令

msprof-analyze compare -d [比对性能数据文件所在路径] -bp [基准性能数据文件所在路径] --output_path=[比对结果文件存放路径]

msprof-analyze compare -d /data1 /PoweFlowNet/profiling_data/fd4588b266f4_28626_20250610092002401_ascend_pt/ASCEND_PROFILER_OUTPUT/ -bp /data1/PoweFlowNet/gpu_profiling/p-I_238661.1749580427151870472.pt.trace.json -o /data1 /PoweFlowNet/compare_profiling_new



5.   参考

Nan Lin, Stavros Orfanoudakis, Nathan Ordonez Cardenas, Juan S. Giraldo, Pedro P. Vergara,

PowerFlowNet: Power flow approximation using message passing Graph Neural Networks,

International Journal of Electrical Power & Energy Systems,

Volume 160,

2024,

110112,

ISSN 0142-0615,

https://doi.org/10.1016/j.ijepes.2024.110112.

(https://www.sciencedirect.com/science/article/pii/S0142061524003338)

用户头像

Splendid2025

关注

还未添加个人签名 2025-01-26 加入

AI4SCI

评论

发布
暂无评论
基于昇腾适配电力潮流计算模型PowerFlowNet_昇腾_Splendid2025_InfoQ写作社区