Ray Tune 容错机制实战指南:实验级恢复与 Trial 级故障处理
人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载导读在分布式机器学习实验中节点因内存溢出OOM、磁盘占满、网络抖动或抢占式 Spot 实例回收而宕机是常态。Ray Tune 提供了一套完整的容错体系实验级容错通过Tuner.restore从断点恢复被中断的实验Trial 级容错通过FailureConfig自动重调度失败的单个 Trial。读完本文你将掌握如何在 Ray Tune 中启用实验级与 Trial 级容错包括恢复被中断的实验、配置自动恢复auto-resume、处理 Ray 对象引用与 Ray Data 的恢复以及设置单个 Trial 的最大失败重试次数。容错机制能带来的两个直接收益保存训练进度、节省时间与算力即使节点失败也不会从头再来以及在分布式场景下充分利用可抢占的 Spot 实例以降低成本。注意在分布式Tune 实验中启用容错的前提是先配置某种持久化存储将所有 Trial 结果与检查点汇总到统一位置参见 tune-storage-options。本文中恢复实验用到的~/ray_results/tune_fault_tolerance_guide目录正是一个本地持久化示例。实验级容错恢复被中断的整个实验实验级容错的核心 API 是Tuner.restore源码位于 python/ray/tune/tuner.py它可以从上次中断的位置继续一个此前被打断的实验。什么场景应该使用Tuner.restore根据 tune-fault-tolerance.rst 的说明以下三种情况适合使用恢复机制调用Tuner.fit()的驱动脚本出错退出例如头节点内存耗尽或磁盘占满实验被人为用CtrlC中断整个集群连同实验一起因瞬时错误崩溃例如网络中断、Ray 对象存储内存耗尽。需要特别澄清Tuner.restore的边界它不是用来恢复一个已终止的实验然后修改超参数搜索空间或停止条件的。实验恢复的目的是精确地重新完成之前通过Tuner.fit()提交的那个任务。例如一个配置为运行 10 个训练迭代且所有 Trial 已完成的实验你不能通过Tuner.restore把它改造成 20 个迭代继续训练——正确做法是开启一个新实验并用上一个实验的检查点初始化模型权重参见 tune-iterative-experimentation FAQ。另一个关键限制用户自定义训练循环中的 bug 无法靠恢复解决。导致实验崩溃的原因必须是瞬时性ephemeral的这样恢复后的重试才有成功可能。从源码看Tuner.restore的 docstring 也强调恢复路径必须指向可信的实验目录——实验状态使用 pickle 序列化从不可信路径恢复会执行任意 Python 代码见 tuner.py 的 warning。恢复一个 Tune 实验完整示例下面的训练函数演示了容错的前提条件——Trainable 必须实现检查点的保存与加载详见 tune-trial-checkpoint否则恢复后无法续接训练进度。完整示例代码位于 doc/source/tune/doc_code/fault_tolerance.pyimport json import os import tempfile from ray import tune def trainable(config): # 检查点加载恢复时从这里继续 checkpoint tune.get_checkpoint() start 1 if checkpoint: with checkpoint.as_directory() as checkpoint_dir: with open(os.path.join(checkpoint_dir, checkpoint.json), r) as f: state json.load(f) start state[epoch] 1 for epoch in range(start, config[num_epochs]): # 训练逻辑... # 检查点保存 with tempfile.TemporaryDirectory() as temp_checkpoint_dir: with open(os.path.join(temp_checkpoint_dir, checkpoint.json), w) as f: json.dump({epoch: epoch}, f) tune.report( {epoch: epoch}, checkpointtune.Checkpoint.from_directory(temp_checkpoint_dir), ) tuner tune.Tuner( trainable, param_space{num_epochs: 10}, run_configtune.RunConfig( storage_pathos.path.expanduser(~/ray_results), nametune_fault_tolerance_guide, ), ) result_grid tuner.fit()要点解读检查点加载通过tune.get_checkpoint()获取最新检查点用checkpoint.as_directory()解包到本地目录并读取其中的checkpoint.json从而拿到上次完成的epoch训练从epoch 1续跑检查点保存每个 epoch 将状态写入临时目录并通过tune.report(..., checkpointtune.Checkpoint.from_directory(...))上报指标与检查点结果落盘实验的结果与检查点按照RunConfig配置保存到~/ray_results/tune_fault_tolerance_guidestorage_path为~/ray_resultsname为tune_fault_tolerance_guide。当实验因前述任一原因中断后用这个路径即可恢复tuner tune.Tuner.restore( os.path.expanduser(~/ray_results/tune_fault_tolerance_guide), trainabletrainable, resume_erroredTrue, ) tuner.fit()技巧也可以从云存储桶路径恢复只需把path换成s3://前缀tuner tune.Tuner.restore( paths3://cloud-bucket/tune_fault_tolerance_guide, trainabletrainable )从Tuner.restore的源码签名tuner.py可以看到它支持的完整参数path、trainable、resume_unfinished、resume_errored、restart_errored、param_space、storage_filesystem以及实验性的_resume_config。其中trainable必须与初始化原 Tuner 时使用的 trainable 一致。恢复配置控制哪些 Trial 被恢复Tune 允许根据实验中断时各 Trial 的状态精细配置恢复行为中断时处于RUNNING状态的未完成 Trial 默认会被恢复处于ERRORED状态的 Trial 可以选择从检查点恢复resume或从零重跑restart已经TERMINATED的 Trial无法被恢复。对应源码中的三个开关语义详见 tuner.py 的 docstringtuner tune.Tuner.restore( os.path.expanduser(~/ray_results/tune_fault_tolerance_guide), trainabletrainable, resume_erroredTrue, # 出错 Trial从最新检查点恢复 restart_erroredFalse, # 出错 Trial若为 True 则强制从零重跑不加载检查点 resume_unfinishedTrue, # 未完成 Trial继续运行False 则标记为终止 )从源码实现看这三个标志最终会转换为ResumeConfig定义在 python/ray/tune/tune_config.pyresume_unfinishedTrue对应ResumeType.RESUME否则为SKIP而resume_errored与restart_errored分别映射出错 Trial 的RESUME与RESTARTtuner.py。此外已完成的 Trial 始终会被加入结果总览表但不会被恢复运行。自动恢复Auto-resume单脚本复用在生产环境中往往希望一个脚本同时承担两种职责(1) 首次运行时启动初始训练(2) 若已有运行记录则直接恢复实验。此时可用Tuner.can_restore工具源码见 tuner.py其 docstring 中即给出了此复用模式的用法import os from ray import tune storage_path os.path.expanduser(~/ray_results) exp_name tune_fault_tolerance_guide path os.path.join(storage_path, exp_name) if tune.Tuner.can_restore(path): tuner tune.Tuner.restore(path, trainabletrainable, resume_erroredTrue) else: tuner tune.Tuner( trainable, param_space{num_epochs: 10}, run_configtune.RunConfig(storage_pathstorage_path, nameexp_name), ) tuner.fit()脚本第一次运行时can_restore返回False走新建 Tuner 的分支启动初始训练第二次运行首次运行已中断时can_restore返回True自动切换到恢复分支从第一次运行的输出续跑。can_restore还支持传入自定义storage_filesystempyarrow.fs.FileSystem适用于自定义文件系统场景。进阶使用 Ray 对象引用时如何恢复实验实验恢复通常发生在与原运行不同的 Ray session中此时 Ray 对象引用会被自动垃圾回收。如果在实验状态里保存了对象引用例如保存在每个 Trial 的 config 中恢复后去ray.get这些引用将无法正常工作——因为引用指向的对象已经不存在了。解决办法是重新创建这些对象、放入 Ray 对象存储然后把新的对象引用传给 Tune。Tuner.restore的param_space参数正是为此设计的——它期望param_space与原实验未修改恢复时只使用其中更新过的对象引用tuner.py。示例对ray.put的大模型对象引用做网格搜索假设我们有一批大型预训练模型例如用于计算 Inception Score 的图像分类模型想对选哪个模型做调优每个 Trial 从对象存储中取一个模型使用。完整代码在 fault_tolerance.pyimport ray from ray import tune class LargeModel: def __init__(self, model_id): self.model_id model_id # Load weights based on the model_id... def train_fn(config): # 从对象存储中检索模型 model ray.get(config[model_ref]) print(model.model_id) # 模型可能很大因此用 ray.put 放入对象存储以在 Trial 间共享 model_refs [ray.put(LargeModel(1)), ray.put(LargeModel(2))] tuner tune.Tuner( train_fn, # 对对象引用做调优 param_space{model_ref: tune.grid_search(model_refs)}, run_configtune.RunConfig( storage_pathos.path.expanduser(~/ray_results), namerestore_object_refs ), ) tuner.fit()恢复时只需通过param_space重新指定对象引用——先重建对象并ray.put再把新引用交给Tuner.restore# 重新创建对象并放入对象存储 param_space { model_ref: tune.grid_search([ray.put(LargeModel(1)), ray.put(LargeModel(2))]) } tuner tune.Tuner.restore( os.path.expanduser(~/ray_results/restore_object_refs), trainabletrain_fn, # 重新指定 param_space 以更新对象引用 param_spaceparam_space, resume_erroredTrue, ) tuner.fit()对 Ray Data 做调优时的恢复如果你调优的是 Ray Data 数据集同样需要在param_space中重新指定它们——Ray Data 内部可能包含对象引用所以上文描述的问题同样适用。示例ds_1 ray.data.from_items([{x: i, y: 2 * i} for i in range(128)]) ds_2 ray.data.from_items([{x: i, y: 3 * i} for i in range(128)]) param_space { datasets: {train: tune.grid_search([ds_1, ds_2])}, } tuner tune.Tuner.restore(..., param_spaceparam_space)Trial 级容错用FailureConfig处理单个 Trial 失败与实验级容错针对整个实验中断不同Trial 级容错处理的是集群中单个 Trial 的失败常见诱因包括使用可抢占的 Spot 实例运行瞬时网络连接问题节点内存溢出或磁盘占满。Ray Tune 通过FailureConfig配置单个 Trial 的失败处理策略FailureConfig在 python/ray/tune/impl/config.py 中定义。仍以上文实现了检查点保存与加载的trainable为例配置方式如下from ray import tune tuner tune.Tuner( trainable, param_space{num_epochs: 10}, run_configtune.RunConfig( storage_pathos.path.expanduser(~/ray_results), nametrial_fault_tolerance, failure_configtune.FailureConfig(max_failures3), ), ) tuner.fit()其行为语义是当某个 Trial 遇到运行时错误时上述配置会重新调度该 Trial 最多max_failures3次类似地如果节点 X 发生故障如被抢占或失去连接该配置会把原本运行在节点 X 上的所有 Trial 重新调度最多重试 3 次。从底层实现看max_failures正是Trial对象的一个核心字段见 python/ray/tune/experiment/trial.py 与 python/ray/tune/experiment/experiment.py默认值为0即不重试。其工作机制是Trial 失败后Tune 的执行控制器会依据FailureConfig决定是否将 Trial 重新入队并在每次重试时优先加载该 Trial 最近一次保存的检查点继续训练——这正是前文 Trainable 中检查点加载逻辑发挥作用的地方只有实现了tune.get_checkpoint()的正确读取重试才能从断点续跑而非从头开始。实践建议将FailureConfig(max_failuresN)与持久化存储如云存储路径结合使用是应对 Spot 实例抢占的标准组合。抢占发生时节点上的 Trial 自动迁移到新节点并从检查点恢复配合较大的max_failures值可以在不牺牲训练进度的前提下大幅降低实例成本。总结本指南覆盖了 Ray Tune 提供的两类容错能力容错层级核心 API / 配置适用场景关键参数实验级Tuner.restore/Tuner.can_restore驱动脚本崩溃、CtrlC 中断、整个集群瞬时故障resume_unfinished、resume_errored、restart_errored、param_spaceTrial 级FailureConfigSpot 实例抢占、网络抖动、节点 OOM / 磁盘占满max_failures两个层级的共同前提是Trainable 必须正确实现检查点的保存与加载且实验配置了持久化存储。实验级容错用于把整个实验从断点拉回来Trial 级容错用于在实验运行中自动消化单个 Trial 的失败当两者配合使用时即使面对恶劣的分布式环境长时间运行的调优任务也能以最小的人力干预稳定跑完。如需进一步深入可继续阅读仓库中的相关文档tune-storage-options持久化存储配置、tune-distributed-ref分布式实验、tune-trial-checkpoint检查点机制以及本文所有示例的完整可运行源码 fault_tolerance.py 和恢复逻辑核心实现 tuner.py。赞分享人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载相关推荐Ray RLlib 容错与弹性训练完全指南EnvRunner 恢复、环境级容错与 Ray Tune 实验级恢复Ray RLlib 容错与弹性训练完全指南EnvRunner 恢复、环境级容错与 Ray Tune 实验级恢复 本文是 Ray RLlib 官方文档 faul人工智能分布式训练强化学习任务调度模型推理服务Ray Train 故障恢复与实验恢复指南旧版 API 的容错机制详解Ray Train 故障恢复与实验恢复指南旧版 API 的容错机制详解 本指南基于 Ray 开源仓库中 fault tolerance deprecated人工智能分布式训练强化学习任务调度模型推理服务Ray Train 容错机制实战指南Worker 故障、节点抢占与 Job Driver 恢复Ray Train 容错机制实战指南Worker 故障、节点抢占与 Job Driver 恢复 Ray Train 是 Ray 分布式运行时提供的分布式训练框人工智能分布式训练强化学习任务调度模型推理服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

