基于昇腾适配电力潮流计算模型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

[if !supportLists]3.2 [endif] 新建conda环境

conda create -n PowerFlowNet -c conda-forgepython=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 installtorch_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;importtorch_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 pythontrain_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 OrdonezCardenas, Juan S. Giraldo, Pedro P. Vergara,

PowerFlowNet: Power flow approximation usingmessage 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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容