Документация | Tensordict | Особенности | Примеры, учебники и демонстрации | Цитата | Установка | Задал вопрос | Внося
TOCHRL -это библиотека подкрепления с открытым исходным кодом (RL) для Pytorch.
Прочитайте полную бумагу для более курированного описания библиотеки.
Проверьте наши учебные пособия по началу работы, чтобы быстро нарастать с основными функциями библиотеки!
Документацию TOCHRL можно найти здесь. Он содержит учебники и ссылку API.
Torchrl также предоставляет базу знаний RL, которая поможет вам отладить ваш код или просто изучить основы RL. Проверьте это здесь.
У нас есть несколько вступительных видео, чтобы вы могли лучше узнать библиотеку, проверьте их:
TOCHRL, являющийся доменом-агентом, вы можете использовать его во многих различных областях. Вот несколько примеров:
TensorDict
Алгоритмы RL очень гетерогенные, и может быть трудно переработать кодовую базу в разных настройках (например, от онлайн до офлайн, от состояния до пиксельных обучения). TOCHRL решает эту проблему с помощью TensorDict
, удобной структуры данных (1) , которая может использоваться для оптимизации кодовой базы RL. С помощью этого инструмента можно написать полный сценарий обучения PPO менее чем за 100 строк кода !
import torch
from tensordict . nn import TensorDictModule
from tensordict . nn . distributions import NormalParamExtractor
from torch import nn
from torchrl . collectors import SyncDataCollector
from torchrl . data . replay_buffers import TensorDictReplayBuffer ,
LazyTensorStorage , SamplerWithoutReplacement
from torchrl . envs . libs . gym import GymEnv
from torchrl . modules import ProbabilisticActor , ValueOperator , TanhNormal
from torchrl . objectives import ClipPPOLoss
from torchrl . objectives . value import GAE
env = GymEnv ( "Pendulum-v1" )
model = TensorDictModule (
nn . Sequential (
nn . Linear ( 3 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 2 ),
NormalParamExtractor ()
),
in_keys = [ "observation" ],
out_keys = [ "loc" , "scale" ]
)
critic = ValueOperator (
nn . Sequential (
nn . Linear ( 3 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 128 ), nn . Tanh (),
nn . Linear ( 128 , 1 ),
),
in_keys = [ "observation" ],
)
actor = ProbabilisticActor (
model ,
in_keys = [ "loc" , "scale" ],
distribution_class = TanhNormal ,
distribution_kwargs = { "low" : - 1.0 , "high" : 1.0 },
return_log_prob = True
)
buffer = TensorDictReplayBuffer (
storage = LazyTensorStorage ( 1000 ),
sampler = SamplerWithoutReplacement (),
batch_size = 50 ,
)
collector = SyncDataCollector (
env ,
actor ,
frames_per_batch = 1000 ,
total_frames = 1_000_000 ,
)
loss_fn = ClipPPOLoss ( actor , critic )
adv_fn = GAE ( value_network = critic , average_gae = True , gamma = 0.99 , lmbda = 0.95 )
optim = torch . optim . Adam ( loss_fn . parameters (), lr = 2e-4 )
for data in collector : # collect data
for epoch in range ( 10 ):
adv_fn ( data ) # compute advantage
buffer . extend ( data )
for sample in buffer : # consume data
loss_vals = loss_fn ( sample )
loss_val = sum (
value for key , value in loss_vals . items () if
key . startswith ( "loss" )
)
loss_val . backward ()
optim . step ()
optim . zero_grad ()
print ( f"avg reward: { data [ 'next' , 'reward' ]. mean (). item (): 4.4f } " )
Вот пример того, как API среды полагается на Tensordict для переноса данных из одной функции в другую во время выполнения развертывания:
TensorDict
позволяет легко использовать кусочки кода в разных средах, моделях и алгоритмах.
Например, вот как кодировать развертывание в Torchrl:
- obs, done = env.reset()
+ tensordict = env.reset()
policy = SafeModule(
model,
in_keys=["observation_pixels", "observation_vector"],
out_keys=["action"],
)
out = []
for i in range(n_steps):
- action, log_prob = policy(obs)
- next_obs, reward, done, info = env.step(action)
- out.append((obs, next_obs, action, log_prob, reward, done))
- obs = next_obs
+ tensordict = policy(tensordict)
+ tensordict = env.step(tensordict)
+ out.append(tensordict)
+ tensordict = step_mdp(tensordict) # renames next_observation_* keys to observation_*
- obs, next_obs, action, log_prob, reward, done = [torch.stack(vals, 0) for vals in zip(*out)]
+ out = torch.stack(out, 0) # TensorDict supports multiple tensor operations
Используя это, TORCHRL абстрагирует входные / выходные сигнатуры модулей, ENV, коллекционеров, буферов воспроизведения и потерь библиотеки, что позволяет легко переработать все примитивы по настройкам.
Вот еще один пример отключенной тренировочной петли в Torchrl (при условии, что был создан сборщик данных, буфер воспроизведения, потерю и оптимизатор):
- for i, (obs, next_obs, action, hidden_state, reward, done) in enumerate(collector):
+ for i, tensordict in enumerate(collector):
- replay_buffer.add((obs, next_obs, action, log_prob, reward, done))
+ replay_buffer.add(tensordict)
for j in range(num_optim_steps):
- obs, next_obs, action, hidden_state, reward, done = replay_buffer.sample(batch_size)
- loss = loss_fn(obs, next_obs, action, hidden_state, reward, done)
+ tensordict = replay_buffer.sample(batch_size)
+ loss = loss_fn(tensordict)
loss.backward()
optim.step()
optim.zero_grad()
Этот учебный цикл может быть повторно использован по всему алгоритмам, поскольку он делает минимальное количество предположений о структуре данных.
Tensordict поддерживает множество тензорных операций на своем устройстве и форме (форма тенденциозного сустава или размером партии является общим произвольным N первыми измерениями всех его содержащихся тензоров):
# stack and cat
tensordict = torch . stack ( list_of_tensordicts , 0 )
tensordict = torch . cat ( list_of_tensordicts , 0 )
# reshape
tensordict = tensordict . view ( - 1 )
tensordict = tensordict . permute ( 0 , 2 , 1 )
tensordict = tensordict . unsqueeze ( - 1 )
tensordict = tensordict . squeeze ( - 1 )
# indexing
tensordict = tensordict [: 2 ]
tensordict [:, 2 ] = sub_tensordict
# device and memory location
tensordict . cuda ()
tensordict . to ( "cuda:1" )
tensordict . share_memory_ ()
Tensordict поставляется с выделенным модулем tensordict.nn
, который содержит все, что вам может понадобиться, чтобы написать свою модель с ним. И это functorch
и torch.compile
совместим!
transformer_model = nn.Transformer(nhead=16, num_encoder_layers=12)
+ td_module = SafeModule(transformer_model, in_keys=["src", "tgt"], out_keys=["out"])
src = torch.rand((10, 32, 512))
tgt = torch.rand((20, 32, 512))
+ tensordict = TensorDict({"src": src, "tgt": tgt}, batch_size=[20, 32])
- out = transformer_model(src, tgt)
+ td_module(tensordict)
+ out = tensordict["out"]
Класс TensorDictSequential
позволяет ветвенным последовательностям экземпляров nn.Module
очень модульным способом. Например, вот реализация трансформатора, использующего блоки Encoder и Decoder:
encoder_module = TransformerEncoder (...)
encoder = TensorDictSequential ( encoder_module , in_keys = [ "src" , "src_mask" ], out_keys = [ "memory" ])
decoder_module = TransformerDecoder (...)
decoder = TensorDictModule ( decoder_module , in_keys = [ "tgt" , "memory" ], out_keys = [ "output" ])
transformer = TensorDictSequential ( encoder , decoder )
assert transformer . in_keys == [ "src" , "src_mask" , "tgt" ]
assert transformer . out_keys == [ "memory" , "output" ]
TensorDictSequential
позволяет изолировать подграфы, запрашивая набор желаемых клавиш ввода / вывода:
transformer . select_subsequence ( out_keys = [ "memory" ]) # returns the encoder
transformer . select_subsequence ( in_keys = [ "tgt" , "memory" ]) # returns the decoder
Проверьте учебники Tensordict, чтобы узнать больше!
Общий интерфейс для среды, который поддерживает общие библиотеки (Openai Gym, DeepMind Control Lab и т. Д.) (1) и без государства выполнение (например, среда на основе моделей). Контейнеры с пакетированными средами позволяют параллельно выполнять (2) . Также предоставляется общий класс спецификации тензора Pytorch. API среды Torchrl простой, но строгим и конкретным. Проверьте документацию и учебник, чтобы узнать больше!
env_make = lambda : GymEnv ( "Pendulum-v1" , from_pixels = True )
env_parallel = ParallelEnv ( 4 , env_make ) # creates 4 envs in parallel
tensordict = env_parallel . rollout ( max_steps = 20 , policy = None ) # random rollout (no policy given)
assert tensordict . shape == [ 4 , 20 ] # 4 envs, 20 steps rollout
env_parallel . action_spec . is_in ( tensordict [ "action" ]) # spec check returns True
Многопроцесс и распределенные коллекционеры данных (2), которые работают синхронно или асинхронно. Благодаря использованию Tensordict, тренировочные петли Torchrl сделаны очень похожими на регулярные тренировочные циклы в контролируемом обучении (хотя «DataLoader»-Create Data Collector-изменен на лету):
env_make = lambda : GymEnv ( "Pendulum-v1" , from_pixels = True )
collector = MultiaSyncDataCollector (
[ env_make , env_make ],
policy = policy ,
devices = [ "cuda:0" , "cuda:0" ],
total_frames = 10000 ,
frames_per_batch = 50 ,
...
)
for i , tensordict_data in enumerate ( collector ):
loss = loss_module ( tensordict_data )
loss . backward ()
optim . step ()
optim . zero_grad ()
collector . update_policy_weights_ ()
Проверьте наши примеры распределенных коллекционеров, чтобы узнать больше о сверхбыстком сборе данных с помощью TOCHRL.
Эффективные (2) и общие (1) буферы воспроизведения с модулизованным хранением:
storage = LazyMemmapStorage ( # memory-mapped (physical) storage
cfg . buffer_size ,
scratch_dir = "/tmp/"
)
buffer = TensorDictPrioritizedReplayBuffer (
alpha = 0.7 ,
beta = 0.5 ,
collate_fn = lambda x : x ,
pin_memory = device != torch . device ( "cpu" ),
prefetch = 10 , # multi-threaded sampling
storage = storage
)
Буферы воспроизведения также предлагаются как обертки вокруг общих наборов данных для автономного RL :
from torchrl . data . replay_buffers import SamplerWithoutReplacement
from torchrl . data . datasets . d4rl import D4RLExperienceReplay
data = D4RLExperienceReplay (
"maze2d-open-v0" ,
split_trajs = True ,
batch_size = 128 ,
sampler = SamplerWithoutReplacement ( drop_last = True ),
)
for sample in data : # or alternatively sample = data.sample()
fun ( sample )
Среда межсетибранной среды преобразует (1) , выполненные на устройстве и векторизованным образом (2) , которые обрабатывают и подготовят данные, выходящие из средств, которые будут использоваться агентом:
env_make = lambda : GymEnv ( "Pendulum-v1" , from_pixels = True )
env_base = ParallelEnv ( 4 , env_make , device = "cuda:0" ) # creates 4 envs in parallel
env = TransformedEnv (
env_base ,
Compose (
ToTensorImage (),
ObservationNorm ( loc = 0.5 , scale = 1.0 )), # executes the transforms once and on device
)
tensordict = env . reset ()
assert tensordict . device == torch . device ( "cuda:0" )
Другие преобразования включают в себя: масштабирование вознаграждений ( RewardScaling
), операции формы (конкатенация тензоров, нескважение и т. Д.), Согласность последовательных операций ( CatFrames
), изменение размера ( Resize
) и многое другое.
В отличие от других библиотек, преобразования сложены как список (а не обернуты друг на друга), что позволяет легко добавлять и удалять их по желанию:
env . insert_transform ( 0 , NoopResetEnv ()) # inserts the NoopResetEnv transform at the index 0
Тем не менее, преобразования могут получить доступ и выполнять операции в родительской среде:
transform = env . transform [ 1 ] # gathers the second transform of the list
parent_env = transform . parent # returns the base environment of the second transform, i.e. the base env + the first transform
Различные инструменты для распределенного обучения (например, картовые тензоры памяти) (2) ;
Различные архитектуры и модели (например, актер-критику) (1) :
# create an nn.Module
common_module = ConvNet (
bias_last_layer = True ,
depth = None ,
num_cells = [ 32 , 64 , 64 ],
kernel_sizes = [ 8 , 4 , 3 ],
strides = [ 4 , 2 , 1 ],
)
# Wrap it in a SafeModule, indicating what key to read in and where to
# write out the output
common_module = SafeModule (
common_module ,
in_keys = [ "pixels" ],
out_keys = [ "hidden" ],
)
# Wrap the policy module in NormalParamsWrapper, such that the output
# tensor is split in loc and scale, and scale is mapped onto a positive space
policy_module = SafeModule (
NormalParamsWrapper (
MLP ( num_cells = [ 64 , 64 ], out_features = 32 , activation = nn . ELU )
),
in_keys = [ "hidden" ],
out_keys = [ "loc" , "scale" ],
)
# Use a SafeProbabilisticTensorDictSequential to combine the SafeModule with a
# SafeProbabilisticModule, indicating how to build the
# torch.distribution.Distribution object and what to do with it
policy_module = SafeProbabilisticTensorDictSequential ( # stochastic policy
policy_module ,
SafeProbabilisticModule (
in_keys = [ "loc" , "scale" ],
out_keys = "action" ,
distribution_class = TanhNormal ,
),
)
value_module = MLP (
num_cells = [ 64 , 64 ],
out_features = 1 ,
activation = nn . ELU ,
)
# Wrap the policy and value funciton in a common module
actor_value = ActorValueOperator ( common_module , policy_module , value_module )
# standalone policy from this
standalone_policy = actor_value . get_policy_operator ()
Разведки обертки и модули, чтобы легко обмениваться исследованием и эксплуатацией (1) :
policy_explore = EGreedyWrapper ( policy )
with set_exploration_type ( ExplorationType . RANDOM ):
tensordict = policy_explore ( tensordict ) # will use eps-greedy
with set_exploration_type ( ExplorationType . DETERMINISTIC ):
tensordict = policy_explore ( tensordict ) # will not use eps-greedy
Серия эффективных модулей потерь и высоко векторизованного функционального возврата и вычисления преимуществ.
from torchrl . objectives import DQNLoss
loss_module = DQNLoss ( value_network = value_network , gamma = 0.99 )
tensordict = replay_buffer . sample ( batch_size )
loss = loss_module ( tensordict )
from torchrl . objectives . value . functional import vec_td_lambda_return_estimate
advantage = vec_td_lambda_return_estimate ( gamma , lmbda , next_state_value , reward , done , terminated )
Общий класс тренера (1) , который выполняет вышеупомянутую петлю обучения. Благодаря механизму подключения он также поддерживает любую операцию ведения журнала или преобразования данных в любой момент времени.
Различные рецепты для создания моделей, которые соответствуют развертываемой среде.
Если вы чувствуете, что в библиотеке отсутствует функция, пожалуйста, отправьте проблему! Если вы хотите внести свой вклад в новые функции, проверьте наш призыв к вкладу и нашу страницу взноса.
Серия современных реализаций предоставлена с иллюстративной целью:
Алгоритм | Скомпилируйте поддержку ** | Без тенденциозного API | Модульные потери | Непрерывный и дискретный |
Дкн | 1,9x | + | НА | + (через преобразование ActionDiscretizer) |
DDPG | 1,87x | + | + | - (только непрерывно) |
Iql | 3.22x | + | + | + |
CQL | 2.68x | + | + | + |
TD3 | 2.27x | + | + | - (только непрерывно) |
TD3+BC | непроверенный | + | + | - (только непрерывно) |
A2C | 2.67x | + | - | + |
PPO | 2.42x | + | - | + |
Мешок | 2.62x | + | - | + |
Редк | 2.28x | + | - | - (только непрерывно) |
Мечтатель v1 | непроверенный | + | + (разные классы) | - (только непрерывно) |
Решения Трансформеры | непроверенный | + | НА | - (только непрерывно) |
Перекресток | непроверенный | + | + | - (только непрерывно) |
Гейл | непроверенный | + | НА | + |
Импала | непроверенный | + | - | + |
Iql (marl) | непроверенный | + | + | + |
DDPG (Marl) | непроверенный | + | + | - (только непрерывно) |
PPO (Marl) | непроверенный | + | - | + |
Qmix-Vdn (Marl) | непроверенный | + | НА | + |
Мешок (марл) | непроверенный | + | - | + |
Rlhf | НА | + | НА | НА |
** Число указывает на ожидаемое ускорение по сравнению с нетерпеливым режимом при выполнении на процессоре. Числа могут варьироваться в зависимости от архитектуры и устройства.
И еще много еще!
Примеры кода, отображающие фрагменты кода игрушек и обучающие сценарии, также доступны
Проверьте каталог примеров для получения более подробной информации о обработке различных настроек конфигурации.
Мы также предоставляем учебники и демонстрации, которые дают представление о том, что может сделать библиотека.
Если вы используете Torchrl, пожалуйста, обратитесь к этой записи Bibtex, чтобы привести эту работу:
@misc{bou2023torchrl,
title={TorchRL: A data-driven decision-making library for PyTorch},
author={Albert Bou and Matteo Bettini and Sebastian Dittert and Vikash Kumar and Shagun Sodhani and Xiaomeng Yang and Gianni De Fabritiis and Vincent Moens},
year={2023},
eprint={2306.00577},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Создайте среду Conda, в которой будут установлены пакеты.
conda create --name torch_rl python=3.9
conda activate torch_rl
Пирог
В зависимости от использования Functorch, который вы хотите сделать, вы можете установить новейший (ночной) выпуск Pytorch или последнюю стабильную версию Pytorch. См. Здесь для подробного списка команд, включая pip3
или другие специальные инструкции по установке.
Торхрл
Вы можете установить последний стабильный релиз, используя
pip3 install torchrl
Это должно работать на Linux, Windows 10 и OSX (Intel или Silicon Chips). На определенных машинах Windows (Windows 11) нужно установить библиотеку локально (см. Ниже).
Ночная сборка может быть установлена через
pip3 install torchrl-nightly
который мы в настоящее время отправляем только для машин Linux и OSX (Intel). Важно отметить, что ночные сборки также требуют ночной сборки Pytorch.
Чтобы установить дополнительные зависимости, позвоните
pip3 install " torchrl[atari,dm_control,gym_continuous,rendering,tests,utils,marl,open_spiel,checkpointing] "
или их подмножество.
Можно также захотеть установить библиотеку локально. Три основные причины могут мотивировать это:
Чтобы установить библиотеку локально, начните с клонирования репо:
git clone https://github.com/pytorch/rl
И не забудьте проверить ветку или тег, который вы хотите использовать для сборки:
git checkout v0.4.0
Перейдите в каталог, где вы клонировали репо Torchrl и установите его (после установки ninja
)
cd /path/to/torchrl/
pip3 install ninja -U
python setup.py develop
Можно также построить колеса для распространения среди сотрудников, использующих
python setup.py bdist_wheel
Ваши колеса будут храниться там ./dist/torchrl<name>.whl
и установка через
pip install torchrl < name > .whl
ПРЕДУПРЕЖДЕНИЕ : К сожалению, pip3 install -e .
в настоящее время не работает. Вклад, чтобы помочь исправить это, приветствуются!
На машинах M1 это должно работать без ящика с ночной сборкой Pytorch. Если генерация этого артефакта в macos m1 не работает правильно или в выполнении сообщения (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))
ARCHFLAGS="-arch arm64" python setup.py develop
Чтобы запустить быструю проверку здравомыслия, оставьте этот каталог (например, выполнив cd ~/
) и попытайтесь импортировать библиотеку.
python -c "import torchrl"
Это не должно возвращать никакого предупреждения или ошибки.
Необязательные зависимости
Следующие библиотеки могут быть установлены в зависимости от использования, которое нужно сделать из Torchrl:
# diverse
pip3 install tqdm tensorboard "hydra-core>=1.1" hydra-submitit-launcher
# rendering
pip3 install moviepy
# deepmind control suite
pip3 install dm_control
# gym, atari games
pip3 install "gym[atari]" "gym[accept-rom-license]" pygame
# tests
pip3 install pytest pyyaml pytest-instafail
# tensorboard
pip3 install tensorboard
# wandb
pip3 install wandb
Поиск неисправностей
Если ModuleNotFoundError: No module named 'torchrl._torchrl
возникает ошибки (или предупреждение, указывающее, что двоичные файлы C ++ не могут быть загружены), это означает, что расширения C ++ не были установлены или не найдены.
develop
: cd ~/path/to/rl/repo
python -c 'from torchrl.envs.libs.gym import GymEnv'
python setup.py develop
. Одной из распространенных причин является расхождение версии G ++/C ++ и/или проблема с библиотекой ninja
. wget https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py
python collect_env.py
OS: macOS *** (arm64)
OS: macOS **** (x86_64)
Проблемы с помощью версий могут вызвать сообщение об ошибке типа undefined symbol
и тому подобное. Для этого см. В документе «Проблемы с версией» для полного объяснения и предлагаемых обходных путей.
Если вы заметите ошибку в библиотеке, пожалуйста, поднимите проблему в этом репо.
Если у вас есть более общий вопрос относительно RL в Pytorch, опубликуйте его на форуме Pytorch.
Внутреннее сотрудничество в Toochrl приветствуется! Не стесняйтесь, подайте, отправляйте проблемы и PRS. Вы можете проверить подробное руководство по взносу здесь. Как упомянуто выше, здесь можно найти список открытых вкладов.
Вкладчикам рекомендуется установить предварительные крючки (с помощью pre-commit install
). Pre-Commit будет проверять наличие проблем, связанных с линином, когда код будет совершен на локальном уровне. Вы можете отключить проверку, добавив -n
к своей команде Commit: git commit -m <commit message> -n
Эта библиотека выпускается как бета -функция Pytorch. Изменения в BC, вероятно, произойдут, но они будут введены с гарантией на осмотр после нескольких циклов выброса.
Torchrl лицензирован по лицензии MIT. Смотрите лицензию для деталей.