NumPy 1.14.3 补丁版本解析:recarray 兼容、打印格式修复与 Python 2.7/3.4-3.6 支持细节

NumPy 1.14.3 补丁版本解析:recarray 兼容、打印格式修复与 Python 2.7/3.4-3.6 支持细节

科学计算数据分析 【免费下载链接】numpy The fundamental package for scientific computing with Python. 项目地址: https://gitcode.com/gh_mirrors/nu/numpy 点击查看 免费下载 本文围绕 NumPy 1.14.3 这一 bugfix 版本,逐一拆解其三个核心修复点&…

2026/9/20 19:59:44 阅读更多 →
公司网站自己可做吗:避坑与晋升实战速查手册

公司网站自己可做吗:避坑与晋升实战速查手册

公司网站自己可做吗:避坑与晋升实战速查手册 改个需求建站公司拖一周,这种痛谁懂?很多老板或技术负责人都在问: 公司网站自己可做吗? 别急着回答“能”或“不能”。这取决于你的预算、时间以及团队的技术底子。为了帮大家理清思路,我整理了一份 速查手册 ,从技术选型到职业路径,全是干货。 1.…

2026/9/20 19:59:18 阅读更多 →
material-dialogs 3.3.0 发布详解:消息行距主题属性、选择列表防护与底部弹窗修复

