Прогноз погоды на Raspberry Pi: легкая нейросеть для локального инференса | AiManual
AiManual Logo Ai / Manual.
11 Фев 2026 Гайд

Edge-прогноз погоды на Raspberry Pi: когда 4GB RAM хватает для нейросети

Архитектура метеомодели для Raspberry Pi. Собираем edge-решение для прогноза температуры без облаков. Компромиссы, код, оптимизации.

Зачем предсказывать погоду на Raspberry Pi? (Серьезный вопрос)

Открою секрет: все крупные метеосервисы врут. Ну, не врут, а усредняют. Их модели генерируют прогноз для квадрата 10x10 километров, а у вас во дворе может быть свой микроклимат. Особенно если живете в низине, рядом с водоемом или в городе с эффектом "теплового острова".

Edge-прогноз - это не про замену Гидрометцентра. Это про создание персональной метеостанции, которая учится на ваших данных и предсказывает температуру именно в вашей точке. Без интернета. Без подписок. Без отправки данных куда-либо.

Ключевая идея: мы не строим глобальную модель атмосферы. Мы строим простую регрессионную модель, которая по историческим данным ваших датчиков предсказывает температуру на N часов вперед. Это как персональный синоптик в коробке за $60.

Что не так с облачными метео-API? (Практические проблемы)

Попробуйте запустить запрос к OpenWeatherMap с Raspberry Pi в деревне. Задержка - 2-3 секунды. Трафик - пусть и небольшой, но постоянный. А если интернет упал? А если API изменили? А если начали брать деньги?

Локальный инференс решает эти проблемы:

  • Нулевая задержка после загрузки модели
  • Работа полностью офлайн
  • Нет зависимости от сторонних сервисов
  • Конфиденциальность - данные никуда не уходят

Но есть и обратная сторона: ограниченные вычислительные ресурсы. Raspberry Pi 4 с 4GB RAM - это не NVIDIA A100. Нам нужна модель, которая поместится в память и будет работать быстрее, чем обновление через API.

Архитектура: что выбрасываем, что оставляем

Современные метеомодели вроде GraphCast от Google используют графовые нейросети и трансформеры. Они точные. Они красивые. Они совершенно бесполезны на Raspberry Pi (даже на Pi 5).

Наша архитектура проще:

Компонент Что используем Почему
Модель Простая LSTM или GRU сеть Временные ряды, мало параметров
Фреймворк ONNX Runtime Кроссплатформенность, оптимизация под ARM
Язык Python с C++ биндингами Баланс скорости разработки и производительности
Данные Температура, влажность, давление (локальные датчики) Максимум 3-5 фичей - простота

Важное ограничение: мы не предсказываем осадки, ветер или облачность. Только температуру. Почему? Потому что для точного прогноза осадков нужны спутниковые данные и сложные физические модели. А температура - локальный параметр, который хорошо экстраполируется.

1 Собираем железо: что нужно кроме Raspberry Pi

Минимальный набор:

  • Raspberry Pi 4/5 (2GB RAM хватит, но 4GB комфортнее)
  • Датчик BME280 (температура, влажность, давление) - стоит $5-10
  • MicroSD карта класса A2 (обязательно!) - иначе инференс будет тормозить из-за медленного I/O

Если планируете систему для теплицы или фермы, добавьте датчик освещенности. Но помните: каждый новый датчик - дополнительная фича в модели, а значит, больше параметров.

Про установку ОС и базовую настройку я писал в статье про запуск LLM на Raspberry Pi. Те же принципы: отключаем swap, настраиваем файловую систему, ставим кулер (модель будет нагружать CPU).

2 Готовим данные: как не переобучить модель на шум

Самая частая ошибка в edge-ML: сбор недостаточного количества данных. Месяца показаний датчика хватит только для очень приблизительного прогноза. Нужны сезонные изменения.

План сбора данных:

# Пример логирования данных с BME280
import board
import adafruit_bme280
import sqlite3
from datetime import datetime
import time

i2c = board.I2C()
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)

db = sqlite3.connect('weather_data.db')
cursor = db.cursor()

