伏羲天气预报部署教程:Docker Compose编排FuXi+Prometheus监控服务
伏羲天气预报部署教程:Docker Compose编排FuXi+Prometheus监控服务
天气预报这事儿,听起来挺玄乎,但如果你能自己部署一个能预测未来15天全球天气的AI模型,是不是感觉挺酷的?今天要聊的,就是复旦大学开发的“伏羲”(FuXi)中期气象大模型。
简单来说,伏羲是个用机器学习做天气预报的系统,能预测全球未来15天的天气情况。它背后的技术,发表在了《npj Climate and Atmospheric Science》这本挺有名的期刊上。论文里讲得很清楚,这套系统用的是“级联”的机器学习方法,一层一层地预测,效果还挺不错。
但论文归论文,真要把这套系统跑起来,自己用上,还是得花点功夫。原始的部署方式,对环境依赖多,步骤也繁琐。今天,我就带你换个思路,用Docker Compose把整个服务“打包”起来,再配上Prometheus监控,让你能一键部署、轻松管理,还能随时看到系统运行得怎么样。
1. 为什么选择Docker Compose来部署伏羲?
你可能要问,为啥非得用Docker Compose?直接按照官方说明装不行吗?当然可以,但体验可能不太好。
想象一下,你拿到一个软件,需要先装Python,再装一堆叫不上名字的库,还得配置模型路径、检查CUDA版本……一步出错,可能就得从头再来。这过程,对新手来说,简直就是劝退指南。
而Docker Compose能帮你解决这些问题:
- 环境隔离:把伏羲需要的所有东西,包括Python环境、依赖库、模型文件,都打包在一个“容器”里。这个容器在你的电脑上,就像一个独立的小房间,里面东西齐全,跟外面互不干扰。你再也不用担心“在我电脑上能跑,在你那就报错”这种事了。
- 一键启动:原来需要手动执行的好几条命令,现在写在一个配置文件里,一条命令就能全部搞定。部署、更新、重启,都变得非常简单。
- 易于管理:特别是当我们后面还要加入监控服务时,用Docker Compose可以轻松地把多个服务(比如伏羲应用和Prometheus)组织在一起,统一管理。
- 快速复现:今天部署好了,明天换台机器,或者分享给同事,直接把配置文件给他,瞬间就能搭建起一模一样的环境。
所以,用Docker Compose不是炫技,而是为了让你更省心、更高效地把这个强大的天气预报模型用起来。
2. 部署前准备:你的电脑需要什么?
在开始动手之前,我们先看看你的“地基”打得牢不牢。运行这套容器化的伏羲系统,对电脑有一些基本要求。
2.1 硬件要求
伏羲模型进行数值计算,对算力有一定需求。虽然我们用Docker封装了,但容器最终还是要调用你电脑的硬件资源。
- CPU:建议使用多核处理器。模型推理过程已经过优化,可以并行计算,核心越多,速度相对越快。普通的现代四核或六核处理器就够用了。
- 内存(RAM):建议16GB或以上。这是最关键的一点。模型本身和中间计算数据都会占用大量内存。如果内存不足,程序可能会运行非常缓慢,甚至直接崩溃。
- 硬盘空间:至少需要准备10GB的可用空间。这主要用于存放Docker镜像、模型文件(约9GB)以及生成的预报数据。
- GPU(可选但推荐):如果你有NVIDIA显卡,并且安装了正确的驱动,可以显著提升预报速度。我们的配置也支持GPU加速。没有GPU也没关系,用CPU也能跑,就是需要多点耐心。
2.2 软件要求
软件层面就简单多了,核心是安装Docker。
- 安装Docker Engine和Docker Compose:
- 如果你用的是Windows或macOS,直接去Docker官网下载Docker Desktop安装就行,它包含了所有需要的组件。
- 如果你用的是Linux系统(比如Ubuntu),可以通过包管理器安装。这里以Ubuntu为例,打开终端执行:
# 更新软件包列表 sudo apt-get update # 安装Docker sudo apt-get install docker.io docker-compose # 将当前用户加入docker组,避免每次都用sudo sudo usermod -aG docker $USER - 重要:安装完成后,请注销并重新登录系统,或者重启电脑,这样用户组更改才能生效。
- 验证安装:打开终端,输入以下命令,如果能看到版本号,说明安装成功。
docker --version docker-compose --version
好了,硬件软件都准备好了,接下来就是重头戏:编写我们的“一键部署”说明书。
3. 编写Docker Compose编排文件
Docker Compose的核心是一个叫 docker-compose.yml 的配置文件。这个文件就像乐高图纸,告诉Docker需要搭建哪些“积木”(服务),以及它们之间如何连接。
我们在一个你喜欢的目录下(比如 ~/fuxi-docker),创建这个文件。
version: '3.8'
services:
# 伏羲天气预报应用服务
fuxi-forecast:
image: csdnmirrors/fuxi-weather:latest # 使用预构建的镜像
container_name: fuxi-app
restart: unless-stopped # 容器意外退出时自动重启
ports:
- "7860:7860" # 将容器的7860端口映射到主机的7860端口
volumes:
# 挂载模型目录,避免每次重建容器都重新下载模型
- ./ai-models:/root/ai-models
# 挂载示例数据目录,方便测试
- ./sample_data:/root/fuxi2/Sample_Data
# 挂载输出目录,预报结果保存在主机上
- ./forecast_output:/root/fuxi2/output
environment:
- MODEL_PATH=/root/ai-models/ai4s/fuxi2/FuXi_EC # 模型路径环境变量
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu] # 如果宿主机有NVIDIA GPU,则启用GPU支持
# 健康检查,确保服务真正启动成功
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7860"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Prometheus 监控服务
prometheus:
image: prom/prometheus:latest
container_name: fuxi-prometheus
restart: unless-stopped
ports:
- "9090:9090" # Prometheus的Web界面端口
volumes:
# 挂载Prometheus配置文件
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
# 挂载数据目录,持久化监控数据
- ./prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
depends_on:
fuxi-forecast:
condition: service_healthy # 等待伏羲应用健康检查通过后再启动
# Grafana 数据可视化面板(可选,但强烈推荐)
grafana:
image: grafana/grafana:latest
container_name: fuxi-grafana
restart: unless-stopped
ports:
- "3000:3000" # Grafana的Web界面端口
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123 # 设置初始管理员密码,请务必修改!
volumes:
# 挂载Grafana数据目录,持久化仪表盘配置
- ./grafana_data:/var/lib/grafana
depends_on:
- prometheus
我来解释一下这个配置文件里的几个关键点:
-
fuxi-forecast服务:这是主角。image: 我们使用了一个预构建好的Docker镜像csdnmirrors/fuxi-weather:latest,它里面已经包含了FuXi应用和所有Python依赖。这省去了你从头构建镜像的麻烦。volumes: 挂载了三个目录。这是Docker里非常重要的概念,它能把容器内的目录和主机上的目录关联起来。这样,模型文件、你的输入数据、预报结果都不会随着容器的删除而消失。environment: 设置了一个环境变量,告诉应用模型在哪里。deploy.resources: 如果检测到你的主机有NVIDIA GPU,它会自动启用GPU来加速计算。healthcheck: 定义了一个健康检查,Docker会定期检查应用接口是否能访问,确保服务是真正可用的。
-
prometheus服务:这是监控员。- 它负责抓取和存储伏羲应用(以及其他系统)的运行指标,比如CPU使用率、内存占用、请求次数等。
- 它依赖
fuxi-forecast,并且会等伏羲应用健康启动后,自己再启动。
-
grafana服务:这是仪表盘。- Prometheus存了一堆数据,但直接看数字不直观。Grafana能把它们变成漂亮的图表和仪表盘,让你一眼就看清系统状态。
- 它依赖
prometheus,从后者那里获取数据。
光有Prometheus还不行,我们得告诉它监控谁。所以需要在主机上创建Prometheus的配置文件。
4. 配置Prometheus监控
在 docker-compose.yml 的同级目录,创建一个 prometheus 文件夹,然后在里面创建 prometheus.yml 文件。
# prometheus/prometheus.yml
global:
scrape_interval: 15s # 每15秒抓取一次数据
evaluation_interval: 15s # 每15秒评估一次规则
# 告警规则配置(可选,本篇先不展开)
# rule_files:
# - "alert.rules"
# 抓取配置,告诉Prometheus监控哪些目标
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控我们的伏羲应用服务
- job_name: 'fuxi-app'
static_configs:
- targets: ['fuxi-forecast:7860'] # 使用Docker Compose的服务名进行内部网络通信
metrics_path: '/metrics' # 假设伏羲应用在7860端口提供了/metrics端点(需应用支持)
# 注意:标准的FuXi应用可能不原生暴露Prometheus指标。
# 一种常见做法是使用“导出器”(exporter),比如一个旁路容器,通过读取应用日志或状态来生成指标。
# 这里是一个示例配置,实际部署时可能需要额外开发或使用第三方exporter。
# 监控Docker容器(需要额外安装cAdvisor)
# - job_name: 'cadvisor'
# static_configs:
# - targets: ['cadvisor:8080']
重要说明:上面的配置中,targets: ['fuxi-forecast:7860'] 和 metrics_path: '/metrics' 是一个理想化的假设。目前标准的FuXi Web应用(基于Gradio)可能并没有直接提供一个Prometheus格式的指标端点。
要让监控真正工作起来,通常有几种方法:
- 修改应用代码:在伏羲的Python应用(
app.py)中集成Prometheus客户端库(如prometheus_client),在关键函数处埋点,并暴露一个/metrics的HTTP接口。 - 使用Sidecar容器:启动一个独立的“监控代理”容器,与伏羲应用共享部分资源(如网络、进程空间),通过读取应用日志、分析系统调用或调用应用的管理API来生成指标。
- 使用cAdvisor:监控容器级别的资源使用情况(CPU、内存、网络IO)。这相对容易,在
docker-compose.yml中添加cAdvisor服务并配置Prometheus抓取即可,但它无法获取应用内部的业务指标(如“预报请求数”、“平均推理耗时”)。
为了教程的完整性,我们先采用第3种简单方法,监控容器资源。你可以取消 docker-compose.yml 和 prometheus.yml 中关于cAdvisor的注释,并添加以下服务定义到 docker-compose.yml:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: fuxi-cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg
depends_on:
- fuxi-forecast
同时取消 prometheus.yml 中 cadvisor job的注释。这样,你就能在Prometheus和Grafana中看到每个容器的CPU、内存使用情况了。
5. 一键启动与使用指南
配置文件都准备好了,现在让我们启动整个服务栈。
-
启动所有服务: 打开终端,进入你存放
docker-compose.yml的目录(例如~/fuxi-docker),执行一条命令:docker-compose up -d-d参数表示在“后台”运行。Docker会开始拉取镜像(如果本地没有)、创建容器、并按照依赖关系启动它们。第一次运行可能会花几分钟下载镜像。 -
查看服务状态: 启动后,可以用下面的命令检查服务是否都在正常运行:
docker-compose ps你应该看到
fuxi-app,fuxi-prometheus,fuxi-grafana(以及可选的fuxi-cadvisor) 的状态都是Up。 -
访问服务:
- 伏羲天气预报应用:打开浏览器,访问
http://你的服务器IP:7860。你应该能看到和官方文档里一样的Gradio Web界面。 - Prometheus监控:访问
http://你的服务器IP:9090。你可以在这里查询监控指标,比如输入container_memory_usage_bytes{name="fuxi-app"}来查看伏羲容器的内存使用量。 - Grafana仪表盘:访问
http://你的服务器IP:3000。首次登录用户名和密码都是admin(它会强制你修改密码)。登录后,需要添加Prometheus作为数据源(地址填http://prometheus:9090,因为它们在同一个Docker网络内),然后就可以导入或创建漂亮的监控仪表盘了。
- 伏羲天气预报应用:打开浏览器,访问
-
进行天气预报: 在伏羲的Web界面(7860端口):
- 准备数据:你需要一个符合格式的NetCDF文件作为输入。你可以先使用我们挂载到容器内的示例数据(如果镜像提供了的话),或者按照官方文档的说明,使用
make_era5_input.py等脚本准备你自己的数据。 - 配置参数:选择短期、中期、长期的预报步数。
- 运行预报:点击运行按钮,等待结果。在终端,你可以用
docker-compose logs -f fuxi-forecast来实时查看应用日志。
- 准备数据:你需要一个符合格式的NetCDF文件作为输入。你可以先使用我们挂载到容器内的示例数据(如果镜像提供了的话),或者按照官方文档的说明,使用
-
管理服务:
- 停止服务:
docker-compose down。这会停止并移除所有容器,但不会删除你挂载卷里的数据(模型、输出、监控数据)。 - 查看日志:
docker-compose logs [服务名],例如docker-compose logs fuxi-forecast。 - 重启服务:
docker-compose restart [服务名]。
- 停止服务:
6. 总结与后续建议
通过这篇教程,我们完成了几件事:
- 容器化部署:用Docker Compose把复杂的伏羲天气预报系统及其依赖,打包成了一个可以通过一条命令
docker-compose up -d就轻松部署的服务栈。 - 数据持久化:通过卷挂载,确保了模型文件、你的数据和预报结果的安全,不会随容器消失。
- 集成监控:引入了Prometheus和Grafana,让你不仅能使用模型,还能清晰地掌握它的运行状态和资源消耗,为后续的性能分析和优化打下了基础。
给后续深入使用的几点建议:
- 安全第一:务必修改Grafana的默认密码。考虑为服务设置更复杂的密码,或者使用环境变量文件(
.env)来管理敏感信息。 - 指标定制:要监控应用内部的业务指标(如每次预报的耗时),最好的办法还是修改伏羲应用的代码,集成Prometheus SDK进行埋点。这需要一些开发工作,但能提供最有价值的洞察。
- 资源限制:在生产环境中,建议在
docker-compose.yml中为每个服务设置资源限制(deploy.resources.limits),防止某个容器耗尽主机资源。 - 数据准备流水线:将数据预处理脚本(如
make_era5_input.py)也容器化,并设计成自动化流水线,这样从原始数据到最终预报,可以完全自动化运行。
伏羲模型是一个强大的科研工具,通过Docker和现代运维工具的包装,它变得更容易被开发者、研究者甚至气象爱好者所使用。希望这个教程能帮你跨过部署的门槛,真正把精力聚焦在气象预测的应用和探索上。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐




所有评论(0)