中文摘要:本项目将 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 与真实证据截图。
| 字段 | 值 |
|---|---|
| 模型仓库 | HumanCompatibleAI/ppo-seals-CartPole-v0 |
| 固定源版本 | a86541dd3744275227cb16d07192967fc6b7775e |
| 本地检查点工件 | ppo-seals-CartPole-v0.zip |
| 检查点字节数 | 139005 |
| 检查点 SHA256 | 4e57a2618e1ab32ee4c5267874ae9f630896bc73991bd68392f5c78e4ecf738d |
| 架构路径 | Stable-Baselines3 PPO(MlpPolicy / ActorCriticPolicy) |
| 策略网络 | net_arch = {'pi': [64, 64], 'vf': [64, 64]},激活函数 ReLU |
| 参数数量 | 9155 |
library_name | stable-baselines3 |
pipeline_tag | reinforcement-learning |
许可证。 上游模型卡片未声明许可证字段,仓库中亦未随附
LICENSE 文件。根据任务规则 "license without
guessing",本次交付不会推测或附加许可证;仅记录
license: not-declared。若要在自身流水线条款之外重新分发本次迁移,
责任由您自行承担。
| 组件 | 版本 |
|---|---|
| 系统 / 架构 | openEuler / Linux aarch64 (glibc 2.38) |
| Python | 3.11.14 |
| CANN | 8.5.1 |
npu-smi / 驱动 | 25.5.1 |
| 硬件 | Ascend910B4-1(物理 npu:0) |
torch | 2.9.0+cpu(镜像中已匹配 CANN 的 CPU wheel,未替换) |
torch_npu | 2.9.0(镜像中已匹配 CANN,未替换) |
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 |
重要。
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.txtrequirements.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确认 NPU 设备可见。
npu-smi info # 8x Ascend910B4-1;目标为物理设备 0(可选)固定可见设备。 inference.py 已在导入 torch/torch_npu 前设置
ASCEND_RT_VISIBLE_DEVICES=0,将逻辑 npu:0 映射到物理设备 0。你也可以自行设置:
export ASCEND_RT_VISIBLE_DEVICES=0运行确定性推理。
cd /root/ascend-model-pipeline/jobs/rl26/ppo-seals-cartpole-v0/ppo-seals-cartpole-v0-npu
python3 inference.py --hold-seconds 8该脚本:
torch.npu.is_available(),设置 npu:0,记录设备名称/CANN/npu-smi;npu:0(all_params_on_npu=True);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。查看结果。
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.jsonlogs/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.png | ModelAgent 工作流步骤(真实会话记录) |
assets/npu_device_call.png | NPU 设备调用 + 实时 npu-smi PID 关联 |
assets/model_result.png | 最终 logs/npu_result.json + 确定性前向输出 |
assets/modelagent_live_session.png | 实时 ModelAgent 会话(npu-smi 关联块) |
链接:
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.pnglicense: not-declared,不做猜测。learning_rate、clip_range、lr_schedule)训练。在 Python 3.11 中,这些闭包无法反序列化,因此基于上游 config.yml 中记录的超参数,通过 SB3 custom_objects 提供。这些并非权重,也不参与策略前向传播;加载的策略张量即为完整且不可变的检查点(已通过 SHA256 校验)。npu:0 上执行;CPU 仅用于编排、反序列化和预处理,无 CPU 卸载/回退。torch / torch_npu 必须保持为容器中与 CANN 匹配的版本配对;安装任意 PyPI wheel 包会破坏 NPU 运行时。