1. 背景说明

SMACv2 是基于 StarCraft II 的多智能体强化学习测试环境。它不是一个完整的学习框架,而是一个多智能体环境,负责提供智能体观测、全局状态、可执行动作、奖励、终止信号和场景随机化机制。SMACv2 官方要求将 32x32_flat.SC2Map 放入 SMAC_Maps 地图目录,这是 SMACv2 程序化生成场景所依赖的基础地图。(GitHub)

EPyMARL 是 PyMARL 的扩展版本,支持多种多智能体环境,包括 SMAC、SMACv2、SMAClite、PettingZoo 和 VMAS 等。EPyMARL 官方也说明,SMAC 和 SMACv2 需要本地 StarCraft II 安装和对应地图文件。(GitHub)

本文记录在 Windows 平台上配置:

StarCraft II
SMACv2
EPyMARL
PyTorch CUDA
QMIX 训练流程

并最终成功运行:

QMIX + SMACv2 + protoss_5_vs_5

2. 最终环境概况

本次配置平台为 Windows,核心组件如下:

操作系统:Windows
Conda 环境名:epymarl_smacv2
StarCraft II 路径:D:\Software\StarCraft II
EPyMARL 路径:D:\HANXU\MARL\epymarl
SMACv2 地图路径:D:\Software\StarCraft II\Maps\SMAC_Maps\32x32_flat.SC2Map
GPU:NVIDIA GeForce RTX 5080

已验证的关键结果:

SMACv2 script 测试通过
EPyMARL 能够启动 sc2v2 环境
StarCraft II 能够被 PySC2 调用
QMIX 能够完成短训练
Sacred 日志捕获问题已绕过

最终成功运行日志中包含:

[DEBUG] pymarl Using capture mode "no"
[INFO] my_main Finished Training
[INFO] pymarl Completed after 0:05:09

这说明训练链路已经完整跑通。


3. 安装前准备

3.1 安装 Anaconda

本文使用 Conda 管理 Python 环境。安装完成后,后续所有命令建议在 Anaconda Prompt 或 Conda Prompt 中执行。

3.2 安装 Git

EPyMARL、SMACv2 和 SMAClite 都需要从 GitHub 获取源码,因此需要安装 Git。

可以用 Conda 安装:

conda install git -y

也可以安装 Git for Windows。

安装后检查:

git --version

4. 安装 StarCraft II

SMACv2 底层依赖 StarCraft II,因此需要先安装 StarCraft II。

本文中的安装路径为:

D:\Software\StarCraft II

建议设置环境变量 SC2PATH

setx SC2PATH "D:\Software\StarCraft II"

设置后关闭当前终端,重新打开。

检查:

echo %SC2PATH%

期望输出:

D:\Software\StarCraft II

5. 安装 SMACv2 地图

SMACv2 需要专用基础地图:

32x32_flat.SC2Map

注意,这个文件不是普通 SMAC 地图包中的 3m8m2s3z 等固定任务地图。SMACv2 官方明确要求 32x32_flat.SC2Map 位于 SMAC_Maps 文件夹中。(GitHub)

最终目录结构应为:

D:\Software\StarCraft II
└── Maps
    └── SMAC_Maps
        └── 32x32_flat.SC2Map

检查地图是否存在:

dir "D:\Software\StarCraft II\Maps\SMAC_Maps\32x32_flat.SC2Map"

如果路径正确,能够看到该 .SC2Map 文件。


6. 新建 Conda 环境

为了避免破坏已有环境,建议新建专用环境:

conda create -n epymarl_smacv2 python=3.10 -y
conda activate epymarl_smacv2

升级基础工具:

python -m pip install --upgrade pip setuptools wheel

7. 安装 PyTorch CUDA

本文最终使用的是带 CUDA 的 PyTorch。PyTorch 官方提供 CUDA 12.8 的 pip 安装通道。(PyTorch)

根据实际环境,可以使用:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

安装完成后验证:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

期望输出类似:

2.x.x+cu128
True
NVIDIA GeForce RTX 5080

只要 torch.cuda.is_available()True,说明 PyTorch 已经可以调用 GPU。


8. 安装 SMACv2

不要使用:

pip install smacv2

该命令可能出现:

ERROR: Could not find a version that satisfies the requirement smacv2

正确方式是从官方 GitHub 仓库安装:

pip install git+https://github.com/oxwhirl/smacv2.git

安装后验证:

python -c "import smacv2; print('smacv2 import ok')"

如果能正常输出:

smacv2 import ok

说明 Python 包安装完成。


9. 固定关键依赖版本

为了减少 PySC2、SMACv2 和 EPyMARL 的兼容性问题,建议固定以下依赖:

pip install numpy==1.24.4 protobuf==3.20.3 scipy==1.10.1

验证:

python -c "import numpy, google.protobuf, scipy; print(numpy.__version__); print(google.protobuf.__version__); print(scipy.__version__)"

期望输出:

1.24.4
3.20.3
1.10.1

10. 测试 SMACv2 是否能独立运行

可以使用一个简单脚本测试 SMACv2 环境是否能启动。

示例脚本:

from smacv2.env.starcraft2.wrapper import StarCraftCapabilityEnvWrapper

env = StarCraftCapabilityEnvWrapper(
    capability_config={
        "n_units": 5,
        "n_enemies": 5,
        "team_gen": {
            "dist_type": "weighted_teams",
            "unit_types": ["stalker", "zealot", "colossus"],
            "weights": [0.45, 0.45, 0.10],
            "observe": True,
        },
        "start_positions": {
            "dist_type": "surrounded_and_reflect",
            "p": 0.5,
            "n_enemies": 5,
            "map_x": 32,
            "map_y": 32,
        },
    },
    map_name="protoss_5_vs_5",
    debug=False,
)

env.reset()

terminated = False
episode_reward = 0

while not terminated:
    actions = []
    for agent_id in range(env.n_agents):
        avail_actions = env.get_avail_agent_actions(agent_id)
        valid_actions = [i for i, available in enumerate(avail_actions) if available]
        actions.append(valid_actions[0])

    reward, terminated, info = env.step(actions)
    episode_reward += reward

print("Episode reward:", episode_reward)
print("Info:", info)

env.close()

运行:

python C:\Users\hx313\PyCharmMiscProject\script.py

如果能够正常结束,说明:

SMACv2 包可用
StarCraft II 可启动
SC2PATH 正确
32x32_flat.SC2Map 地图正确

11. 安装 EPyMARL

创建项目目录:

cd /d D:\HANXU
mkdir MARL
cd /d D:\HANXU\MARL

克隆 EPyMARL:

git clone https://github.com/uoe-agents/epymarl.git
cd epymarl

安装依赖:

pip install -r requirements.txt

如果后续提示缺少某些包,可以补充安装:

pip install sacred pyyaml matplotlib pandas tensorboard pygame

12. 安装 SMAClite

第一次运行 EPyMARL 时,可能会出现:

ModuleNotFoundError: No module named 'smaclite'

这是因为 EPyMARL 在环境注册时导入了 SMAClite 相关模块。即使当前运行的是 sc2v2,也可能需要安装 smaclite

处理方式:

cd /d D:\HANXU\MARL
git clone https://github.com/uoe-agents/smaclite.git
cd smaclite
pip install .

验证:

python -c "import smaclite; print('smaclite import ok')"

然后回到 EPyMARL 目录:

cd /d D:\HANXU\MARL\epymarl

13. 第一次运行 EPyMARL + SMACv2

官方 EPyMARL 支持 sc2v2 环境配置,可以通过 --env-config=sc2v2 运行 SMACv2。官方示例也使用类似:

python src/main.py --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5"

这一形式运行 SMACv2 任务。(GitHub)

首先运行短训练:

python src/main.py --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=10000 test_interval=2000

如果看到类似输出:

Beginning training for 10000 timesteps
Launching SC2
t_env: 2000 / 10000
t_env: 4000 / 10000
Finished Training

说明训练流程已经启动并完成。


14. 处理 PettingZoo 和 VMAS 警告

运行时可能出现:

PettingZoo is not installed, so these environments will not be available
VMAS is not installed, so these environments will not be available

这些警告可以忽略。原因是当前运行的是:

--env-config=sc2v2

并不是 PettingZoo 或 VMAS 环境。

不建议为了消除警告而立即安装:

pip install pettingzoo
pip install "vmas[gymnasium]"

因为这些包可能引入新的依赖变化,反而破坏当前已经跑通的 SMACv2 训练环境。


15. 处理 PyTorch indexing 警告

运行时可能出现:

Using a non-tuple sequence for multidimensional indexing is deprecated

对应文件通常是:

D:\HANXU\MARL\epymarl\src\components\episode_buffer.py

这是因为 EPyMARL 旧代码中存在类似:

target[k][_slices]

新版 PyTorch 会提示未来可能需要改成:

target[k][tuple(_slices)]

当前它只是警告,不影响训练。短期可以忽略。后续如果长期使用较新版本 PyTorch,可以再统一修改 episode_buffer.py 中的索引写法。


16. 处理 Sacred 日志捕获问题

第一次成功训练时,终端中可能大量出现:

--- Logging error ---

甚至在训练结束阶段出现:

OSError: [WinError 1] 函数不正确。

这不是训练失败,而是 Sacred 的输出捕获模式和 Windows 输出流之间存在兼容问题。Sacred 会捕获程序输出并写入 results/sacred,默认可能使用:

capture mode "fd"

在 Windows + Conda + PySC2 + StarCraft II 子进程组合下,fd 捕获模式容易导致 logging 输出异常。

正确做法是在命令前加入:

--capture=no

最终命令为:

python src/main.py --capture=no --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=10000 test_interval=2000

成功后日志中会出现:

[DEBUG] pymarl Using capture mode "no"

此后训练能够正常完成,不再出现大量 --- Logging error ---。最终成功日志中出现了 Using capture mode "no"Finished TrainingCompleted after 0:05:09

注意,不要使用:

capture_mode="no"

这种写法会被 EPyMARL 识别为实验配置项,可能报:

ConfigAddedError: Added new config entry that is not used anywhere

正确写法是:

--capture=no

17. 处理 run.py 末尾 print 报错

如果仍然出现:

OSError: [WinError 1] 函数不正确。

并且报错位置在:

D:\HANXU\MARL\epymarl\src\run.py

例如:

print("Exiting Main")
print("Stopping all threads")
print("Exiting script")

可以将退出阶段的 print() 注释掉。

打开:

D:\HANXU\MARL\epymarl\src\run.py

将类似代码:

print("Stopping all threads")
for t in threading.enumerate():
    if t.name != "MainThread":
        print("Thread {} is alive! Is daemon: {}".format(t.name, t.daemon))
        t.join(timeout=1)
        print("Thread joined")

print("Exiting script")

改为:

# print("Stopping all threads")
for t in threading.enumerate():
    if t.name != "MainThread":
        # print("Thread {} is alive! Is daemon: {}".format(t.name, t.daemon))
        t.join(timeout=1)
        # print("Thread joined")

# print("Exiting script")

保留线程清理逻辑,只关闭退出阶段的终端输出。

不过在已经使用:

--capture=no

之后,这类问题通常不会再出现。


18. 检查实验结果是否保存

EPyMARL 使用 Sacred 保存实验记录,默认保存路径为:

D:\HANXU\MARL\epymarl\results\sacred

查看目录:

dir results\sacred

会看到数字编号目录,例如:

1
2
3
4

进入最新编号:

dir results\sacred\4

通常应包含:

config.json
cout.txt
metrics.json
run.json

这些文件分别记录实验配置、终端输出、训练指标和运行状态。


19. 最终推荐运行命令

后续所有 SMACv2 训练建议统一使用以下格式:

cd /d D:\HANXU\MARL\epymarl
conda activate epymarl_smacv2

python src/main.py --capture=no --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=10000 test_interval=2000

更长一点的测试:

python src/main.py --capture=no --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=200000 test_interval=10000

如果要测试 VDN:

python src/main.py --capture=no --config=vdn --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=200000 test_interval=10000

如果要测试 IQL:

python src/main.py --capture=no --config=iql --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=200000 test_interval=10000

20. 当前已完成的配置检查表

检查项 状态
Conda 环境创建 已完成
PyTorch CUDA 安装 已完成
SMACv2 安装 已完成
StarCraft II 路径识别 已完成
32x32_flat.SC2Map 地图配置 已完成
SMACv2 独立 script 测试 已通过
EPyMARL 安装 已完成
SMAClite 缺失问题 已处理
QMIX + sc2v2 启动 已通过
Sacred fd 捕获日志错误 已通过 --capture=no 规避
训练结果保存 已生成 results/sacred 记录
QMIX 短训练 已完成

21. 总结

本次配置的核心流程是:

安装 StarCraft II
        ↓
配置 SC2PATH
        ↓
放置 SMACv2 专用地图 32x32_flat.SC2Map
        ↓
创建 epymarl_smacv2 Conda 环境
        ↓
安装 PyTorch CUDA
        ↓
从 GitHub 安装 SMACv2
        ↓
安装 EPyMARL
        ↓
补充安装 SMAClite
        ↓
运行 QMIX + sc2v2
        ↓
使用 --capture=no 解决 Windows Sacred 日志捕获问题

最终成功命令为:

python src/main.py --capture=no --config=qmix --env-config=sc2v2 with env_args.map_name="protoss_5_vs_5" t_max=10000 test_interval=2000

当终端出现:

Using capture mode "no"
Finished Training
Completed after ...

即可确认 Windows 下 SMACv2 + EPyMARL + PyTorch CUDA 的训练链路已经配置完成

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