Распределенное хранилище чекпоинтов ML на 4 Raspberry Pi 4B | AiManual
AiManual Logo Ai / Manual.
28 Май 2026 Гайд

Как собрать распределенное хранилище чекпоинтов ML на 4 Raspberry Pi 4B: пошаговое руководство

Пошаговый гайд по сборке отказоустойчивого S3-хранилища для чекпоинтов нейросетей из четырех Raspberry Pi 4B. Все детали, код и типичные ошибки.

Чекпоинты современных LLM весят десятки гигабайт. Когда вы тренируете модель на домашнем сервере или арендуете GPU в облаке, последнее, чего хочется — потерять неделю вычислений из-за отказа одного диска. S3-совместимые хранилища вроде AWS S3, Backblaze B2 решают проблему, но стоят денег. А если у вас уже валяется несколько Raspberry Pi 4B (да, тех самых, что вы купили для умного дома и забросили) — вы сидите на нефтяной скважине.

💡
Идея: собрать из четырёх Pi 4B отказоустойчивое объектное хранилище, к которому будут «приземляться» чекпоинты с вашего тренировочного сервера. За цену одного внешнего SSD получаем четырехкратное резервирование и скорость чтения, ограниченную только сетью.

Почему именно Raspberry Pi 4B, а не Orange Pi или старый ноутбук?

Raspberry Pi 4B — идеальный баланс цены, энергопотребления и производительности портов. У него гигабитный Ethernet, два USB 3.0 (к которым можно подключить SSD), и он работает от 5V/3A блока. Четыре таких камня в сумме дают 4-8 TB сырого дискового пространства (зависит от того, какие SSD вы вставите). Да, процессор ARM Cortex-A72 слаб — но хранилищу и не нужен мощный CPU, ему нужна сеть.

⚠️ Важный нюанс: не пытайтесь ставить Ceph на Raspberry Pi. Ceph требует минимум 4 ГБ ОЗУ на OSD и очень чувствителен к задержкам. MinIO, написанный на Go, работает на малинке просто отлично и потребляет ~200-300 MB памяти на ноду.

В этом гайде я расскажу, как превратить четыре Raspberry Pi 4B (желательно версии 4GB, но и 2GB хватит) в распределенное S3-хранилище, способное пережить потерю любой одной малинки без потери данных. Все шаги проверены лично — я использую такую связку для хранения чекпоинтов обучения моделей семейства LLaMA на 7B-13B.

Железо: что покупать (если у вас ничего нет)

Компонент Рекомендация Примерная цена (2026)
Raspberry Pi 4B 4GB RAM, модель B ~3000 руб/шт
SSD SATA SSD + USB 3.0 корпус (Crucial MX500 500GB) ~5000 руб/шт
MicroSD Samsung EVO Plus 32GB (только для системы) ~500 руб/шт
Сеть Gigabit Ethernet свитч + кабели Cat6 2000 руб (свитч) + ~1000 руб на кабели
Блоки питания Официальный 5V/3A (или качественный USB-C 30W) ~600 руб/шт
Корпус + охлаждение Любой корпус с радиаторами + активное охлаждение ~500 руб/комплект

Итого около 30 000 рублей за полностью готовый кластер из 4 нод с 2 TB полезного пространства (в режиме erasure coding на 8-4). Если брать не 500 ГБ, а по 1 ТБ — цена удвоится, но и пространства станет 4 ТБ.

Софт: стек на май 2026 года

На момент написания статьи актуальная версия Raspberry Pi OS — Bookworm (Debian 12) с ядром 6.6. MinIO рекомендую версию RELEASE.2026-05-26T12-00-00Z — именно она стабильна под ARM64. Альтернатива — использовать официальный Docker-образ, но на Raspberry Pi я предпочитаю устанавливать бинарник напрямую: меньше проблем с производительностью.

Проблема: как НЕ надо делать

