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