Перейти к основному содержимому

Тонкая настройка модели SmolVLA

Обзор

SmolVLA (Small Vision-Language-Action) - это легкая модель визуального-языкового-действия, разработанная HuggingFace и специально предназначенная для задач обучения роботов. Эта модель имеет всего 450M параметров, подходит для работы на потребительском оборудовании и является идеальным выбором для исследований и разработки в области обучения роботов.

Предварительные требования

Системные требования

  • Операционная система: Linux (рекомендуется Ubuntu 20.04+) или macOS
  • Версия Python: 3.8+
  • GPU: NVIDIA GPU (рекомендуется RTX 3080 или выше), минимум 8GB видеопамяти
  • Память: Минимум 16GB RAM
  • Дисковое пространство: Минимум 50GB свободного места

Подготовка среды

1. Установка LeRobot

# Клонировать репозиторий LeRobot
git clone https://github.com/huggingface/lerobot.git
cd lerobot

# Создать виртуальную среду
conda create -n lerobot python=3.10
conda activate lerobot

# Установить зависимости
pip install -e .

2. Установка дополнительных зависимостей

# Установить Flash Attention (опционально, для ускорения обучения)
pip install flash-attn --no-build-isolation

# Установить Weights & Biases (для отслеживания экспериментов)
pip install wandb
wandb login

Подготовка данных

Данные формата LeRobot

SmolVLA требует использования наборов данных формата LeRobot. Убедитесь, что ваш набор данных содержит следующую структуру:

your_dataset/
├── data/
│ ├── chunk-001/
│ │ ├── observation.images.cam_high.png
│ │ ├── observation.images.cam_low.png
│ │ └── ...
│ └── chunk-002/
│ └── ...
├── meta.json
├── stats.safetensors
└── videos/
├── episode_000000.mp4
└── ...

Требования к качеству данных

Согласно рекомендациям HuggingFace, SmolVLA требует:

  • Минимум 25 высококачественных эпизодов для достижения хорошей производительности
  • Рекомендуется 100+ эпизодов для оптимальных результатов
  • Каждый эпизод должен содержать полный процесс выполнения задачи
  • Рекомендуемое разрешение изображения 224x224 или 256x256

Тонкая настройка обучения

Базовая команда обучения

# Установить переменные среды
export HF_USER="io-ai-data"
export CUDA_VISIBLE_DEVICES=0

# Запустить тонкую настройку SmolVLA
lerobot-train \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--dataset.root /data/lerobot_dataset \
--batch_size 64 \
--steps 20000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_finetuning \
--policy.device cuda \
--policy.optimizer_lr 1e-4 \
--policy.scheduler_warmup_steps 1000 \
--policy.push_to_hub false \
--save_checkpoint true \
--save_freq 5000 \
--wandb.enable true \
--wandb.project smolvla_finetuning

Расширенная конфигурация обучения

Обучение на нескольких GPU

# Обучение на нескольких GPU с использованием torchrun
torchrun --nproc_per_node=2 --master_port=29500 \
$(which lerobot-train) \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--dataset.root /data/my_dataset \
--batch_size 32 \
--steps 20000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_multi_gpu \
--policy.device cuda \
--policy.optimizer_lr 1e-4 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true

Конфигурация оптимизации памяти

# Для GPU с меньшей видеопамятью
lerobot-train \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--batch_size 16 \
--steps 30000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_memory_optimized \
--policy.device cuda \
--policy.optimizer_lr 5e-5 \
--policy.use_amp true \
--num_workers 2 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true

Подробное описание параметров

Основные параметры

ПараметрЗначениеРекомендуемое значениеОписание
--policy.typeТип политикиsmolvlaТип модели SmolVLA
--policy.pretrained_pathПуть к предобученной моделиlerobot/smolvla_baseОфициальная предобученная модель на HuggingFace
--dataset.repo_idID репозитория набора данных${HF_USER}/my_datasetВаш набор данных HuggingFace
--dataset.rootМестоположение хранения набора данных/data/my_datasetУказать чтение из локального каталога (опционально)
--batch_sizeРазмер пакета64Настроить в соответствии с видеопамятью, RTX 3080 рекомендуется 32-64
--stepsШаги обучения20000Можно уменьшить до 10000 для небольших наборов данных
--output_dirВыходной каталогoutputs/train/smolvla_finetunedПуть сохранения модели
--job_nameИмя задачиsmolvla_finetuningДля логирования и отслеживания экспериментов (опционально)

