新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 MongoDB 并行化 Hyperopt 超参数搜索:MongoTrials 与 hyperopt-mongo-worker 完整指南

发布时间:2026/9/28 2:51:05来源:尧图网络
使用 MongoDB 并行化 Hyperopt 超参数搜索:MongoTrials 与 hyperopt-mongo-worker 完整指南
机器学习AutoML【免费下载链接】hyperoptDistributed Asynchronous Hyperparameter Optimization in Python项目地址https://gitcode.com/gh_mirrors/hy/hyperopt点击查看免费下载本文是 Hyperopt 分布式异步超参数优化实战指南围绕MongoTrials后端与hyperopt-mongo-worker工作进程完整讲解如何利用 MongoDB 将单机串行的fmin搜索扩展为多进程并行、可持久化的异步搜索。读完本文你将掌握 mongod 的启动与配置、fmin的异步调用改造、worker 的命令行参数与工作循环原理以及实验数据的持久化复用方法。为什么需要 MongoDB 后端Hyperopt 在设计上支持多种不同的 trial 数据库trial database。默认的Trials对象基于 Python 列表与字典实现见 hyperopt/base.py 中asynchronous False的定义它是官方提供的参考实现易于使用但不支持异步更新——也就是说它无法支撑多个进程同时写入各自的评估结果因此无法用于并行搜索。为了并行化搜索Hyperopt 在 hyperopt/mongoexp.py 中提供了MongoTrials实现它以 MongoDB 作为进程间通信IPC与持久化存储介质将搜索建议、评估结果、日志统一存入库中天然支持异步更新。MongoTrials在源码中显式声明了asynchronous Truemongoexp.pyfmin内部的FMinIter会从trials.asynchronous继承这一行为fmin.py从而走异步调度路径。要运行并行化搜索需要依次完成三件事前提是已安装 MongoDB参考 安装说明在网络可达的位置启动一个mongod进程把对hyperopt.fmin的调用改为使用连接该 mongod 的MongoTrials后端启动一个或多个hyperopt-mongo-worker进程同样连接到该 mongod在fmin阻塞期间真正执行搜索。第一步启动 mongod 进程MongoDB 安装完成后启动数据库进程mongod非常简单例如mongod --dbpath . --port 1234 # 或者为每个数据库分配独立目录推荐方式 mongod --dbpath . --port 1234 --directoryperdb --journal --nohttpinterface # 或者以守护进程方式启动 mongod --dbpath . --port 1234 --directoryperdb --fork --journal --logpath log.log --nohttpinterface几条关键的部署建议均来自原文档实践中值得逐一落实注意磁盘预分配Mongo 出于性能考虑会习惯性预分配数 GB 空间可用--noprealloc关闭所以在创建数据库之前要想清楚把库放在哪里。避免网络文件系统把数据库建在网络文件系统上不仅会让你的数据库性能极差还会拖累网络上其他所有用户务必谨慎。注意安全暴露如果机器对互联网可见要么只绑定回环接口loopback并通过 ssh 连接要么阅读 MongoDB 官方文档启用密码保护。本教程后续内容均基于localhost 的 1234 端口上运行的 mongo。第二步使用 MongoTrials 改造 fmin 调用假设一个最简单的场景用 hyperopt 最小化math.sin函数。在进程内串行运行时可以这样写import math from hyperopt import fmin, tpe, hp, Trials trials Trials() best fmin(math.sin, hp.uniform(x, -2, 2), trialstrials, algotpe.suggest, max_evals10)若要改用 MongoDB 做实验的持久化存储把Trials换成MongoTrials即可import math from hyperopt import fmin, tpe, hp from hyperopt.mongoexp import MongoTrials trials MongoTrials(mongo://localhost:1234/foo_db/jobs, exp_keyexp1) best fmin(math.sin, hp.uniform(x, -2, 2), trialstrials, algotpe.suggest, max_evals10)MongoTrials 连接串的语义第一个参数告诉MongoTrials使用哪个 mongod 进程、以及该进程中的哪个数据库这里为foo_db。从源码看连接串会被MongoJobs.new_from_connection_str解析为协议、用户名、密码、主机名、端口、数据库名与集合名mongoexp.py并支持带认证的 URI 格式例如mongo://hyperopt:foobar127.0.0.1:27017/hyperoptdb/jobs?authSourcedb1该格式由 test_mongoexp.py 中的test_parse_url用例验证。第二个参数exp_keyexp1用于在同一个数据库内部给某一组 trial 打标签便于区分实验该参数技术上可选。注意N.B.当前实现有一个硬性要求——数据库名后面必须跟/jobs即形如db/jobs。main_worker_helper中也有相应兜底逻辑若连接串不含/jobs会自动补上mongoexp.py。数据库 vs exp_key两种组织策略把 trial 放在不同数据库里还是用 exp_key 区分取决于你的偏好用独立数据库可以从 shell 直接操作每个库表现为独立文件且实验之间的独立性/隔离性更强用 exp_keyhyperopt-mongo-worker进程是在数据库级别轮询的因此同一数据库下的多个实验可以同时被同一批 worker 支撑资源复用更高效。第三步运行 hyperopt-mongo-worker如果你直接运行上面的代码片段会看到调用在fmin处阻塞挂起。原因在于MongoTrials对fmin自述为一个异步asynchronoustrial 对象fmin在算法提出新的搜索点后并不会亲自评估目标函数而是静静等待其他进程完成评估并把结果写回 mongodb这正是FMinIter中block_until_doneself.asynchronous的行为见 fmin.py。hyperopt-mongo-worker脚本位于 hyperopt 的bin目录安装 hyperopt 时它应当已被放入你的$PATH。在fmin阻塞期间另开一个 shell 执行hyperopt-mongo-worker --mongolocalhost:1234/foo_db --poll-interval0.1该 worker 会从 mongodb 中取出dequeue一个工作任务评估math.sin函数再把结果写回数据库。当fmin尝试完足够多的搜索点后便会返回上面的脚本随之终止hyperopt-mongo-worker会继续在附近等待几分钟以发现新的任务然后自行退出。这里显式设置了--poll-interval0.1因为 worker 的默认轮询节奏是为单个任务耗时至少一两分钟的作业设计的源码中默认值为 5 秒见下节参数表对math.sin这种微秒级任务必须调小轮询间隔否则大量时间浪费在空等上。hyperopt-mongo-worker 完整参数表main_worker使用optparse解析命令行参数mongoexp.py所有可用参数及默认值如下参数默认值说明--mongolocalhost/hyperopthost[:port]/db用于 IPC 与任务存储的连接串--poll-interval5每 1 T N 秒检查一次工作队列单位秒--exp-keyNone本 worker 任务的标识符按 exp_key 限定可领取的任务--reserve-timeout120.0轮询数据库领取任务的超时上限秒超时抛ReserveTimeout--max-jobssys.maxsize运行完这么多任务后停止默认相当于无限--max-jobs-in-dbsys.maxsize数据库中的任务数达到该阈值后停止--max-consecutive-failures4连续 N 个任务失败则停止--last-job-timeoutNone超过 T 秒后不再领取新任务--workdirNone工作根目录默认从 mongo 中加载--no-subprocesses使用子进程默认开启关闭子进程模式让目标函数与 worker 同进程运行便于跨评估复用大块内存数据但需警惕内存泄漏其中--poll-interval同时控制 worker 空转时的随机休眠区间MongoWorker在未领取到任务时会按1 random * (poll_interval - 1)秒随机休眠后再次轮询mongoexp.py避免多 worker 同时打满数据库。源码级原理worker 的工作循环与任务状态机要理解hyperopt-mongo-worker为何能支撑并行搜索需要从 hyperopt/mongoexp.py 顶部的模块文档与MongoWorker.run_onemongoexp.py看起。IPC 依赖的三个集合实验通过三个 MongoDB 集合完成进程间通信jobs存储建议的 trial 及其结果的标准文档关键字段包括spec搜索算法suggest返回的子文档exp_key哪个 driver 建议了该 trial 的标识cmd标识如何调用evaluate的(protocol, ...)元组state任务状态 0/1/2/3新建、运行中、成功、失败owner新任务为None被领取后为(hostname, pid)book_time/refresh_time任务被保留的时间与运行进程最近一次签到时间resultevaluate返回的结果子文档error失败state3任务的原因logs由 ctrl 对象写入的 info/warn/error 消息序列字典。fsGridFS 存储集合用于 pickle 序列化大对象drivers描述 driver 的文档用于防止两个 driver 同时使用同一 exp_key并可挂载实验类保存状态、pickle 的 bandit 重建参数等附件。状态机与抢占式领取任务状态常量定义在 hyperopt/base.pyJOB_STATE_NEW 0、JOB_STATE_RUNNING 1、JOB_STATE_DONE 2、JOB_STATE_ERROR 3。worker保留reserve任务的方式是在jobs集合中原子地找到一个owner为None且state为 0 的文档并将其状态置为 1mongoexp.py。若找不到这样的任务就随机休眠几秒后继续轮询。MongoWorker.run_one的完整流程是循环mj.reserve()直到成功受reserve_timeout限制→ 从job[misc]还原 spec → 按cmd协议反序列化目标函数 → 在临时工作目录中执行worker_fn(spec, ctrl)→ 将结果SONify后通过ctrl.checkpoint(result)写回 → 最后把任务状态更新为JOB_STATE_DONE失败则写JOB_STATE_ERROR并记录异常类型与信息。信号控制与子进程模式main_worker_helpermongoexp.py提供了两类运维能力信号处理SIGINT/SIGTERM/SIGHUP触发干净关闭Shutdown非 Windows 平台下SIGUSR1触发“等当前子进程正常结束后退出”WaitQuit。子进程隔离默认开启子进程模式——每个任务通过递归Popen以--max-jobs1再启动一个独立进程执行以防护内存泄漏与不良清理代价是大型数据集需要在每个子进程中重新加载一次。这就是--no-subprocesses参数存在的意义。MongoTrials 是持久化对象重跑、扩展与只读分析MongoTrials的数据全部落在 mongodb 中因此它天然具备持久化语义。如果你把上面的示例再运行一次best fmin(math.sin, hp.uniform(x, -2, 2), trialstrials, algotpe.suggest, max_evals10)会看到它立刻返回、什么都没发生——因为所连接的数据库里已经有足够的 trial 了第一次实验的结果早已计算并存储在其中。基于这一特性可以灵活操作开始一次新搜索更换数据库名或exp_key扩展当前搜索用更大的max_evals再次调用fmin继续追加搜索点只读分析另起进程创建MongoTrials仅用于分析库中已有结果完全不需要调用fmin。从实现上看MongoTrials本质上是MongoJobs集合的包装器mongoexp.py它面向“读取trial 数据库”设计若需要直接修改集合中的文档应取.handle属性MongoJobs实例使用底层方法或 pymongo 接口写完后调用refresh()/refresh_tids()让本地视图与数据库同步。验证与测试仓库里的集成测试怎么做仓库在 hyperopt/tests/integration/test_mongoexp.py 中提供了针对 MongoDB 后端的集成测试可直接作为本地环境验证的参考TempMongo上下文管理器test_mongoexp.py会以mongod --dbpath ... --noprealloc --port22334启动临时数据库实例等待就绪后返回连接串localhost:22334/db/jobs退出时清理进程与目录test_parse_url覆盖了带用户名密码与authSource参数的连接串解析测试中还通过main_worker_helper、MongoWorker、ReserveTimeout等组件验证 worker 侧的领取与执行链路test_mongoexp.py。你可以用pytest hyperopt/tests/integration/test_mongoexp.py运行这组测试确认本机 mongod 与 hyperopt 的 mongo 后端配合正常。小结从串行到并行的三步改造把一次 hyperopt 搜索从单进程串行改为 MongoDB 驱动的并行异步搜索核心动作可以浓缩为三步启动 mongod注意预分配、网络文件系统与安全绑定问题→ 将fmin的trials参数从Trials换成指向mongo://host:port/db/jobs的MongoTrials可用exp_key在库内隔离实验→ 启动一个或多个hyperopt-mongo-worker承担实际评估按任务耗时调节--poll-interval按资源情况决定是否使用子进程模式。之后MongoDB 会替你持久化每一次评估搜索可以随时扩展、复用或由只读进程分析——这正是 Hyperopt 分布式异步超参数优化的核心工作方式。赞分享机器学习AutoML【免费下载链接】hyperoptDistributed Asynchronous Hyperparameter Optimization in Python项目地址https://gitcode.com/gh_mirrors/hy/hyperopt点击查看免费下载相关推荐DiffSynth Studio重新定义扩散模型应用边界的全能引擎DiffSynth Studio重新定义扩散模型应用边界的全能引擎 在人工智能内容生成的浪潮中你是否曾为复杂的模型部署而烦恼是否曾因显存不足而无法体验最新人工智能大模型媒体生成深度学习预训练微调使用 SparkTrials 在 Apache Spark 集群上分布式扩展 Hyperopt 超参数搜索使用 SparkTrials 在 Apache Spark 集群上分布式扩展 Hyperopt 超参数搜索 Hyperopt 的 SparkTrials 类可以机器学习AutoMLHyperopt MongoDB配置完整指南从零开始搭建分布式参数优化系统Hyperopt MongoDB配置完整指南从零开始搭建分布式参数优化系统 Hyperopt是一个强大的Python库专门用于分布式异步超参数优化。通过Mo机器学习AutoML上一篇3个步骤搞定手机变摄像头DroidCam高效部署指南下一篇虚拟手柄驱动解放双手Windows即插即用游戏控制器模拟完全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

