spearmint
Spearmint 是一款基于贝叶斯优化算法的开源工具,旨在帮助用户以最高的效率寻找机器学习模型或其他复杂系统的最佳参数配置。它核心解决的是“调参难、成本高”的问题:在传统方法需要大量试错实验的情况下,Spearmint 能够智能地迭代调整参数,用尽可能少的实验次数找到目标函数的最小值,从而大幅节省计算资源和时间。
这款工具特别适合机器学习研究人员、数据科学家以及需要优化复杂实验流程的开发者使用。无论是单机环境还是集群部署,Spearmint 都能自动管理实验的启动与记录。其技术亮点在于模块化设计,支持多种采集函数(如期望改进、UCB 等),并提供两种运行模式:完整版可自动封装并执行代码实验;轻量版(Spearmint-lite)则通过文件交互提出建议,允许用户手动执行实验(甚至适用于非代码类实验),提供了极高的灵活性。
需要注意的是,当前仓库主要处于维护状态,核心团队已转向开发功能更强大的新版本(采用非商业许可),但现有版本依然稳定可用,尤其适合希望免费使用且熟悉 Python 2.7 环境的用户。
使用场景
某深度学习团队正在训练一个复杂的卷积神经网络,急需找到最优的超参数组合以在有限算力下最大化模型准确率。
没有 spearmint 时
- 研究人员依赖人工经验或简单的网格搜索调整学习率、动量等参数,往往需要数百次试错才能碰巧接近最优解。
- 每次实验需手动修改配置文件并重启训练脚本,大量时间浪费在重复的启动操作和结果记录上,效率极低。
- 由于缺乏智能引导,许多计算资源被消耗在明显表现不佳的参数区域,导致昂贵的 GPU 算力被严重浪费。
- 团队成员难以并行协作,多人同时调整参数时容易发生冲突,且无法实时共享最新的实验进展数据。
使用 spearmint 后
- spearmint 基于贝叶斯优化算法自动推断下一个最有希望的参数组合,将寻找最优解所需的实验次数从数百次缩减至几十次。
- 通过编写简单的包装器脚本,spearmint 自动接管实验的启动、参数注入及结果回传流程,实现了全流程无人值守运行。
- 系统能智能避开低效参数空间,优先探索高潜力区域,确保每一次 GPU 运行都产生最大化的信息增益。
- 支持集群环境下的并行调度,自动管理多个并发实验的任务队列,让团队成员能专注于模型架构设计而非调参琐事。
spearmint 的核心价值在于将盲目且耗时的超参数搜索转化为一种高效、自动化的科学实验过程,极大降低了机器学习模型的迭代成本。
运行环境要求
- Linux (Ubuntu 11.0+)
- macOS
未说明
未说明

