Перейти к содержанию

Пример запуска Unity среды с DQN агентом

Unity Demo

О чем урок

Короткий путь: подключить Unity‑среду (через Editor или standalone‑билд), обучить DQN‑агента и проверить взаимодействие случайным агентом. Для подготовки Unity следуйте разделу «Настройка Unity среды» — см. страницу Unity Environment.

Репозиторий Unity окружения

Исходный код Unity окружения доступен по ссылке: TensorAeroSpace/UnityAirplaneEnvironment

Цели и требования

  • Что вы сделаете:
  • Подключите Unity‑среду к TensorAeroSpace (Editor или билд).
  • Запустите DQN‑тренировку и оценку.
  • Проверите взаимодействие со случайным агентом.
  • Что потребуется:
  • Unity + ML-Agents (mlagents==1.1.0), Python 3.8+, tensoraerospace.

Импорты модели и среды

from tensoraerospace.agent.dqn.model import Model, DQNAgent
from tensoraerospace.envs.unity_env import get_plane_env, unity_discrete_env

Подключение среды

# Подключение к Unity Editor (нажмите Play после запуска скрипта)
env = unity_discrete_env()
# Укажите путь к собранной среде Unity
build_path = "/abs/path/to/build.x86_64"   # Linux
# build_path = "C:\\path\\to\\build.exe"  # Windows
env = get_plane_env(build_path, server=True)

Порт и подключение

По умолчанию используется порт 5004. Если он занят — закройте другие процессы или измените порт в настройках ML‑Agents/окружения.

Запуск DQN‑тренировки и оценки

num_actions = env.action_space.n
model = Model(num_actions)
target_model = Model(num_actions)

agent = DQNAgent(model, target_model, env, train_nums=100)
agent.train()

# Оценка после обучения
rewards_sum = agent.evaluation(env)
print("After Training: %d out of 200" % rewards_sum)

Типичные логи подключения

[INFO] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.
[INFO] Connected to Unity environment with package version 2.2.1-exp.1 and communication version 1.5.0
[INFO] Connected new brain: My Behavior?team=0
[WARNING] uint8_visual was set to true, but visual observations are not in use. This setting will not have any effect.
[WARNING] The environment contains multiple observations. You must define allow_multiple_obs=True to receive them all.

Экран запуска взаимодействия

Unity Interface

Рисунок 2.1. Визуализация процесса обучения и взаимодействия (Unity Environment)

Случайный агент: быстрое взаимодействие

env = get_plane_env()
env.reset()

print(env.action_space)       # Количество действий в среде
print(env.observation_space)  # Размер состояния среды

for _ in range(100):
    action = env.action_space.sample()
    obs, reward, done, info = env.step(action)
env.close()
env = unity_discrete_env()
env.reset()

print(env.action_space)

for _ in range(100):
    action = env.action_space.sample()
    obs, reward, done, info = env.step(action)
env.close()

Запуск в Docker на множестве GPU/CPU

Обучение на нескольких GPU ускоряет процесс, позволяет использовать более сложные модели и параллелить сбор опыта.

FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime

RUN pip install mlagents==1.1.0 scipy==1.5.4 tensorboard==2.17.0
RUN mkdir /workspace/logs
COPY a3c_example.py /workspace

ENTRYPOINT tensorboard --logdir /workspace/logs --port 8889 --host 0.0.0.0 & python /workspace/a3c_example.py

Открытые источники (документация)

  • Unity ML-Agents: https://github.com/Unity-Technologies/ml-agents
  • Документация TensorBoard: https://www.tensorflow.org/tensorboard
  • Docker: https://docs.docker.com/

Скрипт запуска A3C в Docker

from tensoraerospace.envs.unity_env import get_plane_env
from tensoraerospace.agent.a3c import Agent, setup_global_params

def env_function(worker_id):
    # /tf/linux_build/build.x86_64 — путь к собранному Unity окружению
    return get_plane_env("/tf/linux_build/build.x86_64", server=True, worker=worker_id)

actor_lr = 0.0005
critic_lr = 0.001
gamma = 0.99
hidden_size = 128
update_interval = 1
max_episodes = 100

setup_global_params(actor_lr, critic_lr, gamma, hidden_size, update_interval, max_episodes)

agent = Agent(env_function, gamma)
agent.train()

Запуск контейнера

docker run \
  -v ./tensoraerospace:/tf/tensoraerospace \
  -v ./linux_build:/tf/linux_build \
  -p 8889:8889 unity_docker

Трудности и решения

  • Порт 5004 занят: измените порт в конфигурации или остановите конфликтующий процесс.
  • Лог allow_multiple_obs=True: либо включите параметр в обертке среды, либо используйте первый наблюдаемый канал.
  • Несоответствие версий mlagents: убедитесь, что версия совместима с ML-Agents (mlagents==1.1.0).
  • Не подключается к билду: проверьте build_path и права на запуск (Linux: chmod +x).

Связанные примеры