桌面 AI 自动化落地实战:OpenClaw v2.7.9 双端一键部署与 TaoToken 配置指南(含安装包) 2026/9/28 3:57:14

桌面 AI 自动化落地实战:OpenClaw v2.7.9 双端一键部署与 TaoToken 配置指南(含安装包)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
GetQzonehistory:一键导出QQ空间历史说说Excel的完整备份方案 2026/9/28 3:57:14

GetQzonehistory:一键导出QQ空间历史说说Excel的完整备份方案

GetQzonehistory:一键导出QQ空间历史说说Excel的完整备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 手动复制一条空间说说大约要10秒。如果你账号里有3000条历史说…

阅读更多 →
VS Code安装流程配 TaoToken:settings.json 骨架与连通性验证 2026/9/28 3:57:14

VS Code安装流程配 TaoToken:settings.json 骨架与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何在本地跑通 AReaL:LLM Agent 异步强化学习训练完整指南 2026/9/28 3:57:14

如何在本地跑通 AReaL:LLM Agent 异步强化学习训练完整指南

如何在本地跑通 AReaL:LLM Agent 异步强化学习训练完整指南 【免费下载链接】AReaL The RL Bridge for LLM-based Agent Applications. Made Simple & Flexible. 项目地址: https://gitcode.com/GitHub_Trending/are/AReaL 把你 Agent 应用里的模型 API …

阅读更多 →
国内网站统计工具的售后服务对比 2026/9/28 3:57:14

国内网站统计工具的售后服务对比

直答:网站统计工具的售后不只看客服响应速度,更要看文档是否完善、技术支持是否分档位、出问题时能不能帮你定位到代码层面。选型时大家都在比功能、比价格,很少有人比售后服务。直到某天凌晨两点,大促前一天晚上发现数据看板一片…

阅读更多 →
Python快速入门专业版(二十七):函数参数:位置参数与关键字参数(避免参数传递错误) 2026/9/28 3:57:08

Python快速入门专业版(二十七):函数参数:位置参数与关键字参数(避免参数传递错误)

在函数的使用过程中, 参数传递这个环节是连接函数定义和函数调用的桥梁, 同时它也是特别容易出错的点。很多刚开始学编程的人, 在调用函数的时候, 经常会因为把参数的顺序搞反了, 或者是把参数的名字弄混淆了, 从而让程序报错, 或者导致逻辑出现错误。其实呢, 这边只提供了两种…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