ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Ray Tune 自定义日志与日志产物:logging_example 实战解读

2026/9/20 14:41:20 拓冰建站 浏览量
Ray Tune 自定义日志与日志产物:logging_example 实战解读 人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】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点击查看免费下载本文以仓库 python/ray/tune/examples/logging_example.py 为核心骨架对应文档入口为 doc/source/tune/examples/includes/logging_example.rst系统讲解如何通过LoggerCallback自定义实验级日志回调、如何用trial_name_creator/trial_dirname_creator定制 Trial 名称与目录、以及RunConfig/TuneConfig的编排细节并深入仓库源码揭示 Tune 日志链路CSV / JSON / TensorBoard与默认回调的组装逻辑帮助你在真实调参任务中精准掌控日志输出与实验可复现性。一、示例概述一个最小的日志定制Tune 实验logging_example.py是一个体积很小但信息量完整的 Ray Tune 示例它用函数式训练easy_objectivetune.Tuner完成 5 组随机搜索同时演示了三件核心事情自定义日志回调定义TestLoggerCallback(LoggerCallback)在每次收到 Trial 结果时打印一行日志自定义 Trial 名称与目录名通过trial_name_creator和trial_dirname_creator把 Trial 命名成{trainable_name}_{trial_id}_123实验编排通过RunConfig实验名hyperband_test、停止条件、回调列表和TuneConfig优化目标mean_loss、采样数、指标方向完整配置一次Tuner.fit()实验。运行方式仓库内可直接执行# 快速冒烟测试每个 trial 只跑 1 个 training iteration python python/ray/tune/examples/logging_example.py --smoke-test # 完整运行每个 trial 最多 100 个 training iteration python python/ray/tune/examples/logging_example.py--smoke-test由脚本顶部的argparse解析见 logging_example.py其作用是把stop{training_iteration: 1}让实验秒级结束适合 CI 或本地快速验证。完整的示例代码#!/usr/bin/env python import argparse import time from ray import tune from ray.tune.logger import LoggerCallback class TestLoggerCallback(LoggerCallback): def on_trial_result(self, iteration, trials, trial, result, **info): print(fTestLogger for trial {trial}: {result}) def trial_str_creator(trial): return {}_{}_123.format(trial.trainable_name, trial.trial_id) def evaluation_fn(step, width, height): time.sleep(0.1) return (0.1 width * step / 100) ** (-1) height * 0.1 def easy_objective(config): # Hyperparameters width, height config[width], config[height] for step in range(config[steps]): # Iterative training function - can be any arbitrary training procedure intermediate_score evaluation_fn(step, width, height) # Feed the score back back to Tune. tune.report({iterations: step, mean_loss: intermediate_score}) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument( --smoke-test, actionstore_true, helpFinish quickly for testing ) args, _ parser.parse_known_args() tuner tune.Tuner( easy_objective, run_configtune.RunConfig( namehyperband_test, callbacks[TestLoggerCallback()], stop{training_iteration: 1 if args.smoke_test else 100}, ), tune_configtune.TuneConfig( metricmean_loss, modemin, num_samples5, trial_name_creatortrial_str_creator, trial_dirname_creatortrial_str_creator, ), param_space{ steps: 100, width: tune.randint(10, 100), height: tune.loguniform(10, 100), }, ) results tuner.fit() print(Best hyperparameters: , results.get_best_result().config)二、核心机制一LoggerCallback与自定义日志2.1 基类接口实验级日志生命周期LoggerCallback位于 python/ray/tune/logger/logger.py继承自Callback被标注为PublicAPI是实验级experiment-level日志回调的公共基类。它定义了五个可覆写的纯日志方法分别对应 Trial 生命周期中的五个事件方法触发时机关键参数log_trial_start(trial)Trial 启动时trialTrial 对象log_trial_restore(trial)Trial 从 checkpoint 恢复时triallog_trial_save(trial)Trial 保存 checkpoint 时triallog_trial_result(iteration, trial, result)Trial 每上报一次结果时iteration实验结果所属的迭代序号trialresult结果字典log_trial_end(trial, failedFalse)Trial 结束时failedTrue表示 Trial 异常退出基类还提供了一组on_*桥接方法on_trial_result、on_trial_start、on_trial_restore、on_trial_save、on_trial_complete、on_trial_error它们内部直接把事件转发给对应的log_*方法见 logger.py。例如def on_trial_result(self, iteration, trials, trial, result, **info): self.log_trial_result(iteration, trial, result) def on_trial_complete(self, iteration, trials, trial, **info): self.log_trial_end(trial, failedFalse) def on_trial_error(self, iteration, trials, trial, **info): self.log_trial_end(trial, failedTrue)因此用户自定义日志器时既可以覆写on_trial_result这种带完整上下文trials列表、**info的通用回调钩子也可以只覆写log_trial_result这种精简的日志方法。示例中的TestLoggerCallback选择覆写on_trial_resultclass TestLoggerCallback(LoggerCallback): def on_trial_result(self, iteration, trials, trial, result, **info): print(fTestLogger for trial {trial}: {result})这样每次tune.report(...)上报中间结果时都会打印一行包含 Trial 标识与完整结果字典的日志可用于实时观察每个 Trial 的指标演化、排查数值异常或把结果转发到自定义监控系统。2.2 基类文档中的建议LoggerCallback的 docstring 特别强调实现者应在 Trial 结束时收到log_trial_end妥善清理日志资源如关闭文件句柄。示例中的TestLoggerCallback只做打印、无外部资源因此无需清理而仓库内置的CSVLoggerCallback/JsonLoggerCallback正是这一规范的参考实现——它们在log_trial_end中关闭文件句柄并清理内部字典见下文第三节。2.3 从源码看回调的通用钩子LoggerCallback的父类 python/ray/tune/callback.py 中Callback基类自身也展示了同样的用法覆写on_trial_result即可在每个结果到达时打印指标。二者的区别在于定位Callback通用回调基类所有on_*钩子与 TrialRunner 生命周期强绑定LoggerCallback日志专用子类额外提供log_*精简接口与_restore_from_remote等日志恢复辅助方法。在回调列表里同时出现多个回调时Tune 通过CallbackList容器统一调度Callback基类的元类_CallbackMeta会强制容器类实现全部on_*方法见 callback.py。三、核心机制二内置 Logger 与默认日志产物示例没有显式配置 CSV / JSON / TensorBoard 日志器但这不代表实验没有日志。Tune 会在Tuner.fit()时自动补齐默认回调其中日志器默认就是三个内置实现见 python/ray/tune/utils/callback.pyDEFAULT_CALLBACK_CLASSES ( CSVLoggerCallback, JsonLoggerCallback, TBXLoggerCallback, )3.1 CSVLoggerCallbackprogress.csv实现于 python/ray/tune/logger/csv.py将结果写入每个 Trial 目录下的progress.csv。关键实现细节写入前会自动扁平化嵌套字典{a: {b: 1}} - {a/b: 1}使用flatten_dict(tmp, delimiter/)见 csv.py每行写入后立即flush()保证实验中断时数据不丢csv.pyTrial 结束log_trial_end时关闭文件句柄正是 2.2 节所述规范的落地断点续跑时通过_restore_from_remote从远端存储恢复该文件避免覆盖历史进度csv.py。3.2 JsonLoggerCallbackresult.json 与 param.json实现于 python/ray/tune/logger/json.py同时维护三个产物文件内容result.json每次上报的结果字典以 JSON Lines每行一个 JSON 对象追加写入并 flushparam.jsonTrial 的最终配置indent2、sort_keysTrue的可读格式param.pkl配置的 cloudpickle 序列化版本保证任意 Python 对象的完整可恢复重要JsonLoggerCallback的 docstring 明确指出ExperimentAnalysis工具要求实验必须使用该回调见 json.py。默认回调列表中包含它因此使用默认配置即可兼容ExperimentAnalysis。3.3 默认回调的组装规则_create_default_callbacksutils/callback.py的组装逻辑有三条关键规则缺啥补啥CSV / JSON / TensorBoard 三个默认日志器只在用户未显式传入时才追加非 CSV/JSON 的自定义 Logger 不会禁用 CSV/JSON即你在RunConfig.callbacks中传入TestLoggerCallback这类自定义日志器时CSV 与 JSON 日志器仍会被自动创建这正是示例能只写自定义回调仍拿到 progress.csv / result.json的原因Syncer 回调保证排在所有 Logger 之后确保跨节点同步时拿到的是最新日志与 checkpoint。此外RAY_TUNE_CALLBACKS_ENV_VAR环境变量还可注入全局回调utils/callback.py。3.4 第三方实验跟踪内置扩展点除三个默认日志器外仓库 python/ray/tune/logger/ 目录还提供了针对主流实验管理平台的LoggerCallback实现wandb.pyWeights Biases、mlflow.py、comet.py、tensorboardx.py、aim.py。它们同样实现log_trial_start/log_trial_result/log_trial_end等钩子证明自定义 Logger 的接口设计足够支撑真实的实验管理平台对接。在示例的RunConfig中把callbacks换成或追加这些类即可将中间结果同步到对应平台。四、核心机制三Trial 名称与目录名定制示例中tune_config同时设置了trial_name_creatortrial_str_creator, trial_dirname_creatortrial_str_creator,两个 creator 共用同一个函数def trial_str_creator(trial): return {}_{}_123.format(trial.trainable_name, trial.trial_id)生成形如easy_objective_abcdef0_123的名称。4.1 两个参数的区别从 python/ray/tune/experiment/trial.py 的源码可见Trial 构造时会把两个 creator 分别解析为custom_trial_name显示名出现在终端输出、日志行与结果索引中custom_dirname目录名即该 Trial 在实验目录下的子目录名日志产物progress.csv、result.json等都写在该目录下。两者都接受一个接收Trial对象、返回字符串的可调用对象。示例把二者设为同一个函数实现显示名与目录名一致的效果。4.2 目录名定制为何重要Trial 目录名默认包含大量随机哈希路径很长。Trial 源码中甚至有针对路径过长的显式提示trial.pyConsider using trial_dirname_creator to shorten the path.因此在实际任务中trial_dirname_creator常被用来把目录名压缩为可读短名称如trial_{idx}既便于人工浏览产物目录也能规避文件系统路径长度上限。示例中统一使用{trainable_name}_{trial_id}_123正是这一思想的演示日志目录可读、可预测、便于后续定位。4.3 参数流转链路trial_name_creator/trial_dirname_creator从TuneConfig传入后经 config_parser.py 解析进 Experiment 规格再由 experiment.py 传递到Trial构造最终在 trial.py 中执行函数、落盘为 Trial 属性。整条链路均为可调用对象透传无额外限制。五、核心机制四实验编排参数逐项拆解5.1 RunConfig实验名、停止条件与回调RunConfig承载实验级的运行配置示例中使用三处namehyperband_test实验名。结果默认写入~/ray_results/hyperband_test/具体根目录取决于RAY_RESULTS_DIR等环境变量所有 Trial 产物归入其下callbacks[TestLoggerCallback()]实验级回调列表自定义 Logger 由此注入2.1 节stop{training_iteration: 1 if args.smoke_test else 100}停止条件字典。键为结果中的字段名值为触发停止的数值。示例中--smoke-test时每个 Trial 在完成第 1 个training_iteration后即停止正常运行时为 100。training_iteration是 Tune 在每个 Trial 完成一次训练迭代后自动注入结果字典的保留字段tune.report每次上报都会递增它因此可作为天然的迭代计数停止键。5.2 TuneConfig优化目标与搜索编排TuneConfig控制调参过程示例中使用四处metricmean_loss优化目标指标名必须与tune.report上报的键一致示例上报{iterations: ..., mean_loss: ...}modemin优化方向min表示越小越好与mean_loss语义匹配num_samples5采样 5 组超参组合配合param_space中的随机搜索分布使用trial_name_creator/trial_dirname_creator见第四节。5.3 param_space搜索空间param_space{ steps: 100, # 固定值训练总步数 width: tune.randint(10, 100), # 均匀随机整数范围 [10, 100) height: tune.loguniform(10, 100), # 对数均匀随机浮点范围 [10, 100) },steps为固定值训练函数easy_objective内循环 100 次每步调用evaluation_fn并tune.reportwidth用tune.randint(10, 100)采样均匀随机整数height用tune.loguniform(10, 100)采样对数均匀随机浮点数数量级跨度大的参数应优先考虑对数均匀。5.4 训练函数与结果上报easy_objective是函数式训练functional training入口接收config字典即param_space采样结果def easy_objective(config): width, height config[width], config[height] for step in range(config[steps]): intermediate_score evaluation_fn(step, width, height) tune.report({iterations: step, mean_loss: intermediate_score})关键点evaluation_fn(step, width, height)用time.sleep(0.1)模拟每次迭代的计算开销返回一个随width、step变化的损失tune.report(...)把中间结果上报给 Tune 控制器触发自定义TestLoggerCallback.on_trial_result打印、CSV/JSON 日志器写入第三节、以及stop/ 提前停止 / 调度器决策的检查mean_loss因width * step / 100项随训练推进而下降构成一个有意义的极小化目标results.get_best_result().config即可取回最优超参。5.5 结果消费results tuner.fit() print(Best hyperparameters: , results.get_best_result().config)Tuner.fit()返回ResultGridget_best_result()依据TuneConfig中的metric/mode返回最优 Trial 的Result.config即该 Trial 实际使用的超参组合。六、实验结果形态日志目录与实时输出运行完整示例后~/ray_results/hyperband_test/下会形成如下产物结构由内置三个 Logger 共同生成ray_results/hyperband_test/ └── easy_objective_trial_id_123/ # trial_dirname_creator 生成的目录 ├── progress.csv # CSVLoggerCallback扁平化结果表 ├── result.json # JsonLoggerCallbackJSON Lines 结果 ├── param.json # JsonLoggerCallback配置可读 JSON ├── param.pkl # JsonLoggerCallback配置pickle └── events.out.tfevents.* # TBXLoggerCallbackTensorBoard 事件终端上会同时输出两类信息Tune 控制台进度表默认输出层自定义回调的打印TestLogger for trial easy_objective_trial_id_123: {...}其中字典内容即每次tune.report上报的完整结果含iterations、mean_loss、training_iteration、time_total_s等 Tune 自动注入的字段。由于自定义TestLoggerCallback会被自动附加到默认回调之后见 3.3 节组装规则即使将来在callbacks中追加WandbLoggerCallback等第三方日志器progress.csv/result.json依旧照常生成实验分析链路不受影响。七、小结与扩展指引logging_example.py以极简代码覆盖了 Ray Tune 日志体系的四个关键维度自定义日志回调LoggerCallback、内置日志产物CSV/JSON/TensorBoard、Trial 命名与目录定制、实验编排参数。其背后的源码依据可继续在仓库中深入自定义 Logger 接口与桥接逻辑python/ray/tune/logger/logger.py内置 CSV / JSON 日志器python/ray/tune/logger/csv.py、python/ray/tune/logger/json.py默认回调组装规则python/ray/tune/utils/callback.pyTrial 名称/目录生成python/ray/tune/experiment/trial.py同目录下的进阶示例custom_checkpointing_with_callback.py回调 checkpointing 组合、mlflow_example.py实验管理平台集成掌握这套日志定制能力后你可以把任意训练循环的中间指标接入 Tune 的统一日志管线实现一处上报、多端消费终端、CSV/JSON 产物、TensorBoard、第三方平台为大规模调参实验的可观测性与可复现性打下基础。赞分享人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】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点击查看免费下载相关推荐Apache Airflow 高级日志配置实战自定义 dictConfig、远程日志回读与按 Operator/Hook/任务定制日志Apache Airflow 高级日志配置实战自定义 dictConfig、远程日志回读与按 Operator/Hook/任务定制日志 Apache Airf后端任务调度工作流自动化数据编排批处理数据工程流程编排libphonenumber日志系统DefaultLogger与自定义日志实现libphonenumber日志系统DefaultLogger与自定义日志实现 引言 在电话号码解析和处理过程中日志系统扮演着至关重要的角色。libphon后端移动开发Sails 自定义日志消息sails.log 多级日志实战指南Sails 自定义日志消息sails.log 多级日志实战指南 Sails 框架内置了基于 captains log 的日志系统并通过 sails.log后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考