From 0fba3d8880c4467996275c6cf700b5e1ff4ee3e0 Mon Sep 17 00:00:00 2001 From: Sachira Kuruppu Date: Sun, 26 Nov 2023 06:35:43 +0000 Subject: [PATCH 1/2] Add backtranslation code for data generation --- dalm/datasets/backtranslation/LICENSE | 201 ++++++ dalm/datasets/backtranslation/Makefile | 30 + dalm/datasets/backtranslation/README.md | 192 ++++++ .../backtranslation/conf/ds_zero1default.json | 14 + .../backtranslation/conf/ds_zero2default.json | 22 + .../backtranslation/conf/fsdp_config.json | 3 + .../backtranslation/cuda_outofmemory_log.txt | 633 ++++++++++++++++++ .../data/prompts/self_curation.txt | 11 + .../backtranslation/data/seed/convert.py | 73 ++ .../backtranslation/data/seed/download.sh | 5 + .../data/unlabelled/falcon_refinedweb.py | 44 ++ .../datasets/backtranslation/figs/humback.png | Bin 0 -> 259311 bytes .../backtranslation/requirements_predict | 91 +++ .../backtranslation/requirements_train.txt | 90 +++ .../backtranslation/scripts/falcon.sh | 15 + .../scripts/predict_instruction.sh | 23 + .../scripts/predict_instruction_vllm.sh | 31 + .../backtranslation/scripts/self_aug.sh | 24 + .../backtranslation/scripts/self_curation.sh | 34 + .../scripts/train_backward_Myx.sh | 44 ++ .../scripts/train_backward_Myx_slurm.sh | 74 ++ .../backtranslation/scripts/train_seed.sh | 57 ++ dalm/datasets/backtranslation/src/__init__.py | 1 + .../src/core/build_curation_dataset.py | 42 ++ .../src/core/filter_curation_results.py | 83 +++ .../backtranslation/src/core/predict.py | 96 +++ .../backtranslation/src/core/predict_vllm.py | 77 +++ .../backtranslation/src/core/train.py | 69 ++ .../src/core/train_flash_attn.py | 13 + .../backtranslation/src/core/trainer.py | 77 +++ dalm/datasets/backtranslation/src/data.py | 261 ++++++++ .../backtranslation/src/utils/__init__.py | 0 .../backtranslation/src/utils/config.py | 36 + .../backtranslation/src/utils/constant.py | 3 + .../src/utils/convert_vllm_to_alpaca_eval.py | 27 + dalm/datasets/backtranslation/src/utils/io.py | 46 ++ .../backtranslation/src/utils/print.py | 6 + .../backtranslation/src/utils/template.py | 49 ++ dalm/datasets/backtranslation/tox.ini | 21 + 39 files changed, 2618 insertions(+) create mode 100644 dalm/datasets/backtranslation/LICENSE create mode 100644 dalm/datasets/backtranslation/Makefile create mode 100644 dalm/datasets/backtranslation/README.md create mode 100644 dalm/datasets/backtranslation/conf/ds_zero1default.json create mode 100644 dalm/datasets/backtranslation/conf/ds_zero2default.json create mode 100644 dalm/datasets/backtranslation/conf/fsdp_config.json create mode 100644 dalm/datasets/backtranslation/cuda_outofmemory_log.txt create mode 100644 dalm/datasets/backtranslation/data/prompts/self_curation.txt create mode 100644 dalm/datasets/backtranslation/data/seed/convert.py create mode 100644 dalm/datasets/backtranslation/data/seed/download.sh create mode 100644 dalm/datasets/backtranslation/data/unlabelled/falcon_refinedweb.py create mode 100644 dalm/datasets/backtranslation/figs/humback.png create mode 100644 dalm/datasets/backtranslation/requirements_predict create mode 100644 dalm/datasets/backtranslation/requirements_train.txt create mode 100644 dalm/datasets/backtranslation/scripts/falcon.sh create mode 100644 dalm/datasets/backtranslation/scripts/predict_instruction.sh create mode 100644 dalm/datasets/backtranslation/scripts/predict_instruction_vllm.sh create mode 100755 dalm/datasets/backtranslation/scripts/self_aug.sh create mode 100755 dalm/datasets/backtranslation/scripts/self_curation.sh create mode 100755 dalm/datasets/backtranslation/scripts/train_backward_Myx.sh create mode 100644 dalm/datasets/backtranslation/scripts/train_backward_Myx_slurm.sh create mode 100755 dalm/datasets/backtranslation/scripts/train_seed.sh create mode 100644 dalm/datasets/backtranslation/src/__init__.py create mode 100644 dalm/datasets/backtranslation/src/core/build_curation_dataset.py create mode 100644 dalm/datasets/backtranslation/src/core/filter_curation_results.py create mode 100644 dalm/datasets/backtranslation/src/core/predict.py create mode 100644 dalm/datasets/backtranslation/src/core/predict_vllm.py create mode 100644 dalm/datasets/backtranslation/src/core/train.py create mode 100644 dalm/datasets/backtranslation/src/core/train_flash_attn.py create mode 100644 dalm/datasets/backtranslation/src/core/trainer.py create mode 100644 dalm/datasets/backtranslation/src/data.py create mode 100644 dalm/datasets/backtranslation/src/utils/__init__.py create mode 100644 dalm/datasets/backtranslation/src/utils/config.py create mode 100644 dalm/datasets/backtranslation/src/utils/constant.py create mode 100644 dalm/datasets/backtranslation/src/utils/convert_vllm_to_alpaca_eval.py create mode 100644 dalm/datasets/backtranslation/src/utils/io.py create mode 100644 dalm/datasets/backtranslation/src/utils/print.py create mode 100644 dalm/datasets/backtranslation/src/utils/template.py create mode 100644 dalm/datasets/backtranslation/tox.ini diff --git a/dalm/datasets/backtranslation/LICENSE b/dalm/datasets/backtranslation/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/dalm/datasets/backtranslation/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/dalm/datasets/backtranslation/Makefile b/dalm/datasets/backtranslation/Makefile new file mode 100644 index 0000000..0ee0469 --- /dev/null +++ b/dalm/datasets/backtranslation/Makefile @@ -0,0 +1,30 @@ +all: format clean pre test + echo 'finished' + +.PHONY: format +format: + isort --profile black --filter-files . + black . + +.PHONY: test +test: + coverage run --source src -m pytest -vv . + coverage report -m + flake8 + +.PHONY: pre +pre: + pre-commit run --all-files + +.PHONY: debug +debug: + pytest -vv tests/utils/test_logging.py + +.PHONY: clean +clean: + rm -rf build/ + rm -rf dist/ + rm -rf *.egg-info/ + rm -f .coverage + rm -f coverage.xml + find . | grep -E '(__pycache__|\.pyc|\.pyo$$)' | xargs rm -rf \ No newline at end of file diff --git a/dalm/datasets/backtranslation/README.md b/dalm/datasets/backtranslation/README.md new file mode 100644 index 0000000..ccd6db2 --- /dev/null +++ b/dalm/datasets/backtranslation/README.md @@ -0,0 +1,192 @@ +# 🐋 Humback + +An **unofficial** implementation of [Self-Alignment with Instruction Backtranslation](https://arxiv.org/pdf/2308.06259.pdf) . + +The proposed Humback is a novel framework that can augment the instruction data for supervised fine-tuning with high quality. + +🚧 Currently, this repo is under construction and not finished. + +![Humback Framework](./figs/humback.png) + +## 🌴 Dependencies + +- Python==3.11.4 +- PyTorch==2.0.1 +- Others: [requirements.txt](./requirements.txt) + +## 🚀 QuickStart + +Procedure (2 iters): +1. Prepare seed data and unlabelled data. +2. Train the backward model $M_{yx}$ on the reversed seed data. +3. Self-augment the seed data via $M_{yx}$. +4. Train a forward model $M_{0}$ on the seed data. +5. Self-curate the unlabelled data $A_{k}^{(1)}$ via $M_{0}$ (tag quality scores). +6. Train a forward model $M_{1}$ on the self-curated unlabelled data $A_{k}^{(1)}$. +7. Use $M_{1}$ to self-curate the unlabelled data $A_{k}^{(2)}$. +8. Train a forward model $M_{2}$ on the self-curated unlabelled data $A_{k}^{(2)}$. + +### Seed Data Pre-processing + +We follow the original paper and use [oasst1](https://huggingface.co/datasets/OpenAssistant/oasst1) to construct the seed data. + +The processed data could be found [here](https://github.com/Spico197/Humback/releases/tag/data) . + +```bash +$ bash data/seed/download.sh +$ python data/seed/convert.py +# #data: 3286, #dump: 3200 +# Instruction len: 149±266, Response len: 1184±799 +``` + +### Unlabelled Data Pre-processing + +Since ClueWeb22 is not a free open-source dataset, we sample texts from [falcon-refinedweb](https://huggingface.co/datasets/tiiuae/falcon-refinedweb) instead. + +The processed data could be found [here](https://github.com/Spico197/Humback/releases/tag/data) . + +```bash +$ python data/unlabelled/falcon_refinedweb.py +``` + +### Train Backward Model $M_{yx}$ + +| Item | Value | +| :--------------------- | :-------------------------------------------------------------------------- | +| Foundation Model | [meta-llama/Llama-2-7b-hf](https://huggingface.co/meta-llama/Llama-2-7b-hf) | +| GPUs | 8 * A100 40GB | +| Mixed Precision | bf16 | +| Gradient Checkpointing | on | +| ZeRO-Offload | Stage 2 | +| Batch size | 32 | +| Steps | 500 | + +```bash +# The first Myx training takes about 30min (on the seed data) +$ bash scripts/train_backward_Myx.sh +``` + +The pre-trained $M_{yx}$ is available at [Huggingface](https://huggingface.co/Spico/Humback-Myx). + +### Self-Augmentation via $M_{yx}$ + +The augmentation data is available at [Huggingface](https://huggingface.co/datasets/Spico/Humback/blob/main/unlabelled_gen_instruction.jsonl) . + +```bash +# Taking about 6:40:45 on the unlabelled data with 8*A100 +$ bash scripts/self_aug.sh +``` + +### Train Seed Model $M_{0}$ + +Hyper parameters are the same as $M_{yx}$. + +```bash +$ bash scripts/train_seed.sh +``` + +The pre-trained $M_{0}$ is available at [Huggingface](https://huggingface.co/Spico/Humback-M0) (Uploading). + +### Self-Curation Prompting + +The curated data is available at [Huggingface](https://huggingface.co/datasets/Spico/Humback/blob/main/m1_v2.jsonl) . + +```bash +# 33:54:45 with 8*A100 on 482,963 samples +$ bash scripts/self_curation.sh +# scores: [('None', 217203), ('4', 119211), ('3', 102756), ('5', 21301), ('1', 13083), ('2', 9288), ('8', 19), ('0', 15), ('9', 14), ('7', 11), ('6', 9), ('10', 4), ('91', 3), ('83', 2), ('20', 2), ('14', 2), ('75', 2), ('92', 2), ('72', 1), ('93', 1), ('28', 1), ('19', 1), ('728', 1), ('17', 1), ('16', 1), ('100', 1), ('237', 1), ('13', 1), ('73', 1), ('38', 1), ('87', 1), ('94', 1), ('98', 1), ('64', 1), ('52', 1), ('27', 1), ('24', 1), ('762', 1), ('266', 1), ('225', 1), ('80', 1), ('267', 1), ('99', 1), ('90', 1), ('63', 1), ('97', 1), ('78', 1), ('40', 1), ('1986', 1), ('47', 1), ('66', 1), ('45', 1), ('10502', 1), ('21', 1)] +# Number of qualified results (scores=5): 21301/482963 +# instruction len: 198 ± 351 +# response len: 1601 ± 345 +# --------------------------------------- +# v2: (Strict Curation Score Matching: add `$` to the matching regex): +# Scores: [('None', 322324), ('3', 71851), ('4', 53120), ('5', 16460), ('1', 11921), ('2', 7260), ('0', 10), ('7', 4), ('6', 3), ('19', 1), ('8', 1), ('16', 1), ('13', 1), ('10', 1), ('23', 1), ('9', 1), ('90', 1), ('92', 1), ('45', 1)] +# Number of qualified results (scores=5): 15521/482963 +# instruction len: 124 ± 113 +# response len: 1611 ± 345 +# --------------------------------------- +$ cat outputs/m1/unlabelled_curated_data.jsonl data/seed/seed.jsonl > data/curated/m1.jsonl +``` + +### Train Models $M_{i}$ + +Most hyper parameters are the same as $M_{yx}$ except for the number of steps (the original Humback trains 1600 steps on 512k samples). + +```bash +# change the `--data_path` in `scripts/train_seed.sh` +$ bash scripts/train_seed.sh +``` + +## 📑 Experimental Results + +Other models: [HuggingFaceH4/open_llm_leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard) . + +| Model | Average | ARC | HellaSwag | MMLU | TruthfulQA | +| :----------------------------------------------------------------------------------------------- | ------: | ----: | --------: | ----: | ---------: | +| Llama-2-7b | 54.32 | 53.07 | 78.59 | 46.87 | 38.76 | +| Llama-2-7b-chat | 56.34 | 52.90 | 78.55 | 48.32 | 45.57 | +| Vicuna-7b-v1.3 | 55.62 | 50.43 | 76.92 | 48.14 | 47.01 | +| Humback $M_{0}$ | 58.13 | 56.31 | 81.20 | 47.45 | 47.59 | +| Humback $M_{1}$ | 54.65 | 52.99 | 78.57 | 45.48 | 41.54 | +| Humback $M_{1,\text{w/o DiffSysPrompt,TemplateVicuna1.1}}$ | 55.85 | 52.82 | 78.53 | 45.86 | 46.21 | +| Humback $M_{1,\text{w/o DiffSysPrompt,TemplateVicuna1.1,StrictCurationScoreMatching}}$ | 54.26 | 53.50 | 78.52 | 45.19 | 39.83 | +| Humback $M_{1,\text{w/o DiffSysPrompt,TemplateVicuna1.1,StrictCurationScoreMatching,1200steps}}$ | 56.67 | 56.23 | 81.10 | 46.46 | 42.89 | +| Humback $M_{1,\text{w/o DiffSysPrompt,TemplateVicuna1.1,StrictCurationScoreMatching,1800steps}}$ | 57.58 | 57.68 | 81.78 | 46.13 | 44.74 | +| Humback $M_{1,\text{w/o DiffSysPrompt,TemplateVicuna1.1,StrictCurationScoreMatching,2400steps}}$ | 56.96 | 55.89 | 80.83 | 45.84 | 45.30 | + +The results and the trend are not as good as the original paper, but the performance of $M_{0}$ is better than vanilla llama2-7b. +Specifically, Humback $M_{1}$ is worse than $M_{0}$, and the different system prompts seem not be helpful on these benchmarks. +By the way, although $M_{0}$ is good at these benchmarks, it may be not good at generating high quality and diversified responses on more tasks. +Further experiments should be conducted to verify the effectiveness of the reproduced Humback $M_{0}$ (e.g. [alpaca_eval](https://github.com/tatsu-lab/alpaca_eval) with GPT4 as the judge). + +Possible reasons are: +1. The backward model $M_{yx}$ is not good enough to generate high quality instructions. +2. The seed model $M_{0}$ is not competent to evaluate the generated quality (not all scores are ranging from 1 to 5). + +Since I don't have GPT4 API keys, `chatgpt_fn` is used as the evaluator here (as introduced in [alpaca_eval](https://github.com/tatsu-lab/alpaca_eval)): + +``` + win_rate standard_error n_total avg_length +gpt4 73.79 1.54 805 1365 +claude 70.37 1.60 805 1082 +chatgpt 66.09 1.66 805 811 +wizardlm-13b 65.16 1.67 805 985 +vicuna-13b 64.10 1.69 805 1037 +guanaco-65b 62.36 1.71 805 1249 +oasst-rlhf-llama-33b 62.05 1.71 805 1079 +alpaca-farm-ppo-human 60.25 1.72 805 803 +falcon-40b-instruct 56.52 1.74 805 662 +text_davinci_003 50.00 0.00 805 307 +alpaca-7b 45.22 1.74 805 396 +HumbackM0 32.30 1.65 805 548 +text_davinci_001 28.07 1.56 805 296 +HumbackM1 23.35 1.49 805 1522 +``` + +🔥 Further discussions are fully welcomed. + +## 📝 TODO + +- [ ] train more steps on $M_{i}$. +- [ ] remove system prompts when training $M_{0}$, $M_{i}$ and $M_{yx}$. + +## 💌 Acknowledgments + +- Paper: [Self-Alignment with Instruction Backtranslation](https://arxiv.org/pdf/2308.06259.pdf) +- Code: [FastChat](https://github.com/lm-sys/FastChat) +- Code: [vLLM](https://github.com/vllm-project/vllm) +- Code: [stanford_alpaca](https://github.com/tatsu-lab/stanford_alpaca) +- Code: [transformers](https://huggingface.co/transformers/) + +## 📜 Reference + +```bibtex +@misc{li2023selfalignment, + title={Self-Alignment with Instruction Backtranslation}, + author={Xian Li and Ping Yu and Chunting Zhou and Timo Schick and Luke Zettlemoyer and Omer Levy and Jason Weston and Mike Lewis}, + year={2023}, + eprint={2308.06259}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` diff --git a/dalm/datasets/backtranslation/conf/ds_zero1default.json b/dalm/datasets/backtranslation/conf/ds_zero1default.json new file mode 100644 index 0000000..10f23ac --- /dev/null +++ b/dalm/datasets/backtranslation/conf/ds_zero1default.json @@ -0,0 +1,14 @@ +{ + "bf16": { + "enabled": true + }, + "zero_optimization": { + "stage": 1 + }, + "gradient_accumulation_steps": "auto", + "gradient_clipping": "auto", + "steps_per_print": 2000, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "wall_clock_breakdown": false +} diff --git a/dalm/datasets/backtranslation/conf/ds_zero2default.json b/dalm/datasets/backtranslation/conf/ds_zero2default.json new file mode 100644 index 0000000..1939231 --- /dev/null +++ b/dalm/datasets/backtranslation/conf/ds_zero2default.json @@ -0,0 +1,22 @@ +{ + "bf16": { + "enabled": true + }, + "zero_optimization": { + "stage": 2, + "offload_optimizer": { + "device": "cpu", + "pin_memory": true + }, + "offload_param": { + "device": "cpu", + "pin_memory": true + } + }, + "gradient_accumulation_steps": "auto", + "gradient_clipping": "auto", + "steps_per_print": 2000, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "wall_clock_breakdown": false +} diff --git a/dalm/datasets/backtranslation/conf/fsdp_config.json b/dalm/datasets/backtranslation/conf/fsdp_config.json new file mode 100644 index 0000000..37baa74 --- /dev/null +++ b/dalm/datasets/backtranslation/conf/fsdp_config.json @@ -0,0 +1,3 @@ +{ + "fsdp_transformer_layer_cls_to_wrap": "LlamaDecoderLayer" +} \ No newline at end of file diff --git a/dalm/datasets/backtranslation/cuda_outofmemory_log.txt b/dalm/datasets/backtranslation/cuda_outofmemory_log.txt new file mode 100644 index 0000000..2328e3b --- /dev/null +++ b/dalm/datasets/backtranslation/cuda_outofmemory_log.txt @@ -0,0 +1,633 @@ +(/home/ubuntu/sachira/Humback/.env) ubuntu@ip-172-31-46-114:~/sachira/Humback$ scripts/train_backward_Myx.sh +WARNING:__main__: +***************************************** +Setting OMP_NUM_THREADS environment variable for each process to be 1 in default, to avoid your system being overloaded, please further tune the variable for optimal performance in your application as needed. +***************************************** +[2023-11-10 21:31:40,744] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,749] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,751] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,763] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,810] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,838] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,842] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,868] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) +[2023-11-10 21:31:40,918] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:40,926] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:40,929] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:40,938] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:41,000] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:41,015] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:41,039] [INFO] [comm.py:637:init_distributed] cdb=None +[2023-11-10 21:31:41,040] [INFO] [comm.py:668:init_distributed] Initializing TorchBackend in DeepSpeed with backend nccl +[2023-11-10 21:31:41,047] [INFO] [comm.py:637:init_distributed] cdb=None +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:06<00:00, 3.18s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.09s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.40s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.11s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.31s/it] +max_steps is given, it will override any value given in num_train_epochs +Using auto half precision backend +[2023-11-10 21:32:35,817] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed info: version=0.12.2, git-hash=unknown, git-branch=unknown +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.41s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.15s/it] +Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:09<00:00, 4.54s/it] +[2023-11-10 21:33:05,414] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed Flops Profiler Enabled: False +[2023-11-10 21:33:05,415] [INFO] [logging.py:96:log_dist] [Rank 0] Using client Optimizer as basic optimizer +[2023-11-10 21:33:05,415] [INFO] [logging.py:96:log_dist] [Rank 0] Removing param_group that has no 'params' in the basic Optimizer +[2023-11-10 21:33:05,423] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed Basic Optimizer = AdamW +[2023-11-10 21:33:05,423] [INFO] [utils.py:56:is_zero_supported_optimizer] Checking ZeRO support for optimizer=AdamW type= +[2023-11-10 21:33:05,424] [INFO] [logging.py:96:log_dist] [Rank 0] Creating torch.bfloat16 ZeRO stage 2 optimizer +[2023-11-10 21:33:05,424] [INFO] [stage_1_and_2.py:147:__init__] Reduce bucket size 500,000,000 +[2023-11-10 21:33:05,424] [INFO] [stage_1_and_2.py:148:__init__] Allgather bucket size 500,000,000 +[2023-11-10 21:33:05,424] [INFO] [stage_1_and_2.py:149:__init__] CPU Offload: False +[2023-11-10 21:33:05,424] [INFO] [stage_1_and_2.py:150:__init__] Round robin gradient partitioning: False +/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py:429: UserWarning: torch.utils.checkpoint: please pass in use_reentrant=True or use_reentrant=False explicitly. The default value of use_reentrant will be updated to be False in the future. To maintain current behavior, pass use_reentrant=True. It is recommended that you use use_reentrant=False. Refer to docs for more details on the differences between the two variants. + warnings.warn( +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ubuntu/sachira/Humback/src/core/train_flash_attn.py", line 10, in + train() + File "/home/ubuntu/sachira/Humback/src/core/train.py", line 61, in train + trainer.train() + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1555, in train + return inner_training_loop( + ^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1860, in _inner_training_loop + tr_loss_step = self.training_step(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2725, in training_step + loss = self.compute_loss(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2748, in compute_loss + outputs = model(**inputs) + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/utils/nvtx.py", line 15, in wrapped_fn + ret_val = func(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/runtime/engine.py", line 1814, in forward + loss = self.module(*inputs, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1034, in forward + outputs = self.model( + ^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 912, in forward + layer_outputs = self._gradient_checkpointing_func( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_compile.py", line 24, in inner + return torch._dynamo.disable(fn, recursive)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/eval_frame.py", line 328, in _fn + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/external_utils.py", line 17, in inner + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 451, in checkpoint + return CheckpointFunction.apply(function, preserve, *args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 230, in forward + outputs = run_function(*args) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 672, in forward + hidden_states, self_attn_weights, present_key_value = self.self_attn( + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/fastchat/train/llama_flash_attn_monkey_patch.py", line 77, in forward + qkv, indices, cu_q_lens, max_s = unpad_input(qkv, key_padding_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 118, in unpad_input + index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices), + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 17, in forward + return torch.gather( + ^^^^^^^^^^^^^ +torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 85.24 GiB. GPU 1 has a total capacty of 39.39 GiB of which 12.82 GiB is free. Including non-PyTorch memory, this process has 26.56 GiB memory in use. Of the allocated memory 22.20 GiB is allocated by PyTorch, and 2.97 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF +[2023-11-10 21:33:28,702] [INFO] [utils.py:802:see_memory_usage] Before initializing optimizer states +[2023-11-10 21:33:28,703] [INFO] [utils.py:803:see_memory_usage] MA 15.75 GB Max_MA 15.75 GB CA 15.75 GB Max_CA 16 GB +[2023-11-10 21:33:28,703] [INFO] [utils.py:810:see_memory_usage] CPU Virtual Memory: used = 66.02 GB, percent = 5.9% +[2023-11-10 21:33:28,897] [INFO] [utils.py:802:see_memory_usage] After initializing optimizer states +[2023-11-10 21:33:28,897] [INFO] [utils.py:803:see_memory_usage] MA 22.03 GB Max_MA 28.31 GB CA 28.31 GB Max_CA 28 GB +[2023-11-10 21:33:28,898] [INFO] [utils.py:810:see_memory_usage] CPU Virtual Memory: used = 53.14 GB, percent = 4.7% +[2023-11-10 21:33:28,898] [INFO] [stage_1_and_2.py:514:__init__] optimizer state initialized +/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py:429: UserWarning: torch.utils.checkpoint: please pass in use_reentrant=True or use_reentrant=False explicitly. The default value of use_reentrant will be updated to be False in the future. To maintain current behavior, pass use_reentrant=True. It is recommended that you use use_reentrant=False. Refer to docs for more details on the differences between the two variants. + warnings.warn( +[2023-11-10 21:33:29,003] [INFO] [utils.py:802:see_memory_usage] After initializing ZeRO optimizer +[2023-11-10 21:33:29,004] [INFO] [utils.py:803:see_memory_usage] MA 22.03 GB Max_MA 22.03 GB CA 28.31 GB Max_CA 28 GB +[2023-11-10 21:33:29,004] [INFO] [utils.py:810:see_memory_usage] CPU Virtual Memory: used = 46.17 GB, percent = 4.1% +[2023-11-10 21:33:29,006] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed Final Optimizer = AdamW +[2023-11-10 21:33:29,006] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed using client LR scheduler +[2023-11-10 21:33:29,006] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed LR Scheduler = None +[2023-11-10 21:33:29,006] [INFO] [logging.py:96:log_dist] [Rank 0] step=0, skipped=0, lr=[1e-05, 1e-05], mom=[(0.9, 0.95), (0.9, 0.95)] +[2023-11-10 21:33:29,006] [INFO] [config.py:972:print] DeepSpeedEngine configuration: +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] activation_checkpointing_config { + "partition_activations": false, + "contiguous_memory_optimization": false, + "cpu_checkpointing": false, + "number_checkpoints": null, + "synchronize_checkpoint_boundary": false, + "profile": false +} +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] aio_config ................... {'block_size': 1048576, 'queue_depth': 8, 'thread_count': 1, 'single_submit': False, 'overlap_events': True} +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] amp_enabled .................. False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] amp_params ................... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] autotuning_config ............ { + "enabled": false, + "start_step": null, + "end_step": null, + "metric_path": null, + "arg_mappings": null, + "metric": "throughput", + "model_info": null, + "results_dir": "autotuning_results", + "exps_dir": "autotuning_exps", + "overwrite": true, + "fast": true, + "start_profile_step": 3, + "end_profile_step": 5, + "tuner_type": "gridsearch", + "tuner_early_stopping": 5, + "tuner_num_trials": 50, + "model_info_path": null, + "mp_size": 1, + "max_train_batch_size": null, + "min_train_batch_size": 1, + "max_train_micro_batch_size_per_gpu": 1.024000e+03, + "min_train_micro_batch_size_per_gpu": 1, + "num_tuning_micro_batch_sizes": 3 +} +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] bfloat16_enabled ............. True +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] checkpoint_parallel_write_pipeline False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] checkpoint_tag_validation_enabled True +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] checkpoint_tag_validation_fail False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] comms_config ................. +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] communication_data_type ...... None +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] compression_config ........... {'weight_quantization': {'shared_parameters': {'enabled': False, 'quantizer_kernel': False, 'schedule_offset': 0, 'quantize_groups': 1, 'quantize_verbose': False, 'quantization_type': 'symmetric', 'quantize_weight_in_forward': False, 'rounding': 'nearest', 'fp16_mixed_quantize': False, 'quantize_change_ratio': 0.001}, 'different_groups': {}}, 'activation_quantization': {'shared_parameters': {'enabled': False, 'quantization_type': 'symmetric', 'range_calibration': 'dynamic', 'schedule_offset': 1000}, 'different_groups': {}}, 'sparse_pruning': {'shared_parameters': {'enabled': False, 'method': 'l1', 'schedule_offset': 1000}, 'different_groups': {}}, 'row_pruning': {'shared_parameters': {'enabled': False, 'method': 'l1', 'schedule_offset': 1000}, 'different_groups': {}}, 'head_pruning': {'shared_parameters': {'enabled': False, 'method': 'topk', 'schedule_offset': 1000}, 'different_groups': {}}, 'channel_pruning': {'shared_parameters': {'enabled': False, 'method': 'l1', 'schedule_offset': 1000}, 'different_groups': {}}, 'layer_reduction': {'enabled': False}} +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] curriculum_enabled_legacy .... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] curriculum_params_legacy ..... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] data_efficiency_config ....... {'enabled': False, 'seed': 1234, 'data_sampling': {'enabled': False, 'num_epochs': 1000, 'num_workers': 0, 'curriculum_learning': {'enabled': False}}, 'data_routing': {'enabled': False, 'random_ltd': {'enabled': False, 'layer_token_lr_schedule': {'enabled': False}}}} +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] data_efficiency_enabled ...... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] dataloader_drop_last ......... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] disable_allgather ............ False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] dump_state ................... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] dynamic_loss_scale_args ...... None +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_enabled ........... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_gas_boundary_resolution 1 +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_layer_name ........ bert.encoder.layer +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_layer_num ......... 0 +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_max_iter .......... 100 +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_stability ......... 1e-06 +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_tol ............... 0.01 +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] eigenvalue_verbose ........... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] elasticity_enabled ........... False +[2023-11-10 21:33:29,007] [INFO] [config.py:976:print] flops_profiler_config ........ { + "enabled": false, + "recompute_fwd_factor": 0.0, + "profile_step": 1, + "module_depth": -1, + "top_modules": 1, + "detailed": true, + "output_file": null +} +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] fp16_auto_cast ............... None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] fp16_enabled ................. False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] fp16_master_weights_and_gradients False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] global_rank .................. 0 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] grad_accum_dtype ............. None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] gradient_accumulation_steps .. 1 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] gradient_clipping ............ 1.0 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] gradient_predivide_factor .... 1.0 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] hybrid_engine ................ enabled=False max_out_tokens=512 inference_tp_size=1 release_inference_cache=False pin_parameters=True tp_gather_partition_size=8 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] initial_dynamic_scale ........ 1 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] load_universal_checkpoint .... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] loss_scale ................... 1.0 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] memory_breakdown ............. False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] mics_hierarchial_params_gather False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] mics_shard_size .............. -1 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] monitor_config ............... tensorboard=TensorBoardConfig(enabled=False, output_path='', job_name='DeepSpeedJobName') wandb=WandbConfig(enabled=False, group=None, team=None, project='deepspeed') csv_monitor=CSVConfig(enabled=False, output_path='', job_name='DeepSpeedJobName') enabled=False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] nebula_config ................ { + "enabled": false, + "persistent_storage_path": null, + "persistent_time_interval": 100, + "num_of_version_in_retention": 2, + "enable_nebula_load": true, + "load_path": null +} +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] optimizer_legacy_fusion ...... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] optimizer_name ............... None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] optimizer_params ............. None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] pipeline ..................... {'stages': 'auto', 'partition': 'best', 'seed_layers': False, 'activation_checkpoint_interval': 0} +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] pld_enabled .................. False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] pld_params ................... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] prescale_gradients ........... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] scheduler_name ............... None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] scheduler_params ............. None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] seq_parallel_communication_data_type torch.float32 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] sparse_attention ............. None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] sparse_gradients_enabled ..... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] steps_per_print .............. inf +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] train_batch_size ............. 8 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] train_micro_batch_size_per_gpu 1 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] use_node_local_storage ....... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] wall_clock_breakdown ......... False +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] weight_quantization_config ... None +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] world_size ................... 8 +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] zero_allow_untested_optimizer True +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] zero_config .................. stage=2 contiguous_gradients=True reduce_scatter=True reduce_bucket_size=500,000,000 allgather_partitions=True allgather_bucket_size=500,000,000 overlap_comm=False load_from_fp32_weights=True elastic_checkpoint=False offload_param=None offload_optimizer=None sub_group_size=1,000,000,000 cpu_offload_param=None cpu_offload_use_pin_memory=None cpu_offload=None prefetch_bucket_size=50,000,000 param_persistence_threshold=100,000 model_persistence_threshold=sys.maxsize max_live_parameters=1,000,000,000 max_reuse_distance=1,000,000,000 gather_16bit_weights_on_model_save=False stage3_gather_fp16_weights_on_model_save=False ignore_unused_parameters=True legacy_stage1=False round_robin_gradients=False zero_hpz_partition_size=1 zero_quantized_weights=False zero_quantized_nontrainable_weights=False zero_quantized_gradients=False mics_shard_size=-1 mics_hierarchical_params_gather=False memory_efficient_linear=True pipeline_loading_checkpoint=False override_module_apply=True +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] zero_enabled ................. True +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] zero_force_ds_cpu_optimizer .. True +[2023-11-10 21:33:29,008] [INFO] [config.py:976:print] zero_optimization_stage ...... 2 +[2023-11-10 21:33:29,008] [INFO] [config.py:962:print_user_config] json = { + "bf16": { + "enabled": true + }, + "zero_optimization": { + "stage": 2 + }, + "gradient_accumulation_steps": 1, + "gradient_clipping": 1.0, + "steps_per_print": inf, + "train_batch_size": 8, + "train_micro_batch_size_per_gpu": 1, + "wall_clock_breakdown": false, + "fp16": { + "enabled": false + }, + "zero_allow_untested_optimizer": true +} +***** Running training ***** + Num examples = 3,200 + Num Epochs = 2 + Instantaneous batch size per device = 1 + Total train batch size (w. parallel, distributed & accumulation) = 8 + Gradient Accumulation steps = 1 + Total optimization steps = 500 + Number of trainable parameters = 6,738,415,616 + 0%| | 0/500 [00:00", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ubuntu/sachira/Humback/src/core/train_flash_attn.py", line 10, in + train() + File "/home/ubuntu/sachira/Humback/src/core/train.py", line 61, in train + trainer.train() + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1555, in train + return inner_training_loop( + ^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1860, in _inner_training_loop + tr_loss_step = self.training_step(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2725, in training_step + loss = self.compute_loss(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2748, in compute_loss + outputs = model(**inputs) + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/utils/nvtx.py", line 15, in wrapped_fn + ret_val = func(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/runtime/engine.py", line 1814, in forward + loss = self.module(*inputs, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1034, in forward + outputs = self.model( + ^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 912, in forward + layer_outputs = self._gradient_checkpointing_func( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_compile.py", line 24, in inner + return torch._dynamo.disable(fn, recursive)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/eval_frame.py", line 328, in _fn + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/external_utils.py", line 17, in inner + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 451, in checkpoint + return CheckpointFunction.apply(function, preserve, *args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 230, in forward + outputs = run_function(*args) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 672, in forward + hidden_states, self_attn_weights, present_key_value = self.self_attn( + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/fastchat/train/llama_flash_attn_monkey_patch.py", line 77, in forward + qkv, indices, cu_q_lens, max_s = unpad_input(qkv, key_padding_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 118, in unpad_input + index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices), + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 17, in forward + return torch.gather( + ^^^^^^^^^^^^^ +torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 89.10 GiB. GPU 7 has a total capacty of 39.39 GiB of which 12.96 GiB is free. Including non-PyTorch memory, this process has 26.42 GiB memory in use. Of the allocated memory 22.20 GiB is allocated by PyTorch, and 2.97 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ubuntu/sachira/Humback/src/core/train_flash_attn.py", line 10, in + train() + File "/home/ubuntu/sachira/Humback/src/core/train.py", line 61, in train + trainer.train() + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1555, in train + return inner_training_loop( + ^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1860, in _inner_training_loop + tr_loss_step = self.training_step(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2725, in training_step + loss = self.compute_loss(model, inputs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2748, in compute_loss + outputs = model(**inputs) + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/utils/nvtx.py", line 15, in wrapped_fn + ret_val = func(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/runtime/engine.py", line 1814, in forward + loss = self.module(*inputs, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1034, in forward + outputs = self.model( + ^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 912, in forward + layer_outputs = self._gradient_checkpointing_func( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_compile.py", line 24, in inner + return torch._dynamo.disable(fn, recursive)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/eval_frame.py", line 328, in _fn +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ubuntu/sachira/Humback/src/core/train_flash_attn.py", line 10, in + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/external_utils.py", line 17, in inner + train() +return fn(*args, **kwargs) + File "/home/ubuntu/sachira/Humback/src/core/train.py", line 61, in train + ^^^^^^^^^^^^^^^^^^^ + trainer.train() + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 451, in checkpoint + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1555, in train + return CheckpointFunction.apply(function, preserve, *args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return inner_training_loop( + ^^ ^return super().apply(*args, **kwargs) # type: ignore[misc]^ +^^^^^^^^ ^ ^ ^ ^ ^ ^ ^ ^ + ^ File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 1860, in _inner_training_loop +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 230, in forward + outputs = run_function(*args) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + tr_loss_step = self.training_step(model, inputs) + ^^^^^^^ ^return self._call_impl(*args, **kwargs)^ +^^^^^^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^^^^^^^^^^^^ +^^ File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2725, in training_step +^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 672, in forward + loss = self.compute_loss(model, inputs) + ^ ^hidden_states, self_attn_weights, present_key_value = self.self_attn(^ +^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/trainer.py", line 2748, in compute_loss + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^outputs = model(**inputs)^ +^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^return self._call_impl(*args, **kwargs)^ +^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/fastchat/train/llama_flash_attn_monkey_patch.py", line 77, in forward + ^ ^qkv, indices, cu_q_lens, max_s = unpad_input(qkv, key_padding_mask)^ +^^^^^^^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 118, in unpad_input + index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices), + return forward_call(*args, **kwargs) +^^^^^^^^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^ File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/utils/nvtx.py", line 15, in wrapped_fn +^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + ret_val = func(*args, **kwargs) + ^^^^^^^^^^ ^return super().apply(*args, **kwargs) # type: ignore[misc]^ +^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/deepspeed/runtime/engine.py", line 1814, in forward + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 17, in forward + return torch.gather( + ^^^^^^^^^^^^^ +torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 78.63 GiB. GPU 3 has a total capacty of 39.39 GiB of which 12.82 GiB is free. Including non-PyTorch memory, this process has 26.56 GiB memory in use. Of the allocated memory 22.20 GiB is allocated by PyTorch, and 2.97 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF + loss = self.module(*inputs, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1034, in forward + outputs = self.model( + ^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 912, in forward + layer_outputs = self._gradient_checkpointing_func( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_compile.py", line 24, in inner + return torch._dynamo.disable(fn, recursive)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/eval_frame.py", line 328, in _fn + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/_dynamo/external_utils.py", line 17, in inner + return fn(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 451, in checkpoint + return CheckpointFunction.apply(function, preserve, *args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/utils/checkpoint.py", line 230, in forward + outputs = run_function(*args) + ^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 672, in forward + hidden_states, self_attn_weights, present_key_value = self.self_attn( + ^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/fastchat/train/llama_flash_attn_monkey_patch.py", line 77, in forward + qkv, indices, cu_q_lens, max_s = unpad_input(qkv, key_padding_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 118, in unpad_input + index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices), + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/autograd/function.py", line 539, in apply + return super().apply(*args, **kwargs) # type: ignore[misc] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/flash_attn/bert_padding.py", line 17, in forward + return torch.gather( + ^^^^^^^^^^^^^ +torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 67.81 GiB. GPU 2 has a total capacty of 39.39 GiB of which 12.82 GiB is free. Including non-PyTorch memory, this process has 26.56 GiB memory in use. Of the allocated memory 22.19 GiB is allocated by PyTorch, and 2.98 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF +[2023-11-10 21:33:29,813] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215718 closing signal SIGTERM +[2023-11-10 21:33:29,813] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215720 closing signal SIGTERM +[2023-11-10 21:33:29,813] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215721 closing signal SIGTERM +[2023-11-10 21:33:29,814] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215722 closing signal SIGTERM +[2023-11-10 21:33:29,814] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215723 closing signal SIGTERM +[2023-11-10 21:33:29,814] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215724 closing signal SIGTERM +[2023-11-10 21:33:29,814] torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 215725 closing signal SIGTERM +[2023-11-10 21:33:31,158] torch.distributed.elastic.multiprocessing.api: [ERROR] failed (exitcode: 1) local_rank: 1 (pid: 215719) of binary: /home/ubuntu/sachira/Humback/.env/bin/python +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/run.py", line 810, in + main() + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/elastic/multiprocessing/errors/__init__.py", line 346, in wrapper + return f(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/run.py", line 806, in main + run(args) + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/run.py", line 797, in run + elastic_launch( + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/launcher/api.py", line 134, in __call__ + return launch_agent(self._config, self._entrypoint, list(args)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ubuntu/sachira/Humback/.env/lib/python3.11/site-packages/torch/distributed/launcher/api.py", line 264, in launch_agent + raise ChildFailedError( +torch.distributed.elastic.multiprocessing.errors.ChildFailedError: +============================================================ +src.core.train_flash_attn FAILED +------------------------------------------------------------ +Failures: + +------------------------------------------------------------ +Root Cause (first observed failure): +[0]: + time : 2023-11-10_21:33:29 + host : ip-172-31-46-114.ec2.internal + rank : 1 (local_rank: 1) + exitcode : 1 (pid: 215719) + error_file: + traceback : To enable traceback see: https://pytorch.org/docs/stable/elastic/errors.html +============================================================ +(/home/ubuntu/sachira/Humback/.env) ubuntu@ip-172-31-46-114:~/sachira/Humback$ \ No newline at end of file diff --git a/dalm/datasets/backtranslation/data/prompts/self_curation.txt b/dalm/datasets/backtranslation/data/prompts/self_curation.txt new file mode 100644 index 0000000..7e043a1 --- /dev/null +++ b/dalm/datasets/backtranslation/data/prompts/self_curation.txt @@ -0,0 +1,11 @@ +Below is an instruction from an user and a candidate answer. Evaluate whether or not the answer is a good example of how AI Assistant should respond to the user's instruction. Please assign a score using the following 5-point scale: +1: It means the answer is incomplete, vague, off-topic, controversial, or not exactly what the user asked for. For example, some content seems missing, numbered list does not start from the beginning, the opening sentence repeats user's question. Or the response is from another person’s perspective with their personal experience (e.g. taken from blog posts), or looks like an answer from a forum. Or it contains promotional text, navigation text, or other irrelevant information. +2: It means the answer addresses most of the asks from the user. It does not directly address the user's question. For example, it only provides a high-level methodology instead of the exact solution to user's question. +3: It means the answer is helpful but not written by an AI Assistant. It addresses all the basic asks from the user. It is complete and self contained with the drawback that the response is not written from an AI assistant's perspective, but from other people's perspective. The content looks like an excerpt from a blog post, web page, or web search results. For example, it contains personal experience or opinion, mentions comments section, or share on social media, etc. +4: It means the answer is written from an AI assistant's perspective with a clear focus of addressing the instruction. It provide a complete, clear, and comprehensive response to user’s question or instruction without missing or irrelevant information. It is well organized, self-contained, and written in a helpful tone. It has minor room for improvement, e.g. more concise and focused. +5: It means it is a perfect answer from an AI Assistant. It has a clear focus on being a helpful AI Assistant, where the response looks like intentionally written to address the user's question or instruction without any irrelevant sentences. The answer provides high quality content, demonstrating expert knowledge in the area, is very well written, logical, easy-to-follow, engaging and insightful. + +Please first provide a brief reasoning you used to derive the rating score, and then write "Score: " in the last line. + +{generated_instruction} +{response} diff --git a/dalm/datasets/backtranslation/data/seed/convert.py b/dalm/datasets/backtranslation/data/seed/convert.py new file mode 100644 index 0000000..be1e200 --- /dev/null +++ b/dalm/datasets/backtranslation/data/seed/convert.py @@ -0,0 +1,73 @@ +import statistics as sts + +import os +import sys + +sys.path.append(os.getcwd()) + +from src.utils.io import dump_jsonlines, load_jsonlines + + +def load_tree_data( + tree_filepath, + instruction_quality: float = 0.6, + response_quality: float = 0.6, + instruction_word_num: int = 5, + response_word_num: int = 5, + lang: str = "en", + response_rank: int = 0, +): + trees = load_jsonlines(tree_filepath) + pairs = [] + + def _traverse(ins: dict): + for reply in ins["replies"]: + if ( + ins.get("lang") == lang + and reply.get("lang") == lang + and reply.get("rank") == response_rank + ): + inst_qlt = ins["labels"].get("quality", {"value": 0.0})["value"] + resp_qlt = reply["labels"].get("quality", {"value": 0.0})["value"] + if inst_qlt > instruction_quality and resp_qlt > response_quality: + if ( + len(ins["text"].split()) > instruction_word_num + and len(reply["text"].split()) > response_word_num + ): + pairs.append( + { + "instruction": ins["text"], + "instruction_quality": inst_qlt, + "response": reply["text"], + "response_quality": resp_qlt, + } + ) + for reply in ins["replies"]: + _traverse(reply) + + for tree in trees: + prompt = tree["prompt"] + _traverse(prompt) + + return pairs + + +if __name__ == "__main__": + dump_num = 3200 + pairs = load_tree_data("data/seed/2023-04-12_oasst_ready.trees.jsonl") + print(f"#data: {len(pairs)}, #dump: {dump_num}") + pairs.sort( + key=lambda ins: ins["instruction_quality"] + ins["response_quality"], + reverse=True, + ) + dump_data = pairs[:dump_num] + instruction_lens = [] + response_lens = [] + for ins in dump_data: + instruction_lens.append(len(ins["instruction"])) + response_lens.append(len(ins["response"])) + print( + f"Instruction len: {sts.mean(instruction_lens):.0f}±{sts.stdev(instruction_lens):.0f}, " + f"Response len: {sts.mean(response_lens):.0f}±{sts.stdev(response_lens):.0f}" + ) + dump_jsonlines(dump_data, "data/seed/seed.jsonl") diff --git a/dalm/datasets/backtranslation/data/seed/download.sh b/dalm/datasets/backtranslation/data/seed/download.sh new file mode 100644 index 0000000..a069601 --- /dev/null +++ b/dalm/datasets/backtranslation/data/seed/download.sh @@ -0,0 +1,5 @@ +wget -P data/seed https://huggingface.co/datasets/OpenAssistant/oasst1/resolve/main/2023-04-12_oasst_ready.trees.jsonl.gz +gzip -d data/seed/2023-04-12_oasst_ready.trees.jsonl.gz + +# wget -P data/seed https://huggingface.co/datasets/OpenAssistant/oasst1/resolve/main/2023-04-12_oasst_ready.messages.jsonl.gz +# gzip -d data/seed/2023-04-12_oasst_ready.messages.jsonl.gz diff --git a/dalm/datasets/backtranslation/data/unlabelled/falcon_refinedweb.py b/dalm/datasets/backtranslation/data/unlabelled/falcon_refinedweb.py new file mode 100644 index 0000000..6506fae --- /dev/null +++ b/dalm/datasets/backtranslation/data/unlabelled/falcon_refinedweb.py @@ -0,0 +1,44 @@ +import json + +from datasets import load_dataset +from tqdm import tqdm + + +def is_clean_text(text: str) -> bool: + # according to Table 2, the response lengths of A_{5}^{(2)} range from 1047 to 2279 + if len(text) < 1000 or len(text) > 2200: + return False + + segs = text.split("\n") + if any(len(seg) < 5 for seg in segs): + return False + + return True + + +def main(): + num_samples = 502000 + dump_filepath = "data/unlabelled/falcon-refinedweb-sampled.jsonl" + + ds = load_dataset("tiiuae/falcon-refinedweb", streaming=True, split="train") + fout = open(dump_filepath, "a") + cnt = 0 + tot = 0 + pbar = tqdm(total=num_samples) + for ins in ds: + if cnt >= num_samples: + break + if is_clean_text(ins["content"]): + ins["timestamp"] = ins["timestamp"].strftime("%Y%m%d%H%M%S") + ins_str = json.dumps(ins, ensure_ascii=False) + fout.write(f"{ins_str}\n") + fout.flush() + cnt += 1 + pbar.update(1) + tot += 1 + pbar.set_postfix({"tot": tot, "valid": cnt}) + fout.close() + + +if __name__ == "__main__": + main() diff --git a/dalm/datasets/backtranslation/figs/humback.png b/dalm/datasets/backtranslation/figs/humback.png new file mode 100644 index 0000000000000000000000000000000000000000..6eec5e49df78038c91f6b4255c7fc7c790757052 GIT binary patch literal 259311 zcmeEtWmj8U)NUvgEmEMkySrOTai_SuySuwXafjmWt}RmB3GVLhded{xJKk}B!ToaA zNJz%cX6+?&t|`wm!{ueg5aDs)0RRA^gt)K*001ol0DM%0{Q$o5a@v9i{(!R+S9b&e z@I(K;A!2tgjlmZ`JBg?{DcYJix#~L@0~Bq{?era;jI}YxR{;PbfP}E1l3V6Umb=!M z+ouP@ku$ZgP96BI&c6^5JFIAgKUC#zeKeLpxrH~6kTNNxD0oFJsK!dvV324jbW;v8 z`aJm24uJ_W>GT6N%?I-7T{F8Q>7xDnflTAQ(b2`l6ZiMck={`+frC$!dPhv zNGL&+|9u^j^MO`B5Wxog?<1oiY?kpMNzxlpNHh879 z*xfy?n8dpxf7>B+b+VmRqn%4`BLl9>y_G-QdR(2-EAono&rCX)+$L_&C#^tZvQDHX z3>b1lo12-69)O7INS>eyseD?i@_SSNPiUuu z8;nG_q9f;woFD*o+?*bnGsmG-^>D=lBgQjG!h>)u>0sp}Xre{WeCjw0CKc~%y|{4_%L@`i9q_I5ZAY}X`! z67(Q7oA~yx{=_kC@2NWWI5j#nm;}Ako+;Qef3In6-LE`Qu- zMrhFg?1JE0R9IL@?>v_eS4U$1wBuGulQ`qyakwLnh7I!>+_iw&gaMIxr^bWv=vKc! zLEtXe)2MdRgR_28%YB!)9Z9Qpd~%CLRV=A>syUF2Uq4^?pMf0eqx*E-(Va$1ahZU+ zws5T#(xfR8B$m^wGQ%!0KR3J{Z?CUA){hjjAqMC8Diu7DXQs#bmJ9v8$7ZM6F&|MO z6SY1g$zAfi%cDidl>Ee7kIgGNt93CewG{0r?eNVa;IHJO|$N8 zt)3+#|07yE5`|u*^xde;)TP;mgyxT;m`@1l%gGu~du32ha~Gow@mju;bBiTA=ybee zZa=y*2qrIe#j|E?O~U4%TI0Qh=Y4yhKiY0r)-pR2mWUS1Y#ubH zvBiLtxC|MpDo2=-K{$kn+j@#$xv54|rB6n?Hul&A?NN@Y#*5y5-c{Rnz~wDZVVJQr zv{^Cu;wi~(TuM_AZZKOiBqb4v?Ue}9T*XGwk-VQYX+f(-g*sHS0ZrrmI4O?CAFf5- z>^OM^ES*o6Hv)3$or_eIz6+XTi#VAHe(evMT^#X^C!CF;3v&@ zK0k{*t_UIr#Rm}OO*qAeyPXQ$v04gi_PcGllqu`L+q93v3=J6YJB*WqT!~90rTj%) zl(Xq1{mRmfm&u7c3bO7Er1id8N4SzUDJQXTH&_)%GhV;+#B#{Px%qywN2w;XtcU{Y z4qwK}hwD4m5$0k9%I^&a;R9|6+Lm+YAk9X!sb;nH@s9aBO@4r75~E^LzoO|_k_&$d zrNHu_L_+(>VrZYioTJZE*#dFkssMb?DxIXFeO*VT2k!p|P;Q1q^% z=8qV1jVTU>qN^@sYTibj2JUV5)7sGs(f=BTeK zA`4@Z@_RzlAvSk(F&`m0dhGUKc=OGxB@$o(0M^Z1!9Zw4R2EIr6;vlrr3UsjdF2{Q z3q@cNeefCWZcVKgCH{qeln(W$Y0dq`dW+_ksn|Mo)w}^UrPR^vMiWv}fkcc|Q^YwoY?0pA;x$Oxs5Z>xI08#nD=TblJ!o|iMB)=4PSruimdcIQSOE(w9Pe*X=VznET*F8 z%8AW7SXq*%AYi4Yz=MBl9GT>!7|qB)71DkCjQ`aWBLM4D@kaviuc>}XaLZeXyJ1`1tE>VGi>2vvrKkgvxD(8)jnbPV6DLy-u5zTe7P)I|YpGFBqJ!FlSTV!f zl0a$W34@rZ7p;@hIF3VAvM|9xZ5JnLYK%%0DyeT4yW72#_z7nn}z4?A4)^Nl#4;j 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∈D)|N7H=)=YhNc2D6RA%%g1g;)ks731cXs*i_Gb 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 z zv(3Kc)l)}bP0bV$vTcx)_5@=)P#c1mG88Ar$N1b%RE}Gj1mB`cG%BN>K}kROcSUz6 zEmY$ormX~8I}-eU>DzISnc}qw^|xAGo%31lRTA07y-Hu;a9uD% zg-|^c>ARIN`)XTwn$21p&;v04?P2V%0(x?~;`_3Hf~5~CZUwz7J~c4}hoh~?uz5H! zUae+T4sNXY-4FIY-7H2K`+YQ8p?#rn5k+o?xuaM1rzsBY=&VAr?RjaLGW8JQTdF@5 z2f38@4WIY-)5FR*y`9^7G;VG zZ`(K5$>yn+rh6wD*MDFSa%59Xtyn1NQ9!~`1IAZ)s8C2hPI}V<9wNblHcdC#a@mQZIolVRGN(m?=*44|;5@*!& z5$%fBeb;z|+KKHBTc&*#c&pgL`^O*oFxh>L;!9B`G7ftIiU8Z@;F4Focz0@$Yl5Ej z!uXzWG0pQ5&$rB%3kLptyiLIpV&N}I@JJq3j_FJy=-0>Mh?jr<-PV%#HK}nes!_Bz zp4tf<`z4NgbmmFQ?Cg0Vg3c9YABl(-x#xg_M$oza6qb)Mi|4pD0Kai>b`&+wM!{TG zXS$_iok1*;gx&2gqs9t12W+=Q5rY7qnawKhQTc%DcCnfd757a>aI!E1nh80Qm$=c3IrBP8s01*fj z$`t-AMTG^L1mgoS8qiYEhh2JD%8Ng}PqtT@(7JJwcbeQCQ7k939<0C4w6_Ys3gMfh zR(VA8%Y^kV_w3>}Hzx2FT|j3~Cw63c`QwEEAsa=(LsWT3>Gn=a+`?1xtCQ=h*1M{e z%d%TEhpGq9JUJsO_R{(fZyX0ZBJ9XF(`JHNZ|mWIUIxNj>ebOcSYAX9@LYJ6>p!Xb z5n+-+=X+f>v7DSMjx$RuB(&!!ex{yd_HDu$l}?Qzy+Bcy`?SYXOFN=^we70StPH;4 z6d5xgZ%_<><863MP{No=t@^STZ`Ko(qYxO=nkdg`Wufo8@2uvMGHVn;572p&ddG(= z@x-9ho)UGd9)*XSyIZOqz*LhH6L4^FrRo(zR9KqxV!tX8{=$LpV`}piTkUx z55U{zg#<3IIO_>iaXy?i$1vF3kRE1UiAU(Uexx~XwyF}te`ovlACy8lN-rDNK!@-cr>pQxt2zv)cuOTABJ#;ru62-W3ONSAtb^ zyxI9`)&?s)ONKsIJ72TD{QRPwWD@^|fLRt+;p`FZR-fjwGTY6;G)O_`@vspT)ULb);JRxxRtMF6(XTj~4esPe3^ER*FERI^C zOKajh0wBQI@>ILJsBPZxZKKzM(l*S^K)VCEkH6{f^hq4X1?!Vx@mA{ht*n))?b8#j zI@MR!DjyIO-w&m$IR#%N%_x3t7JMqM9={_5ccrs1crL=5dHd9aiJ{L>S9juXD@VSp zhG*O-GfMd57FOOClH~)gRa7@#Qk^7s3rbC)RSpW)m<~&$<9*k#DX6$ zU?Hd3r1mzuANop#)bvHK!mA_FTUFM@cg5O)FSe=K zc5tjNJ6n&fEc<%gy>DNBuQMZJ;}jC^CUZ2wR5qZRq$5Tl8tD3vPEdlqE7ve%RPUL$ z(&%p-zyc(HvPO}JKG}gx*jU((KMc>%7So-klXws@R@KCxDy$@hx8tTdH7r^&sKtA= znDiATnhl26>2+^zno?AbbCxOs7B;Yop2pbz z0;A_onT7ojnL-O5b!DFHtC_feIFOnaKx!ED5)S7p$sMPWS&WQVKGNf_oTJdyyXK+CQ@QulKy zAFL9$Ef=jWtrxT%LSA#xVtl(D$T>5!TNlemFhu>gfu0xS>n4duw(#6fhB8>|HWQq; zq{Ld?9B-1GcoD)u-+E{DI8~rn1DQom?lGpxk=xUgg`bbm_X>3LvvHourXxXq zDZH)?eLu1GZe9%shd!^1mzDSE5PiAtzl(DH?n!$KzODNSf$iK_)=uocNNeWbDsNf~ z3cfo+ri!gTvV_8C%0K00)+pKFWMoP6%?cgaE7GOV68RTpP%sD5d#X(;lwamn?SzJv z4CoIFwj1YKg+Z@PqvK+h+!Cf?E=-4mU2K_8LpuZ-P0-(Fgzi7TJXbGEcc=E12I@vO zu4PGK#76i2WiCy|!mas?${NEw^w)dp9hXGvI2QH#Ul@K|7s=X0x0x}*@>dxVT<*C% z$u;UGvG%U%ddbHfa9MwyulH5{_aC3U(6MtpABXRugQ$4KS8IBd7LZ>XcChasR;#ZP z`lBbt8a&vivI$`fxGt8dWLs1|w!DIiN)A*BI;k^z_@rK7W6I zV5|?fn*#YcIiTG$6J&ozD&wg1wYjbEz{#ktI?k!|FnOGIB+DE11}7%*^q3<Jg2g!t{Zg&dkt5I;}8U!SLXe5`}0kKe*4ck z_|WGXsq#}kF~?J~gaXTvNGN2!Dw~IVHZ>Pgk4qeGsd(jyS9AZgftEoW1`-sN<=~;) zY9Vbu3|#a&3X~2eiA=qOeY?=Z@LVhKIoqC2LsJMH>e-La?55BFYj0b!f3yvcGmAgFn}IPxi^5chDVIb}(?)MG{o0}VGm42+_D zd*y5P3aAEGvajgbVIjYesgSO38);X&*2E$iclx4{_>ds$VaDJEQsdu3b&g++UCiIl zWXAp)EEm|~IrcAc0E76W$>i;#BUD7-lGl=E@2Wz-+`p|fi*^Oa-j95GAB_n*-0nX<~@1I z?f6=(uN>XiOCne@ZQnu-QvBcX0g zD=WwkN$2iBZ{S>>fPgP9pn!E_5asWNW@-01t8$0l&Uk$z4a%{(Y)^v)CPx3QWluNm zf*z3+jNq!cvhcSbqv7hirlGD|#=dfsQ2GSO`iG zj323OR~fxsh=9Yvjwso8i)UgVIqgZ__D`BbIUjK`?2|Qr;x)fW=FV&0*ZnKOxs8pM zSAQt+#s_w;Z>@i%lv41e~{Dq$*KwL6_*ap}i8Awu^$t+;O|{FRK?GV}+6qKRScz3o^H` z0PL{-BH_@iZo^v81q~+l0K-C=@gO(6#M^lc55~C$n!g90iTueo)Lat^@paAvD!$OS ze(cgex#9{VLLP{6w0WWc&y>_GJ~!)sPGErIlkfH0pn~S4Nb~GE6eY`Sde0~G<}Js& z{-YYf2;I{!Qf6o2zeL*Km(ju1*%fd|*jk5Vv3~^((M5CCi*%y1z#hU*K3>u=jGu}+GVU>g{yLw z2=k<4i`vjLEGhnu=QMS!kJ!~_AJ!$v>Oia)&=B~PU+cV{n!OjolSP&A>x1FY;&}=I zplwG^s}x~Yo52%f_kkt`n;}2nWRh?9C}HHxBXg5Ia&&i|ZR3OIW94n}g_Jk05O&jr zx?xP8y4&|%MYSD3mqnEGt55$Qb6*)&Wz+q;5fl{xK|)#)q(MPSQo2J*y1TnWX^`$l zLL@dwOLuoSNOyPcGn?o6zt?-t`EI^IDS-TAHtpb%uFP~ zVn7+x&Gru}*j}QZF-TMBaT^ z7-YtoB-%1xIk_0|qww93Oj8ug=$G{g7n2a> zQ&qgC#b$S%$M48lqznweCALxrutyYlHY+(a3ue(!02EEiOX(}4;97cG z{nPfEX)WOyQ-VWb*X}-VYpDVE`2?oKUrO98@x%c>8C z`USbgjMCJ%Q+24HfLTa)tz^%_(v4;u8n!;8i>f{nt%hIR`f04jy;qyHt9+=rgb-Ml zQlUQe;&2qV1?gjHCQ1pYQofjNEGISCMFI~|zPLzqBuZh$SjV6Iy|>zhVL)U^BeYX0 zLaua$F_=-@_7u5#+*}w!MQ1#(O!9$UX*-cVc8x4-O~&zJOZn=jx;4%N=w^xW75z&l zo}B0ljRlv}le;oX3-e|&M!ZU?iKyb3`2N;6AE7dTQh$hY{Ahi`PUc&fdvJZ8#B!1FhPhca)R?PpW`hsi>IPN4t&Z5oMiy0HPsqtO9JB zRSUEASy@@E^G>>biOgi8z@rqPgPo57(z@W+uUF^b?kh_+3X~l^GjKH5Wgl6 zsLP0^^d5QzAmEFv4?fKnx=`3|e|vpqX;lSR7ii3tiYn#HBGFkA=#$GXsQlN96do^q zyg#fOzPsyv`J2xpU-BMMlX~#Ido0G#2I)LRL*A{o@M>A*uPy6_@|8t^Ma4Pgxe$Zx z+YGRxMroHI_nTz_t2(s zl-54bna>Tj$H#{o9uuEOl{pyMu_{uP8d^J1`5iz$&Ib`Km5(8_80hcL>TX0= z<|%MwIG%7JS##X;fGXQjcX(&mD7dEPEBvBcR|oW;xwN=vmA4%`qS{tBD*3;=+`4Ag_ek*$E`M$@C1Ys8DZ3uIXUaCn5jz?y1q zX(=rt0w9Cn^E7Im-ot%L#`2W_qBKSfn}{d{fNQt6O$$R`KenN;>XBjxJrc!>~$p-zy+ zu~3;~HR55-z-X>91frtuxW;=`))?3$t@D>@xTeZ_`4I%z#UFt9=zRkN4D|H#)%G+~ zAvEml%5S6U&ZbQv?*N6K_49>upw9B3{ENP`kjB4@yX%$97c1XULj5{$p^7oA`Z~!l zJ1Ywd8yf+jd@t9MEX~fl0BQ~&pf;7O173BeAf7q@3*W2aYHBph+8>^pGOl-ym8S-l zSyVK%w>{4iX27*Q%%A55p^X-)3bE199ICm6v6*MFYiT+AhiYoF+}zx`P9`Q!i6wTAy96lZU%x0J&mSYrCIB9Hz29m79n^3z(A_q6cI5AU zssPgZZB)d7FQ2xZ-G?bMZXO;@>KK4bm6n#C01R}Dq)vxb2!ritoDs)_-q?baQr7E8*qbx4F>7(h=1uwDXu{Fe$S z5b!}r51POd?&3at2FyqR+RbJ0>f5VIVmMqaYv0Pj*3FF`;-e>T=lpTCojvc()fr*M zIxi19HP=eXk(hQd;?sgC%;QY0;xyf#~ zAp?ZWNLgIm1V{w~Aa9Vrg~0PbyYpmbEsZlm;U;D@4dK|>nE4Hv)dDpd;w|XwLXZKMK}*YimiNk_WEuy zauF6MhVpdUOIKA#Mg83NGz{CG6$0@?k|K29x1yj!(5ismop!uEg8d{3!@`oc-qn!= z!f>F|G%;ZFMaLs$)jd+FKZ6dM<|^vewOQ4HV|+}8&z?kwxOTEjv&oVdUUo(QP@P?I zk+aPZfHYPtmjerP$y|ZxvnR=HYY1oSUQ7g894Rr9jQ&JkmSHwOFqC7WO0y@c)m)YD zcDt$x3MvkYM6~Ryls(k+b&Dt+E3l4*%zEQGVz+M|{oOO8=X|7fPXr6cdnjAbcwX(L zZUKemw`&74wlS4>kvrT-S?v_DoGTXHc6VA^?yr<)9vTYyn^L-O$H{P}+PvvflQA<;(<7#eKYywYQ>XgOBX-6v+SLvMP%}y!19h)PI{*Yj| zcz9L~sT$CM)I>GWG3x6ORb;CY;X@MvMK%+vHTsF|ZdRt%in44J?5-`Fdz=sZBf8KB zUqDuD)gVdbXCagE4C1FYEtU`mS6k~2$ZW8-xtx32OxYKDtqw$}g0nbjmXLlmu1n|q zL?^Td@KY&SinoEr8gt=ELI_)F_uP!{m$%Z{ItYCWa`rC3{M zL@(fJA0?}lm&ascBq)sJgI07_V)vzcoTRsxQUXg^CE}=dQxFRre|=9w#WOj7Qv-N_ z{u&ZLp&!gA0p1c-J{qND1uUAt@VekSq(Tm${5THDY;kek5*V}yX>wYA#^@#bQR%eF z*-ln^_M3{oy>aqgJMOoGUYppeY;lF9=(KL&pBsypSRe6jxb%@hXmSp z<+%9|9Da~0pVAuhF*--`l9gM;@%kF5$Oj;D^_<4)P-ll|K3rU!wIN3ayk%iTZ-M9K z`kt^vm?Q#$O^{%;l#NR!0?*_}|HtJY#1?4xbftjfl*8xw-7N|}X+Nh}xzkJhyd|%h zV4z%4BtkLr0M)hw8>eArTYjNX%b?J@hIaj%gGOzVLtBJ=#vj7qFCpW3ghH-QB{(+C zig#+K-ygGxC97#+*bcgwcz+5=CzgofAPCV)%n!!wJ7$vW>kZMOMS1+>5c!?t0Umi5 zEx)*7nc^y0KuB0gg6dHoX3mXX!Vjra^F(dF0n$%ZebP5#dKdxVoKh;H@)xI zrBpp>xTtM!Z|Tps+9NjXY8@0bTnlK8bD2&oq!w(dPj&f49#^&e@{4bcER-k9PX!** zfiGyE{=7C`*3;Dp^xb*Nn3TGzBL4m~XehY8gf@89YqQ`_BVb8KTkC7cEWszPZ5H1i z#3O8k6P5(Acj-BAGUa0Q_s>a4tLSF#zC-(P z?9-M!>vCjdfl%|cm!Ti1;dI0uMPh8Xt?~VsKQbm*!P&akn!@~-wtX;kk^U-BGq6`a zs1ds&G7B7x2Qw%vS=xSVnzBfgMEMzG{`E<1qoJ86^2!%JG#7BNDlq&C)e_wJENHW# zT!4sUJLf4I_@>9X9Bagh-I+rB>GO6@N@q^7FMt_3pdzww3<(yf?mRpoa% z8{;q|oQU}CRVUrU`^_*eefse1Er5IcC7>}xudL#9JL_hBV9xyzqEMyw5SY!Eb9tur zDll0NpR}0gJ)%Hmw_SP(fk=cV>6rS#{)qaq_G%WYSu^s}%X8e_!ehb0lFJ#y&5Pu; zi*lm6RQvp={EhrChx}RU<sjgV7pq#<4V<15g0rD$ob=~|0a^YmhC6{Z39P3uA80 zX}n)fYNew^TAc<1`+R?*#Vk^GnZh@!!9!k6i<|4{PPJn<>xt{_f_1-ze;+H&xdWs= ztRrAfmFZ_)x#zb>yrn2{Se(zvzDyq{fO@(9hVzUzFrib^P?1&iUC_8{-)5!-`f*(+J5lc!%uXX*ux8L>gkPcKNIsh7QGv)v zOX$%}T6J+jOdv+XA2^cYj_G{4Ka1RmaWRGHo`iEVi&xjGEv{rbqc>WRFu0lkZ3a*& zYry*u4m3tvS-^?lX&3LXnPs$aW9!L5cu!MlHdUhE)BQ4bO1cHN2JMfD=*BFFoCE*W z;@2+o)z17tk9uD?;?GvuFzKagidOwsxcP>HMdat9ttPKev z-jbl`2j(LH{|=*Bz_01jit%szEufLdM>?O64n&u$NTafv{FqHC2IM*V!~N5$6*G{9 zKSoZzocZpHibv8a`vq1E>rf!D=!k3nKrh7ZPoB5D;5b=$gbn90Xx>dJ_ zm%87hnN2|a+mj8gb&@_;h{LthlpNv#oxWux@@r!T2!wK+YiDtB5u+k)-e{^grmJjUP}%KzvcC1Za!yL^=AF3v&1GJ_15g{N zPik+;&bxo+xVyD7>hk+B*`UG(QnY2CCg~{8Xt-<5iAOZG=Qv%9>Wz$4z+`%G+{_LF znjV%_>r_^Kg`<6b+GLdlpV@S^$4TrRADl%^TBpAcIi{~{iU5goMhRy%ir1ve&FpWs zzB1F$ltS~GXQWBR%hnaE&-{0DCAJUGqTYqEteH;afKx)ny-Qr(x8wDmE&^GR1Ij|z zUw4Q*Yd_58^XOCae_gMt9fskWh>4pPYFuXzRXIv28riG2tR7RCM8}DVGmIzG&@0_) zXy#a7K1@W6*~09iekIde_pP_X@v+y_WVmFk+# zw$eNhe#_F%%8)Y$*{*~o#nm%VUZmds)GR`OW06;FN8DKdc95B;swP6Y8OveENNOlg z(=(^OYA!s6;G-7@zU=v69ro1jjhcD<+v$i#Le%)RKic>6R)=V%nYHM-9hs`EF>7=d z0Y|~~9KBIh3`>A*;_maf@=Q2BabGN5ry$=m)~m8Pi!#iqclq7lTwL~ZFRr9|O#fPu z0cC)et7OtZy<)q9M9iI${y5ngH(1EE1#F6N_Y7FkMKF?Mh0$3UnIyL|i;-O|hwL5G$A(;d> zE4%_Xjq4+0@0SH046>xM|2eX>1>s3jXE<#mD-LF*Ovxb-h(#=I$_Yl&8p2i)j#Pr@ zZ;bzfj>x5(7tqh#T`edQ7i4}?tzJo}B&mt#Mu2EtN!58!G|rRp*UIYr@L0E_2%7lK zYTWyMRtWN3FnhJO)ar;W0s=>fG*@b>g}c}9{at8DGrFl@$YBbg8#Z#d>w7GfA`;ilW4w^ZAzl;TDUPM#F^I$($KB!?p( zAIs&O)T^h#$r#u~%x@{JmVRk-x3t}19pi7(o=g=49FVX0^LL-$iOS^&3j2x+BZpzY z7SX{;te0Rd#T)3%OdTB29&dvZc;?i}eHy8#FwWVlMM<%%Q%iNLa|G(5_BJ8(tQmWY zQh6dWl}6RD*A|xaY>?87JCoP4iod!D2Hb8--cyRa!e=!dL0^1f7?M~TX3;C@U$O}YTm`?>hMf9L0SG!&Xw7P%bmDCO- zb$i?yyG7-ALz>tx6h7B7D*W*r509! zW!4mAFUR%r=-VK3Hc*rKj*v2}89c7WipE}B#v=Z5^gNs!-y8`U(um`BPW?av^Z8~A za~_wsU;demn?hhHF9v+2bno?WjV55=hEO8ch=*>RC9$OC!b%(8abdTuy2Y8g^QCPk zyIkWj#%1s+VeKj#yYeO0Xo(dRnE%z#voCIbXJ1-s((4tL#xv!qGLrFV!zBPm_wU?5 zZMpu#iPVo3f2zd%kdeZ(eSRGCOdk~xn6%jQRMkaTH)Dr2uwwXI$j;eeNynqV^=-N68eJ^E-q&bUXez89F_MHvDJeHbzggHbJ8Yu_KSnn-~(DUnP6>h0_hsbDHN5J^Bt~wLR zfo|p{x?QSKmMd+tlTVUu5dnpMZQm(RD~hikY)7MJIi53wj-aODkUVsD21yU96CdSf z8f1LDBvLjc{$QLe$u@Ryk%bp{eFQP7=g57~!j7cw;5;yBi@hD|^6q*3m2BSW)n}8P zGUZ{`9+3LlxXn4<;-Z?Z{CF-i>+;5Qx3ofm_0}62h-|P@y>FxjTonobkZ=Oa@B^4^ z(+c@;f9jy2RGf-uYjUbkn|pj83zt2!K$BBEF;ac8GwO_5o?uJ)lknhosz`@3Xm*~5l$ge^B12*-vcWNqHF*!B)dMDn?og~>g z?1t+ST|s~7^sT0(EiCnB-}!Pm{!G-BjJeu5moiW6XQE+sgrtW2as`~W;~*5mVx}nP zar4YySK2*ledF1a7o5mim0@vQtdMi6P`4{>RJcyv&{0ZnL4cRUh6hwS&}nI%M4Lf< zPX+a!4k|mZ_bKo5gY&~x)8BX1)gsGa4n|}Cu zrD!WLI25Wiey&8qGoqC=RSFy0K6R

