在实验室场景中,若需部署 Maxwell-B 开源项目(与 SPINS 配合实现逆向设计仿真),但是电脑无 Docker 环境,本文将提供完整的 Windows 手动部署流程,包含依赖安装、服务配置、代码适配及常见问题解决方案,帮助快速完成部署并解决实操中的各类报错。
一、项目简介
Maxwell-B 是基于多 GPU 的有限差分频域求解器,需与 SPINS 项目配合使用。其核心通过两个服务运行:
- Webserver:负责 HTTP 协议的模拟数据收发(默认端口 9041)
- Simserver:负责实际仿真任务执行支持多 GPU 并行计算,需手动配置工作目录存储临时数据,适用于电磁仿真、逆向设计等科研场景。
二、前置条件
- 已安装 Anaconda 及 Python 3.8+ 环境
- 已创建 SPINS 专用虚拟环境
spins-env(用于与 Maxwell-B 集成) - 安装 CUDA Toolkit(建议 10.0+,需与后续依赖版本匹配)
- 实验室电脑具备 GPU(支持 CUDA 加速)
三、完整部署步骤
(一)项目克隆与目录准备
- 打开 CMD 终端,进入工作目录(如
E:\zpt),克隆项目:
cd E:\zpt
git clone https://github.com/stanfordnqp/maxwell-b.git
cd maxwell-b
- 创建 Maxwell 工作目录(存储临时数据和日志):
mkdir E:\zpt\maxwell-server-files
最终目录结构如下:
E:\zpt\
├── maxwell-b\ # 项目根目录
│ ├── maxwell-server\ # 服务端代码(webserver.py/simserver.py)
│ ├── maxwell-solver\ # 求解器核心代码
│ └── ... 其他项目文件
└── maxwell-server-files\ # 手动创建的工作目录
(二)依赖安装
- 激活已有的
spins-env环境(避免依赖冲突):
conda activate spins-env
- 安装核心依赖(基于 Dockerfile 提取的必需包):
# 基础科学计算库
pip install numpy scipy matplotlib h5py jinja2
# Web 服务与通信依赖
pip install flask requests
# CUDA 加速核心依赖(关键)
pip install pycuda
# MPI 并行计算支持(可选,多 GPU 场景需安装)
conda install -c conda-forge mpi4py
依赖安装注意事项:
- PyCUDA 安装失败时,优先使用 Conda 安装:
conda install -c conda-forge pycuda - 需确保 PyCUDA 版本与 CUDA Toolkit 匹配(如 CUDA 11.x 对应 pycuda 2022.1+)
- 若提示缺少 Visual Studio Build Tools,需提前安装(用于编译部分依赖)
(三)环境变量配置
需设置 MAXWELL_SERVER_FILES 环境变量,指向手动创建的工作目录:
- 永久配置(推荐,重启 CMD 后生效):
setx MAXWELL_SERVER_FILES "E:\zpt\maxwell-server-files"
- 验证配置(关闭当前 CMD,重新打开后执行):
echo %MAXWELL_SERVER_FILES%
输出应为 E:\zpt\maxwell-server-files(无末尾空格)
(四)Windows 专用启动 / 停止脚本创建
原项目仅提供 Linux 脚本,需手动创建 Windows 批处理脚本,方便启停服务。
1. 启动脚本 start_maxwell_windows.bat
在 maxwell-b 根目录创建该文件,内容如下:
2. 停止脚本 stop_maxwell_windows.bat
同样在 maxwell-b 根目录创建,用于快速停止服务:
代码见2025.11.25以后的修复版maxwell-b文件夹
(五)代码适配:修复 Windows 兼容性问题
原项目代码默认适配 Linux,需修改 simserver.py 和 maxwell_config.py 以支持 Windows,否则会出现命令不存在、路径错误等问题。
1. 修复 simserver.py(两个关键问题)
创建修复脚本 fix_simserver_complete.py,放在 maxwell-server 目录下:
代码见2025.11.25以后的修复版maxwell-b文件夹
执行修复脚本:
cd E:\zpt\maxwell-b\maxwell-server
python fix_simserver_complete.py
2. 修复 maxwell_config.py(路径空格问题)
创建修复脚本 fix_maxwell_config.py,放在 maxwell-server 目录下:
代码见2025.11.25以后的修复版maxwell-b文件夹
python
运行
"""修复环境变量路径空格问题"""
import os
# 备份原文件
shutil.copy('maxwell_config.py', 'maxwell_config.py.backup')
# 读取并修改:添加 .strip() 去除路径空格
with open('maxwell_config.py', 'r', encoding='utf-8') as f:
content = f.read()
# 替换环境变量读取逻辑,自动去除首尾空格
content = content.replace(
'os.environ["MAXWELL_SERVER_FILES"]',
'os.environ["MAXWELL_SERVER_FILES"].strip()'
).replace(
"os.environ['MAXWELL_SERVER_FILES']",
"os.environ['MAXWELL_SERVER_FILES'].strip()"
)
# 保存修改
with open('maxwell_config.py', 'w', encoding='utf-8') as f:
f.write(content)
print("✓ maxwell_config.py 修复完成!")
执行修复脚本:
cmd
python fix_maxwell_config.py
(六)服务启动与验证
- 启动服务:双击
maxwell-b根目录的start_maxwell_windows.bat,将自动打开两个 CMD 窗口(分别对应 Webserver 和 Simserver)。 - 验证服务运行状态:
- 查看 Webserver 日志:
cmd
正常输出:type E:\zpt\maxwell-b\webserver.logServing at ('', 9041) - 查看 Simserver 日志:
cmd
正常输出(无报错):type E:\zpt\maxwell-b\simserver.logplaintext
[INFO] Solver directory set to E:\zpt\maxwell-b\maxwell-server\maxwell-solver\ [INFO] Number of GPUs detected on system: 2 [INFO] Number of GPUs used per solve: 1 [INFO] Ready to accept simulations.
- 查看 Webserver 日志:
- 测试网络连接::
运行测试:
python test_maxwell_proper.py
python test_connection.py
(七)日志内容保存路径的修改
要将simserver.log和webserver.log统一存储到E:\zpt\maxwell-b目录下,需要对代码进行如下修改:
1. simserver.py 修改(日志文件配置)
# 在文件顶部导入必要模块(如果已有可忽略)
import os
# 修改日志配置部分(原logging.basicConfig位置)
LOG_FORMAT = '[%(asctime)-15s][%(levelname)s][%(module)s][%(funcName)s] %(message)s'
# 定义日志文件路径
log_dir = r"E:\zpt\maxwell-b"
log_file = os.path.join(log_dir, "simserver.log")
# 确保日志目录存在
os.makedirs(log_dir, exist_ok=True)
# 配置日志输出到文件
logging.basicConfig(
format=LOG_FORMAT,
level=logging.INFO,
filename=log_file,
filemode='a' # 追加模式,避免覆盖历史日志
)
logger = logging.getLogger(__name__)
2. webserver.py 修改(新增日志配置)
# 在文件顶部添加日志相关导入
import logging
import os
# 在导入模块后添加日志配置
LOG_FORMAT = '[%(asctime)-15s][%(levelname)s][%(module)s][%(funcName)s] %(message)s'
log_dir = r"E:\zpt\maxwell-b"
log_file = os.path.join(log_dir, "webserver.log")
os.makedirs(log_dir, exist_ok=True)
logging.basicConfig(
format=LOG_FORMAT,
level=logging.INFO,
filename=log_file,
filemode='a'
)
logger = logging.getLogger(__name__)
3. 补充日志记录(可选增强)
可以在关键操作点添加日志记录,例如:
-
在webserver.py的
do_POST方法中添加:logger.info(f"Received POST request from {self.client_address[0]}, saved file: {filename}") -
在simserver.py的
find_oldest_job方法中添加:if oldest_req: logger.info(f"Found oldest job: {oldest_req}")
修改说明
- 日志路径:通过
os.path.join构造绝对路径,确保在 Windows 系统下正确识别 - 目录创建:使用
os.makedirs(..., exist_ok=True)确保日志目录存在,避免因目录不存在导致的错误 - 日志模式:采用
filemode='a'(追加模式),避免每次启动服务覆盖历史日志 - 统一性:两个服务使用相同的日志格式,便于后续分析
(八)与 SPINS 集成配置
在 SPINS 代码中指定 Maxwell-B 服务地址,即可实现协同工作:
# SPINS 配置文件中添加
maxwell_server_url = "http://localhost:9041" # 同一台机器直接使用本地地址
四、常见问题与解决方案
(一)环境变量相关报错
报错信息:
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'E:\\zpt\\maxwell-server-files '
原因:
环境变量路径末尾存在空格(配置时误输入)。
解决方案:
- 重新设置环境变量(无空格):
cmd
setx MAXWELL_SERVER_FILES "E:\zpt\maxwell-server-files"
- 关闭所有 CMD 窗口,重新打开生效。
- 配合
maxwell_config.py的.strip()修复,双重保障路径无空格。
(二)Simserver 启动报错(ps 命令未找到)
报错信息:
FileNotFoundError: [WinError 2] 系统找不到指定的文件。(指向 ps ax 命令)
原因:
原代码使用 Linux 专属 ps 命令,Windows 不支持。
解决方案:
已通过 fix_simserver_complete.py 修复,替换为 Windows 原生 tasklist 命令,重新运行修复脚本即可。
(三)PyCUDA 安装失败(建议使用conda命令安装)
报错信息:
error: Microsoft Visual C++ 14.0 or greater is required 或编译失败。
解决方案:
- 安装 Visual Studio Build Tools(勾选 “桌面开发用 C++”)。
- 使用 Conda 安装预编译版本:
cmd
conda install -c conda-forge pycuda
- 验证 CUDA 版本与 PyCUDA 匹配:
cmd
nvcc --version # 查看 CUDA 版本
pip show pycuda # 查看 PyCUDA 版本
(四)端口被占用
报错信息:
OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
解决方案:
- 查看端口占用进程:
cmd
netstat -ano | findstr 9041
- 杀死占用进程(替换
PID为实际进程号):
cmd
taskkill /F /PID 1234
- 或修改端口(需同步更新 SPINS 配置):
- 编辑
start_maxwell_windows.bat,将set PORT=9041改为9042等未占用端口。 - 启动 Webserver 时指定新端口:
python webserver.py 9042。
- 编辑
(五)GPU 检测失败
报错信息:
Number of GPUs detected on system: 0
解决方案:
- 验证 GPU 驱动与 CUDA 安装:
cmd
nvidia-smi # 查看 GPU 状态
nvcc --version # 查看 CUDA 版本
- 确保 PyCUDA 与 CUDA 版本匹配,重新安装对应版本的 PyCUDA。
- 以管理员身份启动 CMD,重新运行服务。
五、日常使用指南
(一)服务启停(注意先进入spins-env环境)
- 启动:双击
start_maxwell_windows.bat(自动打开两个服务窗口) - 停止:双击
stop_maxwell_windows.bat或直接关闭服务窗口
(二)日志查看
- Webserver 日志:
E:\zpt\maxwell-b\maxwell-server\webserver.log - Simserver 日志:
E:\zpt\maxwell-b\maxwell-server\simserver.log - 实时监控日志(PowerShell):
powershell
Get-Content E:\zpt\maxwell-b\maxwell-server\simserver.log -Wait
(三)配置优化
- 调整 GPU 数量:编辑
start_maxwell_windows.bat,将set NGPUS=1改为实际需要的 GPU 数量(如2)。 - 开机自启动:按
Win+R输入shell:startup,将start_maxwell_windows.bat快捷方式放入启动文件夹。 - 临时文件清理:创建
cleanup_old_files.bat定期清理 7 天前的临时文件:
batch
@echo off
set MAXWELL_SERVER_FILES=E:\zpt\maxwell-server-files
forfiles /P "%MAXWELL_SERVER_FILES%" /D -7 /C "cmd /c del @path" 2>nul
echo 清理完成!
pause
六、总结
通过以上步骤,可在 Windows 环境下无需 Docker 完成 Maxwell-B 的手动部署,核心要点包括:
- 依赖安装需匹配 CUDA 版本,PyCUDA 是 GPU 加速的关键。
- 代码适配是 Windows 部署的核心,需修复进程查询命令和路径分隔符问题。
- 环境变量路径需避免空格,工作目录需手动创建并配置权限。
部署完成后,Maxwell-B 可与 SPINS 协同工作,支持多 GPU 仿真任务,适用于实验室的电磁逆向设计等科研场景。若遇到其他报错,可通过查看日志定位问题,或根据报错信息调整依赖版本、配置参数。
810

被折叠的 条评论
为什么被折叠?