# Создаем таблицу один раз
cursor.execute('''
CREATE TABLE IF NOT EXISTS measurements (
    timestamp INTEGER PRIMARY KEY,
    temperature REAL,
    humidity REAL,
    pressure REAL
)
''')

while True:
    timestamp = int(datetime.now().timestamp())
    temp = bme280.temperature
    humidity = bme280.humidity
    pressure = bme280.pressure
    
    cursor.execute('''
    INSERT INTO measurements VALUES (?, ?, ?, ?)
    ''', (timestamp, temp, humidity, pressure))
    
    db.commit()
    time.sleep(300)  # Каждые 5 минут

Собираем минимум 3 месяца данных. Зимой, весной, летом - чтобы модель увидела все сезоны. Если нет времени ждать, можно взять открытые данные с ближайшей метеостанции и дообучить на своих.

💡
Не используйте сырые данные! Температура имеет суточный и сезонный тренды. Примените скользящее среднее за 24 часа, чтобы убрать шум. Нормализуйте данные между -1 и 1 - это ускорит обучение.

3 Проектируем нейросеть: меньше слоев, больше смысла

Вот архитектура, которая работает на Raspberry Pi 4 с инференсом меньше 100 мс:

import torch
import torch.nn as nn

class TinyWeatherLSTM(nn.Module):
    def __init__(self, input_size=3, hidden_size=32, num_layers=2, output_size=24):
        super().__init__()
        # Всего ~5,000 параметров - влезет куда угодно
        self.lstm = nn.LSTM(
            input_size=input_size,
            hidden_size=hidden_size,
            num_layers=num_layers,
            batch_first=True,
            dropout=0.1
        )
        # Предсказываем температуру на 24 часа вперед
        self.fc = nn.Linear(hidden_size, output_size)
        
    def forward(self, x):
        # x shape: (batch, seq_len=168, features=3)
        # 168 часов = 7 дней истории
        lstm_out, _ = self.lstm(x)
        # Берем только последний выход
        last_output = lstm_out[:, -1, :]
        return self.fc(last_output)

Почему именно такие параметры?

  • Input size=3: температура, влажность, давление. Можно добавить время суток (sin/cos кодирование)
  • Hidden size=32: золотая середина между точностью и скоростью
  • Seq len=168: неделя истории с шагом в час. Этого достаточно для учета циклов
  • Output size=24: прогноз на сутки вперед по часам

Для сравнения: модель Granite 4.0 Nano от IBM имеет 350M параметров. Наша - 5,000. В 70,000 раз меньше.

4 Обучение: делаем на ПК, запускаем на Pi

Обучаем модель на компьютере с GPU (или в Google Colab). Затем конвертируем в ONNX - формат, который ONNX Runtime ест на ARM.

# Экспорт в ONNX
import torch.onnx

dummy_input = torch.randn(1, 168, 3)  # Батч, история, фичи
torch.onnx.export(
    model,
    dummy_input,
    "weather_model.onnx",
    input_names=["input"],
    output_names=["output"],
    dynamic_axes={
        "input": {0: "batch_size"},
        "output": {0: "batch_size"}
    }
)

Переносим файл weather_model.onnx на Raspberry Pi. Устанавливаем ONNX Runtime для ARM:

pip install onnxruntime
# Или для максимальной производительности:
pip install onnxruntime-arm

5 Инференс на Raspberry Pi: оптимизация до миллисекунд

Вот как выглядит код прогноза:

import onnxruntime as ort
import numpy as np
from datetime import datetime, timedelta

class WeatherPredictor:
    def __init__(self, model_path):
        # Используем CPU провайдер, но можно попробовать ARMNN
        self.session = ort.InferenceSession(
            model_path,
            providers=['CPUExecutionProvider']
        )
        self.input_name = self.session.get_inputs()[0].name
        
    def predict(self, history_data):
        # history_data shape: (1, 168, 3)
        # Нормализованные данные
        inputs = {self.input_name: history_data.astype(np.float32)}
        outputs = self.session.run(None, inputs)
        predictions = outputs[0][0]  # (24,)
        
        # Денормализуем обратно в градусы
        return self.denormalize(predictions)
        
    def denormalize(self, data):
        # Ваша логика денормализации
        return data * 30 + 10  # Пример для температуры от -20 до +40