lAO7#ID&oO8r4WGfsEP8{RMan_U_Y(k|8! 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 M~7-vRtvC5y3h9h#0*UsGh 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 rIjUU?H)Oyy6F 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 literal 0 HcmV?d00001 diff --git a/dalm/datasets/backtranslation/requirements_predict b/dalm/datasets/backtranslation/requirements_predict new file mode 100644 index 0000000..4de7fa0 --- /dev/null +++ b/dalm/datasets/backtranslation/requirements_predict @@ -0,0 +1,91 @@ +aiohttp==3.9.0 +aiosignal==1.3.1 +anyio==3.7.1 +async-timeout==4.0.3 +attrs==23.1.0 +certifi==2023.11.17 +charset-normalizer==3.3.2 +click==8.1.7 +cmake==3.27.7 +exceptiongroup==1.1.3 +fastapi==0.104.1 +filelock==3.13.1 +frozenlist==1.4.0 +fschat==0.2.32 +fsspec==2023.10.0 +h11==0.14.0 +httpcore==1.0.2 +httptools==0.6.1 +httpx==0.25.1 +huggingface-hub==0.19.4 +idna==3.4 +Jinja2==3.1.2 +jsonschema==4.20.0 +jsonschema-specifications==2023.11.1 +lit==17.0.5 +markdown-it-py==3.0.0 +markdown2==2.4.10 +MarkupSafe==2.1.3 +mdurl==0.1.2 +mpmath==1.3.0 +msgpack==1.0.7 +multidict==6.0.4 +networkx==3.2.1 +nh3==0.2.14 +ninja==1.11.1.1 +numpy==1.26.2 +nvidia-cublas-cu11==11.10.3.66 +nvidia-cuda-cupti-cu11==11.7.101 +nvidia-cuda-nvrtc-cu11==11.7.99 +nvidia-cuda-runtime-cu11==11.7.99 +nvidia-cudnn-cu11==8.5.0.96 +nvidia-cufft-cu11==10.9.0.58 +nvidia-curand-cu11==10.2.10.91 +nvidia-cusolver-cu11==11.4.0.1 +nvidia-cusparse-cu11==11.7.4.91 +nvidia-nccl-cu11==2.14.3 +nvidia-nvtx-cu11==11.7.91 +packaging==23.2 +pandas==2.1.3 +prompt-toolkit==3.0.41 +protobuf==4.25.1 +psutil==5.9.6 +pyarrow==14.0.1 +pydantic==1.10.13 +Pygments==2.17.0 +python-dateutil==2.8.2 +python-dotenv==1.0.0 +pytz==2023.3.post1 +PyYAML==6.0.1 +ray==2.8.0 +referencing==0.31.0 +regex==2023.10.3 +requests==2.31.0 +rich==13.7.0 +rpds-py==0.13.0 +safetensors==0.4.0 +sentencepiece==0.1.99 +shortuuid==1.0.11 +six==1.16.0 +sniffio==1.3.0 +starlette==0.27.0 +svgwrite==1.4.3 +sympy==1.12 +tiktoken==0.5.1 +tokenizers==0.15.0 +torch==2.0.1 +tqdm==4.66.1 +transformers==4.35.2 +triton==2.0.0 +typing_extensions==4.8.0 +tzdata==2023.3 +urllib3==2.1.0 +uvicorn==0.24.0.post1 +uvloop==0.19.0 +vllm==0.2.1.post1 +watchfiles==0.21.0 +wavedrom==2.0.3.post3 +wcwidth==0.2.10 +websockets==12.0 +xformers==0.0.22 +yarl==1.9.2 diff --git a/dalm/datasets/backtranslation/requirements_train.txt b/dalm/datasets/backtranslation/requirements_train.txt new file mode 100644 index 0000000..735b52a --- /dev/null +++ b/dalm/datasets/backtranslation/requirements_train.txt @@ -0,0 +1,90 @@ +accelerate==0.24.1 +aiohttp==3.8.6 +aiosignal==1.3.1 +annotated-types==0.6.0 +anyio==3.7.1 +async-timeout==4.0.3 +attrs==23.1.0 +certifi==2023.7.22 +charset-normalizer==3.3.2 +click==8.1.7 +datasets==2.15.0 +deepspeed==0.12.3 +dill==0.3.7 +einops==0.7.0 +exceptiongroup==1.1.3 +fastapi==0.104.1 +filelock==3.13.1 +flash-attn==2.3.3 +frozenlist==1.4.0 +fschat==0.2.32 +fsspec==2023.10.0 +h11==0.14.0 +hjson==3.1.0 +httpcore==1.0.2 +httpx==0.25.1 +huggingface-hub==0.19.4 +idna==3.4 +Jinja2==3.1.2 +markdown-it-py==3.0.0 +markdown2==2.4.10 +MarkupSafe==2.1.3 +mdurl==0.1.2 +mpmath==1.3.0 +multidict==6.0.4 +multiprocess==0.70.15 +networkx==3.2.1 +nh3==0.2.14 +ninja==1.11.1.1 +numpy==1.26.2 +nvidia-cublas-cu12==12.1.3.1 +nvidia-cuda-cupti-cu12==12.1.105 +nvidia-cuda-nvrtc-cu12==12.1.105 +nvidia-cuda-runtime-cu12==12.1.105 +nvidia-cudnn-cu12==8.9.2.26 +nvidia-cufft-cu12==11.0.2.54 +nvidia-curand-cu12==10.3.2.106 +nvidia-cusolver-cu12==11.4.5.107 +nvidia-cusparse-cu12==12.1.0.106 +nvidia-nccl-cu12==2.18.1 +nvidia-nvjitlink-cu12==12.3.101 +nvidia-nvtx-cu12==12.1.105 +packaging==23.2 +pandas==2.1.3 +prompt-toolkit==3.0.41 +psutil==5.9.6 +py-cpuinfo==9.0.0 +pyarrow==14.0.1 +pyarrow-hotfix==0.5 +pydantic==1.10.13 +pydantic_core==2.14.3 +Pygments==2.16.1 +pynvml==11.5.0 +python-dateutil==2.8.2 +pytz==2023.3.post1 +PyYAML==6.0.1 +regex==2023.10.3 +requests==2.31.0 +rich==13.7.0 +safetensors==0.4.0 +sentencepiece==0.1.99 +shortuuid==1.0.11 +six==1.16.0 +sniffio==1.3.0 +starlette==0.27.0 +svgwrite==1.4.3 +sympy==1.12 +tiktoken==0.5.1 +tokenizers==0.15.0 +torch==2.1.0 +tqdm==4.66.1 +transformers==4.35.2 +triton==2.1.0 +typing_extensions==4.8.0 +tzdata==2023.3 +urllib3==2.1.0 +uvicorn==0.24.0.post1 +wavedrom==2.0.3.post3 +wcwidth==0.2.10 +xxhash==3.4.1 +yarl==1.9.2 diff --git a/dalm/datasets/backtranslation/scripts/falcon.sh b/dalm/datasets/backtranslation/scripts/falcon.sh new file mode 100644 index 0000000..6a0a9f4 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/falcon.sh @@ -0,0 +1,15 @@ +#!/usr/bin/bash + +#SBATCH --job-name=falcon +#SBATCH --output=logs/%x-%j.log +#SBATCH --error=logs/%x-%j.log + +#SBATCH --partition=Partition +#SBATCH --cpus-per-task=8 +#SBATCH -n 1 +#SBATCH -N 1 + + +source ~/anaconda3/bin/activate torch + +python data/unlabelled/falcon_refinedweb.py diff --git a/dalm/datasets/backtranslation/scripts/predict_instruction.sh b/dalm/datasets/backtranslation/scripts/predict_instruction.sh new file mode 100644 index 0000000..28b8720 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/predict_instruction.sh @@ -0,0 +1,23 @@ +# TODO: to add inference executive file with multiple GPUs +#!/usr/bin/bash + +export CUDA_VISIBLE_DEVICES=7 + +num_nodes=1 +num_gpu_per_node=1 + +bsz=4 +model_path="/dev/shm/tzhu/outputs/forward_model_on_seed_data_scheduled" + +bsz_per_dev=$(echo "${bsz} / ${num_nodes} / ${num_gpu_per_node}" | bc) + +torchrun \ + --nnodes ${num_nodes} \ + --nproc_per_node ${num_gpu_per_node} \ + -m src.core.predict \ + --mixed_precision="bf16" \ + --model_path=${model_path} \ + --data_filepath="data/seed/seed.jsonl" \ + --save_filepath="outputs/seed_pred.jsonl" \ + --prompt_column_name="instruction" \ + --batch_size=${bsz_per_dev} diff --git a/dalm/datasets/backtranslation/scripts/predict_instruction_vllm.sh b/dalm/datasets/backtranslation/scripts/predict_instruction_vllm.sh new file mode 100644 index 0000000..93ae6f8 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/predict_instruction_vllm.sh @@ -0,0 +1,31 @@ +#!/usr/bin/bash + +export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" + +# model_path="/dev/shm/tzhu/outputs/forward_model_on_seed_data_scheduled" +# data_filepath="data/seed/seed.jsonl" +# save_filepath="outputs/seed_pred.jsonl" +# prompt_column_name="instruction" + +# model_path="/dev/shm/tzhu/outputs/backward_model_on_seed_data_scheduled" +# data_filepath="data/unlabelled/sampled.jsonl" +# save_filepath="outputs/sampled_unlabelled_gen_instruction.jsonl" +# prompt_column_name="content" + +# model_path="/dev/shm/tzhu/Humback/models/m1_with_diff_sys_prompt" +# data_filepath="data/alpaca_eval/alpaca_eval.jsonl" +# save_filepath="outputs/m1_alpaca_eval_pred.jsonl" +# prompt_column_name="instruction" + +model_path="/dev/shm/tzhu/Humback/models/m0" +data_filepath="data/alpaca_eval/alpaca_eval.jsonl" +save_filepath="outputs/m0_alpaca_eval_pred.jsonl" +prompt_column_name="instruction" + +python -m src.core.predict_vllm \ + --reverse \ + --model_path=${model_path} \ + --data_filepath=${data_filepath} \ + --save_filepath=${save_filepath} \ + --prompt_column_name=${prompt_column_name} \ + --tensor_parallel_size=8 diff --git a/dalm/datasets/backtranslation/scripts/self_aug.sh b/dalm/datasets/backtranslation/scripts/self_aug.sh new file mode 100755 index 0000000..c5562b8 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/self_aug.sh @@ -0,0 +1,24 @@ +#!/usr/bin/bash + +export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" + +model_path="/dev/shm/Humpback/outputs/backward_model_on_seed_data_scheduled" +data_filepath="data/unlabelled/falcon-refinedweb-sampled.jsonl" +save_filepath="/dev/shm/Humpback/outputs/m1/unlabelled_gen_instruction.jsonl" +prompt_column_name="content" + +# python -m src.core.predict_vllm \ +# --reverse \ +# --model_path=${model_path} \ +# --data_filepath=${data_filepath} \ +# --save_filepath=${save_filepath} \ +# --prompt_column_name=${prompt_column_name} \ +# --tensor_parallel_size=8 + +python src/core/predict_vllm.py \ + --reverse \ + --model_path=${model_path} \ + --data_filepath=${data_filepath} \ + --save_filepath=${save_filepath} \ + --prompt_column_name=${prompt_column_name} \ + --tensor_parallel_size=8 diff --git a/dalm/datasets/backtranslation/scripts/self_curation.sh b/dalm/datasets/backtranslation/scripts/self_curation.sh new file mode 100755 index 0000000..6c7a259 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/self_curation.sh @@ -0,0 +1,34 @@ +#!/usr/bin/bash + +export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" + +model_path="/dev/shm/Humpback/models/m1_strict_score_matching_2400steps" +unlabelled_data_filepath="/dev/shm/Humpback/outputs/m1/unlabelled_gen_instruction.jsonl" +middle_save_filepath="/dev/shm/Humpback/outputs/m1/mid1_unlabelled_data_for_curation.jsonl" +predicted_save_filepath="/dev/shm/Humpback/outputs/m1/mid2_unlabelled_data_curation_predicted.jsonl" +curation_results_save_filepath="/dev/shm/Humpback/outputs/m1/mid3_unlabelled_data_curation_results.jsonl" +curated_save_filepath="/dev/shm/Humpback/outputs/m1/unlabelled_curated_data.jsonl" + +echo "(1/3) => Build dataset for curation ..." +python -m src.core.build_curation_dataset \ + --data_filepath=${unlabelled_data_filepath} \ + --save_filepath=${middle_save_filepath} \ + --curation_prompt_filepath="data/prompts/self_curation.txt" \ + --generated_instruction_column_name="response" \ + --response_column_name="prompt" + +echo "(2/3) => Predict curation results ..." +python -m src.core.predict_vllm \ + --model_path=${model_path} \ + --data_filepath=${middle_save_filepath} \ + --save_filepath=${predicted_save_filepath} \ + --prompt_column_name="prompt" \ + --tensor_parallel_size=8 + +echo "(3/3) => Curate results ..." +python -m src.core.filter_curation_results \ + --data_filepath=${predicted_save_filepath} \ + --middle_save_filepath=${curation_results_save_filepath} \ + --save_filepath=${curated_save_filepath} \ + --curation_response_column_name="response" \ + --score=5 diff --git a/dalm/datasets/backtranslation/scripts/train_backward_Myx.sh b/dalm/datasets/backtranslation/scripts/train_backward_Myx.sh new file mode 100755 index 0000000..b4c10c0 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/train_backward_Myx.sh @@ -0,0 +1,44 @@ +#!/usr/bin/bash + +num_nodes=1 +num_gpu_per_node=8 + +bsz=32 +output_dir="/dev/shm/Humpback/outputs/backward_model_on_seed_data_scheduled" + +mkdir -p $output_dir +bsz_per_dev=$(echo "${bsz} / ${num_nodes} / ${num_gpu_per_node}" | bc) + +python -m torch.distributed.run \ + --nnodes ${num_nodes} \ + --nproc_per_node ${num_gpu_per_node} \ + -m src.core.train_flash_attn \ + --reverse \ + --deepspeed conf/ds_zero2default.json \ + --model_name_or_path "mistralai/Mistral-7B-v0.1" \ + --data_path "data/seed/seed.jsonl" \ + --per_device_train_batch_size ${bsz_per_dev} \ + --per_device_eval_batch_size ${bsz_per_dev} \ + --adam_beta1 0.9 \ + --adam_beta2 0.95 \ + --learning_rate "1e-5" \ + --final_lr "9e-6" \ + --weight_decay 0.1 \ + --max_grad_norm 1.0 \ + --evaluation_strategy "no" \ + --logging_strategy steps \ + --logging_steps 1 \ + --max_steps 500 \ + --save_strategy steps \ + --save_steps 100 \ + --save_total_limit 1 \ + --output_dir ${output_dir} \ + --overwrite_output_dir \ + --ddp_timeout 30000 \ + --logging_first_step True \ + --bf16 True \ + --ddp_find_unused_parameters False \ + --gradient_checkpointing \ + --report_to none \ + --log_level info \ + --lazy_preprocess True diff --git a/dalm/datasets/backtranslation/scripts/train_backward_Myx_slurm.sh b/dalm/datasets/backtranslation/scripts/train_backward_Myx_slurm.sh new file mode 100644 index 0000000..1f5bfb6 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/train_backward_Myx_slurm.sh @@ -0,0 +1,74 @@ +#!/usr/bin/bash + +#SBATCH --job-name=backward +#SBATCH --output=logs/%x-%j.log +#SBATCH --error=logs/%x-%j.log + +#SBATCH --partition=Partition +#SBATCH --ntasks-per-node=1 +#SBATCH --cpus-per-task=32 +#SBATCH --mem=128G +#SBATCH -x SH-IDCA1404-10-140-54-116 + +#SBATCH --nodes=1 +#SBATCH --gres=gpu:4 + + +source ~/anaconda3/bin/activate torch + +num_nodes=1 +num_gpu_per_node=4 + +bsz=32 +output_dir="outputs/backward_model_on_seed_data_scheduled_ds1" + +mkdir -p $output_dir +bsz_per_dev=$(echo "${bsz} / ${num_nodes} / ${num_gpu_per_node}" | bc) + +nodes=( $( scontrol show hostnames $SLURM_JOB_NODELIS ) ) +nodes_array=($nodes) +head_node=${nodes_array[0]} +head_node_ip=$(srun --nodes=1 --ntasks=1 -w "$head_node" hostname --ip-address) +echo "Node: $head_node" +echo "Node IP: $head_node_ip" + +srun torchrun \ + --nnodes ${num_nodes} \ + --nproc_per_node ${num_gpu_per_node} \ + --node_rank $SLURM_NODEID \ + --rdzv_id $RANDOM \ + --rdzv_backend c10d \ + --rdzv_endpoint $head_node:29518 \ + -m src.core.train_flash_attn \ + --reverse \ + --deepspeed conf/ds_zero2default.json \ + --model_name_or_path /home/zhutong/Llama-2-7b-hf \ + --data_path data/seed/seed.jsonl \ + --per_device_train_batch_size ${bsz_per_dev} \ + --per_device_eval_batch_size ${bsz_per_dev} \ + --num_train_epochs 15 \ + --adam_beta1 0.9 \ + --adam_beta2 0.95 \ + --learning_rate "1e-5" \ + --final_lr "9e-6" \ + --weight_decay 0.1 \ + --max_grad_norm 1.0 \ + --evaluation_strategy "no" \ + --logging_strategy steps \ + --logging_steps 1 \ + --save_strategy epoch \ + --save_total_limit 1 \ + --output_dir ${output_dir} \ + --overwrite_output_dir \ + --ddp_timeout 30000 \ + --logging_first_step True \ + --bf16 True \ + --tf32 True \ + --ddp_find_unused_parameters False \ + --gradient_checkpointing \ + --report_to none \ + --log_level info \ + --lazy_preprocess True + + # --fsdp "full_shard auto_wrap" \ + # --fsdp_config conf/fsdp_config.json \ diff --git a/dalm/datasets/backtranslation/scripts/train_seed.sh b/dalm/datasets/backtranslation/scripts/train_seed.sh new file mode 100755 index 0000000..d3cb0e7 --- /dev/null +++ b/dalm/datasets/backtranslation/scripts/train_seed.sh @@ -0,0 +1,57 @@ +#!/usr/bin/bash + +num_nodes=1 +num_gpu_per_node=8 + +bsz=32 +# max_steps=500 +# data_path="data/seed/seed.jsonl" +# output_dir="/dev/shm/tzhu/outputs/forward_model_on_seed_data_scheduled" +# max_steps=765 # 21,301 curated instances (score=5) + 3,200 seed data for M1 training +# data_path="data/curated/m1.jsonl" +# output_dir="/dev/shm/tzhu/Humback/models/m1_with_diff_sys_prompt" + +num_nodes=1 +num_gpu_per_node=8 +bsz=32 + +max_steps=2400 +data_path=data/seed/seed.jsonl +output_dir="/dev/shm/Humpback/models/m1_strict_score_matching_2400steps" + +mkdir -p $output_dir +bsz_per_dev=$(echo "${bsz} / ${num_nodes} / ${num_gpu_per_node}" | bc) + +python -m torch.distributed.run \ + --nnodes ${num_nodes} \ + --nproc_per_node ${num_gpu_per_node} \ + -m src.core.train_flash_attn \ + --deepspeed conf/ds_zero2default.json \ + --model_name_or_path "mistralai/Mistral-7B-v0.1" \ + --data_path ${data_path} \ + --per_device_train_batch_size ${bsz_per_dev} \ + --per_device_eval_batch_size ${bsz_per_dev} \ + --adam_beta1 0.9 \ + --adam_beta2 0.95 \ + --learning_rate "1e-5" \ + --final_lr "9e-6" \ + --weight_decay 0.1 \ + --max_grad_norm 1.0 \ + --evaluation_strategy "no" \ + --logging_strategy steps \ + --logging_steps 1 \ + --output_dir ${output_dir} \ + --overwrite_output_dir \ + --ddp_timeout 30000 \ + --logging_first_step True \ + --bf16 True \ + --tf32 True \ + --ddp_find_unused_parameters False \ + --gradient_checkpointing \ + --report_to none \ + --log_level info \ + --lazy_preprocess True \ + --save_total_limit 1 \ + --max_steps ${max_steps} \ + --save_strategy steps \ + --save_steps 100 diff --git a/dalm/datasets/backtranslation/src/__init__.py b/dalm/datasets/backtranslation/src/__init__.py new file mode 100644 index 0000000..c26fa2b --- /dev/null +++ b/dalm/datasets/backtranslation/src/__init__.py @@ -0,0 +1 @@ +import src.utils.template # noqa: F401 diff --git a/dalm/datasets/backtranslation/src/core/build_curation_dataset.py b/dalm/datasets/backtranslation/src/core/build_curation_dataset.py new file mode 100644 index 0000000..aba671f --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/build_curation_dataset.py @@ -0,0 +1,42 @@ +import argparse + +from tqdm import tqdm + +from src.utils.io import dump_jsonlines, load_jsonlines + + +def main(args): + prompt_template = open(args.curation_prompt_filepath, "r").read().strip() + data = load_jsonlines(args.data_filepath) + results = [] + for ins in tqdm(data, desc="Building curation dataset"): + generated_instruction = ins[args.generated_instruction_column_name] + response = ins[args.response_column_name] + prompt = prompt_template.format( + generated_instruction=generated_instruction, + response=response, + ) + results.append( + { + "prompt": prompt, + "generated_instruction": generated_instruction, + "response": response, + } + ) + dump_jsonlines(results, args.save_filepath) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--data_filepath", type=str) + parser.add_argument("--save_filepath", type=str) + parser.add_argument( + "--curation_prompt_filepath", type=str, default="data/prompts/self_curation.txt" + ) + parser.add_argument( + "--generated_instruction_column_name", type=str, default="response" + ) + parser.add_argument("--response_column_name", type=str, default="prompt") + args = parser.parse_args() + + main(args) diff --git a/dalm/datasets/backtranslation/src/core/filter_curation_results.py b/dalm/datasets/backtranslation/src/core/filter_curation_results.py new file mode 100644 index 0000000..657726f --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/filter_curation_results.py @@ -0,0 +1,83 @@ +import argparse +import re +import statistics as sts +from collections import Counter + +from tqdm import tqdm + +from src.utils.io import dump_jsonlines, load_jsonlines + + +def main(args): + data = load_jsonlines(args.data_filepath) + regex = re.compile(r"[Ss]core:\s*(\d+)$") + tgt_scores = list(map(int, args.scores.split(","))) + + scores = [] + qualified_results = [] + all_results = [] + instruction_lens = [] + response_lens = [] + for ins in tqdm(data, desc="Filtering curation results"): + raw = ins["raw"] + curation_response = ins[args.curation_response_column_name] + score_matched = regex.search(curation_response) + if score_matched: + score = int(score_matched.group(1)) + else: + score = None + + scores.append(str(score)) + + all_results.append( + { + "instruction": raw["generated_instruction"], + "response": raw["response"], + "score": score, + } + ) + if isinstance(score, int) and score is not None and score in tgt_scores: + if ( + args.min_instruction_len + <= len(raw["generated_instruction"]) + <= args.max_instruction_len + ): + qualified_results.append( + { + "instruction": raw["generated_instruction"], + "response": raw["response"], + "score": score, + } + ) + instruction_lens.append(len(raw["generated_instruction"])) + response_lens.append(len(raw["response"])) + + dump_jsonlines(all_results, args.middle_save_filepath) + dump_jsonlines(qualified_results, args.save_filepath) + + print(f"Scores: {Counter(scores).most_common()}") + print( + f"Number of qualified results (scores={args.scores}): {len(qualified_results)}/{len(all_results)}" + ) + print( + f"instruction len: {sts.mean(instruction_lens):.0f} ± {sts.stdev(instruction_lens):.0f}" + ) + print( + f"response len: {sts.mean(response_lens):.0f} ± {sts.stdev(response_lens):.0f}" + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--data_filepath", type=str) + parser.add_argument("--middle_save_filepath", type=str) + parser.add_argument("--save_filepath", type=str) + parser.add_argument("--curation_response_column_name", type=str, default="response") + parser.add_argument( + "--scores", type=str, default="5", help="scores separated in `,`. e.g. `3,4,5`." + ) + parser.add_argument("--min_instruction_len", type=int, default=10) + parser.add_argument("--max_instruction_len", type=int, default=800) + args = parser.parse_args() + + main(args) diff --git a/dalm/datasets/backtranslation/src/core/predict.py b/dalm/datasets/backtranslation/src/core/predict.py new file mode 100644 index 0000000..1e23041 --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/predict.py @@ -0,0 +1,96 @@ +import argparse + +import torch +from accelerate import Accelerator +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import AutoModelForCausalLM, AutoTokenizer + +from src.data import CollateFnWithTokenization, InferenceDataset +from src.utils.io import dump_jsonlines, load_jsonlines + + +@torch.inference_mode() +def main(args): + accelerator = Accelerator(mixed_precision=args.mixed_precision) + + tokenizer = AutoTokenizer.from_pretrained(args.model_path, padding_side="left") + if tokenizer.pad_token is None: + tokenizer.pad_token = tokenizer.eos_token + tokenizer.pad_token_id = tokenizer.eos_token_id + model = AutoModelForCausalLM.from_pretrained(args.model_path) + model.half() + + # We resize the embeddings only when necessary to avoid index errors. If you are creating a model from scratch + # on a small vocab and want a smaller embedding size, remove this test. + embedding_size = model.get_input_embeddings().weight.shape[0] + if len(tokenizer) > embedding_size: + model.resize_token_embeddings(len(tokenizer)) + + dataset = InferenceDataset( + load_jsonlines(args.data_filepath), + content_name=args.prompt_column_name, + reverse=args.reverse, + ) + data_loader = DataLoader( + dataset, + batch_size=args.batch_size, + collate_fn=CollateFnWithTokenization(tokenizer), + shuffle=False, + ) + + model, data_loader = accelerator.prepare(model, data_loader) + + results = [] + + for batch in tqdm(data_loader): + output_ids = accelerator.unwrap_model(model).generate( + **batch, + do_sample=True if args.temperature > 1e-5 else False, + temperature=args.temperature, + repetition_penalty=args.repetition_penalty, + max_new_tokens=args.max_new_tokens, + ) + + output_ids = accelerator.pad_across_processes( + output_ids, dim=1, pad_index=tokenizer.pad_token_id + ) + input_ids = accelerator.gather(batch["input_ids"]).cpu().numpy() + output_ids = accelerator.gather(output_ids).cpu().numpy() + + decoded_inputs = tokenizer.batch_decode(input_ids, skip_special_tokens=True) + decoded_preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True) + for decoded_input, decoded_pred in zip(decoded_inputs, decoded_preds): + results.append( + { + "prompt": decoded_input, + "response": decoded_pred, + } + ) + results.append(decoded_pred) + + accelerator.wait_for_everyone() + if accelerator.is_main_process: + dump_jsonlines(results, args.save_filepath) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--temperature", type=float, default=0.7) + parser.add_argument("--top_p", type=float, default=0.9) + parser.add_argument("--repetition_penalty", type=float, default=1.0) + parser.add_argument("--max_new_tokens", type=int, default=512) + parser.add_argument("--data_filepath", type=str) + parser.add_argument("--save_filepath", type=str) + parser.add_argument("--prompt_column_name", type=str, default="instruction") + parser.add_argument("--reverse", action="store_true") + parser.add_argument("--model_path", type=str) + parser.add_argument("--batch_size", type=int, default=2) + parser.add_argument("--mixed_precision", type=str, default="bf16") + args = parser.parse_args() + + # Reset default repetition penalty for T5 models. + if "t5" in args.model_path and args.repetition_penalty == 1.0: + args.repetition_penalty = 1.2 + + main(args) diff --git a/dalm/datasets/backtranslation/src/core/predict_vllm.py b/dalm/datasets/backtranslation/src/core/predict_vllm.py new file mode 100644 index 0000000..cbbc153 --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/predict_vllm.py @@ -0,0 +1,77 @@ + +import os +import sys + +sys.path.append(os.getcwd()) + +import argparse + +from vllm import LLM, SamplingParams + +from src.data import InferenceDataset +from src.utils.io import dump_jsonlines, load_jsonlines + + +def main(args): + print("LLM") + llm = LLM( + args.model_path, + tensor_parallel_size=args.tensor_parallel_size, + dtype=args.dtype, + ) + print("Sampling Params") + sampling_params = SamplingParams( + temperature=args.temperature, + top_p=args.top_p, + max_tokens=args.max_new_tokens, + ) + + print("Loading data") + + raw_data = load_jsonlines(args.data_filepath) + data = InferenceDataset( + raw_data, + content_name=args.prompt_column_name, + reverse=args.reverse, + ) + prompts = data.get_all() + + print("Generating") + + # 00:25 / 100 prompts on one GPU + results = llm.generate(prompts, use_tqdm=True, sampling_params=sampling_params) + + # 07:24 / 100 prompts on one GPU + # results = [] + # for prompt in tqdm(prompts): + # result = llm.generate(prompt, use_tqdm=False, sampling_params=sampling_params) + # results.append(result) + + dump_jsonl = [] + for raw, result in zip(raw_data, results): + dump_jsonl.append( + { + "raw": raw, + "full_prompt": result.prompt, + "prompt": raw[args.prompt_column_name], + "response": result.outputs[0].text, + } + ) + dump_jsonlines(dump_jsonl, args.save_filepath) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--temperature", type=float, default=0.7) + parser.add_argument("--top_p", type=float, default=0.9) + parser.add_argument("--max_new_tokens", type=int, default=512) + parser.add_argument("--data_filepath", type=str) + parser.add_argument("--save_filepath", type=str) + parser.add_argument("--prompt_column_name", type=str, default="instruction") + parser.add_argument("--reverse", action="store_true") + parser.add_argument("--model_path", type=str) + parser.add_argument("--dtype", type=str, default="bfloat16") + parser.add_argument("--tensor_parallel_size", type=int, default=1) + args = parser.parse_args() + + main(args) diff --git a/dalm/datasets/backtranslation/src/core/train.py b/dalm/datasets/backtranslation/src/core/train.py new file mode 100644 index 0000000..3412bd1 --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/train.py @@ -0,0 +1,69 @@ +""" +The code is borrowed from https://github.com/lm-sys/FastChat/blob/main/fastchat/train/train.py + +Here is the original license: + https://github.com/lm-sys/FastChat/blob/main/LICENSE +""" + +import math +import pathlib + +import transformers + +from src.core.trainer import ScheduledTrainer +from src.data import make_supervised_data_module +from src.utils.config import DataArguments, ModelArguments, TrainingArguments +from src.utils.io import safe_save_model_for_hf_trainer + + +def train(): + parser = transformers.HfArgumentParser( + (ModelArguments, DataArguments, TrainingArguments) + ) + model_args, data_args, training_args = parser.parse_args_into_dataclasses() + + # Set RoPE scaling factor + config = transformers.AutoConfig.from_pretrained( + model_args.model_name_or_path, + cache_dir=training_args.cache_dir, + ) + orig_ctx_len = getattr(config, "max_position_embeddings", None) + if orig_ctx_len and training_args.model_max_length > orig_ctx_len: + scaling_factor = float(math.ceil(training_args.model_max_length / orig_ctx_len)) + config.rope_scaling = {"type": "linear", "factor": scaling_factor} + config.use_cache = False + + # Load model and tokenizer + model = transformers.AutoModelForCausalLM.from_pretrained( + model_args.model_name_or_path, + config=config, + cache_dir=training_args.cache_dir, + use_flash_attention_2=True, + ) + tokenizer = transformers.AutoTokenizer.from_pretrained( + model_args.model_name_or_path, + cache_dir=training_args.cache_dir, + model_max_length=training_args.model_max_length, + padding_side="right", + use_fast=False, + ) + tokenizer.pad_token = tokenizer.unk_token + + # Load data + data_module = make_supervised_data_module(tokenizer=tokenizer, data_args=data_args) + + # Start trainner + trainer = ScheduledTrainer( + model=model, tokenizer=tokenizer, args=training_args, **data_module + ) + if list(pathlib.Path(training_args.output_dir).glob("checkpoint-*")): + trainer.train(resume_from_checkpoint=True) + else: + trainer.train() + model.config.use_cache = True + trainer.save_state() + safe_save_model_for_hf_trainer(trainer=trainer, output_dir=training_args.output_dir) + + +if __name__ == "__main__": + train() diff --git a/dalm/datasets/backtranslation/src/core/train_flash_attn.py b/dalm/datasets/backtranslation/src/core/train_flash_attn.py new file mode 100644 index 0000000..8d9e208 --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/train_flash_attn.py @@ -0,0 +1,13 @@ +# from fastchat.train.llama_flash_attn_monkey_patch import ( +# replace_llama_attn_with_flash_attn, +# ) + +# replace_llama_attn_with_flash_attn() + +import os +os.environ['TRANSFORMERS_CACHE'] = '/dev/shm/huggingface/' + +from src.core.train import train # noqa: E402 + +if __name__ == "__main__": + train() diff --git a/dalm/datasets/backtranslation/src/core/trainer.py b/dalm/datasets/backtranslation/src/core/trainer.py new file mode 100644 index 0000000..c6f0f33 --- /dev/null +++ b/dalm/datasets/backtranslation/src/core/trainer.py @@ -0,0 +1,77 @@ +from functools import partial + +import torch +from torch.optim.lr_scheduler import LambdaLR +from transformers import Trainer + + +def _get_linear_schedule_with_warmup_lr_lambda( + current_step: int, + *, + num_warmup_steps: int, + num_training_steps: int, + final_lr: float = 1e-6, +): + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + return max( + final_lr, + float(num_training_steps - current_step) + / float(max(1, num_training_steps - num_warmup_steps)), + ) + + +def get_linear_schedule_with_warmup( + optimizer, + num_warmup_steps, + num_training_steps, + last_epoch=-1, + final_lr: float = 1e-6, +): + """ + Create a schedule with a learning rate that decreases linearly from the initial lr set in the optimizer to 0, after + a warmup period during which it increases linearly from 0 to the initial lr set in the optimizer. + + Args: + optimizer ([`~torch.optim.Optimizer`]): + The optimizer for which to schedule the learning rate. + num_warmup_steps (`int`): + The number of steps for the warmup phase. + num_training_steps (`int`): + The total number of training steps. + last_epoch (`int`, *optional*, defaults to -1): + The index of the last epoch when resuming training. + + Return: + `torch.optim.lr_scheduler.LambdaLR` with the appropriate schedule. + """ + + lr_lambda = partial( + _get_linear_schedule_with_warmup_lr_lambda, + num_warmup_steps=num_warmup_steps, + num_training_steps=num_training_steps, + final_lr=final_lr, + ) + return LambdaLR(optimizer, lr_lambda, last_epoch) + + +class ScheduledTrainer(Trainer): + def create_scheduler( + self, num_training_steps: int, optimizer: torch.optim.Optimizer = None + ): + """ + Setup the scheduler. The optimizer of the trainer must have been set up either before this method is called or + passed as an argument. + + Args: + num_training_steps (int): The number of training steps to do. + """ + if self.lr_scheduler is None: + self.lr_scheduler = get_linear_schedule_with_warmup( + self.optimizer if optimizer is None else optimizer, + num_warmup_steps=self.args.get_warmup_steps(num_training_steps), + num_training_steps=num_training_steps, + final_lr=self.args.final_lr, + ) + self._created_lr_scheduler = True + return self.lr_scheduler diff --git a/dalm/datasets/backtranslation/src/data.py b/dalm/datasets/backtranslation/src/data.py new file mode 100644 index 0000000..8ff4caf --- /dev/null +++ b/dalm/datasets/backtranslation/src/data.py @@ -0,0 +1,261 @@ +import torch +from fastchat.conversation import Conversation, SeparatorStyle, get_conv_template +from torch.utils.data import Dataset +from transformers import PreTrainedTokenizer + +from src.utils.constant import IGNORE_TOKEN_ID +from src.utils.io import load_jsonlines +from src.utils.print import rank0_print + + +def preprocess( + sources, + tokenizer: PreTrainedTokenizer, + reverse: bool = False, +) -> dict: + if reverse: + conv = get_conv_template("vicuna_v1.1_reverse") + aug_conv = conv + else: + conv = get_conv_template("vicuna_v1.1_seed") + aug_conv = get_conv_template("vicuna_v1.1_aug") + assert conv.roles == aug_conv.roles + assert conv.sep == aug_conv.sep + assert conv.sep2 == aug_conv.sep2 + + roles = {"human": conv.roles[0], "gpt": conv.roles[1]} + + # Apply prompt templates + conversations = [] + for i, source in enumerate(sources): + conv_src = source["source"] + if conv_src == "aug": + _conv = aug_conv + else: + _conv = conv + if roles[source["conversations"][0]["from"]] != _conv.roles[0]: + # Skip the first one if it is not from human + source["conversations"] = source["conversations"][1:] + + _conv.messages = [] + for j, sentence in enumerate(source["conversations"]): + role = roles[sentence["from"]] + assert role == _conv.roles[j % 2], f"{i}" + _conv.append_message(role, sentence["value"]) + conversations.append(_conv.get_prompt()) + + # Tokenize conversations + input_ids = tokenizer( + conversations, + return_tensors="pt", + padding="max_length", + max_length=tokenizer.model_max_length, + truncation=True, + ).input_ids + targets = input_ids.clone() + + assert conv.sep_style == SeparatorStyle.ADD_COLON_TWO + + # Mask targets. Only compute loss on the assistant outputs. + sep = conv.sep + conv.roles[1] + ": " + for conversation, target in zip(conversations, targets): + total_len = int(target.ne(tokenizer.pad_token_id).sum()) + + turns = conversation.split(conv.sep2) + cur_len = 1 + target[:cur_len] = IGNORE_TOKEN_ID + for i, turn in enumerate(turns): + if turn == "": + break + turn_len = len(tokenizer(turn).input_ids) + + parts = turn.split(sep) + if len(parts) != 2: + break + parts[0] += sep + # "-2" is hardcoded for the LLaMA tokenizer to make the offset correct. + instruction_len = len(tokenizer(parts[0]).input_ids) - 2 + + # Ignore the user instructions + target[cur_len : cur_len + instruction_len] = IGNORE_TOKEN_ID + cur_len += turn_len + + target[cur_len:] = IGNORE_TOKEN_ID + + if cur_len < tokenizer.model_max_length: + if cur_len != total_len: + target[:] = IGNORE_TOKEN_ID + rank0_print( + f"WARNING: tokenization mismatch: {cur_len} vs. {total_len}." + f" (ignored)" + ) + + return dict( + input_ids=input_ids, + labels=targets, + attention_mask=input_ids.ne(tokenizer.pad_token_id), + ) + + +def convert_inst_resp_pairs_into_fastchat(ins: dict, reverse: bool = False) -> dict: + inst = ins["instruction"] if not reverse else ins["response"] + resp = ins["response"] if not reverse else ins["instruction"] + if "score" in ins: + source = "aug" + else: + source = "seed" + return { + "id": "", + "source": source, + "conversations": [ + {"from": "human", "value": inst}, + {"from": "gpt", "value": resp}, + ], + } + + +class SupervisedDataset(Dataset): + """Dataset for supervised fine-tuning.""" + + def __init__( + self, + raw_data, + tokenizer: PreTrainedTokenizer, + reverse: bool = False, + ): + super(SupervisedDataset, self).__init__() + + rank0_print("Formatting inputs...") + sources = [ + convert_inst_resp_pairs_into_fastchat(example, reverse=reverse) + for example in raw_data + ] + data_dict = preprocess(sources, tokenizer, reverse=reverse) + + self.input_ids = data_dict["input_ids"] + self.labels = data_dict["labels"] + self.attention_mask = data_dict["attention_mask"] + + def __len__(self): + return len(self.input_ids) + + def __getitem__(self, i) -> dict[str, torch.Tensor]: + return dict( + input_ids=self.input_ids[i], + labels=self.labels[i], + attention_mask=self.attention_mask[i], + ) + + +class LazySupervisedDataset(Dataset): + """Dataset for supervised fine-tuning.""" + + def __init__( + self, + raw_data, + tokenizer: PreTrainedTokenizer, + reverse: bool = False, + ): + super(LazySupervisedDataset, self).__init__() + self.tokenizer = tokenizer + self.reverse = reverse + + rank0_print("Formatting inputs...Skip in lazy mode") + self.tokenizer = tokenizer + self.raw_data = raw_data + self.cached_data_dict = {} + + def __len__(self): + return len(self.raw_data) + + def __getitem__(self, i) -> dict[str, torch.Tensor]: + if i in self.cached_data_dict: + return self.cached_data_dict[i] + + ret = preprocess( + [ + convert_inst_resp_pairs_into_fastchat( + self.raw_data[i], reverse=self.reverse + ) + ], + self.tokenizer, + reverse=self.reverse, + ) + ret = dict( + input_ids=ret["input_ids"][0], + labels=ret["labels"][0], + attention_mask=ret["attention_mask"][0], + ) + self.cached_data_dict[i] = ret + + return ret + + +def make_supervised_data_module(tokenizer: PreTrainedTokenizer, data_args) -> dict: + """Make dataset and collator for supervised fine-tuning.""" + dataset_cls = ( + LazySupervisedDataset if data_args.lazy_preprocess else SupervisedDataset + ) + rank0_print("Loading data...") + + train_data = load_jsonlines(data_args.data_path) + train_dataset = dataset_cls( + train_data, tokenizer=tokenizer, reverse=data_args.reverse + ) + + if data_args.eval_data_path: + eval_data = load_jsonlines(data_args.eval_data_path) + eval_dataset = dataset_cls( + eval_data, tokenizer=tokenizer, reverse=data_args.reverse + ) + else: + eval_dataset = None + + return dict(train_dataset=train_dataset, eval_dataset=eval_dataset) + + +class InferenceDataset(Dataset): + def __init__( + self, + data, + content_name: str = "content", + reverse: bool = False, + ): + self.data = data + self.reverse = reverse + self.content_name = content_name + + if reverse: + self.conv: Conversation = get_conv_template("vicuna_v1.1_reverse") + else: + self.conv: Conversation = get_conv_template("vicuna_v1.1") + + def __len__(self): + return len(self.data) + + def __getitem__(self, idx): + ins = self.data[idx] + self.conv.messages.clear() + self.conv.append_message(self.conv.roles[0], ins[self.content_name]) + self.conv.append_message(self.conv.roles[1], None) + prompt = self.conv.get_prompt() + return prompt + + def get_all(self): + return [self[i] for i in range(len(self))] + + +class CollateFnWithTokenization: + def __init__(self, tokenizer: PreTrainedTokenizer, max_seq_len: int = 2048) -> None: + self.tokenizer = tokenizer + self.max_seq_len = max_seq_len + + def __call__(self, batch): + outputs = self.tokenizer( + batch, + return_tensors="pt", + max_length=self.max_seq_len, + padding=True, + truncation=True, + ) + return outputs diff --git a/dalm/datasets/backtranslation/src/utils/__init__.py b/dalm/datasets/backtranslation/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dalm/datasets/backtranslation/src/utils/config.py b/dalm/datasets/backtranslation/src/utils/config.py new file mode 100644 index 0000000..6e1fd48 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/config.py @@ -0,0 +1,36 @@ +from dataclasses import dataclass, field + +from transformers import TrainingArguments + + +@dataclass +class ModelArguments: + model_name_or_path: str = field(default="meta-llama/Llama-2-7b-hf") + + +@dataclass +class DataArguments: + data_path: str = field( + default=None, metadata={"help": "Path to the training data."} + ) + eval_data_path: str = field( + default=None, metadata={"help": "Path to the evaluation data."} + ) + lazy_preprocess: bool = field(default=False) + reverse: bool = field( + default=False, + metadata={"help": "Reverse inst-resp for backward model $M_{yx}$ training"}, + ) + + +@dataclass +class TrainingArguments(TrainingArguments): + cache_dir: str | None = field(default=None) + optim: str = field(default="adamw_torch") + model_max_length: int = field( + default=2048, + metadata={ + "help": "Maximum sequence length. Sequences will be right padded (and possibly truncated)." + }, + ) + final_lr: float = field(default=1e-6, metadata={"help": "Final minimal lr"}) diff --git a/dalm/datasets/backtranslation/src/utils/constant.py b/dalm/datasets/backtranslation/src/utils/constant.py new file mode 100644 index 0000000..bd4fcf9 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/constant.py @@ -0,0 +1,3 @@ +from transformers.trainer_pt_utils import LabelSmoother + +IGNORE_TOKEN_ID = LabelSmoother.ignore_index diff --git a/dalm/datasets/backtranslation/src/utils/convert_vllm_to_alpaca_eval.py b/dalm/datasets/backtranslation/src/utils/convert_vllm_to_alpaca_eval.py new file mode 100644 index 0000000..e87cdd8 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/convert_vllm_to_alpaca_eval.py @@ -0,0 +1,27 @@ +import argparse + +from src.utils.io import dump_json, load_jsonlines + + +def main(args): + vllm_data = load_jsonlines(args.input_filepath) + alpaca_eval_data = [] + for ins in vllm_data: + alpaca_eval_data.append( + { + "dataset": ins["raw"]["dataset"], + "instruction": ins["raw"]["instruction"], + "output": ins["response"], + "generator": args.generator, + } + ) + dump_json(alpaca_eval_data, args.output_filepath) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--input_filepath", "-i", type=str, required=True) + parser.add_argument("--output_filepath", "-o", type=str, required=True) + parser.add_argument("--generator", "-g", default="Humback", type=str) + args = parser.parse_args() + main(args) diff --git a/dalm/datasets/backtranslation/src/utils/io.py b/dalm/datasets/backtranslation/src/utils/io.py new file mode 100644 index 0000000..7bbbf74 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/io.py @@ -0,0 +1,46 @@ +import json +from pathlib import Path + +import transformers + + +def dump_jsonlines(obj, filepath, **kwargs): + path = Path(filepath) + path.parent.mkdir(parents=True, exist_ok=True) + + with open(filepath, "wt", encoding="utf-8") as fout: + for d in obj: + line_d = json.dumps(d, ensure_ascii=False, **kwargs) + fout.write("{}\n".format(line_d)) + + +def load_jsonlines(filepath, **kwargs): + data = list() + with open(filepath, "rt", encoding="utf-8") as fin: + for line in fin: + line_data = json.loads(line.strip()) + data.append(line_data) + return data + + +def load_json(filepath, **kwargs): + with open(filepath, "rt", encoding="utf-8") as fin: + data = json.load(fin, **kwargs) + return data + + +def dump_json(obj, filepath, **kwargs): + path = Path(filepath) + path.parent.mkdir(parents=True, exist_ok=True) + + with open(filepath, "wt", encoding="utf-8") as fout: + json.dump(obj, fout, ensure_ascii=False, **kwargs) + + +def safe_save_model_for_hf_trainer(trainer: transformers.Trainer, output_dir: str): + """Collects the state dict and dump to disk.""" + state_dict = trainer.model.state_dict() + if trainer.args.should_save: + cpu_state_dict = {key: value.cpu() for key, value in state_dict.items()} + del state_dict + trainer._save(output_dir, state_dict=cpu_state_dict) # noqa diff --git a/dalm/datasets/backtranslation/src/utils/print.py b/dalm/datasets/backtranslation/src/utils/print.py new file mode 100644 index 0000000..94086c6 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/print.py @@ -0,0 +1,6 @@ +import os + + +def rank0_print(*args, **kwargs): + if os.environ.get("LOCAL_RANK", 0) == 0: + print(*args, **kwargs) diff --git a/dalm/datasets/backtranslation/src/utils/template.py b/dalm/datasets/backtranslation/src/utils/template.py new file mode 100644 index 0000000..0441086 --- /dev/null +++ b/dalm/datasets/backtranslation/src/utils/template.py @@ -0,0 +1,49 @@ +from fastchat.conversation import Conversation, SeparatorStyle, register_conv_template + +register_conv_template( + Conversation( + name="vicuna_v1.1_reverse", + system_message=( + "This is a chat between a curious user and a helpful artificial intelligence assistant. " + "Given the assistant's reponse, please predict the user's instruction." + ), + roles=("RESPONSE", "INSTRUCTION"), + messages=(), + offset=0, + sep_style=SeparatorStyle.ADD_COLON_TWO, + sep=" ", + sep2="", + ) +) + +register_conv_template( + Conversation( + name="vicuna_v1.1_aug", + system_message=( + "This is a chat between a curious user and a helpful artificial intelligence assistant. " + "Given the assistant's reponse, please predict the user's instruction in the style of an AI Assistant." + ), + roles=("USER", "ASSISTANT"), + messages=(), + offset=0, + sep_style=SeparatorStyle.ADD_COLON_TWO, + sep=" ", + sep2="", + ) +) + +register_conv_template( + Conversation( + name="vicuna_v1.1_seed", + system_message=( + "This is a chat between a curious user and a helpful artificial intelligence assistant. " + "The assistant gives helpful, detailed, and polite answers to the user's questions with knowledge from web search." + ), + roles=("USER", "ASSISTANT"), + messages=(), + offset=0, + sep_style=SeparatorStyle.ADD_COLON_TWO, + sep=" ", + sep2="", + ) +) diff --git a/dalm/datasets/backtranslation/tox.ini b/dalm/datasets/backtranslation/tox.ini new file mode 100644 index 0000000..e149be7 --- /dev/null +++ b/dalm/datasets/backtranslation/tox.ini @@ -0,0 +1,21 @@ +[flake8] +ignore= + # line length + E501, + # whitespace before ':' + E203, + # line break before binary operator + W503 +exclude = + # No need to traverse our git directory + .git, + # There's no value in checking cache directories + __pycache__, + # This contains our built documentation + build, + # This contains builds of flake8 that we don't want to check + dist, + bak, + data, + outputs, + debug.py \ No newline at end of file From 456560ce16abffdb5f7b9b13803a45fb92d84b32 Mon Sep 17 00:00:00 2001 From: Sachira Kuruppu Date: Sun, 26 Nov 2023 06:43:23 +0000 Subject: [PATCH 2/2] Update documentation on how to setup dependencies for backtranslation. --- dalm/datasets/backtranslation/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dalm/datasets/backtranslation/README.md b/dalm/datasets/backtranslation/README.md index ccd6db2..c33b690 100644 --- a/dalm/datasets/backtranslation/README.md +++ b/dalm/datasets/backtranslation/README.md @@ -10,9 +10,15 @@ The proposed Humback is a novel framework that can augment the instruction data ## 🌴 Dependencies -- Python==3.11.4 -- PyTorch==2.0.1 -- Others: [requirements.txt](./requirements.txt) +- Dependencies required for training are included in requirements_train.txt + - These dependencies are needed when running: + - `train_backward_Myx.sh` + - `train_seed.sh` +- Dependencies required for prediction are included in requirements_predict.txt + - These dependencies are needed when running: + - `self_aug.sh` + - `self_curation.sh` +- Create two separate conda environments for training and predicting. This is because vllm downgrades some of the libraries needed for training (e.g. torch). ## 🚀 QuickStart