July 18, 2025

Gensyn - пытаемся заставить ноду на CPU работать нормально

Обновленная версия для 0.5.8

Исходим из того, что у вас уже стоит нода Gensyn. Для начала обновимся. Останавливаем ноду в скрин-сессии:

ctrl+C

Выходим из скрин-сессии:

exit

Теперь нам нужно сохранить три файла, вот они:

"/root/rl-swarm/swarm.pem"
"/root/rl-swarm/modal-login/temp-data/userApiKey.json"
"/root/rl-swarm/modal-login/temp-data/userData.json"

Потом, нужно будет вернуть их на тоже место

А теперь едем дальше - переходим в корень

cd $HOME

Удаляем папку с нодой:

rm -rf rl-swarm

Скачиваем файлы:

git clone https://github.com/gensyn-ai/rl-swarm.git

Версия 0.5.8 у меня просто так не поехала, пришлось редактировать вот этот файл:

nano ~/rl-swarm/rgym_exp/config/rg-swarm.yaml

Нужно добавить строку bf16: false в конфигурацию тренера, нужно вставить её именно в секцию config, на одном уровне с logging_dir и fp16, вот так:

trainer:
  _target_: rgym_exp.src.trainer.GRPOTrainerModule
  models:
    - _target_: transformers.AutoModelForCausalLM.from_pretrained
      pretrained_model_name_or_path: ${oc.env:MODEL_NAME, ${gpu_model_choice:${default_large_model_pool},${default_small_model_pool}}}
  config:
    _target_: trl.trainer.GRPOConfig
    logging_dir: ${log_dir}
    fp16: ${training.fp16}
    bf16: false        # ← эта строка добавлена

Добавлять нужно без комментария.

Отступы должны быть ровно такими же — 2 пробела для каждого уровня.

Не добавляй лишних пробелов или табов — YAML их не любит.

Теперь можно вернуть на место 3 файла, которые мы сохраняли.

Переходим в папку с нодой:

cd rl-swarm



Открываем наш основной скрипт (можно командой, а можно через меню):

nano run_rl_swarm.sh

Находим строку (в версии 0.5.8 это строка 71) и закомментируем ее:

# rm -r $ROOT_DIR/modal-login/temp-data/*.json 2> /dev/null || true

Это нужно, чтобы скрипт не удалял нашу авторизацию.

Дальше в конце находим вот такой блок (в версии 0.5.8 блок начинается с 229 строки):

HF_TOKEN=${HF_TOKEN:-""} if [ -n "${HF_TOKEN}" ]; then # Check if HF_TOKEN is already set and use if so. Else give user a prompt to choose. HUGGINGFACE_ACCESS_TOKEN=${HF_TOKEN} else echo -en $GREEN_TEXT read -p ">> Would you like to push models you train in the RL swarm to the Hugging Face Hub? [y/N] " yn echo -en $RESET_TEXT yn=${yn:-N} # Default to "N" if the user presses Enter case $yn in [Yy]*) read -p "Enter your Hugging Face access token: " HUGGINGFACE_ACCESS_TOKEN ;; [Nn]*) HUGGINGFACE_ACCESS_TOKEN="None" ;; *) echo ">>> No answer was given, so NO models will be pushed to Hugging Face Hub" && HUGGINGFACE_ACCESS_TOKEN="None" ;; esac fi

echo -en $GREEN_TEXT read -p ">> Enter the name of the model you want to use in huggingface repo/name format, or press [Enter] to use the default model. " MODEL_NAME echo -en $RESET_TEXT

# Only export MODEL_NAME if user provided a non-empty value if [ -n "$MODEL_NAME" ]; then export MODEL_NAME echo_green ">> Using model: $MODEL_NAME" else echo_green ">> Using default model from config" fi

и заменим его на блок:

HF_TOKEN=${HF_TOKEN:-""} if [ -n "${HF_TOKEN}" ]; then # Check if HF_TOKEN is already set and use if so. Else set the default. HUGGINGFACE_ACCESS_TOKEN=${HF_TOKEN} else # Automatically set to not push to Hugging Face Hub HUGGINGFACE_ACCESS_TOKEN="None" echo_green ">> Not pushing models to Hugging Face Hub (set to 'n')" fi

# Automatically set the model name MODEL_NAME="Gensyn/Qwen2.5-0.5B-Instruct" export MODEL_NAME echo_green ">> Using model: $MODEL_NAME"


далее CTRL+X, Y, ENTER

Здесь мы отказались от использования HUGGINGFACE и выбрали модель Gensyn/Qwen2.5-0.5B-Instruct (можно выбрать другую). Это нужно для того, чтобы следующий скрипт мог все делать сам, без вашего участия.

делаем скрипт исполняемым:

chmod +x run_rl_swarm.sh



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