Параметры обучения

ПараметрЗначениеРекомендуемое значениеОписание
--policy.optimizer_lrСкорость обучения1e-4Можно соответственно снизить при тонкой настройке
--policy.scheduler_warmup_stepsШаги прогрева1000Прогрев скорости обучения, стабилизирует обучение
--policy.use_ampСмешанная точностьtrueЭкономит видеопамять, ускоряет обучение
--policy.optimizer_grad_clip_normОбрезка градиента1.0Предотвращает взрыв градиента
--num_workersПотоки загрузки данных4Настроить в соответствии с количеством ядер CPU
--policy.push_to_hubОтправить в HubfalseЗагружать ли модель в HuggingFace (требуется repo_id)
--save_checkpointСохранить контрольные точкиtrueСохранять ли контрольные точки обучения
--save_freqЧастота сохранения5000Интервал шагов сохранения контрольных точек

Специфичные для модели параметры

ПараметрЗначениеРекомендуемое значениеОписание
--policy.vlm_model_nameМодель VLM backboneHuggingFaceTB/SmolVLM2-500M-Video-InstructВизуально-языковая модель, используемая SmolVLA
--policy.chunk_sizeРазмер блока действий50Длина предсказанной последовательности действий
--policy.n_action_stepsШаги выполнения действий50Количество фактически выполняемых действий
--policy.n_obs_stepsШаги истории наблюдений1Количество используемых кадров исторических наблюдений

Мониторинг обучения

Интеграция с Weights & Biases

SmolVLA поддерживает W&B для отслеживания экспериментов:

# Включить логирование W&B
lerobot-train \
--policy.type smolvla \
--dataset.repo_id your-name/your-repo \
--batch_size 64 \
--steps 20000 \
--policy.push_to_hub false \
--wandb.enable true \
--wandb.project smolvla_experiments \
--wandb.notes "SmolVLA finetuning on custom dataset" \
# ... другие параметры

Мониторинг ключевых метрик

Метрики для отслеживания во время обучения:

  • Loss: Общая потеря, должна стабильно уменьшаться
  • Action Loss: Потеря предсказания действий
  • Vision Loss: Потеря визуальных признаков
  • Language Loss: Потеря понимания языка
  • Learning Rate: Изменения скорости обучения
  • GPU Memory: Использование видеопамяти

Оценка модели

Сохранение и загрузка моделей

# Загрузить модель после тонкой настройки
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

policy = SmolVLAPolicy.from_pretrained(
"outputs/train/smolvla_finetuned/checkpoints/last",
device="cuda"
)

# Выполнить вывод
observation = {
"observation.images.cam_high": image_tensor,
"observation.state": state_tensor
}

action = policy.select_action(observation)

Скрипт оценки производительности

# evaluation.py
import torch
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
from lerobot.datasets.lerobot_dataset import LeRobotDataset

def evaluate_model(model_path, dataset_path):
# Загрузить модель
policy = SmolVLAPolicy.from_pretrained(model_path, device="cuda")

# Загрузить тестовый набор данных
dataset = LeRobotDataset(dataset_path, split="test")

total_loss = 0
num_samples = 0

with torch.no_grad():
for batch in dataset:
prediction = policy(batch)
loss = policy.compute_loss(prediction, batch)
total_loss += loss.item()
num_samples += 1

avg_loss = total_loss / num_samples
print(f"Average test loss: {avg_loss:.4f}")

return avg_loss

if __name__ == "__main__":
model_path = "outputs/train/smolvla_finetuned/checkpoints/last"
dataset_path = "path/to/your/test/dataset"
evaluate_model(model_path, dataset_path)

Развертывание и вывод

Пример вывода в реальном времени

# inference.py
import torch
import numpy as np
from PIL import Image
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

class SmolVLAInference:
def __init__(self, model_path):
self.policy = SmolVLAPolicy.from_pretrained(
model_path,
device="cuda"
)
self.policy.eval()

def predict_action(self, image, state, instruction=""):
# Предобработка изображения
if isinstance(image, np.ndarray):
image = Image.fromarray(image)

# Построить наблюдение
observation = {
"observation.images.cam_high": self.preprocess_image(image),
"observation.state": torch.tensor(state, dtype=torch.float32).unsqueeze(0),
"task.language_instruction": instruction
}

# Предсказать действие
with torch.no_grad():
action = self.policy.select_action(observation)

return action.cpu().numpy()

