From b0ce5a10326912961f0bc07cbbd250bab7b9c399 Mon Sep 17 00:00:00 2001
From: Fazzie-Maqianli <55798671+Fazziekey@users.noreply.github.com>
Date: Tue, 28 Mar 2023 20:25:36 +0800
Subject: [PATCH] [Coati] first commit (#3283)
---
applications/Chat/.gitignore | 146 +++++++++
applications/Chat/LICENSE | 202 +++++++++++++
applications/Chat/README.md | 269 +++++++++++++++++
applications/Chat/assets/data-collect.png | Bin 0 -> 410749 bytes
applications/Chat/assets/logo_coati.png | Bin 0 -> 655366 bytes
applications/Chat/assets/stage-3.jpeg | Bin 0 -> 378888 bytes
applications/Chat/benchmarks/README.md | 94 ++++++
.../Chat/benchmarks/benchmark_gpt_dummy.py | 184 ++++++++++++
.../Chat/benchmarks/benchmark_gpt_dummy.sh | 45 +++
.../benchmarks/benchmark_opt_lora_dummy.py | 179 +++++++++++
applications/Chat/coati/__init__.py | 0
applications/Chat/coati/dataset/__init__.py | 9 +
.../Chat/coati/dataset/prompt_dataset.py | 46 +++
.../Chat/coati/dataset/reward_dataset.py | 112 +++++++
.../Chat/coati/dataset/sft_dataset.py | 169 +++++++++++
applications/Chat/coati/dataset/utils.py | 22 ++
.../Chat/coati/experience_maker/__init__.py | 4 +
.../Chat/coati/experience_maker/base.py | 77 +++++
.../Chat/coati/experience_maker/naive.py | 35 +++
applications/Chat/coati/models/__init__.py | 4 +
.../Chat/coati/models/base/__init__.py | 6 +
applications/Chat/coati/models/base/actor.py | 65 ++++
applications/Chat/coati/models/base/critic.py | 54 ++++
applications/Chat/coati/models/base/lm.py | 30 ++
.../Chat/coati/models/base/reward_model.py | 41 +++
.../Chat/coati/models/bloom/__init__.py | 6 +
.../Chat/coati/models/bloom/bloom_actor.py | 35 +++
.../Chat/coati/models/bloom/bloom_critic.py | 38 +++
.../Chat/coati/models/bloom/bloom_lm.py | 35 +++
.../Chat/coati/models/bloom/bloom_rm.py | 37 +++
.../Chat/coati/models/deberta/__init__.py | 4 +
.../coati/models/deberta/deberta_critic.py | 36 +++
.../Chat/coati/models/deberta/deberta_rm.py | 37 +++
applications/Chat/coati/models/generation.py | 146 +++++++++
.../Chat/coati/models/generation_utils.py | 92 ++++++
.../Chat/coati/models/gpt/__init__.py | 6 +
.../Chat/coati/models/gpt/gpt_actor.py | 35 +++
.../Chat/coati/models/gpt/gpt_critic.py | 37 +++
applications/Chat/coati/models/gpt/gpt_lm.py | 35 +++
applications/Chat/coati/models/gpt/gpt_rm.py | 39 +++
.../Chat/coati/models/llama/__init__.py | 6 +
.../Chat/coati/models/llama/llama_actor.py | 38 +++
.../Chat/coati/models/llama/llama_critic.py | 42 +++
.../Chat/coati/models/llama/llama_lm.py | 40 +++
.../Chat/coati/models/llama/llama_rm.py | 40 +++
applications/Chat/coati/models/lora.py | 129 ++++++++
applications/Chat/coati/models/loss.py | 117 ++++++++
.../Chat/coati/models/opt/__init__.py | 6 +
.../Chat/coati/models/opt/opt_actor.py | 35 +++
.../Chat/coati/models/opt/opt_critic.py | 38 +++
applications/Chat/coati/models/opt/opt_lm.py | 35 +++
applications/Chat/coati/models/opt/opt_rm.py | 38 +++
applications/Chat/coati/models/utils.py | 92 ++++++
.../Chat/coati/replay_buffer/__init__.py | 4 +
applications/Chat/coati/replay_buffer/base.py | 43 +++
.../Chat/coati/replay_buffer/naive.py | 57 ++++
.../Chat/coati/replay_buffer/utils.py | 73 +++++
applications/Chat/coati/trainer/__init__.py | 6 +
applications/Chat/coati/trainer/base.py | 168 +++++++++++
.../Chat/coati/trainer/callbacks/__init__.py | 5 +
.../Chat/coati/trainer/callbacks/base.py | 39 +++
.../callbacks/performance_evaluator.py | 133 ++++++++
.../trainer/callbacks/save_checkpoint.py | 75 +++++
applications/Chat/coati/trainer/ppo.py | 135 +++++++++
applications/Chat/coati/trainer/rm.py | 135 +++++++++
applications/Chat/coati/trainer/sft.py | 158 ++++++++++
.../Chat/coati/trainer/strategies/__init__.py | 6 +
.../Chat/coati/trainer/strategies/base.py | 136 +++++++++
.../coati/trainer/strategies/colossalai.py | 213 +++++++++++++
.../Chat/coati/trainer/strategies/ddp.py | 93 ++++++
.../Chat/coati/trainer/strategies/naive.py | 55 ++++
.../Chat/coati/trainer/strategies/sampler.py | 32 ++
applications/Chat/coati/trainer/utils.py | 5 +
applications/Chat/coati/utils/__init__.py | 3 +
.../Chat/coati/utils/tokenizer_utils.py | 78 +++++
applications/Chat/examples/README.md | 141 +++++++++
applications/Chat/examples/inference.py | 59 ++++
applications/Chat/examples/requirements.txt | 2 +
applications/Chat/examples/test_ci.sh | 97 ++++++
applications/Chat/examples/train_dummy.py | 148 +++++++++
applications/Chat/examples/train_dummy.sh | 18 ++
applications/Chat/examples/train_prompts.py | 199 ++++++++++++
applications/Chat/examples/train_prompts.sh | 18 ++
.../Chat/examples/train_reward_model.py | 160 ++++++++++
applications/Chat/examples/train_rm.sh | 8 +
applications/Chat/examples/train_sft.py | 184 ++++++++++++
applications/Chat/examples/train_sft.sh | 12 +
applications/Chat/inference/README.md | 111 +++++++
applications/Chat/inference/benchmark.py | 132 ++++++++
.../Chat/inference/llama_gptq/__init__.py | 5 +
.../Chat/inference/llama_gptq/loader.py | 41 +++
.../Chat/inference/llama_gptq/model_utils.py | 13 +
.../Chat/inference/llama_gptq/quant.py | 283 ++++++++++++++++++
applications/Chat/inference/locustfile.py | 27 ++
applications/Chat/inference/requirements.txt | 10 +
applications/Chat/inference/server.py | 165 ++++++++++
.../Chat/inference/tests/test_chat_prompt.py | 56 ++++
applications/Chat/inference/utils.py | 179 +++++++++++
applications/Chat/pytest.ini | 6 +
applications/Chat/requirements-test.txt | 1 +
applications/Chat/requirements.txt | 13 +
applications/Chat/setup.py | 41 +++
applications/Chat/tests/__init__.py | 0
applications/Chat/tests/test_checkpoint.py | 98 ++++++
applications/Chat/tests/test_data.py | 122 ++++++++
applications/Chat/version.txt | 1 +
106 files changed, 7069 insertions(+)
create mode 100644 applications/Chat/.gitignore
create mode 100644 applications/Chat/LICENSE
create mode 100644 applications/Chat/README.md
create mode 100644 applications/Chat/assets/data-collect.png
create mode 100644 applications/Chat/assets/logo_coati.png
create mode 100644 applications/Chat/assets/stage-3.jpeg
create mode 100644 applications/Chat/benchmarks/README.md
create mode 100644 applications/Chat/benchmarks/benchmark_gpt_dummy.py
create mode 100755 applications/Chat/benchmarks/benchmark_gpt_dummy.sh
create mode 100644 applications/Chat/benchmarks/benchmark_opt_lora_dummy.py
create mode 100644 applications/Chat/coati/__init__.py
create mode 100644 applications/Chat/coati/dataset/__init__.py
create mode 100644 applications/Chat/coati/dataset/prompt_dataset.py
create mode 100644 applications/Chat/coati/dataset/reward_dataset.py
create mode 100644 applications/Chat/coati/dataset/sft_dataset.py
create mode 100644 applications/Chat/coati/dataset/utils.py
create mode 100644 applications/Chat/coati/experience_maker/__init__.py
create mode 100644 applications/Chat/coati/experience_maker/base.py
create mode 100644 applications/Chat/coati/experience_maker/naive.py
create mode 100644 applications/Chat/coati/models/__init__.py
create mode 100644 applications/Chat/coati/models/base/__init__.py
create mode 100644 applications/Chat/coati/models/base/actor.py
create mode 100644 applications/Chat/coati/models/base/critic.py
create mode 100644 applications/Chat/coati/models/base/lm.py
create mode 100644 applications/Chat/coati/models/base/reward_model.py
create mode 100644 applications/Chat/coati/models/bloom/__init__.py
create mode 100644 applications/Chat/coati/models/bloom/bloom_actor.py
create mode 100644 applications/Chat/coati/models/bloom/bloom_critic.py
create mode 100644 applications/Chat/coati/models/bloom/bloom_lm.py
create mode 100644 applications/Chat/coati/models/bloom/bloom_rm.py
create mode 100644 applications/Chat/coati/models/deberta/__init__.py
create mode 100644 applications/Chat/coati/models/deberta/deberta_critic.py
create mode 100644 applications/Chat/coati/models/deberta/deberta_rm.py
create mode 100644 applications/Chat/coati/models/generation.py
create mode 100644 applications/Chat/coati/models/generation_utils.py
create mode 100644 applications/Chat/coati/models/gpt/__init__.py
create mode 100644 applications/Chat/coati/models/gpt/gpt_actor.py
create mode 100644 applications/Chat/coati/models/gpt/gpt_critic.py
create mode 100644 applications/Chat/coati/models/gpt/gpt_lm.py
create mode 100644 applications/Chat/coati/models/gpt/gpt_rm.py
create mode 100644 applications/Chat/coati/models/llama/__init__.py
create mode 100644 applications/Chat/coati/models/llama/llama_actor.py
create mode 100644 applications/Chat/coati/models/llama/llama_critic.py
create mode 100644 applications/Chat/coati/models/llama/llama_lm.py
create mode 100644 applications/Chat/coati/models/llama/llama_rm.py
create mode 100644 applications/Chat/coati/models/lora.py
create mode 100644 applications/Chat/coati/models/loss.py
create mode 100644 applications/Chat/coati/models/opt/__init__.py
create mode 100644 applications/Chat/coati/models/opt/opt_actor.py
create mode 100644 applications/Chat/coati/models/opt/opt_critic.py
create mode 100644 applications/Chat/coati/models/opt/opt_lm.py
create mode 100644 applications/Chat/coati/models/opt/opt_rm.py
create mode 100644 applications/Chat/coati/models/utils.py
create mode 100644 applications/Chat/coati/replay_buffer/__init__.py
create mode 100644 applications/Chat/coati/replay_buffer/base.py
create mode 100644 applications/Chat/coati/replay_buffer/naive.py
create mode 100644 applications/Chat/coati/replay_buffer/utils.py
create mode 100644 applications/Chat/coati/trainer/__init__.py
create mode 100644 applications/Chat/coati/trainer/base.py
create mode 100644 applications/Chat/coati/trainer/callbacks/__init__.py
create mode 100644 applications/Chat/coati/trainer/callbacks/base.py
create mode 100644 applications/Chat/coati/trainer/callbacks/performance_evaluator.py
create mode 100644 applications/Chat/coati/trainer/callbacks/save_checkpoint.py
create mode 100644 applications/Chat/coati/trainer/ppo.py
create mode 100644 applications/Chat/coati/trainer/rm.py
create mode 100644 applications/Chat/coati/trainer/sft.py
create mode 100644 applications/Chat/coati/trainer/strategies/__init__.py
create mode 100644 applications/Chat/coati/trainer/strategies/base.py
create mode 100644 applications/Chat/coati/trainer/strategies/colossalai.py
create mode 100644 applications/Chat/coati/trainer/strategies/ddp.py
create mode 100644 applications/Chat/coati/trainer/strategies/naive.py
create mode 100644 applications/Chat/coati/trainer/strategies/sampler.py
create mode 100644 applications/Chat/coati/trainer/utils.py
create mode 100644 applications/Chat/coati/utils/__init__.py
create mode 100644 applications/Chat/coati/utils/tokenizer_utils.py
create mode 100644 applications/Chat/examples/README.md
create mode 100644 applications/Chat/examples/inference.py
create mode 100644 applications/Chat/examples/requirements.txt
create mode 100755 applications/Chat/examples/test_ci.sh
create mode 100644 applications/Chat/examples/train_dummy.py
create mode 100755 applications/Chat/examples/train_dummy.sh
create mode 100644 applications/Chat/examples/train_prompts.py
create mode 100755 applications/Chat/examples/train_prompts.sh
create mode 100644 applications/Chat/examples/train_reward_model.py
create mode 100755 applications/Chat/examples/train_rm.sh
create mode 100644 applications/Chat/examples/train_sft.py
create mode 100755 applications/Chat/examples/train_sft.sh
create mode 100644 applications/Chat/inference/README.md
create mode 100644 applications/Chat/inference/benchmark.py
create mode 100644 applications/Chat/inference/llama_gptq/__init__.py
create mode 100644 applications/Chat/inference/llama_gptq/loader.py
create mode 100644 applications/Chat/inference/llama_gptq/model_utils.py
create mode 100644 applications/Chat/inference/llama_gptq/quant.py
create mode 100644 applications/Chat/inference/locustfile.py
create mode 100644 applications/Chat/inference/requirements.txt
create mode 100644 applications/Chat/inference/server.py
create mode 100644 applications/Chat/inference/tests/test_chat_prompt.py
create mode 100644 applications/Chat/inference/utils.py
create mode 100644 applications/Chat/pytest.ini
create mode 100644 applications/Chat/requirements-test.txt
create mode 100644 applications/Chat/requirements.txt
create mode 100644 applications/Chat/setup.py
create mode 100644 applications/Chat/tests/__init__.py
create mode 100644 applications/Chat/tests/test_checkpoint.py
create mode 100644 applications/Chat/tests/test_data.py
create mode 100644 applications/Chat/version.txt
diff --git a/applications/Chat/.gitignore b/applications/Chat/.gitignore
new file mode 100644
index 000000000..1ec5f53a8
--- /dev/null
+++ b/applications/Chat/.gitignore
@@ -0,0 +1,146 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+docs/.build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# IDE
+.idea/
+.vscode/
+
+# macos
+*.DS_Store
+#data/
+
+docs/.build
+
+# pytorch checkpoint
+*.pt
+
+# wandb log
+example/wandb/
diff --git a/applications/Chat/LICENSE b/applications/Chat/LICENSE
new file mode 100644
index 000000000..0528c89ea
--- /dev/null
+++ b/applications/Chat/LICENSE
@@ -0,0 +1,202 @@
+Copyright 2021- HPC-AI Technology Inc. All rights reserved.
+ 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 2021- HPC-AI Technology Inc.
+
+ 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/applications/Chat/README.md b/applications/Chat/README.md
new file mode 100644
index 000000000..731005ab2
--- /dev/null
+++ b/applications/Chat/README.md
@@ -0,0 +1,269 @@
+
+ Coati - ColossalAI Talking Intelligence
+
+
+
+
+## Table of Contents
+
+- [Table of Contents](#table-of-contents)
+- [What is Coati ?](#what-is-coati-)
+- [Online demo](#online-demo)
+- [Install](#install)
+ - [Install the environment](#install-the-environment)
+ - [Install the Transformers](#install-the-transformers)
+- [How to use?](#how-to-use)
+ - [Supervised datasets collection](#supervised-datasets-collection)
+ - [Stage1 - Supervised instructs tuning](#stage1---supervised-instructs-tuning)
+ - [Stage2 - Training reward model](#stage2---training-reward-model)
+ - [Stage3 - Training model with reinforcement learning by human feedback](#stage3---training-model-with-reinforcement-learning-by-human-feedback)
+- [Coati7B examples](#coati7b-examples)
+- [FAQ](#faq)
+ - [How to save/load checkpoint](#how-to-saveload-checkpoint)
+- [The Plan](#the-plan)
+ - [Real-time progress](#real-time-progress)
+- [Invitation to open-source contribution](#invitation-to-open-source-contribution)
+- [Quick Preview](#quick-preview)
+- [Authors](#authors)
+- [Citations](#citations)
+- [Licenses](#licenses)
+---
+## What is Coati ?
+
+Coati is a large language model developed by Colossal-AI, which is also a unified large language model framework that has implemented the following functions
+- Supports comprehensive large-model training acceleration capabilities for ColossalAI, without requiring knowledge of complex distributed training algorithms
+- Supervised datasets collection
+- Supervised insturcts fine-tuning
+- Training reward model
+- Reinforcement learning with human feedback
+- Quantization inference
+- Fast model deploying
+- Perfectly integration with the Hugging Face ecosystem, high degree of model customization
+
+
+More details can be found in the [blog](https://www.hpc-ai.tech/blog/colossal-ai-chatgpt).
+
+
+
+
+
+## Online demo
+You can experience the performance of Coati7B on this page.
+
+[chat.colossalai.org](https://chat.colossalai.org/)
+
+> Warning: Due to model and dataset size limitations, Coati is just a baby model, Coati7B may output incorrect information and lack the ability for multi-turn dialogue. There is still significant room for improvement.
+## Install
+
+### Install the environment
+
+```shell
+conda creat -n coati
+conda activate coati
+pip install .
+```
+
+### Install the Transformers
+Given Hugging Face hasn't officially supported the LLaMA models, We fork a branch of Transformers that can be compatible with our code
+
+```shell
+git clone https://github.com/hpcaitech/transformers
+cd transformers
+pip install .
+```
+
+## How to use?
+
+### Supervised datasets collection
+
+we colllected 104K bilingual dataset of Chinese and English, and you can find the datasets in this repo
+
+Here is how we collected the data
+
+
+
+
+### Stage1 - Supervised instructs tuning
+
+Stage1 is supervised instructs fine-tuning, which uses the datasets mentioned earlier to fine-tune the model
+
+you can run the `examples/train_sft.sh` to start a supervised instructs fine-tuning
+
+```
+torchrun --standalone --nproc_per_node=4 train_sft.py \
+ --pretrain "/path/to/LLaMa-7B/" \
+ --model 'llama' \
+ --strategy colossalai_zero2 \
+ --log_interval 10 \
+ --save_path /path/to/Coati-7B \
+ --dataset /path/to/data.json \
+ --batch_size 4 \
+ --accimulation_steps 8 \
+ --lr 2e-5 \
+ --max_datasets_size 512 \
+ --max_epochs 1 \
+```
+
+### Stage2 - Training reward model
+
+Stage2 trains a reward model, which obtains corresponding scores by manually ranking different outputs for the same prompt and supervises the training of the reward model
+
+you can run the `examples/train_rm.sh` to start a reward model training
+
+```
+torchrun --standalone --nproc_per_node=4 train_reward_model.py
+ --pretrain "/path/to/LLaMa-7B/" \
+ --model 'llama' \
+ --strategy colossalai_zero2 \
+ --loss_fn 'log_exp'\
+ --save_path 'rmstatic.pt' \
+```
+
+### Stage3 - Training model with reinforcement learning by human feedback
+
+Stage3 uses reinforcement learning algorithm, which is the most complex part of the training process:
+
+
+
+
+
+you can run the `examples/train_prompts.sh` to start training PPO with human feedback
+
+```
+torchrun --standalone --nproc_per_node=4 train_prompts.py prompts.csv \
+ --pretrain "/path/to/LLaMa-7B/" \
+ --model 'llama' \
+ --strategy colossalai_zero2
+```
+
+
+For more details, see `examples/`.
+
+We also support training reward model with true-world data. See `examples/train_reward_model.py`.
+
+## Coati7B examples
+
+
+## FAQ
+
+### How to save/load checkpoint
+
+We have integrated the Transformers save and load pipeline, allowing users to freely call Hugging Face's language models and save them in the HF format.
+
+```
+from coati.models.llama import LlamaLM
+from coati.trainer import SFTTrainer
+
+model = LlamaLM(pretrained=args.pretrain)
+tokenizer = AutoTokenizer.from_pretrained(args.pretrain)
+
+trainer = SFTTrainer(model=model,
+ strategy=strategy,
+ optim=optim,
+ train_dataloader=train_dataloader,
+ eval_dataloader=eval_dataloader,
+ batch_size=args.batch_size,
+ max_epochs=args.max_epochs,
+ accimulation_steps = args.accimulation_steps
+)
+
+trainer.fit()
+trainer.save_model(path=args.save_path, only_rank0=True, tokenizer=tokenizer)
+```
+
+## The Plan
+
+- [x] implement PPO fine-tuning
+- [x] implement training reward model
+- [x] support LoRA
+- [x] support inference
+- [x] open source the reward model weight
+- [x] support llama from [facebook](https://github.com/facebookresearch/llama)
+- [x] implement PPO-ptx fine-tuning
+- [ ] integrate with Ray
+- [ ] support more RL paradigms, like Implicit Language Q-Learning (ILQL),
+- [ ] support chain of throught by [langchain](https://github.com/hwchase17/langchain)
+
+### Real-time progress
+You will find our progress in github project broad
+
+[Coati](https://github.com/orgs/hpcaitech/projects/17/views/1)
+
+## Invitation to open-source contribution
+Referring to the successful attempts of [BLOOM](https://bigscience.huggingface.co/) and [Stable Diffusion](https://en.wikipedia.org/wiki/Stable_Diffusion), any and all developers and partners with computing powers, datasets, models are welcome to join and build the Colossal-AI community, making efforts towards the era of big AI models from the starting point of replicating ChatGPT!
+
+You may contact us or participate in the following ways:
+1. [Leaving a Star ⭐](https://github.com/hpcaitech/ColossalAI/stargazers) to show your like and support. Thanks!
+2. Posting an [issue](https://github.com/hpcaitech/ColossalAI/issues/new/choose), or submitting a PR on GitHub follow the guideline in [Contributing](https://github.com/hpcaitech/ColossalAI/blob/main/CONTRIBUTING.md).
+3. Join the Colossal-AI community on
+[Slack](https://join.slack.com/t/colossalaiworkspace/shared_invite/zt-z7b26eeb-CBp7jouvu~r0~lcFzX832w),
+and [WeChat(微信)](https://raw.githubusercontent.com/hpcaitech/public_assets/main/colossalai/img/WeChat.png "qrcode") to share your ideas.
+4. Send your official proposal to email contact@hpcaitech.com
+
+Thanks so much to all of our amazing contributors!
+
+## Quick Preview
+
+
+
+
+- Up to 7.73 times faster for single server training and 1.42 times faster for single-GPU inference
+
+
+
+
+
+- Up to 10.3x growth in model capacity on one GPU
+- A mini demo training process requires only 1.62GB of GPU memory (any consumer-grade GPU)
+
+
+
+
+
+- Increase the capacity of the fine-tuning model by up to 3.7 times on a single GPU
+- Keep in a sufficiently high running speed
+
+## Authors
+
+Coati is developed by ColossalAI Team: [Fazzie](https://fazzie-key.cool/about/index.html), [FrankLeeeee](https://github.com/FrankLeeeee), [BlueRum](https://github.com/ht-zhou), [ver217](https://github.com/ver217)
+
+The Phd student [Zangwei Zheng](https://github.com/zhengzangw) and [Xue Fuzhao](https://github.com/XueFuzhao) also contributed a lot to this project.
+
+## Citations
+
+```bibtex
+@article{Hu2021LoRALA,
+ title = {LoRA: Low-Rank Adaptation of Large Language Models},
+ author = {Edward J. Hu and Yelong Shen and Phillip Wallis and Zeyuan Allen-Zhu and Yuanzhi Li and Shean Wang and Weizhu Chen},
+ journal = {ArXiv},
+ year = {2021},
+ volume = {abs/2106.09685}
+}
+
+@article{ouyang2022training,
+ title={Training language models to follow instructions with human feedback},
+ author={Ouyang, Long and Wu, Jeff and Jiang, Xu and Almeida, Diogo and Wainwright, Carroll L and Mishkin, Pamela and Zhang, Chong and Agarwal, Sandhini and Slama, Katarina and Ray, Alex and others},
+ journal={arXiv preprint arXiv:2203.02155},
+ year={2022}
+}
+
+@article{touvron2023llama,
+ title={LLaMA: Open and Efficient Foundation Language Models},
+ author={Touvron, Hugo and Lavril, Thibaut and Izacard, Gautier and Martinet, Xavier and Lachaux, Marie-Anne and Lacroix, Timoth{\'e}e and Rozi{\`e}re, Baptiste and Goyal, Naman and Hambro, Eric and Azhar, Faisal and Rodriguez, Aurelien and Joulin, Armand and Grave, Edouard and Lample, Guillaume},
+ journal={arXiv preprint arXiv:2302.13971},
+ year={2023}
+}
+
+@misc{alpaca,
+ author = {Rohan Taori and Ishaan Gulrajani and Tianyi Zhang and Yann Dubois and Xuechen Li and Carlos Guestrin and Percy Liang and Tatsunori B. Hashimoto },
+ title = {Stanford Alpaca: An Instruction-following LLaMA model},
+ year = {2023},
+ publisher = {GitHub},
+ journal = {GitHub repository},
+ howpublished = {\url{https://github.com/tatsu-lab/stanford_alpaca}},
+}
+```
+
+## Licenses
+
+Coati is licensed under the [Apache 2.0 License](LICENSE).
diff --git a/applications/Chat/assets/data-collect.png b/applications/Chat/assets/data-collect.png
new file mode 100644
index 0000000000000000000000000000000000000000..15eb662201b987dfa1f2de8872271bcc964b10e0
GIT binary patch
literal 410749
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 |