الوثائق | Tensordict | ميزات | أمثلة ، دروس وعروض تجريبية | الاقتباس | التثبيت | طرح سؤال | المساهمة
Torchrl هي مكتبة تعليمية التعزيز مفتوحة المصدر (RL) لـ Pytorch.
اقرأ الورقة الكاملة للحصول على وصف أكثر تنسيقًا للمكتبة.
تحقق من دروسنا في البدء لتكثيف بسرعة مع الميزات الأساسية للمكتبة!
يمكن العثور على وثائق Torchrl هنا. أنه يحتوي على دروس ومرجع API.
يوفر Torchrl أيضًا قاعدة معرفة RL لمساعدتك في تصحيح الكود الخاص بك ، أو ببساطة تعلم أساسيات RL. تحقق من ذلك هنا.
لدينا بعض مقاطع الفيديو التمهيدية لكي تتعرف على المكتبة بشكل أفضل ، والتحقق منها:
Torchrl كونه نادي النطاق ، يمكنك استخدامه عبر العديد من الحقول المختلفة. فيما يلي بعض الأمثلة:
TensorDict
خوارزميات RL غير متجانسة للغاية ، وقد يكون من الصعب إعادة تدوير قاعدة كود عبر الإعدادات (على سبيل المثال من الإنترنت إلى غير متصل ، من التعلم القائم على الدولة). يحل Torchrl هذه المشكلة من خلال 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 عمليات توتر متعددة على أجهزته وشكله (شكل Tensordict ، أو حجمه ، هو الأبعاد الأولى التعسفية الشائعة لجميع الموترات المحتوية):
# 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_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 الأولى المشتركة من فئة تخصيص الموتر. بيئات Torchrl API بسيطة ولكنها صارمة ومحددة. تحقق من الوثائق والبرنامج التعليمي لمعرفة المزيد!
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"-Read 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_ ()
تحقق من أمثلة التجميع الموزعة لمعرفة المزيد حول جمع البيانات المتطايرة مع Torchrl.
فعالة (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) تنفذ حلقة التدريب المذكورة أعلاه. من خلال آلية التثبيت ، فإنه يدعم أيضًا أي عملية تسجيل أو تحويل بيانات في أي وقت معين.
وصفات مختلفة لبناء نماذج تتوافق مع البيئة التي يتم نشرها.
إذا شعرت أن ميزة مفقودة من المكتبة ، فيرجى تقديم مشكلة! إذا كنت ترغب في المساهمة في ميزات جديدة ، فتحقق من دعوتنا للمساهمات وصفحة المساهمة الخاصة بنا.
يتم توفير سلسلة من التطبيقات الحديثة لغرض توضيحي:
خوارزمية | ترجمة الدعم ** | واجهة برمجة تطبيقات خالية من Tensordict | خسائر معيارية | مستمر ومنفصل |
DQN | 1.9x | + | نا | + (من خلال تحويل ActionDiscretizer) |
DDPG | 1.87x | + | + | - (مستمر فقط) |
IQL | 3.22x | + | + | + |
CQL | 2.68x | + | + | + |
TD3 | 2.27x | + | + | - (مستمر فقط) |
TD3+قبل الميلاد | لم يخبر | + | + | - (مستمر فقط) |
A2C | 2.67x | + | - | + |
PPO | 2.42x | + | - | + |
كيس | 2.62x | + | - | + |
redq | 2.28x | + | - | - (مستمر فقط) |
Dreamer V1 | لم يخبر | + | + (فصول مختلفة) | - (مستمر فقط) |
محولات القرار | لم يخبر | + | نا | - (مستمر فقط) |
كروس | لم يخبر | + | + | - (مستمر فقط) |
جيل | لم يخبر | + | نا | + |
إمبالا | لم يخبر | + | - | + |
IQL (مارل) | لم يخبر | + | + | + |
DDPG (مارل) | لم يخبر | + | + | - (مستمر فقط) |
PPO (مارل) | لم يخبر | + | - | + |
QMIX-VDN (MARL) | لم يخبر | + | نا | + |
SAC (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 create --name torch_rl python=3.9
conda activate torch_rl
Pytorch
اعتمادًا على استخدام functorch الذي تريد صنعه ، قد ترغب في تثبيت أحدث إصدار (ليلي) أو أحدث إصدار مستقر من Pytorch. انظر هنا للحصول على قائمة مفصلة بالأوامر ، بما في ذلك pip3
أو تعليمات التثبيت الخاصة الأخرى.
torchrl
يمكنك تثبيت أحدث إصدار مستقر باستخدام
pip3 install torchrl
يجب أن يعمل هذا على Linux و Windows 10 و OSX (رقائق Intel أو Silicon). على بعض آلات 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
<name>
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.
التعاون الداخلي مع Torchrl موضع ترحيب! لا تتردد في شوكة وتقديم المشكلات و PRS. يمكنك الخروج دليل المساهمة التفصيلي هنا. كما ذكر أعلاه ، يمكن العثور على قائمة بالمساهمات المفتوحة هنا.
ينصح المساهمون بتثبيت خطافات ما قبل الالتزام (باستخدام pre-commit install
). ستعمل اللجنة المسبقة على التحقق من المشكلات ذات الصلة عندما يتم ارتكاب الرمز محليًا. يمكنك تعطيل الشيك عن طريق الإلحاق -n
إلى أمر الالتزام الخاص بك: git commit -m <commit message> -n
يتم إصدار هذه المكتبة كميزة بيتا Pytorch. من المحتمل أن تحدث تغييرات في كسر BC ولكن سيتم تقديمها مع ضمان إهمال بعد بضع دورات إطلاق.
تم ترخيص Torchrl بموجب ترخيص MIT. انظر الترخيص للحصول على التفاصيل.