Типичная ошибка новичка — попытаться собрать RAID поверх NFS. Это медленно, ненадежно и при отказе одной ноды вы теряете весь пул. Или ещё хуже — поставить MinIO на SD-карту. SD-карта сдохнет через две недели, потому что MinIO активно пишет логи и метаданные. Мой знакомый так загубил три карты подряд.

Правильный подход: система на microSD (читайте отдельную статью как избежать износа microSD — ссылку), данные на SSD через USB 3.0. А распределенность — это не RAID, а erasure coding или репликация поверх MinIO.

Решение: MinIO в распределенном режиме

MinIO поддерживает «распределенный» режим, когда несколько серверов (нод) работают как единое S3-хранилище. Данные автоматически шардируются и защищаются erasure coding. Для 4 нод и 4 дисков оптимальная схема — EC:4 (данные делятся на 2 равные части + 2 parity-шарды). Потеря любой одной ноды (или даже двух) не приведет к потере данных.

Пошаговая сборка

1 Подготовка SD-карт и первого запуска

Скачайте Raspberry Pi Imager v1.9 (последняя версия на 2026) и запишите Raspberry Pi OS Lite (64-bit) Bookworm на четыре SD-карты. При записи сразу настройте:

  • Имя хоста: pi-storage-1, pi-storage-2 и т.д.
  • SSH включить, пароль задать одинаковый (или ключи).
  • Wi-Fi не трогаем — используем только ethernet.

После первой загрузки подключитесь по SSH к каждой ноде и сделайте базовые тюнинги:

# Обновим систему и изменим настройки SD-карты
sudo apt update && sudo apt upgrade -y

# Отключаем swap (не нужен для MinIO)
sudo dphys-swapfile swapoff
sudo systemctl disable dphys-swapfile

# Монтируем SSD в /data (на каждой ноде свой)
sudo mkdir /data
# Узнайте имя диска: lsblk
sudo mkfs.ext4 /dev/sda1
sudo mount /dev/sda1 /data
# Добавить в fstab

2 Установка MinIO на каждую ноду

Скачиваем бинарник под ARM64 с официального сайта MinIO:

wget https://dl.min.io/server/minio/release/linux-arm64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

# Проверить версию
minio --version
# Должно быть: minio version RELEASE.2026-05-26T12-00-00Z (или новее)

Создаем пользователя и сервис systemd:

sudo useradd -r minio-user -s /sbin/nologin
sudo chown minio-user:minio-user /data

# Создаем файл переменных окружения
sudo nano /etc/default/minio

Содержимое /etc/default/minio:

MINIO_VOLUMES="http://pi-storage-1:9000/data http://pi-storage-2:9000/data http://pi-storage-3:9000/data http://pi-storage-4:9000/data"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=сложный_пароль

(Внимание! Параметр VOLUMES указываем одинаковый на всех нодах — это диски всех серверов в кластере. MinIO сам разберется, какие данные ему принадлежат.)

Создаем systemd unit:

sudo nano /etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio

3 Настройка DNS или /etc/hosts

Чтобы ноды видели друг друга по именам, добавьте на каждой малинке записи в /etc/hosts (или настройте локальный DNS). Пример для pi-storage-1:

192.168.1.101 pi-storage-1
192.168.1.102 pi-storage-2
192.168.1.103 pi-storage-3
192.168.1.104 pi-storage-4
💡
IP-адреса должны быть статическими. Настройте их в роутере или через Netplan.

4 Проверка кластера

После того, как запустили MinIO на всех нодах, откройте веб-интерфейс на любой из них по адресу http://pi-storage-1:9001. Войдите под admin и паролем. В разделе Status вы должны увидеть все 4 ноды со статусом Online.

Теперь создадим bucket и проверим простую загрузку через mc (MinIO Client):

# Установка mc
wget https://dl.min.io/client/mc/release/linux-arm64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# Привязка к кластеру
mc alias set myminio http://pi-storage-1:9000 admin пароль

