跳到内容

日志记录#

日志记录是优化的关键部分,用户应该能够对其进行自定义。本页概述了如何使用 SMAC 自定义日志记录体验。

级别#

改变日志记录行为最简单的方法是改变全局日志记录器的级别。如果您在任何 facade 中指定了 logging_level,SMAC 会为您完成此操作。

smac = Facade(
    ...
    logging_level=20,
    ...
)

下表显示了具体的级别

名称 级别
0 显示全部
10 调试
20 信息
30 警告
40 错误
50 严重

标准日志文件#

默认情况下,SMAC 会生成几个文件来记录优化过程。这些文件存储在目录结构 ./output_directory/name/seed 中,如果未明确提供名称,则名称将被替换为哈希值。此行为可以通过 场景 (Scenario) 配置进行自定义,如下例所示

Scenario(
    configspace = some_configspace,
    name = 'experiment_name',
    output_directory = Path('some_directory'),
    ...
)
值得注意的是,如果输出目录 ./some_directory/experiment_name/seed 已存在,其行为由 外观模式 (facade) 设置中的 overwrite 参数决定。此参数指定是继续之前的运行(默认)还是开始新的运行。

输出分为四个不同的日志文件,以及所使用的 ConfigSpace 库的配置空间 的副本。

intensifier.json#

强化 (intensification) 记录在 intensifier.json 中,结构如下:

{
  "incumbent_ids": [
    65
  ],
  "rejected_config_ids": [
    1,
  ],
  "incumbents_changed": 2,
  "trajectory": [
    {
      "config_ids": [
        1
      ],
      "costs": [
        0.45706284046173096
      ],
      "trial": 1,
      "walltime": 0.029736042022705078
    },
    #...
  ],
  "state": {
    "tracker": {},
    "next_bracket": 0
  }
}

optimization.json#

优化过程在 optimization.json 中描述,结构如下:

{
  "used_walltime": 184.87366724014282,
  "used_target_function_walltime": 20.229533672332764,
  "last_update": 1732703596.5609574,
  "finished": false
}

runhistory.json#

runhistory.json 分为四个部分:statsdataconfigsconfig_originsstats 包含关于不同评估配置的总体广泛统计信息

  "stats": {
    "submitted": 73,
    "finished": 73,
    "running": 0
  },

data 包含条目列表,每个条目对应一个配置。

  "data": [
    {
      "config_id": 1,
      "instance": null,
      "seed": 209652396,
      "budget": 2.7777777777777777,
      "cost": 2147483647.0,
      "time": 0.0,
      "cpu_time": 0.0,
      "status": 0,
      "starttime": 0.0,
      "endtime": 0.0,
      "additional_info": {}
    },
    ...
  ]

configs 是一个人类可读的配置字典,其中键是基于一的 config_id。需要注意的是,在 runhistory.json 中,索引是基于零的。

  "configs": {
    "1": {
      "x": -2.3312147893012
    },

最后,config_origins 指定配置的来源,指示它来自初始设计还是采集函数最大化的结果。

  "config_origins": {
    "1": "Initial Design: Sobol",
    ...
  }

scenario.json#

´scenario.json´ 文件包含记录到 json 文件中的 场景 (Scenario) 的总体状态。

自定义文件#

有时,用户希望禁用或突出显示指定模块。您可以通过向 facade 传递一个自定义 yaml 文件来做到这一点。

smac = Facade(
    ...
    logging_level="path/to/your/logging.yaml",
    ...
)

以下文件展示了如何仅显示来自强化器的错误消息,同时将其他所有内容的级别保持为 INFO

version: 1
disable_existing_loggers: false
formatters:
    simple:
        format: '[%(levelname)s][%(filename)s:%(lineno)d] %(message)s'
handlers:
    console:
        class: logging.StreamHandler
        level: INFO
        formatter: simple
        stream: ext://sys.stdout
loggers:
    smac.intensifier:
        level: ERROR
        handlers: [console]
root:
    level: INFO
    handlers: [console]