Gensyn - пытаемся заставить ноду на CPU работать нормально
Обновленная версия для 0.5.8
Исходим из того, что у вас уже стоит нода Gensyn. Для начала обновимся. Останавливаем ноду в скрин-сессии:
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
скопировать и вставить содержимое:
# === Конфигурация ===
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
Скрипт создает лог-файл и если записей в него не было более 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
вторая для контроля работы скрипта авторестарта:
screen -r monitor_gensyn
Важно! Если теперь хотим остановить/обновить ноду, то сначала входим в сессию monitor_gensyn, останавливаем ее, потом уже в сессию gensyn, при обратном порядке может произойти рестарт (если не успеть остановить monitor_gensyn) .