本文档用于说明 case4_pv_battery_load_pcc_rl_deploy 目录。该案例把已训练的 SAC 策略部署到四节点 PV—电池—负载—PCC 硬件拓扑上,回放一天的光伏、负载和电价数据,由策略每 5 个仿真分钟决定一次电池充放电功率。
目录中的主要文件为:
| 文件 | 作用 |
|---|---|
case4_rl_arbitrage.py |
Algorithm Load 中运行的硬件部署脚本。 |
episodes.csv |
PV、负载和电价回放数据。 |
sac_actor.pt |
部署用 PyTorch SAC actor 权重。 |
evaluate_model.py |
独立运行的模型体积、时延、CPU 和内存基准工具。 |
本目录提供的是“模型推理部署与评估”,不包含强化学习训练流程。
PCC 作为电压模式的平衡节点,只下发电压,不下发功率命令。脚本计算 PCC 剩余功率用于经济性和日志分析:
内部计算约定:
CAN 下发时:
node1.p = -pv_w;node3.p = +load_w;node2.p = -p_bat_w。所有单节点功率命令都通过 PowerClamp 后再发送。
CSV 至少需要以下字段:
| 标准字段 | 兼容字段 |
|---|---|
episode |
无替代字段 |
pv_w |
pv、pv_power_w |
load_w |
load、load_power_w |
price_aud_per_kwh |
price、price_kwh |
随案例提供的数据当前包含 episode 0~6,每个 episode 288 个点,对应一天内每 5 分钟一个点。默认回放 episode 5;若请求的 episode 不存在,脚本会记录警告并使用可用编号中的第一个。
默认配置:
SPEEDUP=24;5 × 60 / 24 = 12.5 秒。因此一个完整 24 小时 episode 约用 1 小时真实时间完成。经济性与 SOC 更新仍按每步 5 个仿真分钟计算,不按 12.5 秒真实等待计算。
POLICY_MODE 支持三种模式:
| 模式 | 行为 |
|---|---|
rl |
加载 sac_actor.pt,根据 12 维观测输出 [-1, 1] 动作。 |
zero |
电池始终请求 0W,用作无储能基线。 |
rule_price |
低电价充电、高电价放电、中间区间保持 0W。 |
未知模式会回退到 rule_price。当 rl 模式缺少 PyTorch、模型文件不存在或模型格式不匹配时,也会记录警告并回退到 rule_price,不会因为 RL 模型加载失败直接下发未知动作。
规则策略默认使用当前 episode 电价的 30% 和 70% 分位数作为低、高阈值:
-1,请求最大充电;+1,请求最大放电;0。RL actor 的输入依次为:
合计 1 + 1 + 1 + 6 + 2 + 1 = 12 维。部署脚本中电池参数、预测步数、归一化方式和网络结构必须与训练环境一致,否则即使模型能加载,策略含义也会发生偏移。
策略动作被限制到 [-1, 1],再乘以最大功率 20W:
随后根据当前 SOC、容量、充放电效率和 5 分钟步长再次裁剪,确保软件模型中的下一步能量保持在 20%~100% 范围内。
| 参数 | 默认值 |
|---|---|
| 容量 | 40Wh |
| 最大充/放功率 | 20W |
| 初始 SOC | 50% |
| 最低 SOC | 20% |
| 最高 SOC | 100% |
| 充电效率 | 0.95 |
| 放电效率 | 0.95 |
这些参数用于部署策略的内部状态和功率可行域,必须与真实硬件能力及训练配置共同核对。软件 SOC 不是 BMS 实测 SOC。
该案例没有分批归零或软启动,安全延时结束后会在第一个控制步直接发送当步 PV、Load 和 Battery 命令。
脚本使用 VIRTUAL_SCALE=20,把实验台功率映射为更大规模系统的虚拟功率。每步现金流为:
单位为 AUD。按脚本约定,P_PCC < 0 表示售电并产生正现金流,P_PCC > 0 表示购电并产生负现金流。该结果是基于数据价格和虚拟倍率的案例指标,不是实际结算账单。
| 参数名 | 默认值 | 作用 |
|---|---|---|
EPISODE |
5 |
回放的数据集编号。 |
POLICY_MODE |
rl |
rl、zero 或 rule_price。 |
DATA_CSV |
episodes.csv |
回放数据文件。 |
MODEL_PATH |
sac_actor.pt |
RL actor 权重。 |
SPEEDUP |
24 |
仿真时间加速倍数,必须大于 0。 |
STEP_MINUTES |
5 |
每个策略步对应的仿真分钟数。 |
STEPS_PER_DAY |
288 |
日内时间编码使用的每天步数。 |
PCC_VOLTAGE_V |
20.0 |
PCC CV 电压。 |
FORECAST_HORIZON |
6 |
观测中的未来价格步数。 |
PRICE_CLIP |
1.0 |
电价归一化裁剪范围。 |
RULE_LOW_QUANTILE |
0.3 |
规则充电阈值分位数。 |
RULE_HIGH_QUANTILE |
0.7 |
规则放电阈值分位数。 |
VIRTUAL_SCALE |
20.0 |
经济指标的虚拟功率倍率。 |
START_DELAY_S |
5.0 |
首次下发前安全延时。 |
STATS_INTERVAL_S |
1.0 |
运行遥测记录间隔。 |
脚本在案例目录下创建:
runtime_records/rl_arbitrage_runtime_record_YYYYMMDD_HHMMSS.csv
记录字段为:
| 字段 | 含义 |
|---|---|
time_ms |
运行时 API 时间戳(毫秒)。 |
node1_p_w~node4_p_w |
四节点最新 p1 遥测;不可用时为 NaN。 |
soc_pct |
软件估算 SOC。 |
price_aud_per_kwh |
当前电价。 |
cashflow_aud |
最近策略步现金流。 |
cumul_cashflow_aud |
累计现金流。 |
伪异步循环会在策略步之间继续运行,最多约每秒记录一次硬件遥测。记录文件逐行 flush,停止时在 finally 中关闭,并输出实际行数。
策略日志还包含 PV、Load、净负载、电池功率、PCC 剩余功率、动作、SOC 和累计现金流。
evaluate_model.py 不发送硬件命令,可在命令行独立评估模型。推荐在项目环境中执行:
uv run python src\algorithm_load\scriptcase\case4_pv_battery_load_pcc_rl_deploy\evaluate_model.py --device cpu
常用参数:
| 参数 | 默认值 | 作用 |
|---|---|---|
--model |
同目录 sac_actor.pt |
模型路径。 |
--device |
auto |
auto、cpu 或 cuda。 |
--warmup |
200 |
预热次数。 |
--runs |
2000 |
计时推理次数。 |
--batch-size |
1 |
推理批大小。 |
--obs-dim |
自动推断 | 手动覆盖输入维度。 |
--num-threads |
0 |
Torch CPU 线程数;0 保持当前配置。 |
--json-out |
无 | 可选 JSON 报告路径。 |
工具会报告模型文件大小、参数数量、权重体积、加载时间、吞吐量、平均/中位/p95/p99 时延、进程 CPU、RSS,以及使用 CUDA 时的显存指标。
当前评估脚本直接导入 Python resource 模块,并从 /proc 读取部分内存数据,因此主要面向 Jetson/Linux 等类 Unix 环境;在原生 Windows Python 中可能因缺少 resource 而无法启动。
episodes.csv、sac_actor.pt 与部署脚本位于同一案例目录。evaluate_model.py,确认模型可加载且目标设备推理时延充足。case4_rl_arbitrage.py。zero,再使用 rule_price,最后启用 rl。runtime_records CSV 和最终 SOC、累计现金流。policy= 是否为预期模式。raw_action 应位于 [-1, 1],实际电池功率还会受 SOC 边界裁剪。bat 可能小于动作请求,这是正常可行域限制。rl、zero、rule_price 在同一 episode 下的最终现金流和 SOC,才能公平评价策略。正常完成或从运行循环正常停止后,脚本会:
需要注意:
PowerClamp 可能裁剪 PV、Load 或 Battery 命令,使计划功率与实际发送值不同;本平台仅提供脚本运行接口、样例、模型部署与评估说明。用户基于本平台进行的模型选择、数据准备、参数配置、控制策略、经济性计算与硬件运行,均由用户自行验证并承担风险。对于因模型泛化失效、训练/部署配置不一致、设备能力不足、数据错误、保护配置不当或环境变化引发的直接或间接问题,本平台不承担责任。