def preprocess_image(self, image):
# Логика предобработки изображения
image = image.resize((224, 224))
image_tensor = torch.tensor(np.array(image)).permute(2, 0, 1).float() / 255.0
return image_tensor.unsqueeze(0)

# Пример использования
if __name__ == "__main__":
inference = SmolVLAInference("outputs/train/smolvla_finetuned/checkpoints/last")

# Симуляция входных данных
image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
state = np.random.randn(7) # Состояние робота с 7 степенями свободы
instruction = "pick up the red cube"

action = inference.predict_action(image, state, instruction)
print(f"Predicted action: {action}")

Лучшие практики

Рекомендации по подготовке данных

  1. Качество данных: Обеспечьте качество демонстрационных данных, избегайте неправильных или несогласованных действий
  2. Разнообразие данных: Включите данные из разных сценариев, условий освещения и положений объектов
  3. Описание задач: Предоставьте четкое описание на естественном языке для каждого эпизода
  4. Баланс данных: Обеспечьте баланс между успешными и неуспешными случаями

Рекомендации по оптимизации обучения

  1. Планирование скорости обучения: Используйте стратегии прогрева и затухания скорости обучения
  2. Регуляризация: Соответствующее использование dropout и затухания весов
  3. Сохранение контрольных точек: Регулярно сохраняйте контрольные точки модели
  4. Стратегия ранней остановки: Отслеживайте потерю валидации, избегайте переобучения

Рекомендации по оптимизации оборудования

  1. Управление видеопамятью: Используйте обучение со смешанной точностью для экономии видеопамяти
  2. Размер пакета: Настройте размер пакета в соответствии с размером видеопамяти
  3. Загрузка данных: Используйте многопроцессную загрузку данных для ускорения обучения
  4. Параллелизм модели: Для больших моделей рассмотрите использование параллелизма модели

Часто задаваемые вопросы (FAQ)

Q: Какие преимущества имеет SmolVLA по сравнению с другими моделями VLA?

A: Основные преимущества SmolVLA включают:

  • Легковесность: Всего 450M параметров, подходит для потребительского оборудования
  • Эффективное обучение: Относительно короткое время обучения
  • Хорошая производительность: Отличная производительность на множестве задач робототехники
  • Легкое развертывание: Умеренный размер модели, удобен для практического развертывания

Q: Сколько времени занимает обучение?

A: Время обучения зависит от нескольких факторов:

  • Размер набора данных: 100 эпизодов занимают примерно 2-4 часа (RTX 3080)
  • Размер пакета: Большие пакеты могут ускорить обучение
  • Конфигурация оборудования: Лучшие GPU могут значительно сократить время обучения
  • Шаги обучения: 20000 шагов обычно достаточно для получения хороших результатов

Q: Как определить, сошлась ли модель?

A: Наблюдайте следующие метрики:

  • Кривые потерь: Общая потеря должна стабильно уменьшаться и выходить на плато
  • Производительность валидации: Производительность на валидационном наборе больше не улучшается
  • Предсказания действий: Действия, предсказанные моделью, должны быть разумными
  • Фактическое тестирование: Тестируйте производительность модели в реальной среде

Q: Что делать, если недостаточно видеопамяти?

A: Вы можете попробовать следующие методы:

  • Уменьшить размер пакета (например, с 64 до 32 или 16): --batch_size 16
  • Включить обучение со смешанной точностью: --policy.use_amp true
  • Уменьшить потоки загрузки данных: --num_workers 2
  • Использовать меньшее разрешение изображения: --policy.resize_imgs_with_padding 224 224
  • Уменьшить шаги наблюдения: --policy.n_obs_steps 1

Q: Как улучшить производительность модели?

A: Методы улучшения производительности:

  • Увеличить объем данных: Собрать больше высококачественных демонстрационных данных
  • Аугментация данных: Использовать методы аугментации изображений для увеличения разнообразия данных
  • Настройка гиперпараметров: Настроить скорость обучения, размер пакета и другие параметры
  • Ансамбль моделей: Обучить несколько моделей и создать ансамбль
  • Адаптация к домену: Дополнительная тонкая настройка для конкретных задач

Связанные ресурсы

Журнал изменений

  • 2024-01: Релиз начальной версии
  • 2024-02: Добавлена поддержка обучения на нескольких GPU
  • 2024-03: Оптимизировано использование памяти и эффективность обучения
  • 2024-04: Добавлены дополнительные примеры оценки и развертывания