# Создание bucket
mc mb myminio/checkpoints

# Загрузка тестового файла
echo "hello cluster" > test.txt
mc cp test.txt myminio/checkpoints/

# Проверка
echo "Кластер работает!"

5 Подключение из ML workflow (Python)

Чтобы ваша тренировочная программа сохраняла чекпоинты прямо в MinIO, используйте библиотеку boto3 (S3-совместимо). Устанавливаем:

pip install boto3

Пример сохранения чекпоинта:

import boto3
from botocore.config import Config

s3 = boto3.client(
    's3',
    endpoint_url='http://pi-storage-1:9000',
    aws_access_key_id='admin',
    aws_secret_access_key='ваш_пароль',
    config=Config(signature_version='s3v4'),
    region_name='us-east-1'
)

# Сохраняем файл модели (например, после 100 шагов)
s3.upload_file('/tmp/checkpoint.pt', 'checkpoints', 'run1/step_100.pt')
print("Чекпоинт сохранен в кластер")

Для быстрых экспериментов можно также использовать s3fs — FUSE-модуль, который монтирует bucket как директорию. Но я не рекомендую — при частых записях возможны лаги.

Производительность: ожидания vs реальность

На 4 малинках через гигабитный Ethernet вы получите около 70-90 MB/s на чтение последовательных данных. Этого хватит для чекпоинтов большинства моделей (они не гигабайты в секунду). Запись будет чуть медленнее из-за erasure coding — около 50-60 MB/s. Если вам нужно быстрее — придется собирать кластер на более мощном железе, например на AMD Strix Halo (есть отдельная статья-гайд).

Частые ошибки и как их избежать

Ошибка Последствия Решение
Не настроить /etc/hosts Ноды не видят друг друга Прописать IP-имена
Разный пароль MINIO_ROOT_PASSWORD на нодах Кластер не соберется Пароль должен быть одинаковым
Использование SD-карты для данных Быстрый износ и потеря данных Данные только на SSD через USB
Не включен TCP BBR Низкая пропускная способность sudo nano /etc/sysctl.conf + net.core.default_qdisc=fq + net.ipv4.tcp_congestion_control=bbr

Почему не GlusterFS или Ceph?

GlusterFS на ARM соберете с трудом — кривые биндинги. Ceph требует больше 4 ГБ ОЗУ на процесс. MinIO — легковесный, написан на Go, имеет отличную документацию и клиент для Python. А главное — он умеет erasure coding «из коробки», что дает отказоустойчивость без лишних телодвижений.

Что дальше?

Если ваш кластер уже работает, попробуйте нагрузить его реальными чекпоинтами. Следите за температурой малинок — без активного охлаждения SSD могут греться до 70°C. И не забудьте настроить мониторинг через Prometheus + Grafana. MinIO отдает метрики в формате Prometheus по адресу /minio/v2/metrics/cluster. Советую также прочитать статью про создание кластера Raspberry Pi для нейросетей — там много смежных советов.

FAQ

Сколько будет стоить такой кластер в 2026?

Около 30 000 руб с SSD на 500 ГБ каждый. Примерно как один средний GPU, но хранилище работает 24/7 и потребляет ~40 Вт.

Можно ли использовать Pi 3 B+?

Можно, но скорость будет <100 Мбит/с из-за USB 2.0. Только для экспериментов.

Насколько надежно такое хранилище?

При выходе одного Pi (диск или сам компьютер) данные не теряются — erasure coding восстанавливает их из оставшихся трех. Сдохли два — данные целы, если настроить EC с 6+4 (но у нас всего 4 диска). Для ML чекпоинтов — достаточно.

Как сделать бэкап всего кластера?

Используйте mc mirror для репликации в другой bucket на облаке (например, B2). Или просто rsync по crontab.

Последнее обновление: 28.05.2026. Если нашли ошибку — пишите в комментарии.

Подписаться на канал