Upload 21 files
Browse files- .gitattributes +12 -0
- .gitignore +160 -0
- BERTopic +3 -0
- Dockerfile +16 -0
- LICENSE +21 -0
- LICENSE.txt +126 -0
- MANIFEST.in +3 -0
- Notice +1 -0
- Pipfile +14 -0
- Pipfile.lock +864 -0
- README.md +323 -18
- README_zh.md +330 -0
- USE_POLICY.md +50 -0
- batch_throttle.py +23 -0
- config.json +3 -0
- convert.py +208 -0
- docker-compose.yml +9 -0
- example.py +61 -0
- requirements.txt +6 -0
- setup.py +139 -0
- test_inference.py +219 -0
.gitattributes
CHANGED
@@ -33,3 +33,15 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
codellama-7b-instruct.Q2_K.gguf filter=lfs diff=lfs merge=lfs -text
|
37 |
+
codellama-7b-instruct.Q3_K_S.gguf filter=lfs diff=lfs merge=lfs -text
|
38 |
+
codellama-7b-instruct.Q3_K_M.gguf filter=lfs diff=lfs merge=lfs -text
|
39 |
+
codellama-7b-instruct.Q3_K_L.gguf filter=lfs diff=lfs merge=lfs -text
|
40 |
+
codellama-7b-instruct.Q4_K_S.gguf filter=lfs diff=lfs merge=lfs -text
|
41 |
+
codellama-7b-instruct.Q4_K_M.gguf filter=lfs diff=lfs merge=lfs -text
|
42 |
+
codellama-7b-instruct.Q5_K_S.gguf filter=lfs diff=lfs merge=lfs -text
|
43 |
+
codellama-7b-instruct.Q5_K_M.gguf filter=lfs diff=lfs merge=lfs -text
|
44 |
+
codellama-7b-instruct.Q6_K.gguf filter=lfs diff=lfs merge=lfs -text
|
45 |
+
codellama-7b-instruct.Q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
46 |
+
codellama-7b-instruct.Q4_0.gguf filter=lfs diff=lfs merge=lfs -text
|
47 |
+
codellama-7b-instruct.Q5_0.gguf filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
share/python-wheels/
|
24 |
+
*.egg-info/
|
25 |
+
.installed.cfg
|
26 |
+
*.egg
|
27 |
+
MANIFEST
|
28 |
+
|
29 |
+
# PyInstaller
|
30 |
+
# Usually these files are written by a python script from a template
|
31 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32 |
+
*.manifest
|
33 |
+
*.spec
|
34 |
+
|
35 |
+
# Installer logs
|
36 |
+
pip-log.txt
|
37 |
+
pip-delete-this-directory.txt
|
38 |
+
|
39 |
+
# Unit test / coverage reports
|
40 |
+
htmlcov/
|
41 |
+
.tox/
|
42 |
+
.nox/
|
43 |
+
.coverage
|
44 |
+
.coverage.*
|
45 |
+
.cache
|
46 |
+
nosetests.xml
|
47 |
+
coverage.xml
|
48 |
+
*.cover
|
49 |
+
*.py,cover
|
50 |
+
.hypothesis/
|
51 |
+
.pytest_cache/
|
52 |
+
cover/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
.pybuilder/
|
76 |
+
target/
|
77 |
+
|
78 |
+
# Jupyter Notebook
|
79 |
+
.ipynb_checkpoints
|
80 |
+
|
81 |
+
# IPython
|
82 |
+
profile_default/
|
83 |
+
ipython_config.py
|
84 |
+
|
85 |
+
# pyenv
|
86 |
+
# For a library or package, you might want to ignore these files since the code is
|
87 |
+
# intended to run in multiple environments; otherwise, check them in:
|
88 |
+
# .python-version
|
89 |
+
|
90 |
+
# pipenv
|
91 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94 |
+
# install all needed dependencies.
|
95 |
+
#Pipfile.lock
|
96 |
+
|
97 |
+
# poetry
|
98 |
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
99 |
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100 |
+
# commonly ignored for libraries.
|
101 |
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
102 |
+
#poetry.lock
|
103 |
+
|
104 |
+
# pdm
|
105 |
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
106 |
+
#pdm.lock
|
107 |
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
108 |
+
# in version control.
|
109 |
+
# https://pdm.fming.dev/#use-with-ide
|
110 |
+
.pdm.toml
|
111 |
+
|
112 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
113 |
+
__pypackages__/
|
114 |
+
|
115 |
+
# Celery stuff
|
116 |
+
celerybeat-schedule
|
117 |
+
celerybeat.pid
|
118 |
+
|
119 |
+
# SageMath parsed files
|
120 |
+
*.sage.py
|
121 |
+
|
122 |
+
# Environments
|
123 |
+
.env
|
124 |
+
.venv
|
125 |
+
env/
|
126 |
+
venv/
|
127 |
+
ENV/
|
128 |
+
env.bak/
|
129 |
+
venv.bak/
|
130 |
+
|
131 |
+
# Spyder project settings
|
132 |
+
.spyderproject
|
133 |
+
.spyproject
|
134 |
+
|
135 |
+
# Rope project settings
|
136 |
+
.ropeproject
|
137 |
+
|
138 |
+
# mkdocs documentation
|
139 |
+
/site
|
140 |
+
|
141 |
+
# mypy
|
142 |
+
.mypy_cache/
|
143 |
+
.dmypy.json
|
144 |
+
dmypy.json
|
145 |
+
|
146 |
+
# Pyre type checker
|
147 |
+
.pyre/
|
148 |
+
|
149 |
+
# pytype static type analyzer
|
150 |
+
.pytype/
|
151 |
+
|
152 |
+
# Cython debug symbols
|
153 |
+
cython_debug/
|
154 |
+
|
155 |
+
# PyCharm
|
156 |
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
157 |
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
158 |
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
159 |
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
160 |
+
#.idea/
|
BERTopic
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from bertopic import BERTopic
|
2 |
+
|
3 |
+
model = BERTopic.load("PetraAI/Nashmi")
|
Dockerfile
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3-alpine
|
2 |
+
|
3 |
+
WORKDIR /app
|
4 |
+
COPY ./requirements.txt /app
|
5 |
+
COPY ./src/* /app
|
6 |
+
|
7 |
+
RUN pip3 install -r requirements.txt
|
8 |
+
|
9 |
+
ENV PORT=5500
|
10 |
+
EXPOSE "$PORT/tcp"
|
11 |
+
|
12 |
+
#ENTRYPOINT nginx && uwsgi --ini /app/params.ini -w FreeGPT4_Server
|
13 |
+
#shell form necessary
|
14 |
+
SHELL ["python3","/app/FreeGPT4_Server.py"]
|
15 |
+
ENTRYPOINT ["python3","/app/FreeGPT4_Server.py"]
|
16 |
+
CMD ["--cookie-file","/cookies.json"]
|
LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MIT License
|
2 |
+
|
3 |
+
Copyright (c) 2023 潘其威(William)
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 |
+
of this software and associated documentation files (the "Software"), to deal
|
7 |
+
in the Software without restriction, including without limitation the rights
|
8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9 |
+
copies of the Software, and to permit persons to whom the Software is
|
10 |
+
furnished to do so, subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21 |
+
SOFTWARE.
|
LICENSE.txt
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
LLAMA 2 COMMUNITY LICENSE AGREEMENT
|
2 |
+
Llama 2 Version Release Date: July 18, 2023
|
3 |
+
|
4 |
+
"Agreement" means the terms and conditions for use, reproduction, distribution and
|
5 |
+
modification of the Llama Materials set forth herein.
|
6 |
+
|
7 |
+
"Documentation" means the specifications, manuals and documentation
|
8 |
+
accompanying Llama 2 distributed by Meta at ai.meta.com/resources/models-and-
|
9 |
+
libraries/llama-downloads/.
|
10 |
+
|
11 |
+
"Licensee" or "you" means you, or your employer or any other person or entity (if
|
12 |
+
you are entering into this Agreement on such person or entity's behalf), of the age
|
13 |
+
required under applicable laws, rules or regulations to provide legal consent and that
|
14 |
+
has legal authority to bind your employer or such other person or entity if you are
|
15 |
+
entering in this Agreement on their behalf.
|
16 |
+
|
17 |
+
"Llama 2" means the foundational large language models and software and
|
18 |
+
algorithms, including machine-learning model code, trained model weights,
|
19 |
+
inference-enabling code, training-enabling code, fine-tuning enabling code and other
|
20 |
+
elements of the foregoing distributed by Meta at ai.meta.com/resources/models-and-
|
21 |
+
libraries/llama-downloads/.
|
22 |
+
|
23 |
+
"Llama Materials" means, collectively, Meta's proprietary Llama 2 and
|
24 |
+
Documentation (and any portion thereof) made available under this Agreement.
|
25 |
+
|
26 |
+
"Meta" or "we" means Meta Platforms Ireland Limited (if you are located in or, if you
|
27 |
+
are an entity, your principal place of business is in the EEA or Switzerland) and Meta
|
28 |
+
Platforms, Inc. (if you are located outside of the EEA or Switzerland).
|
29 |
+
|
30 |
+
By clicking "I Accept" below or by using or distributing any portion or element of the
|
31 |
+
Llama Materials, you agree to be bound by this Agreement.
|
32 |
+
|
33 |
+
1. License Rights and Redistribution.
|
34 |
+
|
35 |
+
a. Grant of Rights. You are granted a non-exclusive, worldwide, non-
|
36 |
+
transferable and royalty-free limited license under Meta's intellectual property or
|
37 |
+
other rights owned by Meta embodied in the Llama Materials to use, reproduce,
|
38 |
+
distribute, copy, create derivative works of, and make modifications to the Llama
|
39 |
+
Materials.
|
40 |
+
|
41 |
+
b. Redistribution and Use.
|
42 |
+
|
43 |
+
i. If you distribute or make the Llama Materials, or any derivative works
|
44 |
+
thereof, available to a third party, you shall provide a copy of this Agreement to such
|
45 |
+
third party.
|
46 |
+
ii. If you receive Llama Materials, or any derivative works thereof, from
|
47 |
+
a Licensee as part of an integrated end user product, then Section 2 of this
|
48 |
+
Agreement will not apply to you.
|
49 |
+
|
50 |
+
iii. You must retain in all copies of the Llama Materials that you
|
51 |
+
distribute the following attribution notice within a "Notice" text file distributed as a
|
52 |
+
part of such copies: "Llama 2 is licensed under the LLAMA 2 Community License,
|
53 |
+
Copyright (c) Meta Platforms, Inc. All Rights Reserved."
|
54 |
+
|
55 |
+
iv. Your use of the Llama Materials must comply with applicable laws
|
56 |
+
and regulations (including trade compliance laws and regulations) and adhere to the
|
57 |
+
Acceptable Use Policy for the Llama Materials (available at
|
58 |
+
https://ai.meta.com/llama/use-policy), which is hereby incorporated by reference into
|
59 |
+
this Agreement.
|
60 |
+
|
61 |
+
v. You will not use the Llama Materials or any output or results of the
|
62 |
+
Llama Materials to improve any other large language model (excluding Llama 2 or
|
63 |
+
derivative works thereof).
|
64 |
+
|
65 |
+
2. Additional Commercial Terms. If, on the Llama 2 version release date, the
|
66 |
+
monthly active users of the products or services made available by or for Licensee,
|
67 |
+
or Licensee's affiliates, is greater than 700 million monthly active users in the
|
68 |
+
preceding calendar month, you must request a license from Meta, which Meta may
|
69 |
+
grant to you in its sole discretion, and you are not authorized to exercise any of the
|
70 |
+
rights under this Agreement unless or until Meta otherwise expressly grants you
|
71 |
+
such rights.
|
72 |
+
|
73 |
+
3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE LAW, THE
|
74 |
+
LLAMA MATERIALS AND ANY OUTPUT AND RESULTS THEREFROM ARE
|
75 |
+
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
76 |
+
EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY
|
77 |
+
WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR
|
78 |
+
FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE
|
79 |
+
FOR DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING
|
80 |
+
THE LLAMA MATERIALS AND ASSUME ANY RISKS ASSOCIATED WITH YOUR
|
81 |
+
USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND RESULTS.
|
82 |
+
|
83 |
+
4. Limitation of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE
|
84 |
+
LIABLE UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, TORT,
|
85 |
+
NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS
|
86 |
+
AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL,
|
87 |
+
CONSEQUENTIAL, INCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN
|
88 |
+
IF META OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF
|
89 |
+
ANY OF THE FOREGOING.
|
90 |
+
|
91 |
+
5. Intellectual Property.
|
92 |
+
|
93 |
+
a. No trademark licenses are granted under this Agreement, and in
|
94 |
+
connection with the Llama Materials, neither Meta nor Licensee may use any name
|
95 |
+
or mark owned by or associated with the other or any of its affiliates, except as
|
96 |
+
required for reasonable and customary use in describing and redistributing the
|
97 |
+
Llama Materials.
|
98 |
+
|
99 |
+
b. Subject to Meta's ownership of Llama Materials and derivatives made by or
|
100 |
+
for Meta, with respect to any derivative works and modifications of the Llama
|
101 |
+
Materials that are made by you, as between you and Meta, you are and will be the
|
102 |
+
owner of such derivative works and modifications.
|
103 |
+
|
104 |
+
c. If you institute litigation or other proceedings against Meta or any entity
|
105 |
+
(including a cross-claim or counterclaim in a lawsuit) alleging that the Llama
|
106 |
+
Materials or Llama 2 outputs or results, or any portion of any of the foregoing,
|
107 |
+
constitutes infringement of intellectual property or other rights owned or licensable
|
108 |
+
by you, then any licenses granted to you under this Agreement shall terminate as of
|
109 |
+
the date such litigation or claim is filed or instituted. You will indemnify and hold
|
110 |
+
harmless Meta from and against any claim by any third party arising out of or related
|
111 |
+
to your use or distribution of the Llama Materials.
|
112 |
+
|
113 |
+
6. Term and Termination. The term of this Agreement will commence upon your
|
114 |
+
acceptance of this Agreement or access to the Llama Materials and will continue in
|
115 |
+
full force and effect until terminated in accordance with the terms and conditions
|
116 |
+
herein. Meta may terminate this Agreement if you are in breach of any term or
|
117 |
+
condition of this Agreement. Upon termination of this Agreement, you shall delete
|
118 |
+
and cease use of the Llama Materials. Sections 3, 4 and 7 shall survive the
|
119 |
+
termination of this Agreement.
|
120 |
+
|
121 |
+
7. Governing Law and Jurisdiction. This Agreement will be governed and
|
122 |
+
construed under the laws of the State of California without regard to choice of law
|
123 |
+
principles, and the UN Convention on Contracts for the International Sale of Goods
|
124 |
+
does not apply to this Agreement. The courts of California shall have exclusive
|
125 |
+
jurisdiction of any dispute arising out of this Agreement.
|
126 |
+
|
MANIFEST.in
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
recursive-include exllamav2 *
|
2 |
+
global-exclude *.pyc
|
3 |
+
global-exclude dni_*
|
Notice
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
Llama 2 is licensed under the LLAMA 2 Community License, Copyright © Meta Platforms, Inc. All Rights Reserved.
|
Pipfile
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[[source]]
|
2 |
+
url = "https://pypi.org/simple"
|
3 |
+
verify_ssl = true
|
4 |
+
name = "pypi"
|
5 |
+
|
6 |
+
[packages]
|
7 |
+
edgegpt = "*"
|
8 |
+
flask = {extras = ["async"], version = "*"}
|
9 |
+
aiohttp = "*"
|
10 |
+
|
11 |
+
[dev-packages]
|
12 |
+
|
13 |
+
[requires]
|
14 |
+
python_version = "3.11"
|
Pipfile.lock
ADDED
@@ -0,0 +1,864 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_meta": {
|
3 |
+
"hash": {
|
4 |
+
"sha256": "df17fa7b0982d444252ef9397071979b8652d279db80bc14c6de62641ba71d8b"
|
5 |
+
},
|
6 |
+
"pipfile-spec": 6,
|
7 |
+
"requires": {
|
8 |
+
"python_version": "3.11"
|
9 |
+
},
|
10 |
+
"sources": [
|
11 |
+
{
|
12 |
+
"name": "pypi",
|
13 |
+
"url": "https://pypi.org/simple",
|
14 |
+
"verify_ssl": true
|
15 |
+
}
|
16 |
+
]
|
17 |
+
},
|
18 |
+
"default": {
|
19 |
+
"aiohttp": {
|
20 |
+
"hashes": [
|
21 |
+
"sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67",
|
22 |
+
"sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c",
|
23 |
+
"sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda",
|
24 |
+
"sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755",
|
25 |
+
"sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d",
|
26 |
+
"sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5",
|
27 |
+
"sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548",
|
28 |
+
"sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690",
|
29 |
+
"sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84",
|
30 |
+
"sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4",
|
31 |
+
"sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a",
|
32 |
+
"sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a",
|
33 |
+
"sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9",
|
34 |
+
"sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef",
|
35 |
+
"sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b",
|
36 |
+
"sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a",
|
37 |
+
"sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d",
|
38 |
+
"sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945",
|
39 |
+
"sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634",
|
40 |
+
"sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7",
|
41 |
+
"sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691",
|
42 |
+
"sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802",
|
43 |
+
"sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c",
|
44 |
+
"sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0",
|
45 |
+
"sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8",
|
46 |
+
"sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82",
|
47 |
+
"sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a",
|
48 |
+
"sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975",
|
49 |
+
"sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b",
|
50 |
+
"sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d",
|
51 |
+
"sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3",
|
52 |
+
"sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7",
|
53 |
+
"sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e",
|
54 |
+
"sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5",
|
55 |
+
"sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649",
|
56 |
+
"sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff",
|
57 |
+
"sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e",
|
58 |
+
"sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c",
|
59 |
+
"sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22",
|
60 |
+
"sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df",
|
61 |
+
"sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e",
|
62 |
+
"sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780",
|
63 |
+
"sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905",
|
64 |
+
"sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51",
|
65 |
+
"sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543",
|
66 |
+
"sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6",
|
67 |
+
"sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873",
|
68 |
+
"sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f",
|
69 |
+
"sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35",
|
70 |
+
"sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938",
|
71 |
+
"sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b",
|
72 |
+
"sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d",
|
73 |
+
"sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8",
|
74 |
+
"sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c",
|
75 |
+
"sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af",
|
76 |
+
"sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42",
|
77 |
+
"sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3",
|
78 |
+
"sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc",
|
79 |
+
"sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8",
|
80 |
+
"sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410",
|
81 |
+
"sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c",
|
82 |
+
"sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825",
|
83 |
+
"sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9",
|
84 |
+
"sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53",
|
85 |
+
"sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a",
|
86 |
+
"sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc",
|
87 |
+
"sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8",
|
88 |
+
"sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c",
|
89 |
+
"sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a",
|
90 |
+
"sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b",
|
91 |
+
"sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd",
|
92 |
+
"sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14",
|
93 |
+
"sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2",
|
94 |
+
"sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c",
|
95 |
+
"sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9",
|
96 |
+
"sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692",
|
97 |
+
"sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1",
|
98 |
+
"sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa",
|
99 |
+
"sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a",
|
100 |
+
"sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de",
|
101 |
+
"sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91",
|
102 |
+
"sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761",
|
103 |
+
"sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd",
|
104 |
+
"sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced",
|
105 |
+
"sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28",
|
106 |
+
"sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8",
|
107 |
+
"sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"
|
108 |
+
],
|
109 |
+
"index": "pypi",
|
110 |
+
"version": "==3.8.5"
|
111 |
+
},
|
112 |
+
"aiosignal": {
|
113 |
+
"hashes": [
|
114 |
+
"sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc",
|
115 |
+
"sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"
|
116 |
+
],
|
117 |
+
"markers": "python_version >= '3.7'",
|
118 |
+
"version": "==1.3.1"
|
119 |
+
},
|
120 |
+
"anyio": {
|
121 |
+
"hashes": [
|
122 |
+
"sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780",
|
123 |
+
"sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"
|
124 |
+
],
|
125 |
+
"markers": "python_version >= '3.7'",
|
126 |
+
"version": "==3.7.1"
|
127 |
+
},
|
128 |
+
"asgiref": {
|
129 |
+
"hashes": [
|
130 |
+
"sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e",
|
131 |
+
"sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"
|
132 |
+
],
|
133 |
+
"version": "==3.7.2"
|
134 |
+
},
|
135 |
+
"async-timeout": {
|
136 |
+
"hashes": [
|
137 |
+
"sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15",
|
138 |
+
"sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"
|
139 |
+
],
|
140 |
+
"markers": "python_version >= '3.6'",
|
141 |
+
"version": "==4.0.2"
|
142 |
+
},
|
143 |
+
"attrs": {
|
144 |
+
"hashes": [
|
145 |
+
"sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04",
|
146 |
+
"sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"
|
147 |
+
],
|
148 |
+
"markers": "python_version >= '3.7'",
|
149 |
+
"version": "==23.1.0"
|
150 |
+
},
|
151 |
+
"bingimagecreator": {
|
152 |
+
"hashes": [
|
153 |
+
"sha256:322312c6b59af1210faa0ec2fbc2429b53add60d3a0af2da7f1ae793844521b5",
|
154 |
+
"sha256:3e66b0f6df6d9082ed3991f06ef1c52b327b9ecb762d2cfa0c36beb26dbbdf55"
|
155 |
+
],
|
156 |
+
"version": "==0.4.4"
|
157 |
+
},
|
158 |
+
"blinker": {
|
159 |
+
"hashes": [
|
160 |
+
"sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213",
|
161 |
+
"sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"
|
162 |
+
],
|
163 |
+
"markers": "python_version >= '3.7'",
|
164 |
+
"version": "==1.6.2"
|
165 |
+
},
|
166 |
+
"certifi": {
|
167 |
+
"hashes": [
|
168 |
+
"sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082",
|
169 |
+
"sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"
|
170 |
+
],
|
171 |
+
"markers": "python_version >= '3.6'",
|
172 |
+
"version": "==2023.7.22"
|
173 |
+
},
|
174 |
+
"charset-normalizer": {
|
175 |
+
"hashes": [
|
176 |
+
"sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96",
|
177 |
+
"sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c",
|
178 |
+
"sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710",
|
179 |
+
"sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706",
|
180 |
+
"sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020",
|
181 |
+
"sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252",
|
182 |
+
"sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad",
|
183 |
+
"sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329",
|
184 |
+
"sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a",
|
185 |
+
"sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f",
|
186 |
+
"sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6",
|
187 |
+
"sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4",
|
188 |
+
"sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a",
|
189 |
+
"sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46",
|
190 |
+
"sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2",
|
191 |
+
"sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23",
|
192 |
+
"sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace",
|
193 |
+
"sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd",
|
194 |
+
"sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982",
|
195 |
+
"sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10",
|
196 |
+
"sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2",
|
197 |
+
"sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea",
|
198 |
+
"sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09",
|
199 |
+
"sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5",
|
200 |
+
"sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149",
|
201 |
+
"sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489",
|
202 |
+
"sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9",
|
203 |
+
"sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80",
|
204 |
+
"sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592",
|
205 |
+
"sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3",
|
206 |
+
"sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6",
|
207 |
+
"sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed",
|
208 |
+
"sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c",
|
209 |
+
"sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200",
|
210 |
+
"sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a",
|
211 |
+
"sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e",
|
212 |
+
"sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d",
|
213 |
+
"sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6",
|
214 |
+
"sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623",
|
215 |
+
"sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669",
|
216 |
+
"sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3",
|
217 |
+
"sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa",
|
218 |
+
"sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9",
|
219 |
+
"sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2",
|
220 |
+
"sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f",
|
221 |
+
"sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1",
|
222 |
+
"sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4",
|
223 |
+
"sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a",
|
224 |
+
"sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8",
|
225 |
+
"sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3",
|
226 |
+
"sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029",
|
227 |
+
"sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f",
|
228 |
+
"sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959",
|
229 |
+
"sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22",
|
230 |
+
"sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7",
|
231 |
+
"sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952",
|
232 |
+
"sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346",
|
233 |
+
"sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e",
|
234 |
+
"sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d",
|
235 |
+
"sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299",
|
236 |
+
"sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd",
|
237 |
+
"sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a",
|
238 |
+
"sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3",
|
239 |
+
"sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037",
|
240 |
+
"sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94",
|
241 |
+
"sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c",
|
242 |
+
"sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858",
|
243 |
+
"sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a",
|
244 |
+
"sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449",
|
245 |
+
"sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c",
|
246 |
+
"sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918",
|
247 |
+
"sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1",
|
248 |
+
"sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c",
|
249 |
+
"sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac",
|
250 |
+
"sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"
|
251 |
+
],
|
252 |
+
"markers": "python_version >= '3.7'",
|
253 |
+
"version": "==3.2.0"
|
254 |
+
},
|
255 |
+
"click": {
|
256 |
+
"hashes": [
|
257 |
+
"sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd",
|
258 |
+
"sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"
|
259 |
+
],
|
260 |
+
"markers": "python_version >= '3.7'",
|
261 |
+
"version": "==8.1.6"
|
262 |
+
},
|
263 |
+
"edgegpt": {
|
264 |
+
"hashes": [
|
265 |
+
"sha256:66d625a137d90bbdb3854dc0347d23ca07a227a902d107fbc28bdf62a939bac5",
|
266 |
+
"sha256:e0509afeccdd22d84b9fe52e96d2661775a4ddec340546f562514d460528efc7"
|
267 |
+
],
|
268 |
+
"index": "pypi",
|
269 |
+
"version": "==0.3.9"
|
270 |
+
},
|
271 |
+
"flask": {
|
272 |
+
"extras": [
|
273 |
+
"async"
|
274 |
+
],
|
275 |
+
"hashes": [
|
276 |
+
"sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0",
|
277 |
+
"sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"
|
278 |
+
],
|
279 |
+
"index": "pypi",
|
280 |
+
"version": "==2.3.2"
|
281 |
+
},
|
282 |
+
"frozenlist": {
|
283 |
+
"hashes": [
|
284 |
+
"sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6",
|
285 |
+
"sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01",
|
286 |
+
"sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251",
|
287 |
+
"sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9",
|
288 |
+
"sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b",
|
289 |
+
"sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87",
|
290 |
+
"sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf",
|
291 |
+
"sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f",
|
292 |
+
"sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0",
|
293 |
+
"sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2",
|
294 |
+
"sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b",
|
295 |
+
"sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc",
|
296 |
+
"sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c",
|
297 |
+
"sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467",
|
298 |
+
"sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9",
|
299 |
+
"sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1",
|
300 |
+
"sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a",
|
301 |
+
"sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79",
|
302 |
+
"sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167",
|
303 |
+
"sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300",
|
304 |
+
"sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf",
|
305 |
+
"sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea",
|
306 |
+
"sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2",
|
307 |
+
"sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab",
|
308 |
+
"sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3",
|
309 |
+
"sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb",
|
310 |
+
"sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087",
|
311 |
+
"sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc",
|
312 |
+
"sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8",
|
313 |
+
"sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62",
|
314 |
+
"sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f",
|
315 |
+
"sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326",
|
316 |
+
"sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c",
|
317 |
+
"sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431",
|
318 |
+
"sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963",
|
319 |
+
"sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7",
|
320 |
+
"sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef",
|
321 |
+
"sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3",
|
322 |
+
"sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956",
|
323 |
+
"sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781",
|
324 |
+
"sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472",
|
325 |
+
"sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc",
|
326 |
+
"sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839",
|
327 |
+
"sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672",
|
328 |
+
"sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3",
|
329 |
+
"sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503",
|
330 |
+
"sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d",
|
331 |
+
"sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8",
|
332 |
+
"sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b",
|
333 |
+
"sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc",
|
334 |
+
"sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f",
|
335 |
+
"sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559",
|
336 |
+
"sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b",
|
337 |
+
"sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95",
|
338 |
+
"sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb",
|
339 |
+
"sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963",
|
340 |
+
"sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919",
|
341 |
+
"sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f",
|
342 |
+
"sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3",
|
343 |
+
"sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1",
|
344 |
+
"sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"
|
345 |
+
],
|
346 |
+
"markers": "python_version >= '3.8'",
|
347 |
+
"version": "==1.4.0"
|
348 |
+
},
|
349 |
+
"h11": {
|
350 |
+
"hashes": [
|
351 |
+
"sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
|
352 |
+
"sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
|
353 |
+
],
|
354 |
+
"markers": "python_version >= '3.7'",
|
355 |
+
"version": "==0.14.0"
|
356 |
+
},
|
357 |
+
"httpcore": {
|
358 |
+
"hashes": [
|
359 |
+
"sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888",
|
360 |
+
"sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"
|
361 |
+
],
|
362 |
+
"markers": "python_version >= '3.7'",
|
363 |
+
"version": "==0.17.3"
|
364 |
+
},
|
365 |
+
"httpx": {
|
366 |
+
"hashes": [
|
367 |
+
"sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd",
|
368 |
+
"sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"
|
369 |
+
],
|
370 |
+
"markers": "python_version >= '3.7'",
|
371 |
+
"version": "==0.24.1"
|
372 |
+
},
|
373 |
+
"idna": {
|
374 |
+
"hashes": [
|
375 |
+
"sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
|
376 |
+
"sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
|
377 |
+
],
|
378 |
+
"markers": "python_version >= '3.5'",
|
379 |
+
"version": "==3.4"
|
380 |
+
},
|
381 |
+
"itsdangerous": {
|
382 |
+
"hashes": [
|
383 |
+
"sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44",
|
384 |
+
"sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"
|
385 |
+
],
|
386 |
+
"markers": "python_version >= '3.7'",
|
387 |
+
"version": "==2.1.2"
|
388 |
+
},
|
389 |
+
"jinja2": {
|
390 |
+
"hashes": [
|
391 |
+
"sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
|
392 |
+
"sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
|
393 |
+
],
|
394 |
+
"markers": "python_version >= '3.7'",
|
395 |
+
"version": "==3.1.2"
|
396 |
+
},
|
397 |
+
"markdown-it-py": {
|
398 |
+
"hashes": [
|
399 |
+
"sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
|
400 |
+
"sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
|
401 |
+
],
|
402 |
+
"markers": "python_version >= '3.8'",
|
403 |
+
"version": "==3.0.0"
|
404 |
+
},
|
405 |
+
"markupsafe": {
|
406 |
+
"hashes": [
|
407 |
+
"sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
|
408 |
+
"sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
|
409 |
+
"sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431",
|
410 |
+
"sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686",
|
411 |
+
"sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559",
|
412 |
+
"sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc",
|
413 |
+
"sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c",
|
414 |
+
"sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0",
|
415 |
+
"sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4",
|
416 |
+
"sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9",
|
417 |
+
"sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575",
|
418 |
+
"sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
|
419 |
+
"sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d",
|
420 |
+
"sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3",
|
421 |
+
"sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00",
|
422 |
+
"sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155",
|
423 |
+
"sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac",
|
424 |
+
"sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52",
|
425 |
+
"sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f",
|
426 |
+
"sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8",
|
427 |
+
"sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
|
428 |
+
"sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24",
|
429 |
+
"sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea",
|
430 |
+
"sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
|
431 |
+
"sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0",
|
432 |
+
"sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee",
|
433 |
+
"sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be",
|
434 |
+
"sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2",
|
435 |
+
"sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707",
|
436 |
+
"sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6",
|
437 |
+
"sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
|
438 |
+
"sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779",
|
439 |
+
"sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
|
440 |
+
"sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c",
|
441 |
+
"sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
|
442 |
+
"sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee",
|
443 |
+
"sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc",
|
444 |
+
"sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
|
445 |
+
"sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48",
|
446 |
+
"sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7",
|
447 |
+
"sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e",
|
448 |
+
"sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b",
|
449 |
+
"sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa",
|
450 |
+
"sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5",
|
451 |
+
"sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e",
|
452 |
+
"sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb",
|
453 |
+
"sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9",
|
454 |
+
"sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57",
|
455 |
+
"sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc",
|
456 |
+
"sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"
|
457 |
+
],
|
458 |
+
"markers": "python_version >= '3.7'",
|
459 |
+
"version": "==2.1.3"
|
460 |
+
},
|
461 |
+
"mdurl": {
|
462 |
+
"hashes": [
|
463 |
+
"sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
|
464 |
+
"sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
|
465 |
+
],
|
466 |
+
"markers": "python_version >= '3.7'",
|
467 |
+
"version": "==0.1.2"
|
468 |
+
},
|
469 |
+
"multidict": {
|
470 |
+
"hashes": [
|
471 |
+
"sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9",
|
472 |
+
"sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8",
|
473 |
+
"sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03",
|
474 |
+
"sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710",
|
475 |
+
"sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161",
|
476 |
+
"sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664",
|
477 |
+
"sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569",
|
478 |
+
"sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067",
|
479 |
+
"sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313",
|
480 |
+
"sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706",
|
481 |
+
"sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2",
|
482 |
+
"sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636",
|
483 |
+
"sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49",
|
484 |
+
"sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93",
|
485 |
+
"sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603",
|
486 |
+
"sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0",
|
487 |
+
"sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60",
|
488 |
+
"sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4",
|
489 |
+
"sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e",
|
490 |
+
"sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1",
|
491 |
+
"sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60",
|
492 |
+
"sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951",
|
493 |
+
"sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc",
|
494 |
+
"sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe",
|
495 |
+
"sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95",
|
496 |
+
"sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d",
|
497 |
+
"sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8",
|
498 |
+
"sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed",
|
499 |
+
"sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2",
|
500 |
+
"sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775",
|
501 |
+
"sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87",
|
502 |
+
"sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c",
|
503 |
+
"sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2",
|
504 |
+
"sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98",
|
505 |
+
"sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3",
|
506 |
+
"sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe",
|
507 |
+
"sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78",
|
508 |
+
"sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660",
|
509 |
+
"sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176",
|
510 |
+
"sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e",
|
511 |
+
"sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988",
|
512 |
+
"sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c",
|
513 |
+
"sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c",
|
514 |
+
"sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0",
|
515 |
+
"sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449",
|
516 |
+
"sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f",
|
517 |
+
"sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde",
|
518 |
+
"sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5",
|
519 |
+
"sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d",
|
520 |
+
"sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac",
|
521 |
+
"sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a",
|
522 |
+
"sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9",
|
523 |
+
"sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca",
|
524 |
+
"sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11",
|
525 |
+
"sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35",
|
526 |
+
"sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063",
|
527 |
+
"sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b",
|
528 |
+
"sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982",
|
529 |
+
"sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258",
|
530 |
+
"sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1",
|
531 |
+
"sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52",
|
532 |
+
"sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480",
|
533 |
+
"sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7",
|
534 |
+
"sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461",
|
535 |
+
"sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d",
|
536 |
+
"sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc",
|
537 |
+
"sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779",
|
538 |
+
"sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a",
|
539 |
+
"sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547",
|
540 |
+
"sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0",
|
541 |
+
"sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171",
|
542 |
+
"sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf",
|
543 |
+
"sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d",
|
544 |
+
"sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"
|
545 |
+
],
|
546 |
+
"markers": "python_version >= '3.7'",
|
547 |
+
"version": "==6.0.4"
|
548 |
+
},
|
549 |
+
"prompt-toolkit": {
|
550 |
+
"hashes": [
|
551 |
+
"sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac",
|
552 |
+
"sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"
|
553 |
+
],
|
554 |
+
"markers": "python_version >= '3.7'",
|
555 |
+
"version": "==3.0.39"
|
556 |
+
},
|
557 |
+
"pygments": {
|
558 |
+
"hashes": [
|
559 |
+
"sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c",
|
560 |
+
"sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"
|
561 |
+
],
|
562 |
+
"markers": "python_version >= '3.7'",
|
563 |
+
"version": "==2.15.1"
|
564 |
+
},
|
565 |
+
"regex": {
|
566 |
+
"hashes": [
|
567 |
+
"sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938",
|
568 |
+
"sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6",
|
569 |
+
"sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef",
|
570 |
+
"sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525",
|
571 |
+
"sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af",
|
572 |
+
"sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc",
|
573 |
+
"sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54",
|
574 |
+
"sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8",
|
575 |
+
"sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7",
|
576 |
+
"sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568",
|
577 |
+
"sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c",
|
578 |
+
"sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f",
|
579 |
+
"sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536",
|
580 |
+
"sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2",
|
581 |
+
"sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb",
|
582 |
+
"sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df",
|
583 |
+
"sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019",
|
584 |
+
"sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18",
|
585 |
+
"sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f",
|
586 |
+
"sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac",
|
587 |
+
"sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8",
|
588 |
+
"sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9",
|
589 |
+
"sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697",
|
590 |
+
"sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06",
|
591 |
+
"sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d",
|
592 |
+
"sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036",
|
593 |
+
"sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1",
|
594 |
+
"sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787",
|
595 |
+
"sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9",
|
596 |
+
"sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0",
|
597 |
+
"sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7",
|
598 |
+
"sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461",
|
599 |
+
"sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee",
|
600 |
+
"sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3",
|
601 |
+
"sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0",
|
602 |
+
"sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f",
|
603 |
+
"sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14",
|
604 |
+
"sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477",
|
605 |
+
"sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd",
|
606 |
+
"sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16",
|
607 |
+
"sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc",
|
608 |
+
"sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff",
|
609 |
+
"sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd",
|
610 |
+
"sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2",
|
611 |
+
"sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e",
|
612 |
+
"sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef",
|
613 |
+
"sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07",
|
614 |
+
"sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3",
|
615 |
+
"sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3",
|
616 |
+
"sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a",
|
617 |
+
"sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7",
|
618 |
+
"sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa",
|
619 |
+
"sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82",
|
620 |
+
"sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77",
|
621 |
+
"sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222",
|
622 |
+
"sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c",
|
623 |
+
"sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd",
|
624 |
+
"sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d",
|
625 |
+
"sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68",
|
626 |
+
"sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9",
|
627 |
+
"sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693",
|
628 |
+
"sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487",
|
629 |
+
"sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06",
|
630 |
+
"sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591",
|
631 |
+
"sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27",
|
632 |
+
"sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a",
|
633 |
+
"sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969",
|
634 |
+
"sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3",
|
635 |
+
"sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0",
|
636 |
+
"sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7",
|
637 |
+
"sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751",
|
638 |
+
"sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747",
|
639 |
+
"sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289",
|
640 |
+
"sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72",
|
641 |
+
"sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777",
|
642 |
+
"sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9",
|
643 |
+
"sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1",
|
644 |
+
"sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1",
|
645 |
+
"sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e",
|
646 |
+
"sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf",
|
647 |
+
"sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f",
|
648 |
+
"sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd",
|
649 |
+
"sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2",
|
650 |
+
"sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c",
|
651 |
+
"sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1",
|
652 |
+
"sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88",
|
653 |
+
"sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9",
|
654 |
+
"sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"
|
655 |
+
],
|
656 |
+
"markers": "python_version >= '3.6'",
|
657 |
+
"version": "==2023.6.3"
|
658 |
+
},
|
659 |
+
"requests": {
|
660 |
+
"hashes": [
|
661 |
+
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
|
662 |
+
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
|
663 |
+
],
|
664 |
+
"markers": "python_version >= '3.7'",
|
665 |
+
"version": "==2.31.0"
|
666 |
+
},
|
667 |
+
"rich": {
|
668 |
+
"hashes": [
|
669 |
+
"sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec",
|
670 |
+
"sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"
|
671 |
+
],
|
672 |
+
"markers": "python_version >= '3.7'",
|
673 |
+
"version": "==13.4.2"
|
674 |
+
},
|
675 |
+
"sniffio": {
|
676 |
+
"hashes": [
|
677 |
+
"sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101",
|
678 |
+
"sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"
|
679 |
+
],
|
680 |
+
"markers": "python_version >= '3.7'",
|
681 |
+
"version": "==1.3.0"
|
682 |
+
},
|
683 |
+
"urllib3": {
|
684 |
+
"hashes": [
|
685 |
+
"sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11",
|
686 |
+
"sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"
|
687 |
+
],
|
688 |
+
"markers": "python_version >= '3.7'",
|
689 |
+
"version": "==2.0.4"
|
690 |
+
},
|
691 |
+
"wcwidth": {
|
692 |
+
"hashes": [
|
693 |
+
"sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e",
|
694 |
+
"sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"
|
695 |
+
],
|
696 |
+
"version": "==0.2.6"
|
697 |
+
},
|
698 |
+
"websockets": {
|
699 |
+
"hashes": [
|
700 |
+
"sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd",
|
701 |
+
"sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f",
|
702 |
+
"sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998",
|
703 |
+
"sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82",
|
704 |
+
"sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788",
|
705 |
+
"sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa",
|
706 |
+
"sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f",
|
707 |
+
"sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4",
|
708 |
+
"sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7",
|
709 |
+
"sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f",
|
710 |
+
"sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd",
|
711 |
+
"sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69",
|
712 |
+
"sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb",
|
713 |
+
"sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b",
|
714 |
+
"sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016",
|
715 |
+
"sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac",
|
716 |
+
"sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4",
|
717 |
+
"sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb",
|
718 |
+
"sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99",
|
719 |
+
"sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e",
|
720 |
+
"sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54",
|
721 |
+
"sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf",
|
722 |
+
"sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007",
|
723 |
+
"sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3",
|
724 |
+
"sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6",
|
725 |
+
"sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86",
|
726 |
+
"sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1",
|
727 |
+
"sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61",
|
728 |
+
"sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11",
|
729 |
+
"sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8",
|
730 |
+
"sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f",
|
731 |
+
"sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931",
|
732 |
+
"sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526",
|
733 |
+
"sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016",
|
734 |
+
"sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae",
|
735 |
+
"sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd",
|
736 |
+
"sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b",
|
737 |
+
"sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311",
|
738 |
+
"sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af",
|
739 |
+
"sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152",
|
740 |
+
"sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288",
|
741 |
+
"sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de",
|
742 |
+
"sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97",
|
743 |
+
"sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d",
|
744 |
+
"sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d",
|
745 |
+
"sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca",
|
746 |
+
"sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0",
|
747 |
+
"sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9",
|
748 |
+
"sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b",
|
749 |
+
"sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e",
|
750 |
+
"sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128",
|
751 |
+
"sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d",
|
752 |
+
"sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c",
|
753 |
+
"sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5",
|
754 |
+
"sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6",
|
755 |
+
"sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b",
|
756 |
+
"sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b",
|
757 |
+
"sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280",
|
758 |
+
"sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c",
|
759 |
+
"sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c",
|
760 |
+
"sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f",
|
761 |
+
"sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20",
|
762 |
+
"sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8",
|
763 |
+
"sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb",
|
764 |
+
"sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602",
|
765 |
+
"sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf",
|
766 |
+
"sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0",
|
767 |
+
"sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74",
|
768 |
+
"sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0",
|
769 |
+
"sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"
|
770 |
+
],
|
771 |
+
"markers": "python_version >= '3.7'",
|
772 |
+
"version": "==11.0.3"
|
773 |
+
},
|
774 |
+
"werkzeug": {
|
775 |
+
"hashes": [
|
776 |
+
"sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890",
|
777 |
+
"sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"
|
778 |
+
],
|
779 |
+
"markers": "python_version >= '3.8'",
|
780 |
+
"version": "==2.3.6"
|
781 |
+
},
|
782 |
+
"yarl": {
|
783 |
+
"hashes": [
|
784 |
+
"sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571",
|
785 |
+
"sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3",
|
786 |
+
"sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3",
|
787 |
+
"sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c",
|
788 |
+
"sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7",
|
789 |
+
"sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04",
|
790 |
+
"sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191",
|
791 |
+
"sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea",
|
792 |
+
"sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4",
|
793 |
+
"sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4",
|
794 |
+
"sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095",
|
795 |
+
"sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e",
|
796 |
+
"sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74",
|
797 |
+
"sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef",
|
798 |
+
"sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33",
|
799 |
+
"sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde",
|
800 |
+
"sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45",
|
801 |
+
"sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf",
|
802 |
+
"sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b",
|
803 |
+
"sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac",
|
804 |
+
"sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0",
|
805 |
+
"sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528",
|
806 |
+
"sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716",
|
807 |
+
"sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb",
|
808 |
+
"sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18",
|
809 |
+
"sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72",
|
810 |
+
"sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6",
|
811 |
+
"sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582",
|
812 |
+
"sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5",
|
813 |
+
"sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368",
|
814 |
+
"sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc",
|
815 |
+
"sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9",
|
816 |
+
"sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be",
|
817 |
+
"sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a",
|
818 |
+
"sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80",
|
819 |
+
"sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8",
|
820 |
+
"sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6",
|
821 |
+
"sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417",
|
822 |
+
"sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574",
|
823 |
+
"sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59",
|
824 |
+
"sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608",
|
825 |
+
"sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82",
|
826 |
+
"sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1",
|
827 |
+
"sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3",
|
828 |
+
"sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d",
|
829 |
+
"sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8",
|
830 |
+
"sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc",
|
831 |
+
"sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac",
|
832 |
+
"sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8",
|
833 |
+
"sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955",
|
834 |
+
"sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0",
|
835 |
+
"sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367",
|
836 |
+
"sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb",
|
837 |
+
"sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a",
|
838 |
+
"sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623",
|
839 |
+
"sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2",
|
840 |
+
"sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6",
|
841 |
+
"sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7",
|
842 |
+
"sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4",
|
843 |
+
"sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051",
|
844 |
+
"sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938",
|
845 |
+
"sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8",
|
846 |
+
"sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9",
|
847 |
+
"sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3",
|
848 |
+
"sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5",
|
849 |
+
"sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9",
|
850 |
+
"sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333",
|
851 |
+
"sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185",
|
852 |
+
"sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3",
|
853 |
+
"sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560",
|
854 |
+
"sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b",
|
855 |
+
"sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7",
|
856 |
+
"sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78",
|
857 |
+
"sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"
|
858 |
+
],
|
859 |
+
"markers": "python_version >= '3.7'",
|
860 |
+
"version": "==1.9.2"
|
861 |
+
}
|
862 |
+
},
|
863 |
+
"develop": {}
|
864 |
+
}
|
README.md
CHANGED
@@ -1,31 +1,336 @@
|
|
1 |
---
|
2 |
-
license:
|
3 |
datasets:
|
4 |
-
-
|
5 |
-
- hollyyfc/tidytuesday_for_python
|
6 |
-
- microsoft/orca-math-word-problems-200k
|
7 |
-
- Cohere/wikipedia-2023-11-embed-multilingual-v3
|
8 |
-
- storytracer/US-PD-Books
|
9 |
-
- HuggingFaceTB/cosmopedia
|
10 |
-
- abacusai/SystemChat
|
11 |
-
- fka/awesome-chatgpt-prompts
|
12 |
-
- m-a-p/COIG-CQIA
|
13 |
-
- MarkrAI/KoCommercial-Dataset
|
14 |
language:
|
15 |
- ar
|
16 |
- en
|
|
|
|
|
17 |
metrics:
|
18 |
- accuracy
|
19 |
- bertscore
|
20 |
- bleu
|
21 |
-
- bleurt
|
22 |
-
- brier_score
|
23 |
-
- cer
|
24 |
-
- character
|
25 |
-
- charcut_mt
|
26 |
- chrf
|
27 |
- code_eval
|
28 |
-
|
29 |
tags:
|
|
|
|
|
|
|
|
|
|
|
30 |
- code
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
license: apache-2.0
|
3 |
datasets:
|
4 |
+
- PetraAI/PetraAI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
language:
|
6 |
- ar
|
7 |
- en
|
8 |
+
- ch
|
9 |
+
- zh
|
10 |
metrics:
|
11 |
- accuracy
|
12 |
- bertscore
|
13 |
- bleu
|
|
|
|
|
|
|
|
|
|
|
14 |
- chrf
|
15 |
- code_eval
|
16 |
+
- brier_score
|
17 |
tags:
|
18 |
+
- chemistry
|
19 |
+
- biology
|
20 |
+
- finance
|
21 |
+
- legal
|
22 |
+
- music
|
23 |
- code
|
24 |
+
- art
|
25 |
+
- climate
|
26 |
+
- medical
|
27 |
+
- text-generation-inference
|
28 |
+
---
|
29 |
+
|
30 |
+
### Inference Speed
|
31 |
+
> The result is generated using [this script](examples/benchmark/generation_speed.py), batch size of input is 1, decode strategy is beam search and enforce the model to generate 512 tokens, speed metric is tokens/s (the larger, the better).
|
32 |
+
>
|
33 |
+
> The quantized model is loaded using the setup that can gain the fastest inference speed.
|
34 |
+
|
35 |
+
| model | GPU | num_beams | fp16 | gptq-int4 |
|
36 |
+
|---------------|---------------|-----------|-------|-----------|
|
37 |
+
| llama-7b | 1xA100-40G | 1 | 18.87 | 25.53 |
|
38 |
+
| llama-7b | 1xA100-40G | 4 | 68.79 | 91.30 |
|
39 |
+
| moss-moon 16b | 1xA100-40G | 1 | 12.48 | 15.25 |
|
40 |
+
| moss-moon 16b | 1xA100-40G | 4 | OOM | 42.67 |
|
41 |
+
| moss-moon 16b | 2xA100-40G | 1 | 06.83 | 06.78 |
|
42 |
+
| moss-moon 16b | 2xA100-40G | 4 | 13.10 | 10.80 |
|
43 |
+
| gpt-j 6b | 1xRTX3060-12G | 1 | OOM | 29.55 |
|
44 |
+
| gpt-j 6b | 1xRTX3060-12G | 4 | OOM | 47.36 |
|
45 |
+
|
46 |
+
|
47 |
+
### Perplexity
|
48 |
+
For perplexity comparison, you can turn to [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#result) and [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#gptq-vs-bitsandbytes)
|
49 |
+
|
50 |
+
## Installation
|
51 |
+
|
52 |
+
### Quick Installation
|
53 |
+
You can install the latest stable release of AutoGPTQ from pip with pre-built wheels compatible with PyTorch 2.0.1:
|
54 |
+
|
55 |
+
* For CUDA 11.7: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu117/`
|
56 |
+
* For CUDA 11.8: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/`
|
57 |
+
* For RoCm 5.4.2: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm542/`
|
58 |
+
|
59 |
+
**Warning:** These wheels are not expected to work on PyTorch nightly. Please install AutoGPTQ from source when using PyTorch nightly.
|
60 |
+
|
61 |
+
#### disable cuda extensions
|
62 |
+
By default, cuda extensions will be installed when `torch` and `cuda` is already installed in your machine, if you don't want to use them, using:
|
63 |
+
```shell
|
64 |
+
BUILD_CUDA_EXT=0 pip install auto-gptq
|
65 |
+
```
|
66 |
+
And to make sure `autogptq_cuda` is not ever in your virtual environment, run:
|
67 |
+
```shell
|
68 |
+
pip uninstall autogptq_cuda -y
|
69 |
+
```
|
70 |
+
|
71 |
+
#### to support triton speedup
|
72 |
+
To integrate with `triton`, using:
|
73 |
+
> warning: currently triton only supports linux; 3-bit quantization is not supported when using triton
|
74 |
+
|
75 |
+
```shell
|
76 |
+
pip install auto-gptq[triton]
|
77 |
+
```
|
78 |
+
|
79 |
+
### Install from source
|
80 |
+
<details>
|
81 |
+
<summary>click to see details</summary>
|
82 |
+
|
83 |
+
Clone the source code:
|
84 |
+
```shell
|
85 |
+
git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ
|
86 |
+
```
|
87 |
+
Then, install from source:
|
88 |
+
```shell
|
89 |
+
pip install .
|
90 |
+
```
|
91 |
+
Like quick installation, you can also set `BUILD_CUDA_EXT=0` to disable pytorch extension building.
|
92 |
+
|
93 |
+
Use `.[triton]` if you want to integrate with triton and it's available on your operating system.
|
94 |
+
|
95 |
+
To install from source for AMD GPUs supporting RoCm, please specify the `ROCM_VERSION` environment variable. The compilation can be speeded up by specifying the `PYTORCH_ROCM_ARCH` variable ([reference](https://github.com/pytorch/pytorch/blob/7b73b1e8a73a1777ebe8d2cd4487eb13da55b3ba/setup.py#L132)), for example `gfx90a` for MI200 series devices. Example:
|
96 |
+
|
97 |
+
```
|
98 |
+
ROCM_VERSION=5.6 pip install .
|
99 |
+
```
|
100 |
+
|
101 |
+
For RoCm systems, the packages `rocsparse-dev`, `hipsparse-dev`, `rocthrust-dev`, `rocblas-dev` and `hipblas-dev` are required to build.
|
102 |
+
|
103 |
+
</details>
|
104 |
+
|
105 |
+
## Quick Tour
|
106 |
+
|
107 |
+
### Quantization and Inference
|
108 |
+
> warning: this is just a showcase of the usage of basic apis in AutoGPTQ, which uses only one sample to quantize a much small model, quality of quantized model using such little samples may not good.
|
109 |
+
|
110 |
+
Below is an example for the simplest use of `auto_gptq` to quantize a model and inference after quantization:
|
111 |
+
```python
|
112 |
+
from transformers import AutoTokenizer, TextGenerationPipeline
|
113 |
+
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
|
114 |
+
import logging
|
115 |
+
|
116 |
+
logging.basicConfig(
|
117 |
+
format="%(asctime)s %(levelname)s [%(name)s] %(message)s", level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S"
|
118 |
+
)
|
119 |
+
|
120 |
+
pretrained_model_dir = "facebook/opt-125m"
|
121 |
+
quantized_model_dir = "opt-125m-4bit"
|
122 |
+
|
123 |
+
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True)
|
124 |
+
examples = [
|
125 |
+
tokenizer(
|
126 |
+
"auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."
|
127 |
+
)
|
128 |
+
]
|
129 |
+
|
130 |
+
quantize_config = BaseQuantizeConfig(
|
131 |
+
bits=4, # quantize model to 4-bit
|
132 |
+
group_size=128, # it is recommended to set the value to 128
|
133 |
+
desc_act=False, # set to False can significantly speed up inference but the perplexity may slightly bad
|
134 |
+
)
|
135 |
+
|
136 |
+
# load un-quantized model, by default, the model will always be loaded into CPU memory
|
137 |
+
model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config)
|
138 |
+
|
139 |
+
# quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask"
|
140 |
+
model.quantize(examples)
|
141 |
+
|
142 |
+
# save quantized model
|
143 |
+
model.save_quantized(quantized_model_dir)
|
144 |
+
|
145 |
+
# save quantized model using safetensors
|
146 |
+
model.save_quantized(quantized_model_dir, use_safetensors=True)
|
147 |
+
|
148 |
+
# push quantized model to Hugging Face Hub.
|
149 |
+
# to use use_auth_token=True, Login first via huggingface-cli login.
|
150 |
+
# or pass explcit token with: use_auth_token="hf_xxxxxxx"
|
151 |
+
# (uncomment the following three lines to enable this feature)
|
152 |
+
# repo_id = f"YourUserName/{quantized_model_dir}"
|
153 |
+
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
|
154 |
+
# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True)
|
155 |
+
|
156 |
+
# alternatively you can save and push at the same time
|
157 |
+
# (uncomment the following three lines to enable this feature)
|
158 |
+
# repo_id = f"YourUserName/{quantized_model_dir}"
|
159 |
+
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
|
160 |
+
# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True)
|
161 |
+
|
162 |
+
# load quantized model to the first GPU
|
163 |
+
model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0")
|
164 |
+
|
165 |
+
# download quantized model from Hugging Face Hub and load to the first GPU
|
166 |
+
# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False)
|
167 |
+
|
168 |
+
# inference with model.generate
|
169 |
+
print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0]))
|
170 |
+
|
171 |
+
# or you can also use pipeline
|
172 |
+
pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer)
|
173 |
+
print(pipeline("auto-gptq is")[0]["generated_text"])
|
174 |
+
```
|
175 |
+
|
176 |
+
For more advanced features of model quantization, please reference to [this script](examples/quantization/quant_with_alpaca.py)
|
177 |
+
|
178 |
+
### Customize Model
|
179 |
+
<details>
|
180 |
+
|
181 |
+
<summary>Below is an example to extend `auto_gptq` to support `OPT` model, as you will see, it's very easy:</summary>
|
182 |
+
|
183 |
+
```python
|
184 |
+
from auto_gptq.modeling import BaseGPTQForCausalLM
|
185 |
+
|
186 |
+
|
187 |
+
class OPTGPTQForCausalLM(BaseGPTQForCausalLM):
|
188 |
+
# chained attribute name of transformer layer block
|
189 |
+
layers_block_name = "model.decoder.layers"
|
190 |
+
# chained attribute names of other nn modules that in the same level as the transformer layer block
|
191 |
+
outside_layer_modules = [
|
192 |
+
"model.decoder.embed_tokens", "model.decoder.embed_positions", "model.decoder.project_out",
|
193 |
+
"model.decoder.project_in", "model.decoder.final_layer_norm"
|
194 |
+
]
|
195 |
+
# chained attribute names of linear layers in transformer layer module
|
196 |
+
# normally, there are four sub lists, for each one the modules in it can be seen as one operation,
|
197 |
+
# and the order should be the order when they are truly executed, in this case (and usually in most cases),
|
198 |
+
# they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output
|
199 |
+
inside_layer_modules = [
|
200 |
+
["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"],
|
201 |
+
["self_attn.out_proj"],
|
202 |
+
["fc1"],
|
203 |
+
["fc2"]
|
204 |
+
]
|
205 |
+
```
|
206 |
+
After this, you can use `OPTGPTQForCausalLM.from_pretrained` and other methods as shown in Basic.
|
207 |
+
|
208 |
+
</details>
|
209 |
+
|
210 |
+
### Evaluation on Downstream Tasks
|
211 |
+
You can use tasks defined in `auto_gptq.eval_tasks` to evaluate model's performance on specific down-stream task before and after quantization.
|
212 |
+
|
213 |
+
The predefined tasks support all causal-language-models implemented in [🤗 transformers](https://github.com/huggingface/transformers) and in this project.
|
214 |
+
|
215 |
+
<details>
|
216 |
+
|
217 |
+
<summary>Below is an example to evaluate `EleutherAI/gpt-j-6b` on sequence-classification task using `cardiffnlp/tweet_sentiment_multilingual` dataset:</summary>
|
218 |
+
|
219 |
+
```python
|
220 |
+
from functools import partial
|
221 |
+
|
222 |
+
import datasets
|
223 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
|
224 |
+
|
225 |
+
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
|
226 |
+
from auto_gptq.eval_tasks import SequenceClassificationTask
|
227 |
+
|
228 |
+
|
229 |
+
MODEL = "EleutherAI/gpt-j-6b"
|
230 |
+
DATASET = "cardiffnlp/tweet_sentiment_multilingual"
|
231 |
+
TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:"
|
232 |
+
ID2LABEL = {
|
233 |
+
0: "negative",
|
234 |
+
1: "neutral",
|
235 |
+
2: "positive"
|
236 |
+
}
|
237 |
+
LABELS = list(ID2LABEL.values())
|
238 |
+
|
239 |
+
|
240 |
+
def ds_refactor_fn(samples):
|
241 |
+
text_data = samples["text"]
|
242 |
+
label_data = samples["label"]
|
243 |
+
|
244 |
+
new_samples = {"prompt": [], "label": []}
|
245 |
+
for text, label in zip(text_data, label_data):
|
246 |
+
prompt = TEMPLATE.format(labels=LABELS, text=text)
|
247 |
+
new_samples["prompt"].append(prompt)
|
248 |
+
new_samples["label"].append(ID2LABEL[label])
|
249 |
+
|
250 |
+
return new_samples
|
251 |
+
|
252 |
+
|
253 |
+
# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0")
|
254 |
+
model = AutoGPTQForCausalLM.from_pretrained(MODEL, BaseQuantizeConfig())
|
255 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL)
|
256 |
+
|
257 |
+
task = SequenceClassificationTask(
|
258 |
+
model=model,
|
259 |
+
tokenizer=tokenizer,
|
260 |
+
classes=LABELS,
|
261 |
+
data_name_or_path=DATASET,
|
262 |
+
prompt_col_name="prompt",
|
263 |
+
label_col_name="label",
|
264 |
+
**{
|
265 |
+
"num_samples": 1000, # how many samples will be sampled to evaluation
|
266 |
+
"sample_max_len": 1024, # max tokens for each sample
|
267 |
+
"block_max_len": 2048, # max tokens for each data block
|
268 |
+
# function to load dataset, one must only accept data_name_or_path as input
|
269 |
+
# and return datasets.Dataset
|
270 |
+
"load_fn": partial(datasets.load_dataset, name="english"),
|
271 |
+
# function to preprocess dataset, which is used for datasets.Dataset.map,
|
272 |
+
# must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name]
|
273 |
+
"preprocess_fn": ds_refactor_fn,
|
274 |
+
# truncate label when sample's length exceed sample_max_len
|
275 |
+
"truncate_prompt": False
|
276 |
+
}
|
277 |
+
)
|
278 |
+
|
279 |
+
# note that max_new_tokens will be automatically specified internally based on given classes
|
280 |
+
print(task.run())
|
281 |
+
|
282 |
+
# self-consistency
|
283 |
+
print(
|
284 |
+
task.run(
|
285 |
+
generation_config=GenerationConfig(
|
286 |
+
num_beams=3,
|
287 |
+
num_return_sequences=3,
|
288 |
+
do_sample=True
|
289 |
+
)
|
290 |
+
)
|
291 |
+
)
|
292 |
+
```
|
293 |
+
|
294 |
+
</details>
|
295 |
+
|
296 |
+
## Learn More
|
297 |
+
[tutorials](docs/tutorial) provide step-by-step guidance to integrate `auto_gptq` with your own project and some best practice principles.
|
298 |
+
|
299 |
+
[examples](examples/README.md) provide plenty of example scripts to use `auto_gptq` in different ways.
|
300 |
+
|
301 |
+
## Supported Models
|
302 |
+
|
303 |
+
> you can use `model.config.model_type` to compare with the table below to check whether the model you use is supported by `auto_gptq`.
|
304 |
+
>
|
305 |
+
> for example, model_type of `WizardLM`, `vicuna` and `gpt4all` are all `llama`, hence they are all supported by `auto_gptq`.
|
306 |
+
|
307 |
+
| model type | quantization | inference | peft-lora | peft-ada-lora | peft-adaption_prompt |
|
308 |
+
|------------------------------------|--------------|-----------|-----------|---------------|-------------------------------------------------------------------------------------------------|
|
309 |
+
| bloom | ✅ | ✅ | ✅ | ✅ | |
|
310 |
+
| gpt2 | ✅ | ✅ | ✅ | ✅ | |
|
311 |
+
| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
312 |
+
| gptj | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
313 |
+
| llama | ✅ | ✅ | ✅ | ✅ | ✅ |
|
314 |
+
| moss | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
315 |
+
| opt | ✅ | ✅ | ✅ | ✅ | |
|
316 |
+
| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | |
|
317 |
+
| codegen | ✅ | ✅ | ✅ | ✅ | |
|
318 |
+
| falcon(RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ | |
|
319 |
+
|
320 |
+
## Supported Evaluation Tasks
|
321 |
+
Currently, `auto_gptq` supports: `LanguageModelingTask`, `SequenceClassificationTask` and `TextSummarizationTask`; more Tasks will come soon!
|
322 |
+
|
323 |
+
## Running tests
|
324 |
+
|
325 |
+
Tests can be run with:
|
326 |
+
|
327 |
+
```
|
328 |
+
pytest tests/ -s
|
329 |
+
```
|
330 |
+
|
331 |
+
## Acknowledgement
|
332 |
+
- Specially thanks **Elias Frantar**, **Saleh Ashkboos**, **Torsten Hoefler** and **Dan Alistarh** for proposing **GPTQ** algorithm and open source the [code](https://github.com/IST-DASLab/gptq).
|
333 |
+
- Specially thanks **qwopqwop200**, for code in this project that relevant to quantization are mainly referenced from [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda).
|
334 |
+
|
335 |
+
|
336 |
+
[![Star History Chart](https://api.star-history.com/svg?repos=PanQiwei/AutoGPTQ&type=Date)](https://star-history.com/#PanQiWei/AutoGPTQ&Date)
|
README_zh.md
ADDED
@@ -0,0 +1,330 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<h1 align="center">AutoGPTQ</h1>
|
2 |
+
<p align="center">一个基于 GPTQ 算法,简单易用且拥有用户友好型接口的大语言模型量化工具包。</p>
|
3 |
+
<p align="center">
|
4 |
+
<a href="https://github.com/PanQiWei/AutoGPTQ/releases">
|
5 |
+
<img alt="GitHub release" src="https://img.shields.io/github/release/PanQiWei/AutoGPTQ.svg">
|
6 |
+
</a>
|
7 |
+
<a href="https://pypi.org/project/auto-gptq/">
|
8 |
+
<img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dd/auto-gptq">
|
9 |
+
</a>
|
10 |
+
</p>
|
11 |
+
<h4 align="center">
|
12 |
+
<p>
|
13 |
+
<a href="https://github.com/PanQiWei/AutoGPTQ/blob/main/README.md">English</a> |
|
14 |
+
<b>中文</b>
|
15 |
+
</p>
|
16 |
+
</h4>
|
17 |
+
|
18 |
+
*<center>📣 好久不见!👋 七月和八月将会迎来架构升级,性能优化和新特性,敬请关注!🥂</center>*
|
19 |
+
|
20 |
+
## 新闻或更新
|
21 |
+
|
22 |
+
- 2023-08-21 - (新闻) - 通义千问团队发布了基于 `auto-gptq` 的 Qwen-7B 4bit 量化版本模型,并提供了[详尽的测评结果](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4#%E9%87%8F%E5%8C%96-quantization)
|
23 |
+
- 2023-08-06 - (更新) - 支持 exllama 的 q4 CUDA 算子使得 int4 量化模型能够获得至少1.3倍的推理速度提升.
|
24 |
+
- 2023-08-04 - (更新) - 支持 RoCm 使得 AMD GPU 的用户能够使用 auto-gptq 的 CUDA 拓展.
|
25 |
+
- 2023-07-26 - (更新) - 一个优雅的 [PPL 测评脚本](examples/benchmark/perplexity.py)以获得可以与诸如 `llama.cpp` 等代码库进行公平比较的结果。
|
26 |
+
- 2023-06-05 - (更新) - 集成 🤗 peft 来使用 gptq 量化过的模型训练适应层,支持 LoRA,AdaLoRA,AdaptionPrompt 等。
|
27 |
+
- 2023-05-30 - (更新) - 支持从 🤗 Hub 下载量化好的模型或上次量化好的模型到 🤗 Hub。
|
28 |
+
|
29 |
+
*获取更多的历史信息,请转至[这里](docs/NEWS_OR_UPDATE.md)*
|
30 |
+
|
31 |
+
## 性能对比
|
32 |
+
|
33 |
+
### 推理速度
|
34 |
+
> 以下结果通过[这个脚本](examples/benchmark/generation_speed.py)生成,文本输入的 batch size 为1,解码策略为 beam search 并且强制模型生成512个 token,速度的计量单位为 tokens/s(越大越好)。
|
35 |
+
>
|
36 |
+
> 量化模型通过能够最大化推理速度的方式加载。
|
37 |
+
|
38 |
+
| model | GPU | num_beams | fp16 | gptq-int4 |
|
39 |
+
|---------------|---------------|-----------|-------|-----------|
|
40 |
+
| llama-7b | 1xA100-40G | 1 | 18.87 | 25.53 |
|
41 |
+
| llama-7b | 1xA100-40G | 4 | 68.79 | 91.30 |
|
42 |
+
| moss-moon 16b | 1xA100-40G | 1 | 12.48 | 15.25 |
|
43 |
+
| moss-moon 16b | 1xA100-40G | 4 | OOM | 42.67 |
|
44 |
+
| moss-moon 16b | 2xA100-40G | 1 | 06.83 | 06.78 |
|
45 |
+
| moss-moon 16b | 2xA100-40G | 4 | 13.10 | 10.80 |
|
46 |
+
| gpt-j 6b | 1xRTX3060-12G | 1 | OOM | 29.55 |
|
47 |
+
| gpt-j 6b | 1xRTX3060-12G | 4 | OOM | 47.36 |
|
48 |
+
|
49 |
+
|
50 |
+
### 困惑度(PPL)
|
51 |
+
对于困惑度的对比, 你可以参考 [这里](https://github.com/qwopqwop200/GPTQ-for-LLaMa#result) 和 [这里](https://github.com/qwopqwop200/GPTQ-for-LLaMa#gptq-vs-bitsandbytes)
|
52 |
+
|
53 |
+
## 安装
|
54 |
+
|
55 |
+
### 快速安装
|
56 |
+
你可以通过 pip 来安装 AutoGPTQ 当前最新的稳定版本:
|
57 |
+
```shell
|
58 |
+
pip install auto-gptq
|
59 |
+
```
|
60 |
+
从 0.2.0 版本开始,你可以从每次版本发布的资产文件列表中下载预构建好的符合你系统配置情况的轮子文件,并通过安装这些轮子文件来跳过漫长的构建过程以达到最快的安装速度。如下是一个例子:
|
61 |
+
```shell
|
62 |
+
# 首先,进入轮子文件存放的目录,然后执行下面的命令
|
63 |
+
pip install auto_gptq-0.2.0+cu118-cp310-cp310-linux_x86_64.whl # 在 linux 操作系统的一个 python=3.10 且 cuda=11.8 的环境下安装 0.2.0 版本的 auto_gptq
|
64 |
+
```
|
65 |
+
#### 取消 cuda 拓展的安装
|
66 |
+
默认情况下,在 `torch` 和 `cuda` 已经于你的机器上被安装时,cuda 拓展将被自动安装,如果你不想要这些拓展的话,采用以下安装命令:
|
67 |
+
```shell
|
68 |
+
BUILD_CUDA_EXT=0 pip install auto-gptq
|
69 |
+
```
|
70 |
+
同时为确保该拓展——`autogptq_cuda` 不再存在于你的虚拟环境,执行以下命令:
|
71 |
+
```shell
|
72 |
+
pip uninstall autogptq_cuda -y
|
73 |
+
```
|
74 |
+
|
75 |
+
#### 支持使用 triton 加速
|
76 |
+
若想使用 `triton` 加速模型推理,使用以下命令:
|
77 |
+
> 警告:目前 triton 仅支持 linux 操作系统;当使用 triton 时 3-bit 数值类型的量化将不被支持
|
78 |
+
|
79 |
+
```shell
|
80 |
+
pip install auto-gptq[triton]
|
81 |
+
```
|
82 |
+
|
83 |
+
### 从源码安装
|
84 |
+
<details>
|
85 |
+
<summary>点击以查看详情</summary>
|
86 |
+
|
87 |
+
克隆源码:
|
88 |
+
```shell
|
89 |
+
git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ
|
90 |
+
```
|
91 |
+
然后,从项目目录安装:
|
92 |
+
```shell
|
93 |
+
pip install .
|
94 |
+
```
|
95 |
+
正如在快速安装一节,你可以使用 `BUILD_CUDA_EXT=0` 来取消构建 cuda 拓展。
|
96 |
+
|
97 |
+
如果你想要使用 triton 加速且其能够被你的操作系统所支持,请使用 `.[triton]`。
|
98 |
+
|
99 |
+
对应 AMD GPUs,为了从源码安装以支持 RoCm,请设置 `ROCM_VERSION` 环境变量。同时通过设置 `PYTORCH_ROCM_ARCH` ([reference](https://github.com/pytorch/pytorch/blob/7b73b1e8a73a1777ebe8d2cd4487eb13da55b3ba/setup.py#L132)) 可提升编译���度,例如:对于 MI200 系列设备,该变量可设为 `gfx90a`。例子:
|
100 |
+
|
101 |
+
```
|
102 |
+
ROCM_VERSION=5.6 pip install .
|
103 |
+
```
|
104 |
+
|
105 |
+
对于 RoCm 系统,在从源码安装时额外需要提前安装以下包:`rocsparse-dev`, `hipsparse-dev`, `rocthrust-dev`, `rocblas-dev` and `hipblas-dev`。
|
106 |
+
|
107 |
+
</details>
|
108 |
+
|
109 |
+
## 快速开始
|
110 |
+
|
111 |
+
### 量化和推理
|
112 |
+
> 警告:这里仅是对 AutoGPTQ 中基本接口的用法展示,只使用了一条文本来量化一个特别小的模型,因此其结果的表现可能不如在大模型上执行量化后预期的那样好。
|
113 |
+
|
114 |
+
以下展示了使用 `auto_gptq` 进行量化和推理的最简单用法:
|
115 |
+
```python
|
116 |
+
from transformers import AutoTokenizer, TextGenerationPipeline
|
117 |
+
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
|
118 |
+
|
119 |
+
|
120 |
+
pretrained_model_dir = "facebook/opt-125m"
|
121 |
+
quantized_model_dir = "opt-125m-4bit"
|
122 |
+
|
123 |
+
|
124 |
+
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True)
|
125 |
+
examples = [
|
126 |
+
tokenizer(
|
127 |
+
"auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."
|
128 |
+
)
|
129 |
+
]
|
130 |
+
|
131 |
+
quantize_config = BaseQuantizeConfig(
|
132 |
+
bits=4, # 将模型量化为 4-bit 数值类型
|
133 |
+
group_size=128, # 一般推荐将此参数的值设置为 128
|
134 |
+
desc_act=False, # 设为 False 可以显著提升推理速度,但是 ppl 可能会轻微地变差
|
135 |
+
)
|
136 |
+
|
137 |
+
# 加载未量化的模型,默认情况下,模型总是会被加载到 CPU 内存中
|
138 |
+
model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config)
|
139 |
+
|
140 |
+
# 量化模型, 样本的数据类型应该为 List[Dict],其中字典的键有且仅有 input_ids 和 attention_mask
|
141 |
+
model.quantize(examples)
|
142 |
+
|
143 |
+
# 保存量化好的模型
|
144 |
+
model.save_quantized(quantized_model_dir)
|
145 |
+
|
146 |
+
# 使用 safetensors 保存量化好的模型
|
147 |
+
model.save_quantized(quantized_model_dir, use_safetensors=True)
|
148 |
+
|
149 |
+
# 将量化好的模型直接上传至 Hugging Face Hub
|
150 |
+
# 当使用 use_auth_token=True 时, 确保你已经首先使用 huggingface-cli login 进行了登录
|
151 |
+
# 或者可以使用 use_auth_token="hf_xxxxxxx" 来显式地添加账户认证 token
|
152 |
+
# (取消下面三行代码的注释来使用该功能)
|
153 |
+
# repo_id = f"YourUserName/{quantized_model_dir}"
|
154 |
+
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
|
155 |
+
# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True)
|
156 |
+
|
157 |
+
# 或者你也可以同时将量化好的模型保存到本地并上传至 Hugging Face Hub
|
158 |
+
# (取消下面三行代码的注释来使用该功能)
|
159 |
+
# repo_id = f"YourUserName/{quantized_model_dir}"
|
160 |
+
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
|
161 |
+
# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True)
|
162 |
+
|
163 |
+
# 加载量化好的模型到能被识别到的第一块显卡中
|
164 |
+
model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0")
|
165 |
+
|
166 |
+
# 从 Hugging Face Hub 下载量化好的模型并加载到能被识别到的第一块显卡中
|
167 |
+
# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False)
|
168 |
+
|
169 |
+
# 使用 model.generate 执行推理
|
170 |
+
print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0]))
|
171 |
+
|
172 |
+
# 或者使用 TextGenerationPipeline
|
173 |
+
pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer)
|
174 |
+
print(pipeline("auto-gptq is")[0]["generated_text"])
|
175 |
+
```
|
176 |
+
|
177 |
+
参考 [此样例脚本](examples/quantization/quant_with_alpaca.py) 以了解进阶的用法。
|
178 |
+
|
179 |
+
### 自定义模型
|
180 |
+
|
181 |
+
<details>
|
182 |
+
|
183 |
+
<summary>以下展示了如何拓展 `auto_gptq` 以支持 `OPT` 模型,如你所见,这非常简单:</summary>
|
184 |
+
|
185 |
+
```python
|
186 |
+
from auto_gptq.modeling import BaseGPTQForCausalLM
|
187 |
+
|
188 |
+
|
189 |
+
class OPTGPTQForCausalLM(BaseGPTQForCausalLM):
|
190 |
+
# chained attribute name of transformer layer block
|
191 |
+
layers_block_name = "model.decoder.layers"
|
192 |
+
# chained attribute names of other nn modules that in the same level as the transformer layer block
|
193 |
+
outside_layer_modules = [
|
194 |
+
"model.decoder.embed_tokens", "model.decoder.embed_positions", "model.decoder.project_out",
|
195 |
+
"model.decoder.project_in", "model.decoder.final_layer_norm"
|
196 |
+
]
|
197 |
+
# chained attribute names of linear layers in transformer layer module
|
198 |
+
# normally, there are four sub lists, for each one the modules in it can be seen as one operation,
|
199 |
+
# and the order should be the order when they are truly executed, in this case (and usually in most cases),
|
200 |
+
# they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output
|
201 |
+
inside_layer_modules = [
|
202 |
+
["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"],
|
203 |
+
["self_attn.out_proj"],
|
204 |
+
["fc1"],
|
205 |
+
["fc2"]
|
206 |
+
]
|
207 |
+
```
|
208 |
+
然后, 你就可以像在基本用法一节中展示的那样使用 `OPTGPTQForCausalLM.from_pretrained` 和其他方法。
|
209 |
+
|
210 |
+
</details>
|
211 |
+
|
212 |
+
|
213 |
+
### 在下游任务上执行评估
|
214 |
+
你可以使用在 `auto_gptq.eval_tasks` 中定义的任务来评估量化前后的模型在某个特定下游任务上的表现。
|
215 |
+
|
216 |
+
这些预定义的模型支持所有在 [🤗 transformers](https://github.com/huggingface/transformers)和本项目中被实现了的 causal-language-models。
|
217 |
+
|
218 |
+
<details>
|
219 |
+
|
220 |
+
<summary>以下是使用 `cardiffnlp/tweet_sentiment_multilingual` 数据集在序列分类(文本分类)任务上评估 `EleutherAI/gpt-j-6b` 模型的示例:</summary>
|
221 |
+
|
222 |
+
```python
|
223 |
+
from functools import partial
|
224 |
+
|
225 |
+
import datasets
|
226 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
|
227 |
+
|
228 |
+
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
|
229 |
+
from auto_gptq.eval_tasks import SequenceClassificationTask
|
230 |
+
|
231 |
+
|
232 |
+
MODEL = "EleutherAI/gpt-j-6b"
|
233 |
+
DATASET = "cardiffnlp/tweet_sentiment_multilingual"
|
234 |
+
TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:"
|
235 |
+
ID2LABEL = {
|
236 |
+
0: "negative",
|
237 |
+
1: "neutral",
|
238 |
+
2: "positive"
|
239 |
+
}
|
240 |
+
LABELS = list(ID2LABEL.values())
|
241 |
+
|
242 |
+
|
243 |
+
def ds_refactor_fn(samples):
|
244 |
+
text_data = samples["text"]
|
245 |
+
label_data = samples["label"]
|
246 |
+
|
247 |
+
new_samples = {"prompt": [], "label": []}
|
248 |
+
for text, label in zip(text_data, label_data):
|
249 |
+
prompt = TEMPLATE.format(labels=LABELS, text=text)
|
250 |
+
new_samples["prompt"].append(prompt)
|
251 |
+
new_samples["label"].append(ID2LABEL[label])
|
252 |
+
|
253 |
+
return new_samples
|
254 |
+
|
255 |
+
|
256 |
+
# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0")
|
257 |
+
model = AutoGPTQForCausalLM.from_pretrained(MODEL, BaseQuantizeConfig())
|
258 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL)
|
259 |
+
|
260 |
+
task = SequenceClassificationTask(
|
261 |
+
model=model,
|
262 |
+
tokenizer=tokenizer,
|
263 |
+
classes=LABELS,
|
264 |
+
data_name_or_path=DATASET,
|
265 |
+
prompt_col_name="prompt",
|
266 |
+
label_col_name="label",
|
267 |
+
**{
|
268 |
+
"num_samples": 1000, # how many samples will be sampled to evaluation
|
269 |
+
"sample_max_len": 1024, # max tokens for each sample
|
270 |
+
"block_max_len": 2048, # max tokens for each data block
|
271 |
+
# function to load dataset, one must only accept data_name_or_path as input
|
272 |
+
# and return datasets.Dataset
|
273 |
+
"load_fn": partial(datasets.load_dataset, name="english"),
|
274 |
+
# function to preprocess dataset, which is used for datasets.Dataset.map,
|
275 |
+
# must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name]
|
276 |
+
"preprocess_fn": ds_refactor_fn,
|
277 |
+
# truncate label when sample's length exceed sample_max_len
|
278 |
+
"truncate_prompt": False
|
279 |
+
}
|
280 |
+
)
|
281 |
+
|
282 |
+
# note that max_new_tokens will be automatically specified internally based on given classes
|
283 |
+
print(task.run())
|
284 |
+
|
285 |
+
# self-consistency
|
286 |
+
print(
|
287 |
+
task.run(
|
288 |
+
generation_config=GenerationConfig(
|
289 |
+
num_beams=3,
|
290 |
+
num_return_sequences=3,
|
291 |
+
do_sample=True
|
292 |
+
)
|
293 |
+
)
|
294 |
+
)
|
295 |
+
```
|
296 |
+
|
297 |
+
</details>
|
298 |
+
|
299 |
+
## 了解更多
|
300 |
+
[教程](docs/tutorial) 提供了将 `auto_gptq` 集成到你的项目中的手把手指导和最佳实践准则。
|
301 |
+
|
302 |
+
[示例](examples/README.md) 提供了大量示例脚本以将 `auto_gptq` 用于不同领域。
|
303 |
+
|
304 |
+
## 支持的模型
|
305 |
+
|
306 |
+
> 你可以使用 `model.config.model_type` 来对照下表以检查你正在使用的一个模型是否被 `auto_gptq` 所支持。
|
307 |
+
>
|
308 |
+
> 比如, `WizardLM`,`vicuna` 和 `gpt4all` 模型的 `model_type` 皆为 `llama`, 因此这些模型皆被 `auto_gptq` 所支持。
|
309 |
+
|
310 |
+
| model type | quantization | inference | peft-lora | peft-ada-lora | peft-adaption_prompt |
|
311 |
+
|------------------------------------|--------------|-----------|-----------|---------------|-----------------------------------------------------------------------------------|
|
312 |
+
| bloom | ✅ | ✅ | ✅ | ✅ | |
|
313 |
+
| gpt2 | ✅ | ✅ | ✅ | ✅ | |
|
314 |
+
| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
315 |
+
| gptj | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
316 |
+
| llama | ✅ | ✅ | ✅ | ✅ | ✅ |
|
317 |
+
| moss | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) |
|
318 |
+
| opt | ✅ | ✅ | ✅ | ✅ | |
|
319 |
+
| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | |
|
320 |
+
| codegen | ✅ | ✅ | ✅ | ✅ | |
|
321 |
+
| falcon(RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ | |
|
322 |
+
|
323 |
+
## 支持的评估任务
|
324 |
+
目前, `auto_gptq` 支持以下评估任务: `LanguageModelingTask`, `SequenceClassificationTask` 和 `TextSummarizationTask`;更多的评估任务即将到来!
|
325 |
+
|
326 |
+
## 致谢
|
327 |
+
- 特别感谢 **Elias Frantar**, **Saleh Ashkboos**, **Torsten Hoefler** 和 **Dan Alistarh** 提出 **GPTQ** 算法并开源[代码](https://github.com/IST-DASLab/gptq)。
|
328 |
+
- 特别感谢 **qwopqwop200**, 本项目中涉及到模型量化的代码主要参考自 [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda)。
|
329 |
+
|
330 |
+
[![Star History Chart](https://api.star-history.com/svg?repos=PanQiwei/AutoGPTQ&type=Date)](https://star-history.com/#PanQiWei/AutoGPTQ&Date)
|
USE_POLICY.md
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Llama 2 Acceptable Use Policy
|
2 |
+
|
3 |
+
Meta is committed to promoting safe and fair use of its tools and features, including Llama 2. If you access or use Llama 2, you agree to this Acceptable Use Policy (“Policy”). The most recent copy of this policy can be found at [ai.meta.com/llama/use-policy](http://ai.meta.com/llama/use-policy).
|
4 |
+
|
5 |
+
## Prohibited Uses
|
6 |
+
We want everyone to use Llama 2 safely and responsibly. You agree you will not use, or allow others to use, Llama 2 to:
|
7 |
+
|
8 |
+
1. Violate the law or others’ rights, including to:
|
9 |
+
1. Engage in, promote, generate, contribute to, encourage, plan, incite, or further illegal or unlawful activity or content, such as:
|
10 |
+
1. Violence or terrorism
|
11 |
+
2. Exploitation or harm to children, including the solicitation, creation, acquisition, or dissemination of child exploitative content or failure to report Child Sexual Abuse Material
|
12 |
+
3. Human trafficking, exploitation, and sexual violence
|
13 |
+
4. The illegal distribution of information or materials to minors, including obscene materials, or failure to employ legally required age-gating in connection with such information or materials.
|
14 |
+
5. Sexual solicitation
|
15 |
+
6. Any other criminal activity
|
16 |
+
2. Engage in, promote, incite, or facilitate the harassment, abuse, threatening, or bullying of individuals or groups of individuals
|
17 |
+
3. Engage in, promote, incite, or facilitate discrimination or other unlawful or harmful conduct in the provision of employment, employment benefits, credit, housing, other economic benefits, or other essential goods and services
|
18 |
+
4. Engage in the unauthorized or unlicensed practice of any profession including, but not limited to, financial, legal, medical/health, or related professional practices
|
19 |
+
5. Collect, process, disclose, generate, or infer health, demographic, or other sensitive personal or private information about individuals without rights and consents required by applicable laws
|
20 |
+
6. Engage in or facilitate any action or generate any content that infringes, misappropriates, or otherwise violates any third-party rights, including the outputs or results of any products or services using the Llama 2 Materials
|
21 |
+
7. Create, generate, or facilitate the creation of malicious code, malware, computer viruses or do anything else that could disable, overburden, interfere with or impair the proper working, integrity, operation or appearance of a website or computer system
|
22 |
+
|
23 |
+
|
24 |
+
|
25 |
+
2. Engage in, promote, incite, facilitate, or assist in the planning or development of activities that present a risk of death or bodily harm to individuals, including use of Llama 2 related to the following:
|
26 |
+
1. Military, warfare, nuclear industries or applications, espionage, use for materials or activities that are subject to the International Traffic Arms Regulations (ITAR) maintained by the United States Department of State
|
27 |
+
2. Guns and illegal weapons (including weapon development)
|
28 |
+
3. Illegal drugs and regulated/controlled substances
|
29 |
+
4. Operation of critical infrastructure, transportation technologies, or heavy machinery
|
30 |
+
5. Self-harm or harm to others, including suicide, cutting, and eating disorders
|
31 |
+
6. Any content intended to incite or promote violence, abuse, or any infliction of bodily harm to an individual
|
32 |
+
|
33 |
+
|
34 |
+
|
35 |
+
3. Intentionally deceive or mislead others, including use of Llama 2 related to the following:
|
36 |
+
1. Generating, promoting, or furthering fraud or the creation or promotion of disinformation
|
37 |
+
2. Generating, promoting, or furthering defamatory content, including the creation of defamatory statements, images, or other content
|
38 |
+
3. Generating, promoting, or further distributing spam
|
39 |
+
4. Impersonating another individual without consent, authorization, or legal right
|
40 |
+
5. Representing that the use of Llama 2 or outputs are human-generated
|
41 |
+
6. Generating or facilitating false online engagement, including fake reviews and other means of fake online engagement
|
42 |
+
4. Fail to appropriately disclose to end users any known dangers of your AI system
|
43 |
+
|
44 |
+
Please report any violation of this Policy, software “bug,” or other problems that could lead to a violation of this Policy through one of the following means:
|
45 |
+
|
46 |
+
* Reporting issues with the model: [github.com/facebookresearch/llama](http://github.com/facebookresearch/llama)
|
47 |
+
* Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)
|
48 |
+
* Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)
|
49 |
+
* Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama: [[email protected]](mailto:[email protected])
|
50 |
+
|
batch_throttle.py
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from hfapi import Client
|
2 |
+
|
3 |
+
client = Client()
|
4 |
+
|
5 |
+
BATCH_SIZE = 4
|
6 |
+
|
7 |
+
LONG_LIST_OF_INPUTS = [
|
8 |
+
"I like you. </s></s> I love you.",
|
9 |
+
"At the other end of Pennsylvania Avenue, people began to line up for a White House tour. </s></s> People formed a line at the end of Pennsylvania Avenue.",
|
10 |
+
] * 500
|
11 |
+
|
12 |
+
def chunker(seq, size):
|
13 |
+
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
|
14 |
+
|
15 |
+
all_results = []
|
16 |
+
|
17 |
+
for inputs in chunker(LONG_LIST_OF_INPUTS, BATCH_SIZE):
|
18 |
+
result = client.text_classification(inputs, model="roberta-large-mnli")
|
19 |
+
print(result)
|
20 |
+
all_results += result
|
21 |
+
|
22 |
+
|
23 |
+
print("Done!")
|
config.json
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"model_type": "llama"
|
3 |
+
}
|
convert.py
ADDED
@@ -0,0 +1,208 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from exllamav2 import ExLlamaV2, ExLlamaV2Config, ExLlamaV2Tokenizer
|
2 |
+
import argparse, os
|
3 |
+
import sys
|
4 |
+
import json
|
5 |
+
from conversion.tokenize import tokenize
|
6 |
+
from conversion.quantize import embeddings, measure_quant, quant
|
7 |
+
from conversion.optimize import optimize
|
8 |
+
from conversion.compile import compile_model
|
9 |
+
|
10 |
+
# import tracemalloc
|
11 |
+
# tracemalloc.start()
|
12 |
+
|
13 |
+
parser = argparse.ArgumentParser(description = "Convert model to ExLlamaV2")
|
14 |
+
parser.add_argument("-i", "--in_dir", type = str, help = "Input directory", default = "")
|
15 |
+
parser.add_argument("-o", "--out_dir", type = str, help = "Output directory")
|
16 |
+
parser.add_argument("-c", "--cal_dataset", type = str, help = "Calibration dataset (.parquet file)", default = "")
|
17 |
+
parser.add_argument("-r", "--dataset_rows", type = int, default = 100, help = "Number of rows to apply from dataset")
|
18 |
+
parser.add_argument("-mr", "--measurement_rows", type = int, default = 16, help = "Number of rows to apply from dataset when measuring")
|
19 |
+
parser.add_argument("-gr", "--gpu_rows", type = int, default = 16, help = "Threshold for paging hidden state to CPU")
|
20 |
+
parser.add_argument("-l", "--length", type = int, default = 2048, help = "Max no. tokens per sample")
|
21 |
+
parser.add_argument("-ml", "--measurement_length", type = int, default = 2048, help = "Max no. tokens per sample when measuring")
|
22 |
+
parser.add_argument("-b", "--bits", type = float, default = 4.156, help = "Target bits per weight")
|
23 |
+
parser.add_argument("-hb", "--head_bits", type = int, default = 6, help = "Target bits per weight (head layer)")
|
24 |
+
parser.add_argument("-m", "--measurement", type = str, help = "Reuse previous measurement")
|
25 |
+
|
26 |
+
args = parser.parse_args()
|
27 |
+
|
28 |
+
# Arguments
|
29 |
+
|
30 |
+
in_dir = None if args.in_dir == "" else os.path.abspath(args.in_dir)
|
31 |
+
out_dir = os.path.abspath(args.out_dir)
|
32 |
+
cal_dataset = None if args.cal_dataset == "" else os.path.abspath(args.cal_dataset)
|
33 |
+
dataset_rows = args.dataset_rows
|
34 |
+
measurement_rows = args.measurement_rows
|
35 |
+
gpu_rows = args.gpu_rows
|
36 |
+
length = args.length
|
37 |
+
measurement_length = args.measurement_length
|
38 |
+
bits = args.bits
|
39 |
+
head_bits = args.head_bits
|
40 |
+
reuse_measurement = args.measurement
|
41 |
+
|
42 |
+
if not os.path.exists(out_dir):
|
43 |
+
print(f" ## Error: Directory not found: {out_dir}")
|
44 |
+
sys.exit()
|
45 |
+
|
46 |
+
# Create model without loading weights
|
47 |
+
|
48 |
+
config = ExLlamaV2Config()
|
49 |
+
config.model_dir = in_dir
|
50 |
+
config.prepare()
|
51 |
+
|
52 |
+
model = ExLlamaV2(config)
|
53 |
+
model.load(lazy = True)
|
54 |
+
|
55 |
+
tokenizer = ExLlamaV2Tokenizer(config)
|
56 |
+
|
57 |
+
# Job file
|
58 |
+
|
59 |
+
job_file = os.path.join(out_dir, "job.json")
|
60 |
+
|
61 |
+
# Create new job
|
62 |
+
|
63 |
+
def save_job():
|
64 |
+
global job_file, job
|
65 |
+
with open(job_file, "w") as f:
|
66 |
+
f.write(json.dumps(job, indent = 4))
|
67 |
+
|
68 |
+
if not os.path.exists(job_file):
|
69 |
+
|
70 |
+
print(f" -- Beginning new job")
|
71 |
+
|
72 |
+
if len(os.listdir(out_dir)) != 0:
|
73 |
+
print(f" !! Warning: Output directory is not empty: {out_dir}")
|
74 |
+
|
75 |
+
if in_dir is None:
|
76 |
+
print(f" ## Error: No input directory specified")
|
77 |
+
sys.exit()
|
78 |
+
|
79 |
+
if cal_dataset is None:
|
80 |
+
print(f" ## Error: No calibration dataset specified")
|
81 |
+
sys.exit()
|
82 |
+
|
83 |
+
job = { "in_dir": in_dir,
|
84 |
+
"out_dir": out_dir,
|
85 |
+
"cal_dataset": cal_dataset,
|
86 |
+
"dataset_rows": dataset_rows,
|
87 |
+
"measurement_rows": measurement_rows,
|
88 |
+
"gpu_rows": gpu_rows,
|
89 |
+
"length": length,
|
90 |
+
"measurement_length": measurement_length,
|
91 |
+
"bits": bits,
|
92 |
+
"head_bits": head_bits,
|
93 |
+
"progress": "begin",
|
94 |
+
}
|
95 |
+
|
96 |
+
if reuse_measurement is not None:
|
97 |
+
|
98 |
+
with open(reuse_measurement, "r") as f:
|
99 |
+
|
100 |
+
imp_measurement = json.load(f)
|
101 |
+
job["measurement"] = imp_measurement["measurement"]
|
102 |
+
job["last_module_idx"] = imp_measurement["last_module_idx"]
|
103 |
+
job["base_perplexity"] = imp_measurement["base_perplexity"]
|
104 |
+
job["reuse_measurement"] = reuse_measurement
|
105 |
+
|
106 |
+
save_job()
|
107 |
+
|
108 |
+
# Resume existing job
|
109 |
+
|
110 |
+
else:
|
111 |
+
|
112 |
+
print(f" -- Resuming job")
|
113 |
+
print(f" !! Note: Overriding options with settings from existing job")
|
114 |
+
|
115 |
+
with open(job_file, "r") as f:
|
116 |
+
job = json.load(f)
|
117 |
+
|
118 |
+
if "invalid" in job:
|
119 |
+
print(" ** Error: Corrupted job")
|
120 |
+
sys.exit()
|
121 |
+
|
122 |
+
job["out_dir"] = out_dir
|
123 |
+
|
124 |
+
# Feedback
|
125 |
+
|
126 |
+
print(f" -- Input: {job['in_dir']}")
|
127 |
+
print(f" -- Output: {out_dir}")
|
128 |
+
print(f" -- Calibration dataset: {job['cal_dataset']}, {job['dataset_rows']} / {job['measurement_rows']} ({job['gpu_rows']}) rows, {job['length']} tokens per sample")
|
129 |
+
print(f" -- Target bits per weight: {job['bits']} (decoder), {job['head_bits']} (head)")
|
130 |
+
|
131 |
+
# Make sure subfolders exist
|
132 |
+
|
133 |
+
out_tensor_dir = os.path.join(job["out_dir"], "out_tensor")
|
134 |
+
if not os.path.exists(out_tensor_dir):
|
135 |
+
os.makedirs(out_tensor_dir)
|
136 |
+
|
137 |
+
# Do the things
|
138 |
+
|
139 |
+
while True:
|
140 |
+
|
141 |
+
progress = job["progress"]
|
142 |
+
|
143 |
+
if progress == "begin":
|
144 |
+
|
145 |
+
if "reuse_measurement" in job:
|
146 |
+
|
147 |
+
print(f" -- Reusing measurement: {job['reuse_measurement']}")
|
148 |
+
job["progress"] = "optimize"
|
149 |
+
save_job()
|
150 |
+
|
151 |
+
else:
|
152 |
+
|
153 |
+
print(f" -- Tokenizing samples (measurement)...")
|
154 |
+
tokenize(job, save_job, tokenizer, measure = True)
|
155 |
+
job["progress"] = "initial_embeddings"
|
156 |
+
save_job()
|
157 |
+
|
158 |
+
if progress == "initial_embeddings":
|
159 |
+
|
160 |
+
print(f" -- Token embeddings (measurement)...")
|
161 |
+
embeddings(job, save_job, model)
|
162 |
+
job["progress"] = "measure_quant"
|
163 |
+
save_job()
|
164 |
+
|
165 |
+
if progress == "measure_quant":
|
166 |
+
|
167 |
+
print(f" -- Measuring quantization impact...")
|
168 |
+
measure_quant(job, save_job, model)
|
169 |
+
job["progress"] = "optimize"
|
170 |
+
save_job()
|
171 |
+
|
172 |
+
if progress == "optimize":
|
173 |
+
|
174 |
+
print(f" -- Optimizing...")
|
175 |
+
optimize(job, save_job)
|
176 |
+
job["progress"] = "tokens_cal"
|
177 |
+
save_job()
|
178 |
+
|
179 |
+
if progress == "tokens_cal":
|
180 |
+
|
181 |
+
print(f" -- Tokenizing samples...")
|
182 |
+
tokenize(job, save_job, tokenizer)
|
183 |
+
job["progress"] = "embeddings"
|
184 |
+
save_job()
|
185 |
+
|
186 |
+
if progress == "embeddings":
|
187 |
+
print(f" -- Token embeddings again...")
|
188 |
+
embeddings(job, save_job, model)
|
189 |
+
job["progress"] = "quant"
|
190 |
+
save_job()
|
191 |
+
|
192 |
+
if progress == "quant":
|
193 |
+
|
194 |
+
print(f" -- Quantizing...")
|
195 |
+
quant(job, save_job, model)
|
196 |
+
job["progress"] = "compile"
|
197 |
+
save_job()
|
198 |
+
|
199 |
+
if progress == "compile":
|
200 |
+
|
201 |
+
print(f" -- Compiling output file...")
|
202 |
+
compile_model(job, save_job, model)
|
203 |
+
job["progress"] = "finished"
|
204 |
+
save_job()
|
205 |
+
|
206 |
+
if progress == "finished": break
|
207 |
+
|
208 |
+
print(f" -- Finished")
|
docker-compose.yml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: "3.9"
|
2 |
+
services:
|
3 |
+
api:
|
4 |
+
image: "d0ckmg/free-gpt4-web-api:latest"
|
5 |
+
ports:
|
6 |
+
- "5500:5500"
|
7 |
+
volumes:
|
8 |
+
- ./cookies.json:/cookies.json
|
9 |
+
|
example.py
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import hfapi
|
2 |
+
client = hfapi.Client()
|
3 |
+
|
4 |
+
print("""
|
5 |
+
|
6 |
+
```python
|
7 |
+
import hfapi
|
8 |
+
client = hfapi.Client()
|
9 |
+
```
|
10 |
+
|
11 |
+
""")
|
12 |
+
|
13 |
+
print("""```python
|
14 |
+
client.question_answering("Where does she live?", "She lives in Berlin.")
|
15 |
+
```
|
16 |
+
""")
|
17 |
+
|
18 |
+
print(">", client.question_answering("Where does she live?", "She lives in Berlin."))
|
19 |
+
|
20 |
+
print("""```python
|
21 |
+
client.text_generation("My name is Julien and I like to ")
|
22 |
+
```
|
23 |
+
""")
|
24 |
+
print("```")
|
25 |
+
print(">", client.text_generation("My name is Julien and I like to ", model="gpt2"))
|
26 |
+
print("```")
|
27 |
+
print()
|
28 |
+
|
29 |
+
print("""```python
|
30 |
+
client.summarization("The tower is 324 metres (1,063 ft) tall, about the same height as an 81-storey building, and the tallest structure in Paris. Its base is square, measuring 125 metres (410 ft) on each side. During its construction, the Eiffel Tower surpassed the Washington Monument to become the tallest man-made structure in the world, a title it held for 41 years until the Chrysler Building in New York City was finished in 1930. It was the first structure to reach a height of 300 metres. Due to the addition of a broadcasting aerial at the top of the tower in 1957, it is now taller than the Chrysler Building by 5.2 metres (17 ft). Excluding transmitters, the Eiffel Tower is the second tallest free-standing structure in France after the Millau Viaduct.")
|
31 |
+
```
|
32 |
+
""")
|
33 |
+
|
34 |
+
print(">", client.summarization("The tower is 324 metres (1,063 ft) tall, about the same height as an 81-storey building, and the tallest structure in Paris. Its base is square, measuring 125 metres (410 ft) on each side. During its construction, the Eiffel Tower surpassed the Washington Monument to become the tallest man-made structure in the world, a title it held for 41 years until the Chrysler Building in New York City was finished in 1930. It was the first structure to reach a height of 300 metres. Due to the addition of a broadcasting aerial at the top of the tower in 1957, it is now taller than the Chrysler Building by 5.2 metres (17 ft). Excluding transmitters, the Eiffel Tower is the second tallest free-standing structure in France after the Millau Viaduct."))
|
35 |
+
print()
|
36 |
+
|
37 |
+
print("""```python
|
38 |
+
client.fill_mask("Paris is the [MASK] of France."))
|
39 |
+
```
|
40 |
+
""")
|
41 |
+
|
42 |
+
print(">",client.fill_mask("Paris is the [MASK] of France."))
|
43 |
+
print()
|
44 |
+
|
45 |
+
|
46 |
+
print("""```python
|
47 |
+
client.text_classification("I hated the movie!")
|
48 |
+
```
|
49 |
+
""")
|
50 |
+
|
51 |
+
print(">", client.text_classification("I hated the movie!"))
|
52 |
+
print()
|
53 |
+
|
54 |
+
|
55 |
+
print("""```python
|
56 |
+
client.token_classification("My name is Sarah and I live in London")
|
57 |
+
```
|
58 |
+
""")
|
59 |
+
|
60 |
+
print(">", client.token_classification("My name is Sarah and I live in London"))
|
61 |
+
print()
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
pandas
|
2 |
+
ninja
|
3 |
+
fastparquet
|
4 |
+
torch>=2.0.1
|
5 |
+
safetensors>=0.3.2
|
6 |
+
sentencepiece>=0.1.97
|
setup.py
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import sys
|
3 |
+
from pathlib import Path
|
4 |
+
from setuptools import setup, find_packages
|
5 |
+
|
6 |
+
|
7 |
+
common_setup_kwargs = {
|
8 |
+
"version": "0.4.1",
|
9 |
+
"name": "auto_gptq",
|
10 |
+
"author": "PanQiWei",
|
11 |
+
"description": "An easy-to-use LLMs quantization package with user-friendly apis, based on GPTQ algorithm.",
|
12 |
+
"long_description": (Path(__file__).parent / "README.md").read_text(encoding="UTF-8"),
|
13 |
+
"long_description_content_type": "text/markdown",
|
14 |
+
"url": "https://github.com/PanQiWei/AutoGPTQ",
|
15 |
+
"keywords": ["gptq", "quantization", "large-language-models", "transformers"],
|
16 |
+
"platforms": ["windows", "linux"],
|
17 |
+
"classifiers": [
|
18 |
+
"Environment :: GPU :: NVIDIA CUDA :: 11.7",
|
19 |
+
"Environment :: GPU :: NVIDIA CUDA :: 11.8",
|
20 |
+
"Environment :: GPU :: NVIDIA CUDA :: 12.0",
|
21 |
+
"License :: OSI Approved :: MIT License",
|
22 |
+
"Natural Language :: Chinese (Simplified)",
|
23 |
+
"Natural Language :: English",
|
24 |
+
"Programming Language :: Python :: 3.8",
|
25 |
+
"Programming Language :: Python :: 3.9",
|
26 |
+
"Programming Language :: Python :: 3.10",
|
27 |
+
"Programming Language :: Python :: 3.11",
|
28 |
+
"Programming Language :: C++",
|
29 |
+
]
|
30 |
+
}
|
31 |
+
|
32 |
+
|
33 |
+
BUILD_CUDA_EXT = int(os.environ.get('BUILD_CUDA_EXT', '1')) == 1
|
34 |
+
if BUILD_CUDA_EXT:
|
35 |
+
try:
|
36 |
+
import torch
|
37 |
+
except:
|
38 |
+
print("Building cuda extension requires PyTorch(>=1.13.0) been installed, please install PyTorch first!")
|
39 |
+
sys.exit(-1)
|
40 |
+
|
41 |
+
CUDA_VERSION = None
|
42 |
+
ROCM_VERSION = os.environ.get('ROCM_VERSION', None)
|
43 |
+
if ROCM_VERSION and not torch.version.hip:
|
44 |
+
print(
|
45 |
+
f"Trying to compile auto-gptq for RoCm, but PyTorch {torch.__version__} "
|
46 |
+
"is installed without RoCm support."
|
47 |
+
)
|
48 |
+
sys.exit(-1)
|
49 |
+
|
50 |
+
if not ROCM_VERSION:
|
51 |
+
default_cuda_version = torch.version.cuda
|
52 |
+
CUDA_VERSION = "".join(os.environ.get("CUDA_VERSION", default_cuda_version).split("."))
|
53 |
+
|
54 |
+
if ROCM_VERSION:
|
55 |
+
common_setup_kwargs['version'] += f"+rocm{ROCM_VERSION}"
|
56 |
+
else:
|
57 |
+
if not CUDA_VERSION:
|
58 |
+
print(
|
59 |
+
f"Trying to compile auto-gptq for CUDA, byt Pytorch {torch.__version__} "
|
60 |
+
"is installed without CUDA support."
|
61 |
+
)
|
62 |
+
sys.exit(-1)
|
63 |
+
common_setup_kwargs['version'] += f"+cu{CUDA_VERSION}"
|
64 |
+
|
65 |
+
|
66 |
+
requirements = [
|
67 |
+
"accelerate>=0.19.0",
|
68 |
+
"datasets",
|
69 |
+
"numpy",
|
70 |
+
"rouge",
|
71 |
+
"torch>=1.13.0",
|
72 |
+
"safetensors",
|
73 |
+
"transformers>=4.31.0",
|
74 |
+
"peft"
|
75 |
+
]
|
76 |
+
|
77 |
+
extras_require = {
|
78 |
+
"triton": ["triton==2.0.0"],
|
79 |
+
"test": ["parameterized"]
|
80 |
+
}
|
81 |
+
|
82 |
+
include_dirs = ["autogptq_cuda"]
|
83 |
+
|
84 |
+
additional_setup_kwargs = dict()
|
85 |
+
if BUILD_CUDA_EXT:
|
86 |
+
from torch.utils import cpp_extension
|
87 |
+
|
88 |
+
if not ROCM_VERSION:
|
89 |
+
from distutils.sysconfig import get_python_lib
|
90 |
+
conda_cuda_include_dir = os.path.join(get_python_lib(), "nvidia/cuda_runtime/include")
|
91 |
+
|
92 |
+
print("conda_cuda_include_dir", conda_cuda_include_dir)
|
93 |
+
if os.path.isdir(conda_cuda_include_dir):
|
94 |
+
include_dirs.append(conda_cuda_include_dir)
|
95 |
+
print(f"appending conda cuda include dir {conda_cuda_include_dir}")
|
96 |
+
extensions = [
|
97 |
+
cpp_extension.CUDAExtension(
|
98 |
+
"autogptq_cuda_64",
|
99 |
+
[
|
100 |
+
"autogptq_cuda/autogptq_cuda_64.cpp",
|
101 |
+
"autogptq_cuda/autogptq_cuda_kernel_64.cu"
|
102 |
+
]
|
103 |
+
),
|
104 |
+
cpp_extension.CUDAExtension(
|
105 |
+
"autogptq_cuda_256",
|
106 |
+
[
|
107 |
+
"autogptq_cuda/autogptq_cuda_256.cpp",
|
108 |
+
"autogptq_cuda/autogptq_cuda_kernel_256.cu"
|
109 |
+
]
|
110 |
+
)
|
111 |
+
]
|
112 |
+
|
113 |
+
if os.environ.get("INCLUDE_EXLLAMA_KERNELS", "1") == "1": # TODO: improve github action to always compile exllama_kernels
|
114 |
+
extensions.append(
|
115 |
+
cpp_extension.CUDAExtension(
|
116 |
+
"exllama_kernels",
|
117 |
+
[
|
118 |
+
"autogptq_cuda/exllama/exllama_ext.cpp",
|
119 |
+
"autogptq_cuda/exllama/cuda_buffers.cu",
|
120 |
+
"autogptq_cuda/exllama/cuda_func/column_remap.cu",
|
121 |
+
"autogptq_cuda/exllama/cuda_func/q4_matmul.cu",
|
122 |
+
"autogptq_cuda/exllama/cuda_func/q4_matrix.cu"
|
123 |
+
]
|
124 |
+
)
|
125 |
+
)
|
126 |
+
|
127 |
+
additional_setup_kwargs = {
|
128 |
+
"ext_modules": extensions,
|
129 |
+
"cmdclass": {'build_ext': cpp_extension.BuildExtension}
|
130 |
+
}
|
131 |
+
common_setup_kwargs.update(additional_setup_kwargs)
|
132 |
+
setup(
|
133 |
+
packages=find_packages(),
|
134 |
+
install_requires=requirements,
|
135 |
+
extras_require=extras_require,
|
136 |
+
include_dirs=include_dirs,
|
137 |
+
python_requires=">=3.8.0",
|
138 |
+
**common_setup_kwargs
|
139 |
+
)
|
test_inference.py
ADDED
@@ -0,0 +1,219 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
from exllamav2 import(
|
3 |
+
ExLlamaV2,
|
4 |
+
ExLlamaV2Config,
|
5 |
+
ExLlamaV2Cache,
|
6 |
+
ExLlamaV2Tokenizer,
|
7 |
+
model_init,
|
8 |
+
)
|
9 |
+
|
10 |
+
import argparse, os, math, time
|
11 |
+
import pandas, fastparquet
|
12 |
+
import torch
|
13 |
+
import torch.nn.functional as F
|
14 |
+
from conversion.tokenize import get_tokens
|
15 |
+
from conversion.quantize import list_live_tensors
|
16 |
+
|
17 |
+
import sys
|
18 |
+
import json
|
19 |
+
|
20 |
+
torch.cuda._lazy_init()
|
21 |
+
torch.set_printoptions(precision = 10)
|
22 |
+
# torch.backends.cuda.matmul.allow_tf32 = True
|
23 |
+
# torch.backends.cuda.matmul.allow_fp16_reduced_precision_reduction = True
|
24 |
+
# torch.set_float32_matmul_precision("medium")
|
25 |
+
|
26 |
+
parser = argparse.ArgumentParser(description = "Test inference on ExLlamaV2 model")
|
27 |
+
parser.add_argument("-ed", "--eval_dataset", type = str, help = "Perplexity evaluation dataset (.parquet file)")
|
28 |
+
parser.add_argument("-er", "--eval_rows", type = int, default = 128, help = "Number of rows to apply from dataset")
|
29 |
+
parser.add_argument("-el", "--eval_length", type = int, default = 2048, help = "Max no. tokens per sample")
|
30 |
+
parser.add_argument("-p", "--prompt", type = str, help = "Generate from prompt")
|
31 |
+
parser.add_argument("-t", "--tokens", type = int, default = 128, help = "Max no. tokens")
|
32 |
+
parser.add_argument("-ps", "--prompt_speed", action = "store_true", help = "Test prompt processing (batch) speed over context length")
|
33 |
+
parser.add_argument("-s", "--speed", action = "store_true", help = "Test raw generation speed over context length")
|
34 |
+
|
35 |
+
# Initialize model and tokenizer
|
36 |
+
|
37 |
+
model_init.add_args(parser)
|
38 |
+
args = parser.parse_args()
|
39 |
+
model_init.check_args(args)
|
40 |
+
model_init.print_options(args)
|
41 |
+
model, tokenizer = model_init.init(args)
|
42 |
+
|
43 |
+
# Test generation
|
44 |
+
|
45 |
+
if args.prompt:
|
46 |
+
|
47 |
+
with torch.inference_mode():
|
48 |
+
|
49 |
+
cache = ExLlamaV2Cache(model)
|
50 |
+
|
51 |
+
ids = tokenizer.encode(args.prompt)
|
52 |
+
tokens_prompt = ids.shape[-1]
|
53 |
+
|
54 |
+
print(f" -- Warmup...")
|
55 |
+
|
56 |
+
model.forward(ids[:, -1:])
|
57 |
+
|
58 |
+
print(f" -- Generating (greedy sampling)...")
|
59 |
+
print()
|
60 |
+
print(args.prompt, end = "")
|
61 |
+
sys.stdout.flush()
|
62 |
+
|
63 |
+
time_begin = time.time()
|
64 |
+
|
65 |
+
if ids.shape[-1] > 1: model.forward(ids[:, :-1], cache, preprocess_only = True)
|
66 |
+
|
67 |
+
torch.cuda.synchronize()
|
68 |
+
time_prompt = time.time()
|
69 |
+
|
70 |
+
for i in range(args.tokens):
|
71 |
+
|
72 |
+
text1 = tokenizer.decode(ids[:, -2:])[0]
|
73 |
+
|
74 |
+
logits = model.forward(ids[:, -1:], cache)
|
75 |
+
sample = torch.argmax(logits[0, -1]).cpu().unsqueeze(0).unsqueeze(0)
|
76 |
+
ids = torch.cat((ids, sample), dim = -1)
|
77 |
+
|
78 |
+
text2 = tokenizer.decode(ids[:, -3:])[0]
|
79 |
+
text2 = text2[len(text1):]
|
80 |
+
|
81 |
+
print (text2, end = "")
|
82 |
+
# sys.stdout.flush()
|
83 |
+
|
84 |
+
time_end = time.time()
|
85 |
+
|
86 |
+
print()
|
87 |
+
print()
|
88 |
+
|
89 |
+
total_prompt = time_prompt - time_begin
|
90 |
+
total_gen = time_end - time_prompt
|
91 |
+
print(f"Prompt processed in {total_prompt:.2f} seconds, {tokens_prompt} tokens, {tokens_prompt / total_prompt:.2f} tokens/second")
|
92 |
+
print(f"Response generated in {total_gen:.2f} seconds, {args.tokens} tokens, {args.tokens / total_gen:.2f} tokens/second")
|
93 |
+
|
94 |
+
cache = None
|
95 |
+
|
96 |
+
|
97 |
+
# Test perplexity
|
98 |
+
|
99 |
+
if args.eval_dataset:
|
100 |
+
|
101 |
+
with torch.inference_mode():
|
102 |
+
|
103 |
+
eval_dataset = args.eval_dataset
|
104 |
+
eval_rows = args.eval_rows
|
105 |
+
eval_length = args.eval_length
|
106 |
+
|
107 |
+
print(f" -- Running perplexity test")
|
108 |
+
print(f" -- Dataset: {eval_dataset}")
|
109 |
+
print(f" -- Tokenizing eval data, {eval_rows} rows x {eval_length} tokens...")
|
110 |
+
|
111 |
+
eval_tokens = get_tokens(eval_rows, eval_length, eval_dataset, tokenizer)
|
112 |
+
|
113 |
+
print(f" -- Inference", end = "")
|
114 |
+
sys.stdout.flush()
|
115 |
+
|
116 |
+
logprob_sum = 0.0
|
117 |
+
logprob_count = 0
|
118 |
+
|
119 |
+
for i in range(eval_tokens.shape[0]):
|
120 |
+
#for i in range(126, 127):
|
121 |
+
|
122 |
+
if i % 10 == 0: print(".", end = "")
|
123 |
+
sys.stdout.flush()
|
124 |
+
|
125 |
+
input_ids = eval_tokens[i:i+1, :]
|
126 |
+
|
127 |
+
input_ids = input_ids[:, :-1]
|
128 |
+
logits = model.forward(input_ids)
|
129 |
+
|
130 |
+
# print (tokenizer.decode(input_ids))
|
131 |
+
|
132 |
+
target_ids = input_ids[:, 1:].to(logits.device)
|
133 |
+
|
134 |
+
log_probs = F.log_softmax(logits, dim=-1)
|
135 |
+
token_log_probs = log_probs.gather(-1, target_ids.unsqueeze(-1)).squeeze(-1)
|
136 |
+
logprob_sum += token_log_probs.sum().item()
|
137 |
+
logprob_count += target_ids.numel()
|
138 |
+
|
139 |
+
print()
|
140 |
+
|
141 |
+
mean_log_prob = logprob_sum / logprob_count
|
142 |
+
perplexity = math.exp(-mean_log_prob)
|
143 |
+
|
144 |
+
print(f" -- Evaluation perplexity: {perplexity:.4f}")
|
145 |
+
|
146 |
+
xx = 0
|
147 |
+
|
148 |
+
|
149 |
+
# Test prompt speed
|
150 |
+
|
151 |
+
if args.prompt_speed:
|
152 |
+
|
153 |
+
with torch.inference_mode():
|
154 |
+
|
155 |
+
cache = ExLlamaV2Cache(model)
|
156 |
+
|
157 |
+
ids = torch.randint(0, model.config.vocab_size - 1, (1, model.config.max_seq_len))
|
158 |
+
|
159 |
+
print(f" -- Warmup...")
|
160 |
+
|
161 |
+
model.forward(ids[:, -1:])
|
162 |
+
|
163 |
+
print(f" -- Measuring prompt speed...")
|
164 |
+
|
165 |
+
current_len = 128
|
166 |
+
while True:
|
167 |
+
|
168 |
+
time_begin = time.time()
|
169 |
+
|
170 |
+
cache.current_seq_len = 0
|
171 |
+
model.forward(ids[:, :current_len], cache, preprocess_only = True)
|
172 |
+
torch.cuda.synchronize()
|
173 |
+
|
174 |
+
time_end = time.time()
|
175 |
+
tps = current_len / (time_end - time_begin)
|
176 |
+
|
177 |
+
print(f" ** Length {current_len:>5} tokens: {tps:>11.4f} t/s")
|
178 |
+
|
179 |
+
current_len_ = current_len
|
180 |
+
current_len = min(current_len + 128, model.config.max_seq_len)
|
181 |
+
if current_len == current_len_: break
|
182 |
+
|
183 |
+
cache = None
|
184 |
+
|
185 |
+
|
186 |
+
# Test token speed
|
187 |
+
|
188 |
+
if args.speed:
|
189 |
+
|
190 |
+
with torch.inference_mode():
|
191 |
+
|
192 |
+
cache = ExLlamaV2Cache(model)
|
193 |
+
|
194 |
+
print(f" -- Measuring token speed...")
|
195 |
+
ids = tokenizer.encode("X")
|
196 |
+
model.forward(ids[:, :])
|
197 |
+
|
198 |
+
current_idx = ids.shape[-1]
|
199 |
+
next_stop = 128
|
200 |
+
|
201 |
+
while True:
|
202 |
+
|
203 |
+
time_begin = time.time()
|
204 |
+
|
205 |
+
tokens = next_stop - current_idx
|
206 |
+
for i in range(tokens):
|
207 |
+
|
208 |
+
logits = model.forward(ids[:, -1:], cache)
|
209 |
+
sample = torch.argmax(logits[0, -1]).cpu().unsqueeze(0).unsqueeze(0)
|
210 |
+
ids = torch.cat((ids, sample), dim=-1)
|
211 |
+
|
212 |
+
time_end = time.time()
|
213 |
+
tps = tokens / (time_end - time_begin)
|
214 |
+
|
215 |
+
print(f" ** Position {current_idx:>5} + {tokens:>3} tokens: {tps:>9.4f} t/s")
|
216 |
+
|
217 |
+
current_idx = next_stop
|
218 |
+
next_stop = min(next_stop + 128, model.config.max_seq_len)
|
219 |
+
if next_stop == current_idx: break
|