你们有没有遇到过这种情况:业务方要的预报分辨率越来越高,机房给的算力却原地不动。我所在的团队去年接了一个区域天气预报产品的优化任务,最初的想法很朴素——把数值模式分辨率从 9 公里抬到 3 公里,结果一算账直接放弃:网格点变成原来的 9 倍,时间步长还要缩短,整体计算量往上翻了不止 20 倍。后来我们换了个思路,让数值模式继续跑低分辨率,把放大细节这个活交给生成式 AI。这个项目最核心的一句话可以概括为:用生成式 AI 超分辨率加速可扩展、低计算天气预测,让高分辨率预报不再依赖昂贵的全链路高分辨率模拟。这篇文章我会把从思路到落地的完整过程写下来,包括最后被折腾到崩溃的几个坑,给同样被算力卡住的人做个参考。
1. 天气预测的算力瓶颈:为什么我会盯上"超分加速"这条路
1.1 高分辨率模拟的账怎么算
先算一笔简单的数学账。区域数值模式的分辨率从 9 公里提高到 3 公里,水平网格数直接变成原来的 9 倍;网格变细之后,为了满足数值稳定性条件,时间步长通常也要至少缩短到原来的三分之一。也就是说,单纯跑一次同样时长的预报,计算量已经接近原来的 27 倍,这还没算垂直层数增加、物理过程参数化更复杂带来的额外开销。
真正做业务的人都知道,预报不是跑一次就完事的。每天多个起报时刻、多次循环更新、集合预报成员、资料同化循环……每一项都要在这个基础上继续翻倍。我们当时面对的需求是某个区域的 24 小时滚动预报,原来使用 9 公里分辨率还能勉强在晚上跑完,一旦升到 3 公里,整个作业链条的时间会长到完全没法用。
高分辨率数值模拟当然是好东西,但它的成本结构决定了它不是所有场景都负担得起。算力不够的时候,你不能直接说"再加机器",很多时候预算就卡在那里。所以问题的关键变成了:能不能找到一条路,既保留接近高分辨率的输出质量,又不让计算账单爆炸。
1.2 低分辨率猛算 + AI 补细节:一个反直觉的方案
低分辨率模式跑得快,但它最大的毛病是把小尺度结构抹平了。强对流单体、锋面窄带、地形云这些在低分辨率场里往往只剩下一个模糊的梯度,细节信息几乎丢光。于是我们开始认真考虑图像领域已经玩了很多年的超分辨率技术:低分辨率场作为输入,让模型学习重建高分辨率场。
气象变量虽然不是自然照片,但本质上都是一个物理量在空间上的分布场。高分辨率场里那些锐利的结构,在低分辨率场里恰好对应着被模糊掉的纹理信息,这正好是超分模型擅长处理的问题。最初我们担心天气现象和自然图像差距太大,但实际看了几组退化实验之后发现,两者在数学结构上有非常强的相似性——都是一张低分辨率图推一张高分辨率图。
方案就这样定型了:粗网格数值模式快速跑一遍,输出低分辨率要素场,然后用生成式 AI 超分模型把结果映射到高分辨率网格。粗模式负责大尺度天气系统的演变,AI 负责把中尺度、小尺度的结构补回来。谁擅长干什么就干什么,计算量最大的部分全部压在便宜的推理阶段。
2. 生成式超分模型的核心原理:它为什么能"脑补"出可信的气象细节
2.1 从插值到生成:超分任务的本质变化
如果只是把图放大,双三次插值早就够了。插值的问题在于它完全不知道被抹掉的细节长什么样,只会做平滑过渡,所以放大之后该糊还是糊。深度学习超分模型做的事情,是学习从低分辨率观测到高分辨率真值之间的映射关系,这个映射是数据驱动学出来的。
早期基于 CNN 的超分模型,本质上在做条件均值回归。什么意思?就是模型在面对多个可能的高分辨率结果时,会倾向于输出它们的平均,因为平均能让均方误差最小。结果就是输出干净但发糊,因为平均值天然会把尖锐结构抹平。生成式模型不一样,它的训练目标里多了一个"真实性"约束。无论是生成对抗网络里的对抗判别器,还是扩散模型里的去噪过程,都会迫使模型产出具体的、锐利的高频结构,而不是一个光滑的平均场。
这个差异在气象上特别重要。降水场里一条雨带的边界、一个对流单体的核区,都对应极强的高频信息。用传统插值或者普通 CNN 超分,这些结构都会被糊掉;用生成式模型,模型会"脑补"出看起来合理、统计上也接近真实的锋面纹理。
2.2 生成式模型在气象场上的适配逻辑
把自然图像超分的套路直接搬到气象场上,肯定翻车。第一,气象变量不是 RGB,降水、温度、风场、湿度各有各的分布特性。降水在大多数格点上是 0,少数格点有强降水,这种零膨胀分布如果用常规归一化处理,模型会直接摆烂。第二,不同要素的空间尺度差别巨大:温度场相对平滑,低层风场受地形影响明显,对流降水却高度破碎、非平稳。第三,变量之间还有物理关联,分开建模就白白丢掉了湿度跟云量、风场跟气压梯度之间的耦合信息。
所以我们的模型输入是多通道的低分辨率要素场,输出是对应通道的高分辨率要素场。降水通道单独做 log1p 变换,训练时按降水区域和非降水区域分别加权监督,避免模型把所有格点都往无降水的方向推。
| 对比项 | GAN 超分 | 扩散模型超分 |
|---|---|---|
| 推理速度 | 快,单步推理 | 慢,多步去噪 |
| 高频细节 | 较好,纹理清晰 | 很细腻,稳定性高 |
| 训练稳定性 | 需要仔细调对抗权重 | 相对稳定 |
| 低计算部署 | 友好 | 不友好 |
前期我们对比过 GAN 类超分和扩散模型超分。扩散模型的效果细腻、稳定性也更好,但是推理步骤太多,对"低计算"这个目标很不友好。GAN 单步推理、显存占用也低,4 倍上采样场景下完全够用,所以项目最终选了 GAN 架构。如果后续需要更高倍率或者更强调多样性,再切扩散模型也不迟,但现阶段要把成本控制在预算内。
3. 整体架构与数据闭环:从粗网格预报到细网格产品的完整链路
3.1 系统总览:三个模块的职责划分
整套系统的链路并不复杂,用一句话概括:低分辨率模式负责大尺度演变,超分模型负责小尺度重建,后处理服务负责把结果安全送出去。
- 模块一:低分辨率数值模式,输出标准格式的要素场文件。
- 模块二:超分服务,加载生成式 AI 模型,对要素场做批量上采样。
- 模块三:后处理与发布模块,做偏差修正、单位转换、出图、写入存储。
三个模块各自独立,中间用标准数据格式对接,所以可以分别扩容。低分辨率模式可以跑在 CPU 集群上,超分服务挂在 GPU 节点上,后处理就无所谓了,普通服务器就行。
这套链路里有几个容易被忽略但很重要的设计。超分服务必须是无状态的:输入一个低分辨率场,输出一个高分辨率场,不依赖任何历史状态。这样整个服务天然支持并行,来了一个任务就吃掉一个任务。另外,低分辨率模式的结果一定要缓存,同一个起报时刻如果只是微调参数、不需要重跑模式,直接从缓存读低分辨率场喂给超分模型就可以。
3.2 训练数据怎么构造:标签并不难找,难在配对
气象领域有一个得天独厚的优势——我们已经积累了大量的历史高分辨率分析场和再分析资料,这些东西可以直接当作超分模型的"真值标签"。具体做法是:把高分辨率场通过空间退化方式降采样成低分辨率场,再配回原来的高分辨率场,组成训练对。
听起来很简单,真正的坑在退化方式的选择上。如果总是用同一种 3×3 平均池化去降采样,模型只会学到对应那一种模糊核,拿到真实模式输出上就不工作了。因为真实低分辨率模式的输出并不是简单平均,还包含了模式自身的平滑、物理参数化带来的空间相关结构、甚至数值格式的隐式耗散。我们最终用了几种退化方式的混合:线性平均、高斯滤波后采样、再加入少量随机噪声,让模型不至于过拟合到某一种退化假设。
时间维度上也要防泄漏。典型错误做法是把同一天的样本随机切到训练集和验证集,两边的天气格局高度相似,评估结果虚高得离谱。正确做法是按时间段切分,比如前 80% 的时间做训练,后 20% 做验证,并且刻意保证覆盖不同季节。汛期和冬季的降水形态差太多了,训练集里没有冬天,模型在冬天就很容易乱来。
3.3 部署时的可扩展设计思考
训练时我们用的是比较重的模型加混合精度,但推理部署做了一次强烈的瘦身。训练用的网络通道数压到原来的三分之一左右,再用量化感知训练把权重压到 FP16,部分层考虑 INT8。压缩之后,模型显存占用不到 2GB,一台普通工作站就能跑起来。
可扩展性方面,因为超分是按空间网格块处理的,我们可以把整个区域切成若干子域,丢到多台推理节点上并行计算,最后再拼接。某个子域天气现象特别复杂、需要更高倍率,也可以单独给这个子域配一个专用模型,不影响其他区域的流程。这个设计在后面帮了大忙,比如沿海区域需要更高的细节分辨率,内陆平原用一个轻量版本就够了,不需要一刀切地浪费算力。
4. 模型训练与评估中的关键细节:损失函数、评价指标、以及"伪细节"的坑
4.1 损失函数怎么配:感知损失和物理约束
生成式超分不能简单拿个对抗损失就完事。气象场的监控目标要分三层:第一层是像素级回归,保证数值总体准确;第二层是感知级约束,保证纹理和空间结构真实;第三层是物理约束,保证输出场不违背基本的物理关系。
像素级我们用了 L1 加少量 L2。L1 对降水这种长尾分布目标更稳,不会被个别强降水格点的巨大误差牵着鼻子走。感知级一开始尝试过用预训练视觉模型的特征匹配损失,但自然图像训练出来的特征提取器放在气象场上并不完全可靠。后来改成小波损失,强制模型在多个尺度上匹配能量分布,效果明显更稳定。物理约束做得很轻:对质量权重场做水平梯度惩罚,抑制网格尺度的伪振荡;对风场和高度场加地转平衡的软约束,避免输出里出现完全不合理的剧烈切变。
损失权重的配比也是反复调出来的。对抗损失权重给到 0.05 左右,L1 是 1.0,小波损失 0.1,物理约束 0.01。对抗损失不能给太高,一旦太高,模型就会牺牲数值准确性,去生成肉眼看很漂亮但数值偏移明显的纹理,这在气象业务里是绝对不能接受的。
4.2 评估时别只看 PSNR:气象有自己的度量方式
图像超分论文里常用的 PSNR 和 SSIM,在气象场上很容易骗人。PSNR 对整体误差敏感,但它天然奖励平滑的结果,因为平滑图像离均值更近、误差更小。可业务真正需要的强降水中心,恰恰是那些偏离均值的极端格点。SSIM 也类似,它更喜欢局部结构稳定的场,而降水场的真实纹理本来就是高高低低、零零碎碎的,不是那种稳定的结构。
我们最终采用的评估组合包括这几项:ETS 降水评分用于强降水能力,不同阈值的命中率与虚报率曲线用于空间一致性,功率谱分析用于检查各尺度能量是否恢复,再加上逐格点误差的箱线图。其中功率谱分析最有说服力:如果超分输出在短波段能量比真实场低,说明高频细节补得还不够;反过来如果高出很多,说明模型开始"发明"结构了。
评估这一步绝对不能省。我们后面很多模型迭代决策都靠这套评估体系,而不是靠肉眼盯着几张图看个大概。
5. 实测效果:低算力果然能打,但真实案例暴露了三个问题
理论说再多,不如跑一次。这里记录我们内部测试的整体收益,以及三个最有代表性的踩坑过程和完整排查思路。
5.1 算力对比:整体速度提升与显存占用
在同样的 GPU 资源下,原始方案直接跑高分辨率模式,单次 24 小时预报耗时将近 1 小时。换成低分辨率模式加超分之后,低分辨率模式大约跑 8 分钟,超分推理加后处理约 3 分钟,整体缩短到原来的五分之一左右。如果只做单时次快速更新,因为超分服务可以常驻并预加载模型,耗时还能进一步压缩。
这个对比不是要说明 AI 可以取代数值模式,而是把这套组合当作一个预算友好型预报前端。算力充足时,高分辨率全链路模拟依然是金标准;算力受限时,这套方案能比较接近金标准的空间细节,但成本低得多。
5.2 三个踩坑问题的完整排查链路
5.2.1 问题一:连续多步预测时误差累积
第一个问题是在滚动预测中发现的。单步超分输出很正常、很逼真,可一旦把它作为初始场接进后续时间步的预报循环,多步之后场就变得异常光滑,或者出现虚假的带状结构。
我们的排查过程是这样:先在验证集上做单步误差分析,指标全部正常;随后做多步自回归测试,把上一步超分输出作为下一步低分辨率模式的初始场输入。逐层对比后发现,超分模型会把某些高频成分添加到初始场里,而低分辨率模式不会直接接收这些高频信息,而是把它们当作物理扰动去演变,高频被模式自身平滑掉,同时还引入了额外的数值振荡。问题根源不在超分本身,而在两个模块的耦合方式。
修复做了两步。一是对超分输出做 9 点空间平滑,再作为低分辨率模式的输入,相当于把极端高频重新交给模式去演化;二是在训练损失里加入时间一致性项,让相邻时次超分输出的差分配对到真实相邻时次的差值,减少单帧独立生成带来的抖动。
5.2.2 问题二:极端天气被平滑掉
第二个问题更致命。业务方拿某次强降水过程来测试,发现模型输出的最大降水中心总是比实况低一截。单看 PSNR 还挺高,但降水评分一塌糊涂。
排查时我们画了所有降水格点的概率密度曲线,发现模型输出的 P99 分位数明显向均值收缩。这又是生成模型回归项的锅:降水的空间分布极度不均匀,训练样本里强降水格点数量少,L1 损失为了最小化全局误差,会把大部分格点预测往中位数方向拉。
解决办法是训练时按降水强度对损失做加权,把降水格点的损失乘上更高的权重;同时,在业务后处理阶段加一个分位数映射的偏差订正,对强降水峰值做补偿。经过这两步,强降水评分明显回升,P99 分位数不再显著收缩。
5.2.3 问题三:分布外场景的崩溃
第三个问题来自一次少见的天气过程。当时的环流配置在训练集里几乎没有覆盖到,超分模型在这种分布外输入上表现得很不稳定,输出里出现一些独立的小尺度涡旋结构,肉眼看着很"真实",但和上游物理场完全对不上。
我们做了这样几步排查。先检查低分辨率输入场是否存在数值异常,排除模式本身的故障。然后固定同一个低分辨率输入,用不同的随机种子去跑模型,发现输出差异非常大,这说明模型在该输入附近高度不确定。最后把输出场与同时刻再分析资料逐尺度对比,发现异常涡旋集中在短波段,明显属于所谓的"幻觉结构"。
根治的办法是双管齐下。一方面补充更多类似环流背景的训练样本,提高模型对少见天气类型的覆盖;另一方面在业务链路里加了一道物理一致性校验,对超分输出的散度和涡度做统计阈值拦截,如果异常格点占比超标,就自动回退到低分辨率场,而不是把可能出错的超分结果直接发出去。毕竟预报产品一旦发布,错就是错,不能赌运气。
6. 落地思考与个人经验:这套方案能放到多大的平台上
6.1 可扩展性:从单机到分布式推理
单机环境下,我们的超分模型大概可以做到每秒处理 5 个以上区域,一个覆盖数百公里的区域预报场,几秒内就能从低分辨率变成高分辨率。所以单机瓶颈通常不在推理速度,而在低分辨率模式本身。如果要把这套服务扩展到省级甚至全国范围,只需要把区域切块分发到多台推理节点,用消息队列做任务协调,每个节点消费某个子区域的输入场并输出超分结果。模块之间没有强耦合,水平扩容是很自然的动作。
6.2 关于"低计算"的本质:不是降低精度,而是重新分配成本
这个项目的核心价值不在于把精度做到比高分辨率模式还高,那种期望一开始就不现实。它的意义在于把计算成本重新分配:把最贵的、必须按物理规律逐步求解的大尺度演变留给数值模式,把小尺度纹理的补全交给 AI。AI 推理阶段非常便宜,而且天然可以并行。对实时性要求高、算力有限的场景,这套方案几乎是理想选择,比如灾害性天气临近预警、移动端天气服务、需要一遍遍滚动更新的快速预报。
6.3 实践中的几个小经验
最后分享几个动手做才会注意到的具体经验。
第一,中间结果一定要落盘。模式输出、超分输出、后处理输出分开保存,出了问题能快速定位是哪一环引入的。第二,标准化参数要跟着训练数据走,线上推理不能拿全局统计去归一化新数据,否则强降水区域很容易被压平。第三,模型版本管理要绑定输入数据版本和训练配置,不然一个模型跑了两周之后,没有人能说清楚它当前的行为和验证时是否一致。
我的体会是,生成式 AI 超分辨率加速天气预测,不是一个花哨的噱头,而是一个在算力约束下非常实用的工程方案。它不要求你拥有大型超算,也不需要魔改数值模式内核,只要有一份可靠的历史高分辨率场、一块普通 GPU,就能把现有预报产品的空间粒度提高一大截。如果你正准备做类似的事情,我建议别急着上大模型。先用一个轻量生成模型把数据闭环跑通,把评估指标和踩坑流程走一遍,再慢慢加复杂度。天气预测不是图像生成比赛,稳定性和可解释性远比酷炫更重要。
这套东西我们目前还在持续迭代,最大的感受是:AI 和数值模式组合在一起时,真正的技术含量往往不在模型本身,而在那些耦合处的细节。