ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ppo-Huggy-NPU 核心代码拆解:59 维观测到 21 维电机控制的完整计算图

ppo-Huggy-NPU 核心代码拆解:59 维观测到 21 维电机控制的完整计算图 ppo-Huggy-NPU 核心代码拆解59 维观测到 21 维电机控制的完整计算图【免费下载链接】ppo-Huggy-NPU项目地址: https://ai.gitcode.com/z_studio/ppo-Huggy-NPUppo-Huggy-NPU 是一个将 Hugging Face Deep RL 课程经典示例「拥抱机器人 Huggy」完整适配到昇腾 910B NPU 的开源项目核心代码全部浓缩在inference.py一个文件里。本文带你对它做一次通俗易懂的核心代码拆解59 维观测如何经过归一化与三层 512 宽 MLP最终输出 21 维电机控制信号。Huggy 是谁先认识这只拥抱小狗 Huggy the Dog拥抱机器人是 Hugging Face Deep RL 课程单元一的经典入门示例一只用物理引擎模拟的小狗被训练去「扑向并拥抱」投出的棍子fetch hug。它由Unity ML-Agents使用PPO近端策略优化算法训练 200 万步权重发布在 Hugging Face Hub仓库名 PaulVialard/ppo-Huggy。它不是Transformer / LLM / VLM而是一个轻量级 MLP 策略网络项目数值观测维度59连续向量观测动作维度21电机控制信号隐藏层3 × 512hidden_units512, num_layers3激活函数SiLU参数量566,805fp32 权重约 2.3 MB训练框架Unity ML-Agents PPO2,000,000 步计算图全景从 59 维观测到 21 维电机控制的完整流水线整条计算图与官方Huggy.onnx逐算子一致一共四步归一化 → 编码 → 映射 → 缩放obs(59) │ ① 观测归一化: clamp((obs − running_mean) / sqrt(running_variance / steps), −5, 5) ▼ ② 三层编码器: Linear(59→512) → SiLU → Linear(512→512) → SiLU → Linear(512→512) → SiLU ▼ ③ 动作头: mu Linear(512→21)log_sigma(21) 为可学习标准差 ▼ ④ 动作输出: 确定性动作 clip(mu, −3, 3) / 3 → 落在 [−1, 1] 随机动作 clip(mu z·exp(log_sigma), −3, 3) / 3, z ~ N(0, I)下面逐段拆解每一步的实现细节。观测归一化详解为什么必须保留 float32第①步。Huggy 环境给出的 59 维连续观测里位置、速度、关节角等各维度量纲差异很大直接喂进网络会让训练与推理不稳定。所以 ML-Agents 在训练时维护了一套「运行统计量」running_mean、running_variance与normalization_steps本模型为 2,000,050推理时用它做标准化clamp((obs − running_mean) / sqrt(running_variance / normalization_steps), −5, 5)对应代码在inference.py的normalize_obs方法约第 137 行。⚠️这里藏着全项目最大的一个坑running_variance是累计和数值可达 1e5normalization_steps达到 2e6如果像普通模型那样整体转成 float16统计量会溢出为 inf归一化直接变成 NaN。因此脚本专门把归一化缓冲统计量强制保留 float32这也是新手最容易踩的精度陷阱之一。三层 512 宽 MLP策略网络的主体编码器第②步。归一化后的 59 维向量送入主体编码器3 层 512 宽的线性层每层后接SiLU激活即 x·sigmoid(x)与 ONNX 导出一致没有残差连接。对应inference.py的encode方法。参数量可以手工验证一遍帮助你理解网络规模第 1 层59×512 512 ≈ 3.0 万第 2、3 层512×512 512 ≈ 26.3 万 × 2动作头512×21 21 ≈ 1.1 万合计566,805✅动作头拆解确定性动作与随机动作的区别第③④步。编码器输出的 512 维特征向量经动作头mu Linear(512→21)得到 21 维动作均值同时模型保存了一份可学习标准差log_sigma(21)。21 个维度对应 Huggy 的 21 路电机控制信号Unity ML-Agents 连续动作空间。确定性动作部署 / 测试用clip(mu, −3, 3) / 3输出落在 [−1, 1]无随机成分同输入必同输出随机动作训练 / 探索用在 mu 上叠加高斯噪声z·exp(log_sigma)再 clip 缩放。本模型收敛后 log_sigma≈0即 σ≈1噪声强度接近标准正态。核心逻辑只有几行inference.py的deterministic_action方法def deterministic_action(self, obs): return torch.clamp(self.mu_of(obs), -3.0, 3.0) / 3.0权重加载ML-Agents 检查点如何还原成 PyTorch 网络load_from_ckptinference.py第 176 行起负责把 Unity ML-Agents 的.pt检查点「翻译」成标准 PyTorch 网络network_body._body_endoder.seq_layers.{0,2,4}.weight/bias→ 3 层编码器action_model._continuous_distribution.mu.weight/bias→ 动作头 muobservation_encoder...normalizer.{running_mean, running_variance, normalization_steps}→ 归一化缓冲action_model...log_sigma→ 可学习标准差模型目录下共有201 个检查点脚本默认加载最终 2M 步的Huggy-2000049.pt与官方Huggy.onnx权重逐位一致。为了验证还原正确脚本用 onnxruntime 跑官方 ONNX 与 torch 重建网络做交叉验证最大绝对误差 6.6e-7float32 舍入级别余弦相似度 1.0重建网络还可再导出为assets/huggy_rebuilt.onnx与官方导出逐位一致。昇腾 NPU 推理部署为什么选 torch_npu有人会问为什么不用 vllm-ascend / sglang因为这两个框架面向 LLM/VLM 的token 生成模型注册表里只有文本/视觉生成架构根本加载不了强化学习策略网络。Huggy 是 PyTorch 原生的 MLP 策略用昇腾官方后端torch_npu直接 forward 即可这也是requirements.txt里只依赖 torch / torch-npu / numpy 的原因。验证环境完整清单见README.md组件版本操作系统Linux 5.10.0aarch64NPU 芯片Ascend 910B单卡 HBM 64 GBCANN8.5.1torch / torch-npu2.9.0cpu / 2.9.0.post1Python3.11.14inference.py内置11 种运行模式info / action / sample / batch / precision / onnx-compare / fingerprint / stats / benchmark / export-onnx一条命令即可验证python inference.py --mode info python inference.py --mode action --obs random --seed 0 python inference.py --mode benchmark --runs 200项目自带的 50 组测试用例可用run_tests.sh一键重跑49 组全部通过唯一未达标的是 bf16 精度非推荐精度。实测精度与性能1e-6 误差与 0.37ms 延迟精度对照NPU vs CPU fp32 参考100 个 59 维样本精度余弦相似度最大绝对误差结论float321.000000001.13e-6✅ 生产推荐float161.000000001.11e-3✅ 可接受bfloat160.999994581.07e-2❌ 不推荐性能单卡 910Bfloat32预热后指标数值单步平均延迟0.37 msp95 0.395 / p99 0.400权重加载耗时≈ 0.03 s峰值显存 100 MBfloat32 下 NPU 与 CPU 参考最大绝对误差仅 1.1e-6说明昇腾 NPU 上的数值计算完全正确。新手避坑指南3 个最易踩的坑fp16 转精度导致 NaN归一化统计量累计方差、步数数值极大必须保持 float32否则溢出成 inf → 归一化 NaNNPU 没有随机数生成器sample模式在 CPU 按 seed 生成高斯噪声再搬运到设备保证同 seed 可复现实测两次采样逐位一致首次前向特别慢约 140 ms 的耗时包含进程冷启动 算子编译 / 图捕获预热后稳态只有 0.37 msbenchmark模式已内置预热。总结与快速上手一句话总结ppo-Huggy-NPU 用不到 600 行代码把 Unity ML-Agents PPO 策略网络的完整计算图59 维观测归一化 → 3×512 MLP → 21 维电机控制在昇腾 910B 上跑到了 0.37ms 单步延迟与 1e-6 级精度并完成了与官方 ONNX 的逐位交叉验证——无论你是 RL 新手还是 NPU 适配工程师这份代码拆解都值得收藏。如果你想亲手跑一遍git clone https://gitcode.com/z_studio/ppo-Huggy-NPU克隆后按README.md创建 venv、安装依赖requirements.txt先npu-smi info确认设备再运行inference.py --mode info即可看到模型加载与首次推理输出。快去让你的小狗在昇腾 NPU 上「拥抱」起来吧【免费下载链接】ppo-Huggy-NPU项目地址: https://ai.gitcode.com/z_studio/ppo-Huggy-NPU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表