На Raspberry Pi 4 этот код выполняется за 50-80 мс. Меньше, чем HTTP-запрос к облачному API.

Не используйте PyTorch напрямую на Raspberry Pi для инференса! Он съест всю память и будет работать в 10 раз медленнее. ONNX Runtime оптимизирован под ARM и использует меньше ресурсов.

Инженерные компромиссы: что жертвуем, что получаем

Edge-разработка - это всегда trade-offs. Наш случай:

Что жертвуем Что получаем взамен Насколько это критично
Точность прогноза Локальность и скорость Погрешность ±2°C вместо ±1°C
Долгосрочный прогноз Краткосрочный (24 часа) Для автоматизации полива хватит
Разнообразие параметров Только температура Основной параметр для большинства задач
Сложность модели Энергоэффективность Потребление < 1Вт вместо 100+ Вт у сервера

Практическое применение: не только для гиков

Где такая система реально полезна?

  • Умная теплица: прогноз заморозков ночью - включить обогрев. Прогноз жары - включить вентиляцию
  • Фермерское хозяйство: предсказание температуры почвы для посадки
  • Домашняя автоматизация: включение обогревателя за час до похолодания
  • Солнечные панели: прогноз облачности для оптимизации накопления энергии

Система стоит $60-100 в сборе и работает годами. Для сравнения: коммерческие метеостанции с API стоят от $500 плюс абонентская плата.

Аппаратное ускорение: нужно ли оно?

Raspberry Pi 5 имеет более мощный CPU, но все еще без NPU. Orange Pi 5 Pro с NPU показывает интересные результаты для LLM, но для нашей простой LSTM NPU - overkill.

Почему не стоит гнаться за аппаратным ускорением:

  1. Модель слишком простая для NPU - overhead на передачу данных съест выгоду
  2. Драйверы и поддержка ONNX на NPU - головная боль
  3. Энергопотребление NPU выше, чем у CPU при таких вычислениях

Исключение: если вы делаете систему на 100+ датчиков (умная ферма). Тогда NPU типа в Tiiny AI Pocket Lab может обрабатывать несколько моделей параллельно.

Ошибки, которые все совершают (и как их избежать)

1. Обучение на слишком короткой истории. Меньше 3 месяцев - модель не увидит сезонность. Решение: использовать открытые данные для предобучения.

2. Забыть про временные метки. Температура в 15:00 и 03:00 - разный контекст. Решение: добавлять час дня как фичу (sin/cos кодирование).

3. Игнорировать аппаратные ограничения. Попытка запустить PyTorch с автоградом на инференсе. Решение: только ONNX Runtime или LibTorch без графа.

4. Не валидировать на реальных данных. Отличные метрики на тестовой выборке, а в реальности - провал. Решение: A/B тестирование с реальными показаниями.

Что дальше? Эволюция edge-метеомоделей

Наша LSTM - только начало. Вот куда движется область:

  • TinyML модели в несколько килобайт для микроконтроллеров
  • Ансамбли простых моделей: одна для температуры, другая для влажности, третья для давления
  • Федеративное обучение: несколько Raspberry Pi обмениваются весами без отправки сырых данных
  • Квантование до INT8: ускорение инференса в 2-4 раза почти без потери точности

Уже сейчас появляются специализированные чипы вроде того, что использует Reservoir Computing от TDK для предсказания временных рядов с минимальным энергопотреблением.

💡
Самый неочевидный совет: добавьте в систему "человеческую проверку". Пусть первые 2 недели модель делает прогноз, но не действует. Сравнивайте с реальностью. Только когда MAE (средняя абсолютная ошибка) упадет ниже 1.5°C - доверяйте автоматизации. Иначе рискуете заморозить помидоры.

Edge-прогноз погоды - это не про создание конкурента Гидрометцентру. Это про демократизацию метеоданных. Когда каждый фермер, садовод или просто гик может иметь персональную метеостанцию с ИИ за стоимость ужина в ресторане.

И самое главное: эта система учится именно на ваших данных. Через год работы она будет знать, что в вашем дворе всегда на 2 градуса холоднее, чем на официальной станции. А это именно та точность, за которой мы гоняемся.