У меня только что было серьёзное обсуждение нетривиальной проблемы в коде с Codex, мы рассмотрели несколько решений и исправили код. Я просто в восторге — если это не AGI, то что?
Мы обучаем RL-политику с SAC для управления роботом. В какой-то момент обучение очень сильно тормозится: один шаг занимает минуты. Инструментируем код — ничего, просто эпизод внезапно заканчивается. В логах нет сообщений об ошибках. Проверяем, что у нас никуда не девается stderr, вроде живой. Вспоминаю, что с одним симулятором все работало. Вспоминаю, что когда у нас был более легкий симулятор, то все работало.
Я догадываюсь, в чём дело: у меня есть набор симуляторов, из которых я сэмплю выборку. Когда эпизод заканчивается, перезапуск симулятора требует 20 секунд. Из-за этого шаг симуляции становится большим: если робот в другом симуляторе делает что-то нетривиальное, то теперь заканчивается его эпизод, и мы каскадно перезапускаем симуляторы вместо обучения.
Codex подозрительно фыркает.
Я предлагаю решение — просто не сэмплить из симулятора, пока он грузится. Codex читает код и говорит, что SB3 так не умеет. Говорит: давай просто робот в симуляторе подождёт — «зависнет» если нет новых команд 200 мс.
Объясняю ему, что так нельзя: у нас много потоков и процессов, и они все смотрят на часы. Что у физических объектов есть инерция.
Обсуждаем суррогатные часы, решаем, что так нельзя. Рассматриваем разные варианты.
Он ещё раз читает код и находит, что в симулируемых датчиках (в отличии от настоящих!) время измеряется один раз за шаг в одном месте. Я совсем забыл про это, но я же молодец, что сделал именно так! И это большая удача сейчас!
Он говорит: «Так давай заклампаем dt — и всё». Вспоминаю, что у нас dt в двух разных местах. Долго клампать и можно ошибиться.
Говорю: «Давай, дорогой, будем сами сэмплить dt из распределения и отправлять в нужные места». (И сможем быстрее риалтайма симуляцию делать!)
Все заработало!