material-dialogs 3.3.0 发布详解:消息行距主题属性、选择列表防护与底部弹窗修复

UI组件移动开发 【免费下载链接】material-dialogs 😍 A beautiful, fluid, and extensible dialogs API for Kotlin & Android. 项目地址: https://gitcode.com/gh_mirrors/ma/material-dialogs 点击查看 免费下载 导读 本文基于 RELEASE_NOTES.m…

2026/9/20 19:58:44 阅读更多 →

最新新闻

Page Assist:免费本地AI浏览器助手,任意网页一键呼出AI

Page Assist:免费本地AI浏览器助手,任意网页一键呼出AI

Page Assist:免费本地AI浏览器助手,任意网页一键呼出AI 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 读一篇长文档、啃…

2026/9/20 20:58:20 阅读更多 →
基于WOW-Auctions-API的魔兽世界拍卖行数据获取与封装解析

基于WOW-Auctions-API的魔兽世界拍卖行数据获取与封装解析

简介:面向《魔兽世界》玩家与 Python 开发者的 WOW-Auctions-API,是基于暴雪开放接口的开源 Python 类库,主要解决拍卖行商品价格监控与交易决策的问题。通过设定价格阈值,它能自动抓取拍卖数据,并在商品价格跌破预期时…

2026/9/20 20:58:20 阅读更多 →
使用本地构建的 apphost 与 .NET 根目录进行运行时开发调试

