atlasleong/ppo-seals-cartpole-v0-npu
模型介绍
文件和版本
Pull Requests
讨论
分析

PPO 智能体在 seals/CartPole-v0 上进行昇腾 NPU 确定性推理

中文摘要:本项目将 Hugging Face 模型 HumanCompatibleAI/ppo-seals-CartPole-v0 (Stable-Baselines3 PPO,MlpPolicy)适配至华为昇腾 NPU,使用 torch_npu 在 物理 npu:0(Ascend910B4-1,CANN 8.5.1)上执行一次完全确定性的推理。策略前向 过程全部在 NPU 上运行,CPU 仅负责编排、反序列化与预处理;任何 NPU 初始化、设备放置 或执行失败都会以非零退出码结束。最终交付内容包括 inference.py、requirements.txt、 日志、结构化结果 JSON 与真实证据截图。

模型简介 / Model introduction

字段值
模型仓库HumanCompatibleAI/ppo-seals-CartPole-v0
固定源版本a86541dd3744275227cb16d07192967fc6b7775e
本地检查点工件ppo-seals-CartPole-v0.zip
检查点字节数139005
检查点 SHA2564e57a2618e1ab32ee4c5267874ae9f630896bc73991bd68392f5c78e4ecf738d
架构路径Stable-Baselines3 PPO(MlpPolicy / ActorCriticPolicy)
策略网络net_arch = {'pi': [64, 64], 'vf': [64, 64]},激活函数 ReLU
参数数量9155
library_namestable-baselines3
pipeline_tagreinforcement-learning

许可证。 上游模型卡片未声明许可证字段,仓库中亦未随附 LICENSE 文件。根据任务规则 "license without guessing",本次交付不会推测或附加许可证;仅记录 license: not-declared。若要在自身流水线条款之外重新分发本次迁移, 责任由您自行承担。

环境依赖 / Environment dependencies

组件版本
系统 / 架构openEuler / Linux aarch64 (glibc 2.38)
Python3.11.14
CANN8.5.1
npu-smi / 驱动25.5.1
硬件Ascend910B4-1(物理 npu:0)
torch2.9.0+cpu(镜像中已匹配 CANN 的 CPU wheel,未替换)
torch_npu2.9.0(镜像中已匹配 CANN,未替换)
stable-baselines32.7.0
gymnasium1.2.0
numpy1.26.4
cloudpickle3.1.2
pandas2.3.2
matplotlib3.10.5

重要。 torch 与 torch_npu 是容器内匹配 CANN 的配套版本,并已在系统范围内 安装。请勿使用普通 PyPI wheel 重新安装或替换它们。requirements.txt 有意仅列出非 torch 运行时依赖。

依赖项与阿里云专属安装步骤

# 1. Aliyun-only package mirror (already configured in this pipeline)
export PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/
export PIP_TRUSTED_HOST=mirrors.aliyun.com

# 2. Install only the non-torch runtime dependencies (torch/torch_npu are pre-installed)
pip install -r requirements.txt

requirements.txt 内容(固定为已验证的镜像版本):

stable-baselines3==2.7.0
gymnasium==1.2.0
numpy==1.26.4
cloudpickle==3.1.2
pandas==2.3.2
matplotlib==3.10.5

推理步骤 / 分步推理操作

  1. 确认 NPU 设备可见。

    npu-smi info          # 8x Ascend910B4-1;目标为物理设备 0
  2. (可选)固定可见设备。 inference.py 已在导入 torch/torch_npu 前设置 ASCEND_RT_VISIBLE_DEVICES=0,将逻辑 npu:0 映射到物理设备 0。你也可以自行设置:

    export ASCEND_RT_VISIBLE_DEVICES=0
  3. 运行确定性推理。

    cd /root/ascend-model-pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu
    python3 inference.py --hold-seconds 8

    该脚本:

    • 校验不可变检查点字节及 SHA256;
    • 断言 torch.npu.is_available(),设置 npu:0,记录设备名称/CANN/npu-smi;
    • 反序列化检查点(仅 CPU 编排),并将所有策略 参数放置到 npu:0(all_params_on_npu=True);
    • 写入带有当前 PID 的 logs/npu_ready.marker,随后保持(默认 8 秒), 并将 npu-smi info 捕获到 logs/npu_smi.log,以便外层封装将确切的 Python PID 与物理 NPU 进程表关联;
    • 在 npu:0 上执行确定性前向传播,并断言每个输入/输出设备均为 npu:0;任何设备放置不匹配或 NPU 错误都会以非零退出码失败;
    • 写入 logs/npu_inference.log 和 logs/npu_result.json。
  4. 查看结果。

    cat logs/npu_result.json
    sha256sum -c SHA256SUMS

完整测试用例与实际输出

测试输入:确定性观测 [0.0, 0.0, 0.0, 0.0](CartPole 状态)。

命令:

cd /root/ascend-model-pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu \
  && python3 inference.py --hold-seconds 8

退出码:0 · PID: 3171595

实际输出(来自 logs/npu_inference.log):