快速开始
新的代码仓库! 正如你可能已经注意到的那样,这个仓库的开发在一段时间内仅限于维护和修复 bug。原因是大家正在共同努力,将 Spearmint 重构为一个新的代码库。这包括算法/理论层面以及工程实现上的改进。你可以在 https://github.com/HIPS/Spearmint 上查看新仓库。请注意,新仓库采用非商业许可,并要求签署贡献者许可协议。如果你不愿意接受该许可,仍然可以自由使用这里的代码(尽管它稍显陈旧)。
Spearmint
Spearmint 是一个用于执行贝叶斯优化的软件包,其算法基于以下论文:
机器学习算法的实用贝叶斯优化
Jasper Snoek, Hugo Larochelle 和 Ryan P. Adams
神经信息处理系统进展, 2012
该代码旨在以自动化的实验方式运行(因此得名“spearmint”),通过迭代调整多个参数,在尽可能少的试验次数内最小化某个目标函数。
Spearmint 是由 哈佛大学 和 多伦多大学 的机器学习研究人员合作开发的成果。
依赖项
本软件包需要以下依赖:
Python 2.7
Numpy 版本 1.6.1+ 在 Ubuntu Linux 上,你可以使用以下命令安装该包:
apt-get install python-numpyScipy 版本 0.9.0+ 在 Ubuntu Linux 上,你可以使用以下命令安装该包:
apt-get install python-scipyGoogle Protocol Buffers(用于完全自动化版本)。 请注意,你应该能够从源码编译安装 protocol-buffers,而无需管理员权限。否则,在 Ubuntu Linux 上,你可以使用以下命令安装该包:
apt-get install python-protobuf
而在 Mac 上(如果你使用 homebrew),则可以使用:
brew install protobuf
然后在 spearmint 子目录下运行以下命令:
bin/make_protobufs
本软件包已在 Ubuntu Linux(11.0 及以上版本)和 Mac OS X 上进行过测试。
该代码由多个部分组成。它被设计为模块化结构,允许替换不同的“驱动器”和“选择器”模块。“选择器”模块实现了诸如期望改进、UCB 或随机等采集函数。“驱动器”则决定了实验如何在系统上分布和运行。由于该代码旨在并行运行实验(一旦有结果就立即启动新实验),因此需要一定的工程实现。目前的实现位于“spearmint”和“spearmint-lite”子目录中:
Spearmint 旨在自动管理单机或集群环境中的实验启动及相应记录工作。为此,你需要提供一种受支持的语言(当前为 Python 或 Matlab)的“包装器”,以及一个配置文件,详细说明待调优的参数及其取值范围。包装器必须接受参数值,并返回一个你希望针对这些参数最小化的数值。Spearmint 将以一种寻求用最少评估次数(或成本)找到最小值的顺序,反复调用包装器,尝试不同的参数设置。
Spearmint-lite 是代码的精简版。 此版本仅通过一个平面文件驱动,不会自动运行实验。相反,它会提出新的实验方案(可能一次提出多个),并要求用户填写实验结果。这非常适合那些不适合编写包装器的情况(例如,实验根本不涉及代码),或者用户希望对整个过程拥有完全控制权的情形。此外,对 Google protocol buffers 的依赖也被 JSON 替代。
运行自动化代码:Spearmint
了解该代码最简单的方式可能是先看一个示例。要开始一项新实验,你需要创建一个包含包装器脚本和配置文件的目录。 我们为你准备了一个简单的示例,用于优化 examples/braninpy 子目录下的“Braninhoo”基准测试。请查看 config.pb 文件。它以 protocol buffer 格式包含了算法的规范。为了指定你的优化任务,你需要填写 “language”(例如 PYTHON 或 MATLAB)和 “name”(即你要优化的包装器函数名称)这两个变量。
接下来是一份“variables”列表,指定了你希望优化的变量名称、类型和数量。每个变量必须是 FLOAT、INT 或 ENUM 类型,分别对应连续实值参数、整数序列和分类变量。MAX 和 MIN 指定了优化变量的取值范围,而 SIZE 则表示具有这些范围和类型的变量数量。Spearmint 将以字典形式调用你的包装器函数,其中包含按“size”大小排列的各变量值,你可以通过指定的名称来访问它们。
现在请查看 branin.py(即 config.pb 顶部 “name” 变量中指定的包装器)。你会看到该文件包含一个函数 “main(job_id, params)”。你的包装器必须包含此函数,Spearmint 会在调用时传入一个 job_id(对你来说可能并不重要)和一个名为 “params”的字典,其中包含了 Spearmint 计划运行的下一次实验的参数向量。主函数应接收这些参数,并返回一个代表在这些输入下观测到的目标函数值的实数。
要安装 Spearmint,请进入 spearmint 子目录并输入以下命令(通常需要加上 sudo):
python setup.py install
你应该将 spearmint 子目录添加到你的 PYTHONPATH 环境变量中。需要注意的是,你有时可以省略上述步骤,但可能需要手动将所有相关模块添加到 PYTHONPATH,并通过 main.py 从该目录调用 spearmint。
要运行 Spearmint,请进入 /bin 子目录并输入以下命令:
./spearmint ../examples/braninpy/config.pb --driver=local --method=GPEIOptChooser --method-args=noiseless=1
或者在 /spearmint 子目录中运行:
python main.py --driver=local --method=GPEIOptChooser --method-args=noiseless=1 ../examples/braninpy/config.pb
这将以 GP-EI MCMC 策略运行 Spearmint。代码将依次启动调用包装函数的进程,并轮询结果。
你会看到,代码会打印出当前已知的最佳(即最低)观测值,以及与高斯过程超参数采样和待优化候选点相关的数字序列。“method”参数指定了要使用的采集函数模块,“method-args”则用于传递该采集函数特有的参数。在本例中,由于 Branin 函数是解析函数,我们告诉高斯过程超参数采样过程不要尝试估计噪声。正确设置这一参数对于优化的顺利进行至关重要。如果你的算法是完全确定性的(例如解析函数),那么将其指定为无噪声将显著加快优化速度。然而,如果你的算法并非确定性(正如大多数机器学习算法及昂贵实验通常所具备的特性),则应省略此参数或将其设为 noiseless=0。
让程序运行一段时间后,你会发现当前最佳值逐渐下降,最终达到约 0.39 的最小值。你可以随时通过 Ctrl+C 来终止进程,并且只需重新运行 Spearmint 命令即可从上次中断的地方继续执行。
回到 braninpy 目录,你会看到 Spearmint 生成的若干新文件,用于记录和管理优化过程。其中值得关注的是 trace.csv 文件和 output 目录。“trace.csv”记录了迄今为止所有运行过的实验及其最佳结果(以及该结果对应的实验编号),按时间顺序排列。文件的每一行以 CSV 格式包含以下信息:时间戳、截至该时间戳的最佳观测值、对应的最佳观测值的作业 ID、剩余的潜在候选点数量、正在运行(未完成)的实验数量,以及已完成的实验总数。output 目录则为每个作业 ID 保存了一个文本文件,内容是该作业的输出(标准输出和标准错误)。因此,如果你想查看最佳作业的输出(如 trace.csv 所示),只需在 output 目录中查找对应的 job-id.txt 文件即可。
如果你正在调试代码,或者代码因某种原因崩溃,查看这些文件将非常有帮助。此外,为了方便起见,Spearmint 每次迭代还会生成一个名为 best_job_and_result.txt 的文件,其中包含当前最佳结果、其对应的作业 ID,以及与该结果相关的所有参数名称和取值的完整列表。
我们还提供了一个名为 bin/cleanup 的脚本,用于彻底重启一次实验并删除所有结果及中间文件。只需运行 bin/cleanup <experiment_dir> 即可。
Matlab 代码同样可以使用本工具包进行优化。为此,你需要在 config.pb 文件中指定 “type: Matlab”,并使用一个与 config.pb 中“name”字段一致的 Matlab 包装函数。该包装函数必须定义一个与文件名相同的函数,格式如下:“function result = braninhoo(job_id, params)”。上述示例假设文件名为 “braninhoo.m”。Spearmint 将向该包装函数传递一个作业 ID 和一个名为 “params”的 Matlab 结构体,其字段由 config.pb 中指定的变量决定。有关与上述 Python 示例 brinapy 对应的 Matlab 示例,请参阅 braninhoo 子目录。
若需并行运行多个作业,可在运行 Spearmint 时添加参数:--max-concurrent=<#jobs>。
Spearmint 设计为可在单机多核处理器或多节点集群环境中并行运行。不过,不同环境需要不同的任务队列管理和故障检测机制,因此分别以“驱动器”模块的形式实现。目前提供了两种驱动器模块,用户也可以根据特定环境的需求轻松开发新的驱动器模块(请参阅驱动器子目录中的示例)。
通过使用 --driver=sge 参数,Spearmint 可以在配备 Sun Grid Engine 的系统上运行,并利用 SGE 的队列机制,在多节点集群上以容错方式并行分配实验任务。该模式尤其适用于 Amazon EC2 环境。结合 StarCluster 工具,你可以在几分钟内搭建一个大型集群并开始分配实验任务。
而使用 --driver=local 参数,则可在单台具有多核处理器的机器上运行 Spearmint。该驱动器会在当前机器上直接启动新进程来执行新实验。不过,这种方式无法实现跨多台机器的任务分配。
网页状态页面
使用标志 -w 运行 Spearmint 会启动一个本地 Web 服务器,该服务器将以比命令行界面更加易懂和直观的方式显示有关优化运行的有用信息和统计数据。Spearmint 将提供一个指向状态页面的链接,您可以直接将其粘贴到浏览器窗口中。
运行基础代码:Spearmint-lite
Spearmint-lite 的设计旨在简单易用。要在 spearmint-lite 中运行实验,请按照上述说明创建一个子目录。同样地,braninpy 目录被用作演示示例。在这种情况下,必须以 JSON 格式在 config.json 文件中提供实验规范。您需要将问题表示为一系列 JSON 对象。与上述 Protocol Buffers 格式一样,每个对象都必须包含名称、类型(浮点数、整数或枚举)、最小值、最大值和大小。除此之外无需再指定其他内容。
返回顶级目录并运行:
python spearmint-lite.py braninpy
Spearmint-lite 将执行一次贝叶斯优化迭代,并将结果写入 braninpy 子目录下的 results.dat 文件中。results.dat 文件中的每一行都由空格分隔,格式如下:
<结果> <耗时> <参数列表,顺序与 config.json 中一致>
每次运行 Spearmint 时,它都会提出新的实验并将其追加到 results.dat 文件中。每个新提出的实验都会有一个标记为“pending”的结果和耗时,用字母 P 表示。用户随后需要执行该实验并填写这些值。请注意,如果选择器模块不使用耗时信息(目前只有 GPEIperSecChooser 使用),则可以安全地将耗时设置为任意值。Spearmint 在提出新实验时会基于待处理的实验进行条件判断,因此可以并行进行任意数量的实验。
此外,还提供了一个脚本 cleanup.sh,用于彻底清理实验目录中的所有中间文件和结果,并从头开始重新启动实验。
选择器模块:
选择器模块实现了用于指示 Spearmint 下一步应运行哪个任务的功能。其中一些对应于贝叶斯优化文献中的“采集函数”。Spearmint 接受 --method=ChooserModule 参数,允许轻松切换不同的采集函数。选择器还可以选择性地包含一些参数,这些参数可以通过 --method-args=argument1,argument2,etc 参数传递给 Spearmint。例如,这些参数可能包括要使用的高斯过程超参数样本数量。有关特定选择器的参数说明,请参阅选择器文件中的注释。以下是本软件包中提供的选择器模块描述:
SequentialChooser: 使用高差异性的 Sobol 序列选择下一个实验。实验按从粗到细的网格顺序依次进行。
RandomChooser: 实验从单位超立方体中随机采样。
GPEIOptChooser: 来自论文中的 GP EI MCMC 算法。首先在单位超立方体上的密集网格上对任务进行密集采样,然后根据 EI 准则对最佳候选者进行“微调”优化。
GPEIperSecChooser: 来自论文中的每秒 EI 值算法。与 GPEIOptChooser 类似,但不同之处在于,点是根据每秒 EI 值准则进行优化和评估的,每个任务都根据预期的实验运行时间进行了加权。
GPEIChooser: 在单位超立方体上对点进行密集采样,并根据 EI 准则返回最佳点。此方法比 GPEIOptChooser 快得多,在搜索空间被网格密集覆盖的低维情况下表现良好。
重要提示!
在估计噪声时,关于噪声的高斯过程先验假设噪声水平“较低”(例如介于 -1 到 1 之间)。如果实际情况并非如此,请务必对您的函数进行缩放,使其满足这一假设(例如使函数值大致位于 -1 到 1 之间)。否则,算法可能会陷入错误的高噪声模式,从而导致性能不佳。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器