news 2026/9/20 21:51:26

ML-Agents 环境可执行文件构建与训练指南:从 Unity 场景打包到 Headless 服务器部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ML-Agents 环境可执行文件构建与训练指南:从 Unity 场景打包到 Headless 服务器部署
  • 人工智能
  • 强化学习
  • 深度学习
  • 机器学习
  • 游戏开发
  • AI 应用

【免费下载链接】ml-agents

The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.

项目地址:https://gitcode.com/gh_mirrors/ml/ml-agents
点击查看免费下载

本文基于 Unity ML-Agents Toolkit 官方文档 Learning-Environment-Executable.md,系统讲解如何将 Unity 训练场景(以 3DBall 平衡球环境为例)构建为独立可执行文件,并通过 Python API 与mlagents-learn命令行工具与之交互、训练,最终把训练产物(ONNX 模型)嵌回场景中,以及如何在无图形界面的 Headless 服务器上加速训练。读完本文,你将掌握"场景配置 → 打包可执行文件 → Python 连接 → 命令行训练 → 模型回嵌"的完整实战链路,并理解其底层通信与进程启动机制。

为什么要使用可执行文件而不是 Unity 编辑器

ML-Agents 既支持在 Unity 编辑器内点击 Play 直接训练,也支持将场景构建为独立可执行文件(Executable)后再进行训练。相比编辑器模式,使用可执行文件有以下优势:

  • 便于分发:你可以把可执行文件直接交给他人使用,而无需共享整个 Unity 工程仓库;
  • 便于远端部署:可以把可执行文件放到远程机器上运行,借助更强的 CPU/GPU 资源加速训练;
  • 支持无图形模式:只要环境不依赖渲染(不使用视觉观测),就可以使用Server BuildHeadless)模式获得更快的训练速度;
  • 解放编辑器:训练在独立进程中运行时,你可以继续用 Unity 编辑器做其他事情。

第一步:构建 3DBall 可执行环境

本文以 3DBall(3D Balance Ball)示例环境为例,展示完整的构建流程。仓库中该示例位于 Project/Assets/ML-Agents/Examples/3DBall,包含场景、Prefab、Agent 脚本与预训练模型等完整资源。

打开 3DBall 场景

  1. 启动 Unity;
  2. 在 Projects 对话框顶部选择Open
  3. 在文件对话框中定位到 ML-Agents 工程下的Project文件夹并点击Open
  4. Project窗口中进入Assets/ML-Agents/Examples/3DBall/Scenes/目录;
  5. 双击3DBall文件加载包含平衡球环境的场景。

仓库中该目录还包含3DBallHardVisual3DBall两个变体场景:前者是更难的物理版本,后者使用视觉观测(Camera)而非向量观测。本文聚焦于基础向量观测版本的3DBall

配置场景以适配训练启动

训练进程启动可执行文件时,程序必须能静默、自动地进入正确场景,因此需要满足三个条件:应用在后台运行、没有需要人工交互的对话框、正确场景自动加载。

  1. 打开 Player Settings(菜单:Edit>Project Settings>Player);
  2. Resolution and Presentation下:
    • 确保Run in Background为勾选状态;
    • 确保Display Resolution Dialog设置为 Disabled(注:较新版本的编辑器可能没有该选项);
  3. 打开 Build Settings 窗口(菜单:File>Build Settings);
  4. 选择目标平台;
    • (可选)勾选 "Development Build" 以输出 调试日志;
  5. 如果Scenes in Build列表中已有场景,确保只有 3DBall 场景被勾选(若列表为空,则只有当前场景会被打进构建);
  6. 点击Build
    • 在文件对话框中定位到 ML-Agents 目录;
    • 指定文件名并点击Save
    • (Windows 平台)使用 Unity 2018.1 时,构建会要求选择文件夹而非文件名。请在根目录下创建一个子文件夹并选择它,后续步骤中将该子文件夹名称为env_name。注意不能把构建产物放到Assets文件夹内。

完成以上步骤后,你就得到了一个包含模拟环境的 Unity 可执行文件,接下来可以与之交互了。

第二步:用 Python API 与可执行环境交互

如果你希望用 Python API(Low-Level API)与可执行文件交互,只需要把可执行文件的名称传给UnityEnvironmentfile_name参数:

from mlagents_envs.environment import UnityEnvironment env = UnityEnvironment(file_name=<env_name>)

其中<env_name>不带扩展名的可执行文件名称(或路径)。

底层原理:可执行文件是如何被启动的

从源码层面看,UnityEnvironment.__init__会在file_name非空时调用env_utils.launch_executable启动子进程(见 ml-agents-envs/mlagents_envs/environment.py):