[inference] python            : 3.11.14
[inference] platform          : Linux-5.10.0-325.0.0.226.oe2203sp4.aarch64-aarch64-with-glibc2.38
[inference] pid               : 3171595
[inference] cwd               : /work/pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu
[inference] checkpoint        : /work/pipeline/models/rl26/ppo-seals-cartpole-v0/ppo-seals-CartPole-v0.zip
[verify]  bytes=139005 sha256=4e57a2618e1ab32ee4c5267874ae9f630896bc73991bd68392f5c78e4ecf738d
[verify]  size_ok=True sha256_ok=True
[npu]     torch=2.9.0+cpu torch_npu=2.9.0
[npu]     is_available=True device=npu:0 name=Ascend910B4-1
[npu]     device_count=1 CANN=8.5.1 npu-smi=25.5.1
[load]    PPO.load elapsed=0.0668s device=npu:0
[model]   policy_class=ActorCriticPolicy num_params=9155
[model]   param_devices=['npu:0'] all_params_on_npu=True
[ready]   NPU_READY_PID=3171595 DEVICE=npu:0 MARKER=/work/pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu/logs/npu_ready.marker
[ready]   holding 8.0s for external npu-smi correlation ...
[ready]   npu_smi captured=True pid_found=True log=/work/pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu/logs/npu_smi.log
[ready]   npu_smi pid_line=| 0       0                 | 3171595       | python3                  | 116                     |
[forward] elapsed=0.2385s (npu-synchronized)
[forward] obs=[[0.0, 0.0, 0.0, 0.0]] shape=(1, 4) dtype=torch.float32 device=npu:0
[forward] action=[0] shape=(1,) dtype=torch.int64 device=npu:0
[forward] value=[[196.2478790283203]] shape=(1, 1) dtype=torch.float32 device=npu:0
[forward] log_prob=[-0.30756598711013794] shape=(1,) dtype=torch.float32 device=npu:0
[forward] probs=[[0.7352343797683716, 0.26476559042930603]] logits=[[-0.30756598711013794, -1.3289103507995605]] entropy=[0.5779828429222107]
[forward] all_outputs_on_npu=True
[final]   exit_code=0 result_json=/work/pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu/logs/npu_result.json

logs/npu_result.json 中的关键字段:

engine          : torch_npu
exit_code       : 0
npu_available   : True
npu_device_name : Ascend910B4-1
source_revision : a86541dd3744275227cb16d07192967fc6b7775e
input_device    : npu:0
model_device    : npu:0
output_device   : npu:0
action          : [0]        (int64, shape [1])
value           : [[196.2478790283203]]  (float32, shape [1, 1])
log_prob        : [-0.30756598711013794] (float32, shape [1])
probs           : [[0.7352343797683716, 0.26476559042930603]]
logits          : [[-0.30756598711013794, -1.3289103507995605]]
entropy         : [0.5779828429222107]

耗时:load_s=0.066821、forward_s=0.238490(NPU 同步)、total_s=10.142876 (包含用于 npu-smi 关联的 8 秒保持期)。

证据截图

截图仅根据真实最终会话记录/日志/结果渲染 (modelagent_turn1.txt、logs/npu_inference.log、logs/npu_result.json、 logs/npu_smi.log);未虚构任何数值。

截图描述
assets/agent_workflow.pngModelAgent 工作流步骤(真实会话记录)
assets/npu_device_call.pngNPU 设备调用 + 实时 npu-smi PID 关联
assets/model_result.png最终 logs/npu_result.json + 确定性前向输出
assets/modelagent_live_session.png实时 ModelAgent 会话(npu-smi 关联块)

链接:

  • assets/agent_workflow.png
  • assets/npu_device_call.png
  • assets/model_result.png
  • assets/modelagent_live_session.png

交付文件集

inference.py
README.md
readme.md
requirements.txt
SHA256SUMS
logs/npu_inference.log
logs/npu_result.json
logs/npu_smi.log
logs/npu_ready.marker
assets/agent_workflow.png
assets/npu_device_call.png
assets/model_result.png
assets/modelagent_live_session.png

局限性

  • 上游模型卡片未声明许可证;本次交付记录为 license: not-declared,不做猜测。
  • 该检查点使用 Python 3.8 时期经 cloudpickle 序列化的调度对象(learning_rate、clip_range、lr_schedule)训练。在 Python 3.11 中,这些闭包无法反序列化,因此基于上游 config.yml 中记录的超参数,通过 SB3 custom_objects 提供。这些并非权重,也不参与策略前向传播;加载的策略张量即为完整且不可变的检查点(已通过 SHA256 校验)。
  • 本次交付仅在固定观测上运行单次确定性策略前向传播;它不会启动 Gym/Unity/机器人硬件,也不是训练或评估框架。
  • 策略前向传播完全在 npu:0 上执行;CPU 仅用于编排、反序列化和预处理,无 CPU 卸载/回退。
  • torch / torch_npu 必须保持为容器中与 CANN 匹配的版本配对;安装任意 PyPI wheel 包会破坏 NPU 运行时。