Вопрос или проблема
Я создаю свою кастомную среду Gym, и до сих пор всё работало хорошо, следуя инструкциям, распространённым по интернету. Однако сейчас я нахожусь на этапе, когда часто происходят изменения в классе среды (наследуя gym.Env), и их нужно тестировать. После последних изменений в коде методов reset()
и step()
оказывается, что теперь gym.make()
возвращает объект среды, который выполняет старый код, который был действителен ранее.
Так что мой вопрос: Как решить эту проблему?
Я не сторонник увеличения версии, например, до v1, так как исходная v0 всё ещё находится в разработке.
Файл __init__.py
на уровне пакета содержит следующее:
from importlib.metadata import version
from gym.envs.registration import register
__version__ = version("wksim")
register(id="WkEnv-v0", entry_point="wksim.wkenv:WkEnv")
Примечание: класс WkEnv находится в файле wkenv.py
В следующем исполняемом файле я тестирую следующим образом:
import gym
from wksim.wkenv import WkEnv
if __name__ == "__main__":
env_config = {
"cli_mode": True,
"cache_trace": True,
"instance": "minimal",
"UNIFORM_TIME_SLOT_LENGTH": 0.05,
}
env = gym.make("WkEnv-v0", config=env_config)
initial_state = env.reset()
Примечание: я узнал, что кастомный класс среды должен быть импортирован, иначе gym.make() не найдёт идентификатор среды.
Эта проблема была решена даже с gym
0.21.0, но также и теперь после обновления до gymnasium
. Коренная причина заключалась в том, как был установлен весь пакет. Использование pip install -e
решило эту проблему.
Похоже, у меня такая же проблема, и я решил её методом проб и ошибок, который я, возможно, не смогу точно воспроизвести здесь.
Сначала я попробовал pip install -e .
в каталоге gym, содержащем setup.py
. Не знаю, что это делает, но после этого я открываю python в той же папке и успешно импортирую gym_XYZ
для своей игры.
Затем я поднимаюсь на уровень вверх в каталоге, где находится мой учебный код. Теперь python не может импортировать gym_XYZ
, поэтому мне нужно добавить следующее:
import sys
sys.path.insert(0, './gym-XYZ')
import gym_XYZ
И тогда это работает.
Ответ или решение
Проблема с обновлением кода окружения в OpenAI Gym: Решения и рекомендации
Если вы столкнулись с ситуацией, когда вызов gym.make()
возвращает объект окружения, который использует старый код, вероятнее всего, проблема кроется в способе установки или обновления вашего кастомного окружения. Эта проблема может возникнуть даже при частых изменениях в классе окружения, основанном на gym.Env
. Вот подробный анализ и рекомендации для решения данной проблемы.
1. Проблема обновления окружения
Когда вы вносите изменения в методы reset()
или step()
, но gym.make()
продолжает возвращать старую версию окружения, это говорит о том, что ваше окружение не обновляется должным образом. Это может произойти, если:
- Окружение было установлено некорректно.
- Вы работаете с кэшем старых версий библиотек или модулей.
2. Рекомендации по установке
Чтобы убедиться, что ваша последняя версия окружения используется, выполните следующие шаги:
Установка в режиме разработки
Используйте команду pip install -e .
в корневой директории вашего проекта, где находится setup.py
. Это позволит вам установить пакет в режиме разработки, предоставляя доступ к изменениям в коде сразу без необходимости повторной установки пакета. В результате ваши изменения будут видны сразу же при каждом запуске программы.
Пример команд
cd /path/to/your/project
pip install -e .
Это создаст символические ссылки на файлы вашего проекта, что сэкономит время и предотвратит необходимость повторной установки после каждого изменения.
3. Импорт окружения
Не забудьте, что ваш класс окружения должен быть импортирован, прежде чем вы сможете его использовать через gym.make()
. Например:
from wksim.wkenv import WkEnv
Это необходимо, чтобы gym
знал о вашем окружении и мог обратится к его определению.
4. Проверка каталога Python
Если после установки в режиме разработки вы все еще сталкиваетесь с проблемами, проверьте, правильно ли настроен ваш sys.path
. Убедитесь, что путь к вашему пакету добавлен перед импортом:
import sys
sys.path.insert(0, './path/to/your/environment')
import wksim
Это обеспечит корректный импорт вашего кастомного окружения независимо от того, в какой директории вы находитесь.
5. Кэширование и окружение
Еще одной возможной причиной проблем может быть кэширование старых версий модулей. Чтобы увериться, что все обновления очищены, перезапустите интерпретатор Python или IDE после внесения изменений в код. Это гарантирует, что все экземпляры классов обновляются до последних изменений.
Заключение
Проблемы с обновлением кода окружения в OpenAI Gym могут быть неприятными, однако следуя приведенным выше рекомендациям, вы сможете легко и быстро справиться с ними. Установка в режиме разработки, правильный импорт и управление путями в вашей среде Python помогут избежать большинства проблем с кэшированием. Внедряя эти методы в вашу практику, вы значительно ускорите процесс тестирования и улучшения ваших кастомных окружений.