Skip to content

Level1 配置进入 DLinear

Abstract

这一篇对应 00-DLinear总览与Level树Level 1

它只讲一件事:

当前这条命令里的参数,怎样一步步和 DLinear(config) 建立关系。

1. 当前层第一性

这一层存在的第一性是:

先解释为什么当前例子最后会实例化成 DLinear(config),而不是别的模型。

如果这层不稳,后面你虽然能看懂 DLinear.py,但不知道:

  • 为什么当前命令会走到 DLinear
  • seq_len / pred_len / moving_avg / enc_in 这些参数到底是怎样进到 config 里的

2. 上下文

父节点:

下一层:

当前入口接口:

python
run_benchmark.py
-> parser.parse_args()
-> build_model_config(args, config_data)
-> pipeline(data_config, model_config, evaluation_config)

当前出口接口:

python
model = DLinear(config)

3. 当前真实命令里,哪些参数真正和 DLinear 有关

当前例子里最关键的是这些:

text
--model-name time_series_library.DLinear
--adapter transformer_adapter
--model-hyper-params "{...}"

model-hyper-params 里和 DLinear 真正强相关的参数有:

  • seq_len = 96
    • DLinear 线性头的输入长度。
  • horizon = 24
    • 会在 adapter/配置层转成 pred_len = 24
  • moving_avg = 25
    • series_decomp 的滑动平均窗口。
  • batch_size = 4
    • DataLoader 用,不属于 DLinear 数学主体。
  • dropout / d_model / d_ff
    • 这些在 DLinear forecasting 主链里基本不关键,属于统一配置壳里可能存在但主模型不强依赖的字段。

4. 总顺序图

5. 抽象树

6. 关键代码块 1:命令行怎样变成 model_config

位置:

核心代码骨架:

python
args = parser.parse_args()
model_config = build_model_config(args, config_data)
log_file_names = pipeline(data_config, model_config, evaluation_config)

6.1 这段代码的输入/输出语义

输入:

  • args
    • 当前命令行解析出来的参数对象。
  • config_data
    • JSON 配置文件内容。

输出:

  • model_config
    • 一个结构化字典,里面已经明确写出:
      • 模型名是谁
      • adapter 是谁
      • 模型超参数有哪些

6.2 当前真实例子里,model_config 的核心部分长什么样

可以近似理解成:

python
model_config = {
    "models": [
        {
            "model_name": "time_series_library.DLinear",
            "adapter": "transformer_adapter",
            "model_hyper_params": {
                "seq_len": 96,
                "horizon": 24,
                "moving_avg": 25,
                "batch_size": 4,
                ...
            }
        }
    ]
}

这一步的意义:

命令行只是字符串;model_config 才是后面真正可被框架消费的结构化模型说明书。

7. 关键代码块 2:pipeline(...) 怎样把它送进模型加载层

位置:

核心代码骨架:

python
model_factory_list = get_models(model_config)

输入:

  • model_config
    • 结构化模型配置。

输出:

  • model_factory_list
    • 模型工厂列表。

当前例子里只有一个模型,所以这里实际上就是:

python
model_factory_list = [DLinear 对应的 ModelFactory]

8. 关键代码块 3:get_models(...) -> get_model_info(...)

位置:

代码骨架:

python
for model_config in all_model_config["models"]:
    model_info = get_model_info(model_config)

8.1 这里在干什么

这一步的作用是:

把“名字是 DLinear”这种字符串,变成“真正的 Python 类和它的元信息”。

输入:

  • model_config
    • 一条单模型配置。

输出:

  • model_info
    • 至少包含:
      • 模型类
      • adapter 信息
      • 超参数

当前例子里:

python
model_config["model_name"] == "time_series_library.DLinear"

所以 get_model_info(...) 最终找到的是:

python
DLinear 类

9. 关键代码块 4:adapter 怎样包起 DLinear

位置:

这一层的作用不是改变 DLinear 数学本体,而是:

把 DLinear 接到 TFB 统一训练/预测接口上。

也就是说:

  • 上层统一调用 _process / forecast_fit / batch_forecast
  • adapter 在内部再去实例化真正的 DLinear(config)

10. 关键代码块 5:真正实例化 DLinear(config)

位置:

adapter 里的实例化代码:

python
def _init_model(self):
    return self.model_class(self.config)   # 等价于 DLinear(config)

DLinear.__init__ 的完整签名是:

python
def __init__(self, configs, individual=False):

关键约束:adapter 只传了 config,没有传 individual,所以 individual 始终取默认值 False

在 TFB 框架里,individual 没有办法通过 model_hyper_params 控制,因为它不是从 configs 对象里读取的属性,而是构造函数的独立参数。想启用 individual=True,需要修改 adapter 的 _init_model()

这里的输出:

  • model
    • 真正的 DLinear 实例,individual=False(共享模式)。

11. 这一层最该固定什么

  1. DLinear 不是直接从命令行跳出来的。
  2. 当前命令必须先经过:
    • build_model_config
    • pipeline
    • get_models
    • get_model_info
    • transformer_adapter
  3. 直到 _init_model(),才真正走到:
python
DLinear(config)

12. 下一步

继续看:

如果某个函数还不熟,补查:

*记录并在线阅读我的笔记*