From c5cfc13bcf0a861adfedf29d127b77d272e9f2f8 Mon Sep 17 00:00:00 2001 From: "Fabrizio (Misto) Milo" Date: Mon, 20 Mar 2023 16:25:45 +0000 Subject: [PATCH] add new website styling --- .github/workflows/docs.yml | 54 +++++ .pre-commit-config.yaml | 21 +- .readthedocs.yml | 22 ++- Makefile | 11 ++ dictionary.txt | 2 + docker/docs/Dockerfile | 18 ++ docs/Makefile | 17 +- docs/README.md | 5 + docs/_static/apple-touch-icon-114x114.png | Bin 0 -> 6780 bytes docs/_static/apple-touch-icon-120x120.png | Bin 0 -> 7207 bytes docs/_static/apple-touch-icon-144x144.png | Bin 0 -> 8954 bytes docs/_static/apple-touch-icon-152x152.png | Bin 0 -> 9475 bytes docs/_static/apple-touch-icon-180x180.png | Bin 0 -> 11479 bytes docs/_static/apple-touch-icon-57x57.png | Bin 0 -> 2988 bytes docs/_static/apple-touch-icon-72x72.png | Bin 0 -> 4001 bytes docs/_static/apple-touch-icon-76x76.png | Bin 0 -> 4273 bytes docs/_static/apple-touch-icon.png | Bin 0 -> 2988 bytes docs/_static/favicon-16x16.png | Bin 0 -> 767 bytes docs/_static/favicon.ico | Bin 0 -> 32038 bytes docs/_static/style.css | 23 +++ docs/_templates/layout.html | 2 + docs/build.sh | 3 + docs/conf.py | 187 ++++++++++++++++++ docs/{source => }/configs.rst | 4 +- docs/{source => }/data.rst | 0 docs/examples.md | 26 +++ docs/faq.md | 8 + docs/favicon.ico | Bin 0 -> 32038 bytes docs/glossary.md | 81 ++++++++ docs/{source => }/index.rst | 27 ++- docs/pipeline.rst | 33 ++++ docs/requirements.txt | 29 ++- docs/source/conf.py | 54 ----- docs/source/examples.rst | 18 -- docs/source/pipeline.rst | 28 --- docs/{source => }/trainer.rst | 0 docs/trlx_logo_bw.png | Bin 0 -> 59797 bytes docs/trlx_logo_red.png | Bin 0 -> 56003 bytes .../grounded_program_synthesis/lang.py | 2 +- .../grounded_program_synthesis/train_trlx.py | 4 +- trlx/models/modeling_ilql.py | 2 +- trlx/models/modeling_nemo_ilql.py | 2 +- trlx/trainer/__init__.py | 2 +- trlx/trainer/accelerate_ppo_trainer.py | 2 +- 44 files changed, 554 insertions(+), 133 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 Makefile create mode 100644 dictionary.txt create mode 100644 docker/docs/Dockerfile create mode 100644 docs/README.md create mode 100644 docs/_static/apple-touch-icon-114x114.png create mode 100644 docs/_static/apple-touch-icon-120x120.png create mode 100644 docs/_static/apple-touch-icon-144x144.png create mode 100644 docs/_static/apple-touch-icon-152x152.png create mode 100644 docs/_static/apple-touch-icon-180x180.png create mode 100644 docs/_static/apple-touch-icon-57x57.png create mode 100644 docs/_static/apple-touch-icon-72x72.png create mode 100644 docs/_static/apple-touch-icon-76x76.png create mode 100644 docs/_static/apple-touch-icon.png create mode 100644 docs/_static/favicon-16x16.png create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/style.css create mode 100644 docs/_templates/layout.html create mode 100755 docs/build.sh create mode 100644 docs/conf.py rename docs/{source => }/configs.rst (86%) rename docs/{source => }/data.rst (100%) create mode 100644 docs/examples.md create mode 100644 docs/faq.md create mode 100644 docs/favicon.ico create mode 100644 docs/glossary.md rename docs/{source => }/index.rst (70%) create mode 100644 docs/pipeline.rst delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/examples.rst delete mode 100644 docs/source/pipeline.rst rename docs/{source => }/trainer.rst (100%) create mode 100644 docs/trlx_logo_bw.png create mode 100644 docs/trlx_logo_red.png diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..fe839678d --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,54 @@ +name: docs_pages_workflow + +on: [pull_request] + +permissions: + pull-requests: write + +jobs: + build_docs_job: + permissions: write-all + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: 3.8 + + - name: Get pip cache dir + id: pip-cache + run: | + python -m pip install --upgrade pip + echo "dir={$(pip cache dir)}" >> $GITHUB_OUTPUT + + - name: pip cache + uses: actions/cache@v3 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py', '**/requirements.txt', '**/docs/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install docs requirements + run: | + python -m pip install -r docs/requirements.txt + + - name: make the sphinx docs + run: | + make -C docs clean + make -C docs html + + - uses: readthedocs/actions/preview@v1 + with: + project-slug: "trlx" + project-language: "en" + # see: https://github.com/readthedocs/actions/tree/main/preview + # message-template (optional): Text message to be injected by the action in the Pull Request description. It supports the following placeholders to be replaced: + # {docs-pr-index-url}: URL to the root of the documentation for the Pull Request preview. + # platform (optional): Read the Docs Community (community) or Read the Docs for Business (business). (default: community) + # single-version (optional): Set this to 'true' if your project is single version, so we can link to the correct URL. (default: 'false') diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d94d14f2a..cbf9fa775 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: -- repo: https://github.com/pre-commit/pre-commit-hooks + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: check-case-conflict @@ -18,17 +18,24 @@ repos: args: [--fix=lf] - id: requirements-txt-fixer - id: trailing-whitespace -- repo: https://github.com/psf/black + - repo: https://github.com/psf/black rev: 23.1.0 hooks: - - id: black + - id: black files: ^(trlx|examples|tests|setup.py)/ -- repo: https://github.com/pycqa/isort + - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: - - id: isort + - id: isort name: isort (python) -- repo: https://github.com/pycqa/flake8 + - repo: https://github.com/pycqa/flake8 rev: 6.0.0 hooks: - - id: flake8 + - id: flake8 + - repo: https://github.com/codespell-project/codespell + rev: v2.2.2 + hooks: + - id: codespell + args: [--ignore-words, dictionary.txt] + additional_dependencies: + - tomli diff --git a/.readthedocs.yml b/.readthedocs.yml index c8f03ab0a..d5f60f2e8 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,9 +1,25 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required version: 2 +build: + os: "ubuntu-20.04" + tools: + python: "3.8" + +# Build documentation in the docs/ directory with Sphinx sphinx: - configuration: docs/source/conf.py + configuration: docs/conf.py + fail_on_warning: false + +# Optionally build your docs in additional formats such as PDF and ePub +formats: + - htmlzip +# Optionally set the version of Python and requirements required to build your docs python: - version: 3.9 install: - - requirements: docs/requirements.txt + - requirements: docs/requirements.txt diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..4c09f1f5f --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +gendoc: + docker build -t trlxgendocs -f docker/docs/Dockerfile . +run: + docker run --rm -it \ + -p 8000:8000 \ + --entrypoint python trlxgendocs -m http.server 8000 --directory build/docs/build/html + +sh: + docker run --rm -it \ + -p 8000:8000 \ + --entrypoint /bin/bash trlxgendocs diff --git a/dictionary.txt b/dictionary.txt new file mode 100644 index 000000000..212e125ae --- /dev/null +++ b/dictionary.txt @@ -0,0 +1,2 @@ +rouge +sart diff --git a/docker/docs/Dockerfile b/docker/docs/Dockerfile new file mode 100644 index 000000000..9247f61db --- /dev/null +++ b/docker/docs/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.8-slim + +# pip install -r docs/requirements.txt +# sphinx-build -b html docs docs/build/html -j auto +# sphinx-build -b html -D nb_execution_mode=off docs docs/build/html -j auto + +RUN python -m pip install --upgrade --no-cache-dir pip +ADD docs/requirements.txt /tmp/requirements.txt +RUN python -m pip install --exists-action=w --no-cache-dir -r /tmp/requirements.txt +RUN apt-get update && apt-get install make imagemagick -y --no-install-recommends \ + git \ + && rm -rf /var/lib/apt/lists/* +RUN mkdir /build +WORKDIR /build/ +ADD . . +RUN python -m pip install -e . +RUN cd docs && make html +ENTRYPOINT [ "python", "-m", "http.server", "8000" ] diff --git a/docs/Makefile b/docs/Makefile index d0c3cbf10..8d57a73b3 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -5,7 +5,7 @@ # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build -SOURCEDIR = source +SOURCEDIR = . BUILDDIR = build # Put it first so that "make" without argument is like "make help". @@ -14,7 +14,20 @@ help: .PHONY: help Makefile +logo: + convert trlx_logo_red.png -define icon:auto-resize=64,48,32,16 _static/favicon.ico + convert trlx_logo_red.png -resize 16x16 _static/favicon-16x16.png + convert trlx_logo_red.png -resize 57x57 _static/apple-touch-icon.png + convert trlx_logo_red.png -resize 57x57 _static/apple-touch-icon-57x57.png + convert trlx_logo_red.png -resize 72x72 _static/apple-touch-icon-72x72.png + convert trlx_logo_red.png -resize 76x76 _static/apple-touch-icon-76x76.png + convert trlx_logo_red.png -resize 114x114 _static/apple-touch-icon-114x114.png + convert trlx_logo_red.png -resize 120x120 _static/apple-touch-icon-120x120.png + convert trlx_logo_red.png -resize 144x144 _static/apple-touch-icon-144x144.png + convert trlx_logo_red.png -resize 152x152 _static/apple-touch-icon-152x152.png + convert trlx_logo_red.png -resize 180x180 _static/apple-touch-icon-180x180.png + # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile +%: Makefile logo @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..68e1d13e9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +# How To build the documentation + +```bash +make html +``` diff --git a/docs/_static/apple-touch-icon-114x114.png b/docs/_static/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..8701f209572b2725c4b6013a78d1f5874842479d GIT binary patch literal 6780 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 LYrL(IH4ptigJz)? literal 0 HcmV?d00001 diff --git a/docs/_static/apple-touch-icon-144x144.png b/docs/_static/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7e4b842aecdb724f819ce359e556141408deca GIT binary patch literal 8954 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 literal 0 HcmV?d00001 diff --git a/docs/_static/apple-touch-icon-152x152.png b/docs/_static/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..36b770945a0214da1150d03b58401a16b430a301 GIT binary patch literal 9475 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 Ll)u(W7zh6!fh!9o literal 0 HcmV?d00001 diff --git a/docs/_static/apple-touch-icon-57x57.png b/docs/_static/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..062cb08bd4cca2af71f77a5347377031a78bf115 GIT binary patch literal 2988 zcmV;d3sdxoP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 YN_t|P(>IkluR8&BH1+S5Y1oAQ4>H(z3jhEB literal 0 HcmV?d00001 diff --git a/docs/_static/apple-touch-icon-76x76.png b/docs/_static/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7e77688db77c0f773ba0fedc2322d4b2e8ff6b GIT binary patch literal 4273 zcmaKvXE+<)+s9+?Q8i*q5mloRt45`$+M_5j8!J|7qy$xa)mB0jF>2LLDSos{(AsM6 zB1KW7iW)^de%JH7d0zbg*SYTVy}sXbf39<0-Y4F~NSleChaLa`FzM>tH@#AWe~Xs- zYVW~4l(-T~S9L>m0N`yZ!?^?1l^1f-F*O7Lo`C^?@Mr+w&s7w@0RZ?z0DvC|06;k# z0O0b;YkjDCbwKT?uYDhI`R^)hE6=z}=zMgno&o^O-TxL@rUWzZRY>EfYp6xDPQlJ9 zOptmB$YeSEm(W#j+KDwPXWPl8=zpl!IAY!L7{X6EILX z^e{wUf3Qf4M)LW%#xgB+5OH%gqz)I3)e#?!7BZXmrHZ1An1{-~%19qO3iui!8ZkSL zu%u^~wBE0%~5qXpS z#Czd!Kel8Ti0?{7s;w0bODUma2%<~cB(Htwb)Gy(D5Jq`I)65ZL-n(^Luzxr&A(B~ zF@7On4c4@De~gMHzslz_S~wsGDeF{YVKFh4Ua`e)Q-eBsHoJ4+e<@u`=JbGAs4>%` z?LH-M*^y$me55gAGBD~GVP)npiHA7VM^19Q=emx#nJaf!>D4C%-ismRjRL$du-gT= z;N0LaDOZ`B>&s1D*ZTEqv?vIqE~VALjczC`<5WALt^cF(nnTWTRzaLJaxL&|Y0pqA zHIhDY18oG;Xk#ku{JH+9IrmsqKs7ePQg0!a$eI`v6#>W`8Uipjz-P?iIuWzaF#$lv zP6E+q2~8-C1d-f0CKT_fGt2!`)WW?WaB?Dh;wLsS5rdpQz*KK_7=2=OgECr|lswe) zs;&ISU)O9W$RBu15toZ<+IW(H{qg&tpfj0aJ`2Z+7$f~|CiSfoX{B@v+L=s~F#TRu zPGlnPJnpSVO?}V;NP zhK7k1HlxM)q3(M0#nn?rJA(2G`S@QrQ|`0Q=Z)-L4{XPm2kMsZQEgZcHr_&Z)Ek0p z_4T(V77@S?-_cqu5+JfNBlFK{Xr(_Fdy5u(r^9q5*<=*(w5-n^X26rMAk`XPbzCq|KX{{)3nK+wpPTK^Q9Qsooy&j=W84oNrb{a9E0Re=c9B89q0No z&@rXeqiL za9qq7!lT*1*w_{MbCLb$Y+Pu{w&h_*38PZlj+k`JGAV~AE9^tm+u}sv$Zf%lGT+6* zzk|8*c!q>nhyB2!VdfzzR}54b?Ij={G`{J)lV5i;=kWTU!`;arjT5VC=LJUr9{ zY813>q&UOhfA<9?7g^;fByf6#)b8OCNcfol)gMC%@${gx1}0%W#D+E*R4`FJ^Ep(t zp6;aFd*Sx2DT`e>T=-ZzGTE|@-biBLjwX3JxC>D=Jy1VqJvA};_BN~APz%2@8cXMt$UV|t*d{zL zL6Kv#w?5-$XVW%1jCtgdw=TXtdNCsth#QU-bM^36TYtH zJ`c4uQasQrcc9m1GmRXf{l4zAG?jWX$rXIky}oiZXyDZ}i^YU^>q8l9L}}N~GFJjg zz_AC+EBi`ZX3C|}AKQXSek~OZD%mDMdG1|t8kgkOZG(HsywoCM6^tIgXa_}C`f`+B z$>6e}VY{e2CTRokbwxYb0tyaoHBvMJ#UCV<~Om%zFZ7q zbhE3?VHJT(iip4iPm`OKPIev&ST!bXaSn>!u41ui{^`sYsWLV;>s!KR(-$~4W;!3P zqkGv&u9y29D^T~D{b=5i@H8K91ERE9@ZxN1rwVow7G3E{LnsKBh=_{50(HfuK~KdX zerd{Wy0EA?!35r~iw`VdC&2ed+fF+PqKy2iv<|=|KDB6ds-Wk;PjTlv-E{eJ~UKq^)cGOrj?wNnoX(5h~RfF z-?$yPER!yu{HSX8bwHURF=0fY$UTYwZshs48RuFbyiKmqiVq} zU{&V%h?fhH`pbutTlyBYMZ=?o^@Zh$Tb)C#!x5Tsr@!lA8F*Y*&igRqpNzT6&_q>% zaernDK2p|_R8LlZ|I@8$6IG8BapdcYu9qufjyYl~TQ3iWkkT)7w0TYINo$HHJA#&G zc4pZ%-uTSvCwtDNP_fO53e`3* zjwqTVZ@XH2$+_pA!e>T{=I~cB2)(%NC~P{{<4dk~+h>Yv!N*lO40p-%SPSVCa3P&z znVwdGr>Ly+A4oQ-@56-XAIAqv7cYH32?wHf!ZLEln=jDG?CpX_yQx8}i#0#+;(dM2 zxd!IV@7{Tad5&{paA8A}PhA@VNgPSHcq;P@-A#^$k$(?omRc^j6bXo3$=}^K7NQ{4 zH9yaDA77q^*5U)i!%l{3M67C_3^ZPtna({wiAGmC@kIx0*+OrMeo>GkRF}ohjZ0=! ztF>jrT&WXlKSq}HufP?&i`_@bKO5(VL!8CnWL<^Zjmf=S_FbW~2H(H>@moBNrpB-v znqju;jH|NQ9O-wqucjk6fOo6yg75w+H;YnwMtZht>kHRis|UjyubZBRzvyBL6YA(P zR_hu6(muGN@9p#_vSp`s^4DAq&5cx5x?q;>YDY2C;ZWV!E;dkhK~}8cbW2TZPMuLk z^KEIK&beS*hMAlkWg>>4nw(r6y60;@`%k>QL>6=>{grF1DCM?voOXU>S7zZB@Xb)q zVblb{thcrd{I|F@$5`|2V>r@I_0{iVY1h3ViZuSLT2}J+Uy1eYs@+q@YEBnz5;yS* z;;REO-Zd0}E|W&Y>5NuW(z(z**Bv+E`9*nUVUX zsiVH}O4Fv`njRH17}N7S6P&1BLqOpT%`v z-_j@8*>;!%59~5;jQLxaIERGXWtrRgkcQ)ug^y(LaH(ecYGY@Yw=-Fz9(9ae%bS0m?Y^lXQRgQAR#M6id*h|0 z0*{ZsHPZxs(>IdUe@#tr8&={t(0M+EVWddG-!q?nBQrLR@VjO{eUl3$(qLwKqJODj zFV#!hT6O+_5$iL0^vom^H85!^N==X9~s>9IZNgzpIM09L_-sT$DS53LNmz3A5@!Zvuoly~w7LA)g*nhs=){IosoX0sH{+HGt#2$?EW zCrK|;OhSOJSvpcPj_7Q9yCHt+*5=5nzqjx=!OQ!M8#JY6g|!0vPazyk5dqC_G?#!~ zKa>zTWnjWz?$Rd=b>XC_M_S9pymKjM@=Vdxf~ctWcFI$wy$-$JFEMIub6|;gX7-wV zRgvZP_ax7l_Wwvs2A)YQ&*BOzHuKoa54Tx(JJ(1=A)!agHasA}wb;wZ(Ml;8%`;bx z8oNw;q^s7wE!7Vra;vV7gC!` za4Of|WB)r=48pO|G$y`IBW_XU?)?hP0<^+$l|_c&?tdI-n)q{u4Qt>i0e$%RjfnUc zih@{iK@YEre(3XH_N2lwWpR+KCjM4T%92ko;u7R+eQTkfmVV#-u68Ih`aApmHD9U= zJ}g5wARATnV{;@4Y>xIl^LnK2rXQy??(j?A=Zms+^7#e{;`ru|is3yi(S;VCw|nT- zl3&32fa01k9xHhGKf!d8t$Ly?15MXk9-iL`ch6C74O^4S97%kqt8#qvy+x31W05vG_6dze90O?~?tmmVd&e2z#rU00 zH|53G_-ltglC!r+@tEqOjTr%Z^vjpwNlAi}!Q~DFLS@2A1Tw$3@B8bL5(`-Er!>{c z<>lcy>riBaZ004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY4#WTe4#WYKD-Ig~000McNliru=K~ZFE&`@u z@bUlv3U*0EK~!ko?V5XVRMi>4f9KwP<+ULRSsqCUpy3f>cnAtXKvV>2p{Q7ts#S`P zk6NfgI~_;VcBWQpJ7X39s8SuBfYpK`h=8Do3MwL?5C|lM1VXZ5lZEVVlD)foPye{P z*#!sk*Z@e)oHx?_44C^Cg$LD3^Ky-H_do-H_dom!)(=UM})~0cpC_ z6F{D);1c2@LP`ljpaXtgM+YRJONlB3Rv|ETW82eLjLxlCG*;VX;u+_cJv)nS~h{bQn`gxZygu`Fc2d40@(RdJhBcz+w1c zBh)wz&^WYuen=q*Ny$fEFMo2m*xB5S1XSRmv@|4;uByE1b~D>^r$g6_loawT zme%7_y3Xpx#`aw-C5#;fj-Fv_0bC8R^-BW|3{5NXX)tcc0Tv6lr=*;5?nAGa%0QrP zKzj;I7#mF+LV<7gKzU^}l6Fy!>>OkymjQE9Q|V)h2I#|@#)e1$I+y4=6y`(TfUrpl z@cQ86&ma)!Qn=1RN(ntuAt@0;A^MxmfdI0-QToC_+F|}LV8U2F)covjZf^ZLQ3z%vC!@Bdjc>jK_i4lDq=eqR2u>c) zCq5sGolcGf0*Fgyu0lXX6&x&sCmy2rl0_7azZOean=?{Un0c0;{^)uk;QJE8JR>!d zNyR&B8qcSvlC7wWOGxN4Kmhfb%*F~PuJQN<5dGh^n4svQ51xfIC68a zRo6iI(bmFT2c(p7nQz;gOt8U?6CooFPBl{RYht0($+wM->^pdv$>YY5nURhqAps?S zkWp`@r@_g3IPEbWj+98?sHX9f+s$I9lXX5H`zk6KH+ls9`(+ys#bSm&4)|s_zD5r_ znw#0=^D)3|ZeJzUX~@t)UkqgT;mdFLuqdc=i`^b~ zq-|T1LV%*sT<7A2ZQC*B4WJ-@2*V48a_h7km_D(HG;fmu)g$%HYjqtV1ZJy+1Bc3Z zfBj|_%)gsEZ=Xrw&_Pu1Eg`Mm&6@HGuAW##YN{P{o#d2cre$X_cy9?p)8Y<7Z9|6T zpr-L~$w5B;dKXs>zLNeqS(sIogx(Iw&oj(4b}}(RYxCCay!q}L9=zx0j2T%7p%A$_ zSqvMV&&ywZ%jW&1j2%@-{?I`nB|=Ipj-H6U`=Pov?(RUlug)}?aG1@MmQ^tS@u%3b zZM$)ET{l9e8nfmL0|tRZTeea4$>%)&@coRuDnC5lFzM{S@2OW3ewTl6VMd@&3d&~@JY_j?p?+rgcW%wx!v1EUbC zN_j;U3zs~{m=Oj1`N`iJrW%`*%a1}$-Nl7egkVx)Vrw6#qNy)vVDR#Diq?*NOQUCM-OM)A8}&nGbwnT3cp2lgF=mXp*5|BUkqHXB9P zjAVRHHusJmN%n2iv05yxfKmw7ZTggwch)fH-Z|t<9ETcNwzUGPaKZ_%ybjxUp3#1Z zM>_nNCM6~DR#q0{&nlvuTUyw)XCHkE^U1wqh5;C!WC%&|f7Y_>jg=HVa1Z?_6&ZjK zg-}&EQVGw$1YdkjNJ;`7oLiS^G9qP~#=_cKHv4=?Dap)8W9d_im@{iS3W8SW3hBK0 z?iyCC`H1J9e4J6khe0TWF2OG)iU5mH5Qoa)rR8ww2!2Jd-0fzV)ykx#q)P-DHnX}w zkp2D^LQ;~EoF5%b-@N1BhWoS~@QBOD- zDKVPEfgqxy3K~5m3c<}yP3*EK@wv&wkcQJB1SNeOe3_QQZ=9|!0qmS6r8HJ1PcMRk z!A27bi~zH0ozZoBD7sBwf7hW;SzGoN1(q-_~E>IM7pn29bl)GnRUA_XPyb}MD z3kdEn#rEQ>sQ&m%y3T153~jysw$W0YKNn6l!ix8dKF# zMn08*5GYcTxN$4w4~AdOMS6T#bsg*5YoNv7CFuh?)2$1y>^X4A(8y_zv4^o^CsZAe zF0y;rjSU<{iSA=W95rGQLLhuiuwpgn645UUR=#hvSh@(XbC3~GMKKb0Bo(M?)O0Nt zm_5VLvhyTt{4_dg5pEiXk7cBLmzaPI1Yu|%*sSf}Q)!39w+Sox@wS?(8pZX}m*J;V z;EDl|5?-NL%y8E%xM`xH(GNExTKvfS?}TkTpsE^q_iV)R6R>)HmlXpYD(ikELO{P?Ii>}|tw?Z}Rj@uim0+U>NAYTu-TSDMl1(-X z=F)P~gTd&1;*d@k180E7bk$pZFLEw+m2%c(U#zcZozKV1y?QY?oGwo5I)8AvsMa*z z=-ZbxHNI^-i1)<^DWmJdSh$!qBf1_vj``dW4AKw`@`}U3;Fyi0R8{3KJ$q7MwX(6T zEr<5%;ZnT{>eqEzq$D-c7m8>({JBZjafd?mHJRe>@m!j>KcvK}C|F~lS|w}^iHZ_e z8!}cd&3im&L!IyY|5?b3EZvZoi*!R?F47HoxyXM31!!SiKX!<70000bbVXQnWMOn= zI%9HWVRU5xGB7eTEif}JGB8vzHaasoIy5yaFfckWFwEhP;Q#;tC3HntbYx+4Wjbwd zWNBu305UK#Gc7POEio`uF*rIgH99jiD=;uRFfc8^yVC#w02y>eSaefwW^{L9a%BK_ icXuvnZfkR6VQ^(GZ*pgw?mQX*000014Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`W@CkAKuch^0Q}Z8? z)X?~^q4`)xHMRdH#{Y}5|F_oscXF5~DQUsMu}DhlzqL1nBzXKKg{~vF9>;^C>8I!!-T@p8K z@M!~bI14-?iy0XBj({-ZRBb+KpdfpRr>`sfb7m0%J*H)eA3gzv=6Jd|hDcmaPB_3R zA(_a-rlzLmrZ9gdtJa}Y$Icx*aN^|Avxj*EA3S*aI9)(ML`W>L<&~(Y@brW!Qzo@( zB}|z(b#iz>NKjZ{E7yvZ*%?`xuV1`+>HOBvz{JSR(A0SQh8C`f$lEt=-L$r_vUFyZ zh>f{>$JS==p4tSx&tE_DbMSESaklO@)v-}B(y~$$J1KppXJg?us6i5BLvVgtNqJ&XDnogBxn5>oc5!lI ZL8@MUQTpt6Hc~)E44$rjF6*2UngCNzE~fwh literal 0 HcmV?d00001 diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc86cfb2fc05e85679ca903606a0139062039303 GIT binary patch literal 32038 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 literal 0 HcmV?d00001 diff --git a/docs/_static/style.css b/docs/_static/style.css new file mode 100644 index 000000000..27efb234a --- /dev/null +++ b/docs/_static/style.css @@ -0,0 +1,23 @@ +:root { + --block-bg-opacity: 0.5; +} + +.wy-side-nav-search { + background-color: #fff; +} + +.getting-started { + background-color: rgba(78, 150, 253, var(--block-bg-opacity)); +} + +.user-guides { + background-color: rgba(0, 169, 154, var(--block-bg-opacity)); +} + +.developer-docs { + background-color: rgba(171, 0, 182, var(--block-bg-opacity)); +} + +.key-ideas { + border: 0px; +} diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 000000000..4c57ba830 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,2 @@ +{% extends "!layout.html" %} +{% set css_files = css_files + ["_static/style.css"] %} diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 000000000..147ebab99 --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +`which sphinx-build` -T -E -b html -d _build/doctrees-readthedocs -D language=en . _build/html diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..32a8c2df3 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,187 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +sys.path.insert(0, os.path.abspath("..")) + + +# -- Project information ----------------------------------------------------- + +project = "trlX" +copyright = "2023, CarperAI" +author = "CarperAI" + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "sphinx.ext.mathjax", + "sphinx.ext.napoleon", + "sphinx.ext.viewcode", + "matplotlib.sphinxext.plot_directive", + "sphinx_autodoc_typehints", + "myst_nb", + # "myst_parser", + "sphinx_remove_toctrees", + "sphinx_copybutton", + "sphinx_design", +] + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "numpy": ("https://docs.scipy.org/doc/numpy/", None), + "scipy": ("https://docs.scipy.org/doc/scipy/reference/", None), + "pytorch": ("https://pytorch.readthedocs.io/", None), +} + +autodoc_preserve_defaults = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = [".rst", ".md"] + +# The master toctree document. +main_doc = "index" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [ + # Sometimes sphinx reads its own outputs as inputs! + "build/html", +] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + +autosummary_generate = True +napolean_use_rtype = False + +# -- Options for nbsphinx ----------------------------------------------------- + +# Execute notebooks before conversion: 'always', 'never', 'auto' (default) +# We execute all notebooks, exclude the slow ones using 'exclude_patterns' +nbsphinx_execute = "always" + +# Use this kernel instead of the one stored in the notebook metadata: +# nbsphinx_kernel_name = 'python3' + +# List of arguments to be passed to the kernel that executes the notebooks: +# nbsphinx_execute_arguments = [] + +# If True, the build process is continued even if an exception occurs: +# nbsphinx_allow_errors = True + + +# Controls when a cell will time out (defaults to 30; use -1 for no timeout): +nbsphinx_timeout = 180 + +# Default Pygments lexer for syntax highlighting in code cells: +# nbsphinx_codecell_lexer = 'ipython3' + +# Width of input/output prompts used in CSS: +# nbsphinx_prompt_width = '8ex' + +# If window is narrower than this, input/output prompts are on separate lines: +# nbsphinx_responsive_width = '700px' + +# This is processed by Jinja2 and inserted before each notebook +nbsphinx_prolog = r""" # noqa: E501 +{% set docname = 'docs/' + env.doc2path(env.docname, base=None) %} +.. only:: html + .. role:: raw-html(raw) + :format: html + .. nbinfo:: + Interactive online version: + :raw-html:`Open In Colab` + __ https://github.com/CarperAI/trlx/blob/ + {{ env.config.release }}/{{ docname }} +""" + +# This is processed by Jinja2 and inserted after each notebook +# nbsphinx_epilog = r""" +# """ + +# Input prompt for code cells. "%s" is replaced by the execution count. +# nbsphinx_input_prompt = 'In [%s]:' + +# Output prompt for code cells. "%s" is replaced by the execution count. +# nbsphinx_output_prompt = 'Out[%s]:' + +# Specify conversion functions for custom notebook formats: +# import jupytext +# nbsphinx_custom_formats = { +# '.Rmd': lambda s: jupytext.reads(s, '.Rmd'), +# } + +# Link or path to require.js, set to empty string to disable +# nbsphinx_requirejs_path = '' + +# Options for loading require.js +# nbsphinx_requirejs_options = {'async': 'async'} + +# mathjax_config = { +# 'TeX': {'equationNumbers': {'autoNumber': 'AMS', 'useLabelIds': True}}, +# } + +# Additional files needed for generating LaTeX/PDF output: +# latex_additional_files = ['references.bib'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_book_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +# Output file base name for HTML help builder. +htmlhelp_basename = "TRLXdoc" + +# -- Extension configuration ------------------------------------------------- + +# Tell sphinx-autodoc-typehints to generate stub parameter annotations including +# types, even if the parameters aren't explicitly documented. +always_document_param_types = True + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + # "logo_only": True, + "show_toc_level": 2, + "repository_url": "https://github.com/CarperAI/trlx", + "use_repository_button": True, # add a "link to repository" button +} + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = "_static/apple-touch-icon-144x144.png" + +html_favicon = "_static/favicon-16x16.png" diff --git a/docs/source/configs.rst b/docs/configs.rst similarity index 86% rename from docs/source/configs.rst rename to docs/configs.rst index da5e1f2e6..0e2abd369 100644 --- a/docs/source/configs.rst +++ b/docs/configs.rst @@ -25,10 +25,10 @@ the specific method being used (i.e. ILQL or PPO) **PPO** -.. autoclass:: trlx.data.method_configs.PPOConfig +.. autoclass:: trlx.trainer.nn.ppo_models.MethodConfig :members: **ILQL** -.. autoclass:: trlx.data.method_configs.ILQLConfig +.. autoclass:: trlx.trainer.nn.ilql_models.ILQLConfig :members: diff --git a/docs/source/data.rst b/docs/data.rst similarity index 100% rename from docs/source/data.rst rename to docs/data.rst diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 000000000..0a2ec49f0 --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,26 @@ +# Examples + +In the `examples` folder you can find several example training tasks. + +Check the configs folder for the associated configs files. + +## randomwalks + +does offline reinforcement on a set of graph random walks to stitch shortest paths +to some destination. + +## simulacra + +optimizes prompts by using [prompts-ratings dataset](https://github.com/JD-P/simulacra-aesthetic-captions). + +## architext + +tries to optimize designs represented textually by minimizing number of rooms (pre-trained model is under a license on hf). + +## ilql_sentiments and ppo_sentiments + +train to generate movie reviews with a positive sentiment, in offline setting – by fitting to IMDB +dataset sentiment scores, and in online setting – by sampling finetuned on IMDB +model and rating samples with learned sentiment reward model, You can tweak +these scripts to your liking and tune hyperparameters to your problem if you +wish to use trlx for some custom task. diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000..e663db2d2 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,8 @@ +# Frequently Asked Questions + +```{admonition} How to add a new page to the documentation? +RST primer for Sphinx: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html +``` + +We are collecting here answers to frequently asked questions. +Contributions welcome! diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc86cfb2fc05e85679ca903606a0139062039303 GIT binary patch literal 32038 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 literal 0 HcmV?d00001 diff --git a/docs/glossary.md b/docs/glossary.md new file mode 100644 index 000000000..aef6f47bb --- /dev/null +++ b/docs/glossary.md @@ -0,0 +1,81 @@ +# Glossary of Terms + +```{glossary} +[Agent]() + An agent in reinforcement learning is the entity that interacts with the {term}`Environment` to learn how to maximize its {term}`Reward`. + +[Action]() + An action in reinforcement learning is the signal that the {term}`Agent` provides to the {term}`Environment` to indicate what it wants to do. + + In other words, an action is a scalar value that the agent provides to the environment to indicate what it wants to do. The agent's goal is to maximize the total reward it receives over a sequence of {term}`Steps`. + +[CPU](https://en.wikipedia.org/wiki/Central_processing_unit) + Short for *Central Processing Unit*, CPUs are the standard computational architecture + available in most computers. trlX can run computations on CPUs, but often can achieve + much better performance on {term}`GPU` . + + +[Device](https://en.wikipedia.org/wiki/Device_computing) + The generic name used to refer to the {term}`CPU`, {term}`GPU`, used + by TRLX to perform computations. + +[Environment]() + An environment in reinforcement learning is the system that the agent interacts with. It is the source of {term}`State`, {term}`Action`, and {term}`Reward`. + + In other words, an environment is a system that defines the agent's observation space, action space, and reward function. It is the source of the agent's experience, and the goal of the agent is to maximize the total reward it receives over a sequence of {term}`Steps`. + +[GPU](https://en.wikipedia.org/wiki/Graphics_processing_unit) + Short for *Graphical Processing Unit*, GPUs were originally specialized for operations + related to rendering of images on screen, but now are much more general-purpose. TRLX is + able to target GPUs for fast operations on arrays (see also {term}`CPU`). + +[Policy]() + A policy in reinforcement learning is a function that maps {term}`State` to {term}`Action`. + + In other words, a policy is a function that maps the agent's current state to the action it should take. The agent's goal is to maximize the total reward it receives over a sequence of {term}`Steps`. + +[PPO](https://arxiv.org/abs/1707.06347) + Short for *Proximal Policy Optimization*, PPO is a {term}`Policy Gradient` algorithm + that is able to learn policies in high-dimensional, continuous action spaces. + +[Policy Gradient](https://spinningup.openai.com/en/latest/spinningup/rl_intro3.html#policy-gradients) + Policy gradient methods are a class of reinforcement learning algorithms that are able to + learn policies in high-dimensional, continuous action spaces. + +[Reinforcement Learning](https://en.wikipedia.org/wiki/Reinforcement_learning) + Reinforcement learning (RL) is a machine learning paradigm that trains an agent to maximize its + {term}`Reward` by interacting with an {term}`Environment`. + +[Reward]() + A reward in reinforcement learning is the signal that the {term}`Environment` provides to the {term}`Agent` to indicate how well it is performing. + + In other words, a reward is a scalar value that the environment provides to the agent to indicate how well it is performing. The agent's goal is to maximize the total reward it receives over a sequence of {term}`Steps`. + +[Rollout]() + A rollout in reinforcement learning is the process of executing a {term}`Policy`, starting from a specific state in the {term}`Environment`, and following it to the end to obtain a complete trajectory of {term}`State`, {term}`Action`, and {term}`Reward`. + + In other words, a Rollout is a simulation of a policy's behavior in the environment over a fixed number of {term}`Steps` or until a terminal state is reached. It provides a means of evaluating the {term}`Policy`'s performance, as the total reward collected over the trajectory can be used as a measure of its effectiveness. + +[State]() + A state in reinforcement learning is the observation that the {term}`Environment` provides to the {term}`Agent`. + +[Steps]() + A step in reinforcement learning is the process of taking a single {term}`Action` in the {term}`Environment`, and observing the resulting {term}`State` and {term}`Reward`. + + In other words, a step is a single iteration of the environment's dynamics, where the agent takes an action and receives a reward and a new state. The agent's goal is to maximize the total reward it receives over a sequence of steps. + +[Trajectory] + + In a {term}`PPO` (Proximal Policy Optimization) setup, a fixed-length trajectory + segment refers to a fixed number of time steps in an episode of an + environment.At each time step, the agent takes an action based on the current + state and receives a reward from the environment. By using fixed-length + trajectory segments, the agent's behavior is divided into chunks of a fixed + length, and each chunk is used for a single PPO update. This allows for more + efficient use of the {term}`Agent`'s experience by breaking it into smaller pieces, and + it also helps to stabilize the learning process by making the training updates + less sensitive to the length of the episode. Fixed-length trajectory segments + are often used in Reinforcement Learning (RL) algorithms, including {term}`PPO`, to + update the policy network. + +``` diff --git a/docs/source/index.rst b/docs/index.rst similarity index 70% rename from docs/source/index.rst rename to docs/index.rst index 1b2947593..0a91d3e50 100644 --- a/docs/source/index.rst +++ b/docs/index.rst @@ -8,16 +8,39 @@ Welcome to trlX's documentation! trlX is a library made for training large language models using reinforcement learning. It currently supports training using PPO or ILQL for models up to 20B using Accelerate. +Installation +------------ +.. code-block:: bash + + pip install "trlx" + + .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Contents: + README data - models configs pipeline + trainer + +.. toctree:: + :hidden: + :maxdepth: 1 + :caption: Examples + examples +.. toctree:: + :hidden: + :maxdepth: 1 + :caption: Resources + + faq + glossary + + Indices and tables ================== diff --git a/docs/pipeline.rst b/docs/pipeline.rst new file mode 100644 index 000000000..3d7c45192 --- /dev/null +++ b/docs/pipeline.rst @@ -0,0 +1,33 @@ +.. _pipeline: + +Pipelines and Rollout Store +*************************** + +*Pipelines* + +Pipelines in trlX provide a way to read from a dataset. They are used to fetch data from the dataset and feed it to the models for training or inference. The pipelines allow for efficient processing of the data and ensure that the models have access to the data they need for their tasks. + +.. autoclass:: trlx.pipeline.BasePipeline + :members: + +.. autoclass:: trlx.pipeline.BaseRolloutStore + :members: + + +*Rollout Stores* + +Rollout stores in trlX are used to store experiences created for the models by the orchestrator. The experiences in the rollout stores serve as the training data for the models. The models use the experiences stored in their rollout stores to learn and improve their behavior. The rollout stores provide a convenient and efficient way for the models to access the experiences they need for training. + + +**PPO** + +.. autoclass:: trlx.pipeline.ppo_pipeline.PPORolloutStorage + :members: + +**ILQL** + +.. autoclass:: trlx.pipeline.offline_pipeline.PromptPipeline + :members: + +.. autoclass:: trlx.pipeline.offline_pipeline.ILQLRolloutStorage + :members: diff --git a/docs/requirements.txt b/docs/requirements.txt index 7a33f300e..3052a2f0c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,11 +1,20 @@ -accelerate==0.12.0 -datasets==2.4.0 -deepspeed==0.7.3 -einops==0.4.1 -numpy==1.23.2 -sphinx==4.0.0 -sphinx_rtd_theme +accelerate +commonmark +datasets +deepspeed +docutils +jupyter-sphinx +matplotlib +myst-nb +nbsphinx +Pygments +ray +readthedocs-sphinx-ext +rich +sphinx-autodoc-typehints +sphinx-book-theme +sphinx-copybutton +sphinx-design +sphinx-remove-toctrees torchtyping -tqdm==4.64.0 -transformers==4.21.2 -wandb==0.13.2 +transformers diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 0a9a11c86..000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,54 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import sphinx_rtd_theme - -sys.path.insert(0, os.path.abspath('../..')) - - -# -- Project information ----------------------------------------------------- - -project = 'trlX' -copyright = '2022, CarperAI' -author = 'CarperAI' - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. - -extensions = ['sphinx_rtd_theme', 'sphinx.ext.todo', 'sphinx.ext.viewcode', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.autosectionlabel'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] diff --git a/docs/source/examples.rst b/docs/source/examples.rst deleted file mode 100644 index 6f5db49d1..000000000 --- a/docs/source/examples.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. _examples: - -Examples -************************ - -In the ``examples`` folder you can find several example training tasks. Check -the configs folder for the associated configs files. ``examples.randomwalks`` -does offline reinforcement on a set of graph random walks to stitch shortest -paths to some destination. ``examples.simulacra`` optimizes prompts by using -prompts-ratings dataset (https://github.com/JD-P/simulacra-aesthetic-captions). -``examples.architext`` tries to optimize designs represented textually by -minimazing number of rooms (pretrained model is under a license on hf). -``examples.ilql_sentiments`` and ``examples.ppo_sentiments`` train to generate -movie reviews with a positive sentiment, in offline setting – by fitting to IMDB -dataset sentiment scores, and in online setting – by sampling finetuned on IMDB -model and rating samples with learned sentiment reward model, You can tweak -these scripts to your liking and tune hyperparameters to your problem if you -wish to use trlx for some custom task. diff --git a/docs/source/pipeline.rst b/docs/source/pipeline.rst deleted file mode 100644 index 68279d889..000000000 --- a/docs/source/pipeline.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. _pipeline: - -Pipelines -************************ - -Pipelines are how you read from a dataset with trlX. Rollout stores are how models store experiences created -for them. It is these experiences in their rollout store that they are trained on. - -**General** - -.. autoclass:: trlx.pipeline.BasePipeline - :members: - -.. autoclass:: trlx.pipeline.BaseRolloutStore - :members: - -**PPO** - -.. autoclass:: trlx.pipeline.ppo_pipeline.PPORolloutStorage - :members: - -**ILQL** - -.. autoclass:: trlx.pipeline.offline_pipeline.PromptPipeline - :members: - -.. autoclass:: trlx.pipeline.offline_pipeline.ILQLRolloutStorage - :members: diff --git a/docs/source/trainer.rst b/docs/trainer.rst similarity index 100% rename from docs/source/trainer.rst rename to docs/trainer.rst diff --git a/docs/trlx_logo_bw.png b/docs/trlx_logo_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0c86f6c2da34aedb1dede5d8fcbfe1141f686c GIT binary patch literal 59797 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 literal 0 HcmV?d00001 diff --git a/docs/trlx_logo_red.png b/docs/trlx_logo_red.png new file mode 100644 index 0000000000000000000000000000000000000000..91bfc378d8124a371774d653d0be27954a7b88b4 GIT binary patch literal 56003 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

C|%j5fZEJlj3Q>onI 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 Iterabl :param prompts: List of prompts to tokenize and use as context - :param length: How many new tokens to genrate for each prompt + :param length: How many new tokens to generate for each prompt :type length: int :param n_samples: Default behavior is to take number of prompts as this diff --git a/trlx/trainer/accelerate_ppo_trainer.py b/trlx/trainer/accelerate_ppo_trainer.py index 16791f62a..84b02a7b6 100644 --- a/trlx/trainer/accelerate_ppo_trainer.py +++ b/trlx/trainer/accelerate_ppo_trainer.py @@ -278,7 +278,7 @@ def make_experience(self, num_rollouts: int = 1024, iter_count: int = 0): # noq while len(ppo_rl_elements) < num_rollouts: # Get next batch in prompt dataset and refresh if exhausted - # TOOD (jon-tow): Make `prompt_dataloader` a cyclic/infinite DataLoader to not require manually + # TODO (jon-tow): Make `prompt_dataloader` a cyclic/infinite DataLoader to not require manually # "refreshing" the contents of the `prompt_iterator` try: batch: PromptBatch = next(self.prompt_iterator)