nano restart_rl_swarm.sh

скопировать и вставить содержимое:

#!/bin/bash

# === Конфигурация === PROJECT_PATH="/root/rl-swarm" LOG_FILE="$PROJECT_PATH/rl_swarm.log" LOG_INACTIVITY_THRESHOLD=3600 # 60 минут (в секундах) CHECK_INTERVAL=60 # Проверка каждые 60 сек STARTUP_GRACE_PERIOD=180 # Ожидание после запуска ноды SCREEN_SESSION="gensyn"

# === Проверка, что скрипт существует === APP_COMMAND="$PROJECT_PATH/run_rl_swarm.sh" if [ ! -f "$APP_COMMAND" ]; then echo "❌ Ошибка: Скрипт $APP_COMMAND не найден!" exit 1 fi if [ ! -x "$APP_COMMAND" ]; then echo "❌ Ошибка: Нет права на исполнение $APP_COMMAND" echo "➡️ Выполните: chmod +x $APP_COMMAND" exit 1 fi

# === Бесконечный цикл мониторинга === while true; do echo -e "\n▒▒ Запуск RL-сварм-ноды..."

echo "▒▒ Создаём новую screen-сессию '$SCREEN_SESSION'..." cd "$PROJECT_PATH" || exit 1

if [ ! -d ".venv" ]; then echo "🛠 Создаём виртуальное окружение .venv..." python3 -m venv .venv fi

# Запуск в screen screen -S "$SCREEN_SESSION" -dm bash -c \ "cd $PROJECT_PATH && source .venv/bin/activate && bash run_rl_swarm.sh 2>&1 | tee -a \"$LOG_FILE\""

echo "⏳ Ожидание $STARTUP_GRACE_PERIOD секунд перед началом мониторинга логов..." sleep "$STARTUP_GRACE_PERIOD"

while true; do # Проверка активности screen-процесса SCREEN_PID=$(screen -ls | grep "\.${SCREEN_SESSION}" | awk -F. '{print $1}' | tr -d '[:space:]') if [ -z "$SCREEN_PID" ] || ! ps -p "$SCREEN_PID" > /dev/null 2>&1; then echo "❗️ screen-сессия '$SCREEN_SESSION' завершилась. Немедленный перезапуск..." screen -S "$SCREEN_SESSION" -X quit pkill -f swarm_launcher pkill -f p2pd sleep 5 break fi

if ! screen -list | grep -q "$SCREEN_SESSION"; then echo "⛔ screen-сессия '$SCREEN_SESSION' отсутствует. Перезапуск..." break fi

if [ ! -f "$LOG_FILE" ]; then echo "⚠️ Лог-файл не найден: $LOG_FILE" break fi

LAST_UPDATE=$(stat -c %Y "$LOG_FILE") NOW=$(date +%s) DIFF=$((NOW - LAST_UPDATE))

echo "▒▒️ Проверка активности логов: последний апдейт был $DIFF сек назад."

if [ "$DIFF" -ge "$LOG_INACTIVITY_THRESHOLD" ]; then echo "⛔ Лог не обновлялся более $((LOG_INACTIVITY_THRESHOLD/60)) минут. Считаем зависанием."

echo "▒▒ Завершаем screen-сессию '$SCREEN_SESSION'..." screen -S "$SCREEN_SESSION" -X quit

echo "▒▒ Завершаем фоновые процессы..." pkill -f swarm_launcher pkill -f p2pd

echo "♻️ Перезапуск через 5 секунд..." sleep 5 break fi

sleep "$CHECK_INTERVAL" done done

далее CTRL+X, Y, ENTER

Скрипт создает лог-файл и если записей в него не было более 60 минут (параметр LOG_INACTIVITY_THRESHOLD можно менять), то скрипт выходит из скрин-сессии, убивает фоновые процессы и перезапускает ноду, создавая новую скрин-сессию с тем же названием. Также скрипт сам запускает виртуальное окружение, поэтому вручную это делать не нужно.

делаем скрипт исполняемым:

chmod +x restart_rl_swarm.sh

создаем скрин-сессию вот с таким названием:

screen -S monitor_gensyn

она нужна для того, чтобы запуститься вручную и контролировать работу второго скрипта.

запускаем:

bash restart_rl_swarm.sh


теперь можем нажать ctrl A D и выйти отсюда.
У нас будет создано две скрин сессии: первая для контроля работы ноды:

screen -r gensyn

ctrl A D

вторая для контроля работы скрипта авторестарта:

screen -r monitor_gensyn

ctrl A D


Важно! Если теперь хотим остановить/обновить ноду, то сначала входим в сессию monitor_gensyn, останавливаем ее, потом уже в сессию gensyn, при обратном порядке может произойти рестарт (если не успеть остановить monitor_gensyn) .