Windows 10 实战:从零部署多智能体强化学习环境(SMAC)
1. 星际争霸2游戏本体安装
想在Windows 10上玩转多智能体强化学习,首先得把"战场"搭建好——这就是星际争霸2游戏本体的安装。很多新手容易在这里栽跟头,特别是当你想把游戏安装到非系统盘时。
我建议直接去暴雪官网下载游戏客户端。虽然需要注册账号,但这是最稳妥的方式。下载器大概80MB左右,但完整游戏需要约30GB空间。如果你的C盘空间充足,直接默认安装最省事。但像我这样习惯把大型软件装在其他盘的用户,就需要特别注意路径问题。
安装完成后,有个关键步骤经常被忽略:设置系统环境变量SC2PATH。这个变量就像是给SMAC平台指路的地图,必须准确指向你的星际争霸2安装目录。具体操作是:
- 右键"此电脑"选择"属性"
- 点击"高级系统设置"
- 在"高级"选项卡点击"环境变量"
- 在系统变量中新建一个变量名为SC2PATH,值为你的安装路径(比如E:\StarCraft II)
注意:路径中不要包含中文或特殊字符,否则后续运行可能会报错。
验证安装是否成功有个小技巧:直接运行游戏目录下的Versions文件夹中的SC2_x64.exe。如果能正常启动游戏,说明基础安装没问题。
2. Python环境配置
2.1 创建虚拟环境
强烈建议使用Anaconda来管理Python环境,它能有效避免不同项目间的依赖冲突。我习惯为每个项目创建独立环境,这里我们创建一个名为sc2的虚拟环境:
conda create -n sc2 python=3.7
conda activate sc2
选择Python 3.7版本是因为SMAC对较新的Python版本支持不够完善,这是经过多次测试后的稳妥选择。创建环境后,建议先升级pip:
python -m pip install --upgrade pip
2.2 PyTorch安装
PyTorch是SMAC的核心依赖之一,版本选择很关键。根据我的实测,PyTorch 1.4.0是最稳定的选择。安装命令取决于你的硬件配置:
对于有NVIDIA显卡的用户:
conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=10.1 -c pytorch
仅使用CPU的情况:
conda install pytorch==1.4.0 torchvision==0.5.0 cpuonly -c pytorch
安装完成后,运行以下命令验证CUDA是否可用:
python -c "import torch; print(torch.cuda.is_available())"
如果输出True,说明GPU加速已启用。我在GTX 1060和RTX 2080上都测试过,虽然性能差异明显,但都能正常运行。
3. 关键依赖库安装
3.1 Torch-Geometric及其依赖
SMAC使用了一些图神经网络相关的库,因此需要安装torch-geometric。但直接pip安装往往会失败,需要先安装四个前置库:
- 访问PyTorch Geometric的官方whl文件页面
- 下载与PyTorch 1.4.0和CUDA 10.1兼容的版本
- 按顺序安装:
pip install torch_scatter-2.0.3+cu101-cp37-cp37m-win_amd64.whl
pip install torch_sparse-0.5.1+cu101-cp37-cp37m-win_amd64.whl
pip install torch_cluster-1.5.2+cu101-cp37-cp37m-win_amd64.whl
pip install torch_spline_conv-1.2.0+cu101-cp37-cp37m-win_amd64.whl
最后安装torch-geometric本体:
pip install torch-geometric
验证安装:
python -c "import torch_geometric; print(torch_geometric.__version__)"
3.2 其他必要库
SMAC还需要一些辅助库,建议一并安装:
pip install numpy matplotlib seaborn pygame pysc2
特别是pysc2,它是DeepMind开发的星际争霸2学习环境,虽然SMAC有自己的接口,但某些功能会依赖它。
4. SMAC平台安装与配置
4.1 安装SMAC
官方推荐两种安装方式,我都尝试过:
直接从GitHub安装:
pip install git+https://github.com/oxwhirl/smac.git
或者先克隆仓库再安装(推荐这种方式,方便后续调试):
git clone https://github.com/oxwhirl/smac.git
cd smac
pip install -e .
第二种方式会在开发模式下安装,允许你直接修改源代码并立即生效,对想要深入研究SMAC工作原理的用户特别有用。
4.2 地图文件配置
SMAC需要使用特定的星际争霸2地图文件,这些不是游戏自带的。你需要:
- 从SMAC提供的链接下载地图包(约200MB)
- 解压后得到SMAC_Maps文件夹
- 将这个文件夹复制到星际争霸2安装目录下的Maps文件夹中
如果安装目录下没有Maps文件夹(常见情况),需要手动创建。完整路径应该类似于:
E:\StarCraft II\Maps\SMAC_Maps
验证地图是否安装成功:
python -m smac.bin.map_list
这个命令会列出所有可用的SMAC地图,如果输出为空,说明地图文件放置位置可能有误。
5. 测试运行与常见问题排查
5.1 基础测试
运行一个简单的随机智能体测试:
python -m smac.examples.random_agents --map=3m
如果一切正常,你应该能看到星际争霸2游戏界面弹出,并且有3个marine单位在随机移动。
5.2 路径问题解决
最常见的错误是路径相关的FileNotFoundError。如果星际争霸2没有安装在默认位置,SMAC可能无法自动找到游戏文件。解决方法有几种:
- 确保SC2PATH环境变量设置正确
- 在代码中显式指定游戏路径:
from smac.env import StarCraft2Env
env = StarCraft2Env(map_name="3m", sc2_path="E:/StarCraft II")
- 或者在SMAC的配置文件中修改默认路径
5.3 版本兼容性问题
如果遇到奇怪的报错,很可能是版本不匹配。建议严格按照以下版本组合:
- Python 3.7.x
- PyTorch 1.4.0
- CUDA 10.1(如果使用GPU)
- SMAC最新master分支
我在实际项目中遇到过torch-geometric与PyTorch版本不匹配导致的段错误,重新安装指定版本后解决。
6. 进阶配置与优化
6.1 多进程训练配置
SMAC支持多进程训练以加速实验,但需要额外配置:
from smac.env import StarCraft2Env
env = StarCraft2Env(
map_name="3m",
seed=123,
replay_dir="replays",
reward_only_positive=False,
reward_scale_rate=200,
observe_ally_actions=True,
obs_all_health=True,
obs_own_health=True,
obs_last_action=True,
obs_pathing_grid=True,
obs_terrain_height=True,
obs_instead_of_state=False,
state_last_action=True,
state_timestep_number=True,
state_agent_id=True,
use_reward_normalization=True,
use_state_normalization=True,
use_agent_normalization=True,
window_size_x=1920,
window_size_y=1200,
heuristic_ai=False,
heuristic_rest=False,
debug=False,
concurrency=True, # 启用多进程
concurrency_context="spawn", # Windows必须使用spawn
num_concurrent_envs=4 # 并发环境数
)
6.2 渲染优化
默认渲染可能会很卡,可以通过调整分辨率改善:
env = StarCraft2Env(
window_size_x=800,
window_size_y=600,
render=Render.human # 或者Render.none完全关闭渲染
)
对于纯训练不需要可视化的情况,建议完全关闭渲染以提升性能。
7. 实际项目中的经验分享
在真实的多智能体强化学习项目中,SMAC环境配置只是第一步。根据我的实战经验,还有几个关键点需要注意:
首先是观测空间的处理。SMAC的原始观测非常庞大,包含单位信息、地图信息等。我通常会自定义观测包装器来提取关键特征:
from smac.env import StarCraft2Env
from gym import spaces
import numpy as np
class CustomObsWrapper(gym.Wrapper):
def __init__(self, env):
super().__init__(env)
# 自定义观测空间
self.observation_space = spaces.Dict({
"agent_features": spaces.Box(low=-np.inf, high=np.inf, shape=(n_agents, feature_dim)),
"global_state": spaces.Box(low=-np.inf, high=np.inf, shape=(state_dim,))
})
def get_obs(self):
raw_obs = self.env.get_obs()
# 处理原始观测...
return processed_obs
env = StarCraft2Env(map_name="3m")
wrapped_env = CustomObsWrapper(env)
其次是奖励设计。SMAC默认的奖励信号可能不适合你的特定任务。可以通过继承StarCraft2Env类来修改奖励计算方式:
class CustomRewardEnv(StarCraft2Env):
def _get_reward(self):
original_reward = super()._get_reward()
# 添加自定义奖励计算
custom_reward = calculate_custom_reward()
return original_reward + custom_reward
最后是并行化训练的技巧。当使用多个SMAC环境并行收集数据时,要注意Windows下的多进程限制。建议使用ray库来管理并行训练:
import ray
from smac.env import StarCraft2Env
ray.init()
@ray.remote
class ParallelEnv:
def __init__(self, map_name):
self.env = StarCraft2Env(map_name=map_name)
def step(self, actions):
return self.env.step(actions)
def reset(self):
return self.env.reset()
# 创建多个并行环境
envs = [ParallelEnv.remote("3m") for _ in range(4)]
这些技巧都是在实际项目中经过验证的,希望能帮你避开我踩过的那些坑。记住,配置环境只是开始,真正的挑战在于如何设计有效的多智能体学习算法来攻克SMAC中的各种战斗场景。
更多推荐


所有评论(0)