伏羲天气预报部署教程: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。

  1. 安装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
      
    • 重要:安装完成后,请注销并重新登录系统,或者重启电脑,这样用户组更改才能生效。
  2. 验证安装:打开终端,输入以下命令,如果能看到版本号,说明安装成功。
    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

我来解释一下这个配置文件里的几个关键点:

  1. fuxi-forecast 服务:这是主角。

    • image: 我们使用了一个预构建好的Docker镜像 csdnmirrors/fuxi-weather:latest,它里面已经包含了FuXi应用和所有Python依赖。这省去了你从头构建镜像的麻烦。
    • volumes: 挂载了三个目录。这是Docker里非常重要的概念,它能把容器内的目录和主机上的目录关联起来。这样,模型文件、你的输入数据、预报结果都不会随着容器的删除而消失。
    • environment: 设置了一个环境变量,告诉应用模型在哪里。
    • deploy.resources: 如果检测到你的主机有NVIDIA GPU,它会自动启用GPU来加速计算。
    • healthcheck: 定义了一个健康检查,Docker会定期检查应用接口是否能访问,确保服务是真正可用的。
  2. prometheus 服务:这是监控员。

    • 它负责抓取和存储伏羲应用(以及其他系统)的运行指标,比如CPU使用率、内存占用、请求次数等。
    • 它依赖 fuxi-forecast,并且会等伏羲应用健康启动后,自己再启动。
  3. 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格式的指标端点。

要让监控真正工作起来,通常有几种方法:

  1. 修改应用代码:在伏羲的Python应用(app.py)中集成Prometheus客户端库(如 prometheus_client),在关键函数处埋点,并暴露一个 /metrics 的HTTP接口。
  2. 使用Sidecar容器:启动一个独立的“监控代理”容器,与伏羲应用共享部分资源(如网络、进程空间),通过读取应用日志、分析系统调用或调用应用的管理API来生成指标。
  3. 使用cAdvisor:监控容器级别的资源使用情况(CPU、内存、网络IO)。这相对容易,在 docker-compose.yml 中添加cAdvisor服务并配置Prometheus抓取即可,但它无法获取应用内部的业务指标(如“预报请求数”、“平均推理耗时”)。

为了教程的完整性,我们先采用第3种简单方法,监控容器资源。你可以取消 docker-compose.ymlprometheus.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.ymlcadvisor job的注释。这样,你就能在Prometheus和Grafana中看到每个容器的CPU、内存使用情况了。

5. 一键启动与使用指南

配置文件都准备好了,现在让我们启动整个服务栈。

  1. 启动所有服务: 打开终端,进入你存放 docker-compose.yml 的目录(例如 ~/fuxi-docker),执行一条命令:

    docker-compose up -d
    

    -d 参数表示在“后台”运行。Docker会开始拉取镜像(如果本地没有)、创建容器、并按照依赖关系启动它们。第一次运行可能会花几分钟下载镜像。

  2. 查看服务状态: 启动后,可以用下面的命令检查服务是否都在正常运行:

    docker-compose ps
    

    你应该看到 fuxi-app, fuxi-prometheus, fuxi-grafana (以及可选的 fuxi-cadvisor) 的状态都是 Up

  3. 访问服务

    • 伏羲天气预报应用:打开浏览器,访问 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网络内),然后就可以导入或创建漂亮的监控仪表盘了。
  4. 进行天气预报: 在伏羲的Web界面(7860端口):

    • 准备数据:你需要一个符合格式的NetCDF文件作为输入。你可以先使用我们挂载到容器内的示例数据(如果镜像提供了的话),或者按照官方文档的说明,使用 make_era5_input.py 等脚本准备你自己的数据。
    • 配置参数:选择短期、中期、长期的预报步数。
    • 运行预报:点击运行按钮,等待结果。在终端,你可以用 docker-compose logs -f fuxi-forecast 来实时查看应用日志。
  5. 管理服务

    • 停止服务docker-compose down。这会停止并移除所有容器,但不会删除你挂载卷里的数据(模型、输出、监控数据)。
    • 查看日志docker-compose logs [服务名],例如 docker-compose logs fuxi-forecast
    • 重启服务docker-compose restart [服务名]

6. 总结与后续建议

通过这篇教程,我们完成了几件事:

  1. 容器化部署:用Docker Compose把复杂的伏羲天气预报系统及其依赖,打包成了一个可以通过一条命令 docker-compose up -d 就轻松部署的服务栈。
  2. 数据持久化:通过卷挂载,确保了模型文件、你的数据和预报结果的安全,不会随容器消失。
  3. 集成监控:引入了Prometheus和Grafana,让你不仅能使用模型,还能清晰地掌握它的运行状态和资源消耗,为后续的性能分析和优化打下了基础。

给后续深入使用的几点建议

  • 安全第一:务必修改Grafana的默认密码。考虑为服务设置更复杂的密码,或者使用环境变量文件(.env)来管理敏感信息。
  • 指标定制:要监控应用内部的业务指标(如每次预报的耗时),最好的办法还是修改伏羲应用的代码,集成Prometheus SDK进行埋点。这需要一些开发工作,但能提供最有价值的洞察。
  • 资源限制:在生产环境中,建议在 docker-compose.yml 中为每个服务设置资源限制(deploy.resources.limits),防止某个容器耗尽主机资源。
  • 数据准备流水线:将数据预处理脚本(如 make_era5_input.py)也容器化,并设计成自动化流水线,这样从原始数据到最终预报,可以完全自动化运行。

伏羲模型是一个强大的科研工具,通过Docker和现代运维工具的包装,它变得更容易被开发者、研究者甚至气象爱好者所使用。希望这个教程能帮你跨过部署的门槛,真正把精力聚焦在气象预测的应用和探索上。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