if file_name is not None: try: self._process = env_utils.launch_executable( file_name, self._executable_args() ) except UnityEnvironmentException: self._close(0) raise

其中_executable_args()会拼接 Unity 可执行文件的命令行参数(environment.py):

  • 若开启无图形模式,追加-nographics -batchmode
  • 追加--mlagents-port <port>指定通信端口(对应源码中的_PORT_COMMAND_LINE_ARG);
  • 若指定log_folder且未显式传-logfile,则追加-logFile <path>/Player-<worker_id>.log

env_utils.launch_executable(见 ml-agents-envs/mlagents_envs/env_utils.py)内部会先调用validate_environment_path做路径归一化:它会剥离.app.exe.x86_64.x86等扩展名,再按平台查找真正的可执行文件(macOS 在.app/Contents/MacOS/下查找,Windows 在.exe中查找,Linux 查找.x86_64/.x86),这也是为什么file_name可以不带扩展名。启动时还使用了start_new_session=True,使 SIGINT 等信号不会直接传到环境子进程,给环境留出正常关闭的机会。

连接建立后,UnityEnvironment还会通过_check_communication_compatibility校验 Unity 侧与 Python 侧的通信协议版本(API_VERSION = "1.5.0",见 environment.py),主版本不一致时会抛出版本不兼容异常。

常用构造参数

UnityEnvironment的完整构造参数(environment.py)包括:

参数默认值说明
file_nameNoneUnity 可执行文件名称;为None时连接编辑器(端口 5004)
worker_id0端口偏移量,端口 =base_port + worker_id,用于并行启动多个环境
base_port5005(有可执行文件)/ 5004(编辑器)通信基准端口
seed0随机种子,随初始化消息发送给 Unity
no_graphicsFalse以无图形模式运行模拟器
timeout_wait60等待环境连接的秒数
additional_args[]附加的 Unity 命令行参数
side_channelsNone用于非 RL 通信的 Side Channel 列表
log_folderNoneUnity Player 日志输出目录(需绝对路径)
num_areas1每个 Unity 实例中的并行训练区域数量

第三步:用 mlagents-learn 命令行训练

  1. 打开命令行(或终端)窗口;
  2. 进入 ML-Agents Toolkit 的安装目录。如果按默认方式 安装,则进入ml-agents/文件夹;
  3. 运行:
mlagents-learn <trainer-config-file> --env=<env_name> --run-id=<run-identifier>

其中:

  • <trainer-config-file>:训练器配置文件(YAML)的路径;
  • <env_name>:从 Unity 导出的可执行文件的名称和路径(不带扩展名);
  • <run-identifier>:用于区分不同训练运行结果的字符串标识。

例如,将 3DBall 可执行文件保存到 ML-Agents Toolkit 安装目录后,运行:

mlagents-learn config/ppo/3DBall.yaml --env=3DBall --run-id=firstRun

启动后终端会先打印 ML-Agents 的 ASCII Logo 横幅。注意:如果使用 Anaconda,请先激活 ml-agents 环境(如conda activate ml-agents)。

训练器配置文件解析

命令中的<trainer-config-file>指向训练器配置 YAML。仓库中的 config/ppo/3DBall.yaml 是 3DBall 的 PPO 训练配置:

behaviors: 3DBall: trainer_type: ppo hyperparameters: batch_size: 64 buffer_size: 12000 learning_rate: 0.0003 beta: 0.001 epsilon: 0.2 lambd: 0.99 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: true hidden_units: 128 num_layers: 2 vis_encode_type: simple reward_signals: extrinsic: gamma: 0.99 strength: 1.0 keep_checkpoints: 5 max_steps: 500000 time_horizon: 1000 summary_freq: 12000

关键参数含义:

  • trainer_type: ppo:使用 PPO(近端策略优化)算法;
  • batch_size/buffer_size:每次更新的样本批大小与经验缓冲区容量;
  • learning_rate/learning_rate_schedule:学习率及其衰减策略(linear线性衰减);
  • beta/epsilon/lambd/num_epoch:PPO 的熵正则系数、裁剪范围、GAE 系数与每批更新轮数;
  • network_settings:网络结构(隐藏单元数hidden_units、层数num_layers、观测归一化normalize);
  • reward_signals.extrinsic.gamma:折扣因子,strength为外在奖励信号强度;
  • max_steps:训练总步数上限(当前配置为 500000);
  • time_horizon:累积经验的时间视界;
  • summary_freq:输出训练统计的频率;
  • keep_checkpoints:保留的检查点数量。

更完整的配置项说明可参阅 Training-Configuration-File.md。

理解训练启动日志

如果mlagents-learn正常运行并开始训练,你会看到类似如下的输出:

CrashReporter: initialized Mono path[0] = '/Users/dericp/workspace/ml-agents/3DBall.app/Contents/Resources/Data/Managed' Mono config path = '/Users/dericp/workspace/ml-agents/3DBall.app/Contents/MonoBleedingEdge/etc' INFO:mlagents_envs: 'Ball3DAcademy' started successfully! Unity Academy name: Ball3DAcademy INFO:mlagents_envs:Connected new brain: Unity brain name: Ball3DLearning Number of Visual Observations (per agent): 0 Vector Observation space size (per agent): 8 Number of stacked Vector Observation: 1 INFO:mlagents_envs:Hyperparameters for the PPO Trainer of brain Ball3DLearning: batch_size: 64 beta: 0.001 buffer_size: 12000 epsilon: 0.2 gamma: 0.995 hidden_units: 128 lambd: 0.99 learning_rate: 0.0003 max_steps: 5.0e4 normalize: True num_epoch: 3 num_layers: 2 time_horizon: 1000 sequence_length: 64 summary_freq: 1000 use_recurrent: False memory_size: 256 use_curiosity: False curiosity_strength: 0.01 curiosity_enc_size: 128 output_path: ./results/first-run-0/Ball3DLearning INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 1000. Mean Reward: 1.242. Std of Reward: 0.746. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 2000. Mean Reward: 1.319. Std of Reward: 0.693. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 3000. Mean Reward: 1.804. Std of Reward: 1.056. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 4000. Mean Reward: 2.151. Std of Reward: 1.432. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 5000. Mean Reward: 3.175. Std of Reward: 2.250. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 6000. Mean Reward: 4.898. Std of Reward: 4.019. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 7000. Mean Reward: 6.716. Std of Reward: 5.125. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 8000. Mean Reward: 12.124. Std of Reward: 11.929. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 9000. Mean Reward: 18.151. Std of Reward: 16.871. Training. INFO:mlagents.trainers: first-run-0: Ball3DLearning: Step: 10000. Mean Reward: 27.284. Std of Reward: 28.667. Training.

这段日志的解读要点:

  • 环境启动确认'Ball3DAcademy' started successfully!表示 Unity 侧 Academy 已正常启动,日志同时打印 Mono 运行时路径;
  • 行为(Behavior)连接确认Connected new brain: Ball3DLearning说明 Python 侧已与 Unity 中的行为建立连接,并打印了观测规格。此处Vector Observation space size (per agent): 8与 3DBall Agent 的观测实现一致——在 Ball3DAgent.cs 的CollectObservations中,Agent 依次加入平台旋转角(2 个)、小球相对位置(3 个)与小球线速度(3 个),共 8 个向量观测;
  • 超参数回显:训练器会打印当前生效的超参数与实际output_path(模型输出目录);
  • 训练进度Step: N. Mean Reward: X. Std of Reward: Ysummary_freq周期输出平均奖励与标准差,可据此判断策略是否在收敛。

命令行常用参数(基于源码)

mlagents-learn的命令行参数定义在 ml-agents/mlagents/trainers/cli_utils.py 中,除文档示例用到的--env--run-id外,常用参数还包括:

参数默认值说明
--envNone待训练的 Unity 可执行文件路径
--run-idppo训练运行标识,用于命名模型与统计子目录
--resumeFalse从检查点恢复训练(需配合--run-id
--initialize-from <RUN_ID>None从指定历史 run-id 初始化模型(可用于微调)
--forceFalse强制覆盖已存在的同名 run-id 数据
--seed-1训练随机数种子
--num-envs1并发启动的 Unity 环境实例数
--num-areas1每个实例内的并行训练区域数
--base-port5005环境通信起始端口,第 i 个实例使用base_port + worker_id
--timeout-wait60等待 Unity 环境启动的秒数
--results-dirresults结果输出根目录
--no-graphicsFalse以无图形模式运行可执行文件(见下文)
--no-graphics-monitorFalse主 worker 用图形模式、其余 worker 用无图形模式
--torch-deviceNonePyTorch 训练设备,如"cpu""cuda""cuda:0"

注意:--train--load已废弃——训练模式现在是默认行为,恢复训练请使用--resume(见 learn.py 中的废弃提示)。

停止训练与获取模型

你可以按Ctrl+C停止训练,训练好的模型会保存在results/<run-identifier>/<behavior_name>.onnx,对应模型的最新检查点。

Windows 平台已知问题:在 Windows 上提前终止训练可能导致模型保存失败,建议等到 Step 达到配置 YAML 中设置的max_steps后再停止。

把训练好的模型嵌入 Agent

获得.onnx模型后,按以下步骤将其嵌入到场景的 Agent 中:

  1. 把模型文件移动到Project/Assets/ML-Agents/Examples/3DBall/TFModels/目录(仓库中该目录已包含官方预训练模型3DBall.onnx等);
  2. 按前述方式在 Unity 编辑器中打开3DBall场景;
  3. 在 Project 窗口选中3DBallPrefab,并选中Agent
  4. <behavior_name>.onnx文件从 Project 窗口拖到Ball3DAgentInspector 窗口的Model占位槽中;
  5. 点击编辑器顶部的Play按钮运行,即可看到 Agent 使用训练后的策略自主控制平台保持小球平衡。

第四步:在无图形 Headless 服务器上训练

要在没有图形渲染支持的 Headless 服务器上训练,需要关闭 Unity 可执行文件的图形显示,有两种方式:

  1. 命令行方式:在mlagents-learn训练命令中传入--no-graphics选项。这在功能上等价于给 Unity 可执行文件追加-nographics -batchmode参数;
  2. 构建方式:在 Unity 编辑器的 Build Settings 中使用Server Build构建可执行文件。

如果你需要带图形训练(例如使用 Camera 视觉观测),则需要在服务器上配置显示渲染支持(例如 xvfb)。本仓库的 Colab Notebook 教程 中,Setup 部分给出了在服务器上配置 xvfb 的示例。

源码佐证

--no-graphics--no-graphics-monitor在 cli_utils.py 中定义,官方 help 明确说明:仅在 Agent 不使用视觉观测时才能安全启用。这两个开关最终会传给UnityEnvironment(no_graphics=...),并反映在_executable_args()生成的命令行中(追加-nographics -batchmode)。同时,no_graphics_monitor模式下主 worker 仍保留图形,其余 worker 使用无图形模式(见 environment.py),这在多环境并行训练且需保留一个可视化窗口时很有用。

常见问题与排查建议

  • "Provided filename does not match any environments"launch_executable找不到可执行文件时会抛出该异常(env_utils.py)。请确认file_name/--env指向的路径存在,且不带.app/.exe等扩展名;Linux 下还需确保文件具备执行权限(源码注释建议chmod -R 755)。
  • 通信版本不兼容:Python 与 Unity 包版本不匹配时,_check_communication_compatibility会拒绝连接并抛出 API 版本不兼容异常(environment.py)。请使用相互兼容的 Unity 包与 Python 包版本。
  • 训练无输出或连接超时:检查Run in Background是否勾选、Display Resolution Dialog是否禁用,以及目标场景是否在 Scenes in Build 列表中唯一勾选;必要时使用--timeout-wait增大等待时间。
  • 需要视觉观测的无头训练:不可使用--no-graphics,需在服务器上配置 xvfb 等虚拟显示方案。

延伸阅读

  • Python-LLAPI.md:低层级 Python API 完整文档,UnityEnvironment的详细用法
  • Installation.md:ML-Agents Toolkit 安装指南
  • Training-Configuration-File.md:训练器配置文件全量参数说明
  • Tutorial-Colab.md:Colab Notebook 教程(含 xvfb 配置示例)
  • config/ppo/3DBall.yaml:3DBall 训练配置文件
  • Ball3DAgent.cs:3DBall Agent 源码(观测、奖励与动作实现)
  • environment.py 与 env_utils.py:可执行环境启动与通信的 Python 端实现
  • 人工智能
  • 强化学习
  • 深度学习
  • 机器学习
  • 游戏开发
  • AI 应用

【免费下载链接】ml-agents

The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.

项目地址:https://gitcode.com/gh_mirrors/ml/ml-agents
点击查看免费下载

相关推荐

上一篇:Windows11安装VideoLingo避坑指南:numpy版本冲突的3个解决方案
下一篇:抖音主页批量备份到本地:一份新手可直接照做的完整教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 21:46:05

如何给PicGo贡献代码:本地开发环境搭建到提交第一个PR的完整指南

如何给PicGo贡献代码&#xff1a;本地开发环境搭建到提交第一个PR的完整指南 【免费下载链接】PicGo 高效创作者的最佳图片上传工具。实现图片一键上传并自动获取链接&#xff0c;提升创作效率。它支持主流图床&#xff0c;提供拖拽、剪贴板粘贴等多种上传方式&#xff0c;具备…

作者头像 李华
网站建设 2026/9/20 21:41:13

Sunshine 快速上手 3 步:把 PC 变成 Moonlight 游戏串流服务器

Sunshine 快速上手 3 步&#xff1a;把 PC 变成 Moonlight 游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你的游戏装在 PC 上&#xff0c;电视、平板、手机却只能…

作者头像 李华