使用本地构建的 apphost 与 .NET 根目录进行运行时开发调试

语言运行时标准库JIT编译编译器 【免费下载链接】runtime .NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps. 项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime 点击查看 免费下载 导读 在 .NET 运行时仓库&#xff0…

2026/9/20 20:58:20 阅读更多 →
百度地图POI与OSM边界数据结合:学校地理数据获取实战

百度地图POI与OSM边界数据结合:学校地理数据获取实战

做地理数据的同学应该都遇到过这种需求:想统计某个区域里的学校分布,或者想给地图上的学校加个轮廓范围,结果发现网上流传的所谓“POI数据包”要么是几年前的旧货,要么来源不明带着一股灰色气息。说句实在话,POI点数据…

2026/9/20 20:58:20 阅读更多 →
Mocha 官方文档站(Astro Starlight)本地构建、预览与依赖升级实战指南

Mocha 官方文档站(Astro Starlight)本地构建、预览与依赖升级实战指南

Mocha 官方文档站(Astro Starlight)本地构建、预览与依赖升级实战指南 【免费下载链接】mocha ☕️ Classic, reliable, trusted test framework for Node.js and the browser 项目地址: https://gitcode.com/gh_mirrors/mo/mocha Mocha 的官方文…

2026/9/20 20:58:20 阅读更多 →
gbrain Doctor 自动修复与评分体系改进:从误报噪声到可观测健康基线

gbrain Doctor 自动修复与评分体系改进:从误报噪声到可观测健康基线

gbrain Doctor 自动修复与评分体系改进:从误报噪声到可观测健康基线 【免费下载链接】gbrain Garrys Opinionated OpenClaw/Hermes Agent Brain 项目地址: https://gitcode.com/gh_mirrors/gb/gbrain gbrain doctor 是 GBrain 大脑健康检查的核心命令&#x…

2026/9/20 20:57:19 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →