From 20ebb38ce1baaa6c9b76379f3551e313b9f60ea6 Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 15:27:16 +0800 Subject: [PATCH 1/8] add prompttuning --- test/unit_test/delta/test_prompt_tuning.py | 135 +++++++++++++++++++++ tk/delta/__init__.py | 3 +- tk/delta/prompt_tuning.py | 42 +++++++ tk/utils/constants.py | 2 +- 4 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 test/unit_test/delta/test_prompt_tuning.py create mode 100644 tk/delta/prompt_tuning.py diff --git a/test/unit_test/delta/test_prompt_tuning.py b/test/unit_test/delta/test_prompt_tuning.py new file mode 100644 index 0000000..e276398 --- /dev/null +++ b/test/unit_test/delta/test_prompt_tuning.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright © Huawei Technologies Co., Ltd. 2010-2022. All rights reserved. + +import os +import logging +import unittest + +import mindspore +import pytest +from mindspore.common.tensor import Tensor + +from tk.delta.prompt_tuning import PromptTuning + +logging.getLogger().setLevel(logging.INFO) +mindspore.set_context(device_id=1) + +class TestPromptTuning(unittest.TestCase): + # _check_num + def test_check_num_with_zero_num_virtual_tokens(self): + logging.info('Start test_check_num_with_zero_num_virtual_tokens.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=0, token_dim=1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_zero_num_virtual_tokens.') + + def test_check_num_with_float_num_virtual_tokens(self): + logging.info('Start test_check_num_with_float_num_virtual_tokens.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1.5, token_dim=1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_float_num_virtual_tokens.') + + def test_check_num_with_negative_num_virtual_tokens(self): + logging.info('Start test_check_num_with_negative_num_virtual_tokens.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=-1, token_dim=1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_negative_num_virtual_tokens.') + + def test_check_num_with_str_num_virtual_tokens(self): + logging.info('Start test_check_num_with_str_num_virtual_tokens.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens='a', token_dim=1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_str_num_virtual_tokens.') + + def test_check_num_with_bool_num_virtual_tokens(self): + logging.info('Start test_check_num_with_bool_num_virtual_tokens.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=True, token_dim=1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_bool_num_virtual_tokens.') + + def test_check_num_with_zero_token_dim(self): + logging.info('Start test_check_num_with_zero_token_dim.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=0, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_zero_token_dim.') + + def test_check_num_with_float_token_dim(self): + logging.info('Start test_check_num_with_float_token_dim.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1.5, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_float_token_dim.') + + def test_check_num_with_negative_token_dim(self): + logging.info('Start test_check_num_with_negative_token_dim.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=-1, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_negative_token_dim.') + + def test_check_num_with_str_token_dim(self): + logging.info('Start test_check_num_with_str_token_dim.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim='a', num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_str_token_dim.') + + def test_check_num_with_bool_token_dim(self): + logging.info('Start test_check_num_with_bool_token_dim.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=False, num_transformer_submodules=1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_bool_token_dim.') + + def test_check_num_with_zero_num_transformer_submodules(self): + logging.info('Start test_check_num_with_zero_num_transformer_submodules.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules=0) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_zero_num_transformer_submodules.') + + def test_check_num_with_float_num_transformer_submodules(self): + logging.info('Start test_check_num_with_float_num_transformer_submodules.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules=1.5) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_float_num_transformer_submodules.') + + def test_check_num_with_negative_num_transformer_submodules(self): + logging.info('Start test_check_num_with_negative_num_transformer_submodules.') + with self.assertRaises(ValueError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules=-1) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_negative_num_transformer_submodules.') + + def test_check_num_with_str_num_transformer_submodules(self): + logging.info('Start test_check_num_with_str_num_transformer_submodules.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules='a') + logging.error(ex.exception) + logging.info('Finish test_check_num_with_str_num_transformer_submodules.') + + def test_check_num_with_bool_num_transformer_submodules(self): + logging.info('Start test_check_num_with_bool_num_transformer_submodules.') + with self.assertRaises(TypeError) as ex: + PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules=True) + logging.error(ex.exception) + logging.info('Finish test_check_num_with_bool_num_transformer_submodules.') + + def test_params_with_legal_tk_delta_prompttuning_embedding(self): + logging.info('Start test_params_with_legal_tk_delta_prompttuning_embedding') + prompttuning = PromptTuning(num_virtual_tokens=1, token_dim=1, num_transformer_submodules=1) + target = Tensor([[1], [1]]).asnumpy() == prompttuning.tk_delta_prompttuning_embedding.asnumpy() + for result in target: + self.assertTrue(result) + logging.info("Finish test_params_with_legal_tk_delta_prompttuning_embedding") + + +if __name__ == '__main__': + pytest.main(["-s", os.path.abspath(__file__)]) diff --git a/tk/delta/__init__.py b/tk/delta/__init__.py index 6fcb928..ad821ee 100644 --- a/tk/delta/__init__.py +++ b/tk/delta/__init__.py @@ -7,6 +7,7 @@ from tk.delta.prefix_layer import PrefixLayer from tk.delta.low_rank_adapter import LowRankAdapterDense, LowRankAdapterLayer from tk.delta.adapter import AdapterDense, AdapterLayer from tk.delta.r_drop import RDropLoss, rdrop_repeat +from tk.delta.prompt_tuning import PromptTuning __all__ = ['LoRADense', 'PrefixLayer', 'LowRankAdapterDense', 'LowRankAdapterLayer', - 'AdapterDense', 'AdapterLayer', 'RDropLoss', 'rdrop_repeat'] + 'AdapterDense', 'AdapterLayer', 'RDropLoss', 'rdrop_repeat', 'PromptTuning'] diff --git a/tk/delta/prompt_tuning.py b/tk/delta/prompt_tuning.py new file mode 100644 index 0000000..edd426b --- /dev/null +++ b/tk/delta/prompt_tuning.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright © Huawei Technologies Co., Ltd. 2022-2023. All rights reserved. +import mindspore as ms +import mindspore.nn as nn + +from tk.utils.version_utils import is_version_ge + +if is_version_ge(ms.__version__, '2.0.0'): + import mindspore._checkparam as Validator + + INC_LEFT = Validator.INC_LEFT +else: + from mindspore._checkparam import Validator, Rel + + INC_LEFT = Rel.INC_LEFT + + +class PromptTuning(nn.Cell): + """Define a cell with PromptTuning structure. + + Attributes: + num_virtual_tokens (int): The number of virtual tokens to use. + token_dim (int): The hidden embedding dimension of the base model. + num_transformer_submodules (int): The number of transformer submodules in the base model. + """ + + def __init__(self, + num_virtual_tokens: int, + token_dim: int, + num_transformer_submodules: int = 1): + super().__init__() + self.num_virtual_tokens = Validator.check_positive_int(num_virtual_tokens, int, "num_virtual_tokens") + self.token_dim = Validator.check_positive_int(token_dim, int, "token_dim") + self.num_transformer_submodules = Validator.check_positive_int(num_transformer_submodules, int, + "num_transformer_submodules") + self.total_virtual_tokens = self.num_virtual_tokens * self.num_transformer_submodules + self.tk_delta_prompttuning_embedding = nn.Embedding(self.total_virtual_tokens, self.token_dim) + + def construct(self, indices): + prompt_embeddings = self.tk_delta_prompttuning_embedding(indices) + return prompt_embeddings diff --git a/tk/utils/constants.py b/tk/utils/constants.py index 8d0f90d..c7a9be0 100644 --- a/tk/utils/constants.py +++ b/tk/utils/constants.py @@ -104,5 +104,5 @@ EVAL_INFER_TASK_NAMES = [EVALUATE_TASK_NAME, INFER_TASK_NAME] TK_SDK_INTERFACE_NAMES = [FINETUNE_TASK_NAME, EVALUATE_TASK_NAME, INFER_TASK_NAME] # 微调算法清单 -DELTA_LIST = ['lora', 'prefixtuning', 'adapter', 'low_rank_adapter', 'bitfit'] +DELTA_LIST = ['lora', 'prefixtuning', 'adapter', 'low_rank_adapter', 'bitfit', 'prompttuning'] -- Gitee From 2f30e120482cac65de145e8bf0f3976343c42077 Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:08:32 +0800 Subject: [PATCH 2/8] add prompttuning readme --- doc/TK_DeltaAlgorithm_README.md | 155 ++++++++++++++++++++++++++++++++ doc/image/prompt_tuning.png | Bin 0 -> 68937 bytes 2 files changed, 155 insertions(+) create mode 100644 doc/image/prompt_tuning.png diff --git a/doc/TK_DeltaAlgorithm_README.md b/doc/TK_DeltaAlgorithm_README.md index d29f769..280b5a3 100644 --- a/doc/TK_DeltaAlgorithm_README.md +++ b/doc/TK_DeltaAlgorithm_README.md @@ -1463,6 +1463,161 @@ class BertClsModel(BaseModel): +## 七、Prompt-Tuning算法 + +### 7.1 算法介绍 + +Prompt-Tuning算法通过为文本任务的输入提娜佳前缀提示信息Prompt,无需修改上游预训练模型参数,即能实现下游任务的微调。前缀Prompt并非来自人工标注,而是由深度神经网络表示,对每一个下游任务,在微调时只需要冻结预训练权重,额外训练Prompt部分的参数即可。 + +算法原理如下图所示,算法具体细节可参考相关论文[The Power of Scale for Parameter-Efficient Prompt Tuning](https://arxiv.org/abs/2104.08691)。 + +

Prompt-Tuning算法原理图: 对于每个下游任务,给输入添加前缀信息,冻结预训练模型参数,只训练这些前缀。
+ + + +### 7.2 API接口 + +#### PromptTuning + +```python +class tk.delta.prompt_tuning.PromptTuning(num_virtual_tokens, + token_dim, + num_transformer_submodules) +``` + +**参数** + +- **num_virtual_tokens**(int) - 提示词缀标记的长度。 +- **token_dim**(int)- embedding后每个标记对应向量的维度,与原模型hidden_size一致。 +- **num_transformer_submodules**(int) - 原模型中transformer子模块的个数,默认为1。 + + +**输入** + +shape为 `(batch_size, num_virtual_tokens * num_transformer_submodules)` 的Tensor。参数中的 `batch_size` 应等于模型参数中的 `batch_size` 。 + +**输出** + +shape为 `(batch_size, num_virtual_tokens * num_transformer_submodules, hidden_size)` 的Tensor 。参数中的 `batch_size`、`hidden_size`应等于模型参数中的 `batch_size`、`hidden_size`。 + + + +**异常** + +- **TypeError** - `num_virtual_tokens`不是正整数。 +- **TypeError** - `token_dim`不是正整数。 +- **TypeError** - `num_transformer_submodules`不是正整数。 + +### 7.3 使用样例 + +通过以下步骤将模型结构中经过Embedding层的输入与带有PromptTuning结构的模块进行拼接,并冻结网络进行训练: + +1)安装mindpet工具包。([安装方法参考《README.md》第二章](../README.md)) + +2)在模型的主体结构中,从工具包引入`PromptTuning`类,初始化PromptTuning模块和用于输入模块的prompt_ids,并在模型construct中,将prompt_output拼接至原模型的embedding_output之前,裁剪至原Tensor长度后替换原模型embedding_output。此外,根据不同模型的输入,对例如input_ids等Tensor进行类似拼接替换操作。PromptTuning相关参数可参考API接口自行指定。如果进行分布式训练,可调用`shard`方法指定分布式策略。 + +```python +from tk.delta import PromptTuning +# original ModelClass +def __init__(self, **kwargs): + # add promttuning initialization + self.prompt_cell = PromptTuning(num_virtual_tokens=20, token_dim=4096, num_transformer_submodules=1) + self.prompt_ids = Tensor(list(range(0, num_virtual_tokens * num_transformer_submodules)), dtype=mstype.int32) + self.prompt_ids = self.expand_dims(self.prompt_ids, 0) + # if distributed training is required, invoke shard method + self.tile = P.Tile().shard(((1, 1),)) + self.concat = P.Concat(axis=1).shard(((config.parallel_config.data_parallel, 1, 1), (config.parallel_config.data_parallel, 1, 1))) + self.slice = P.StridedSlice().shard(((config.parallel_config.data_parallel, 1, 1),)) + +def construct(self, input_ids, embedding_output, **kwargs): + # get prompt embedding output + prompt_ids = self.tile(self.prompt_ids, (batch_size, 1)) + prompt_output = self.cast(self.prompt_cell(prompt_ids), mstype.float16) + # concat prompt_output and embedding_output + embedding_output = self.concat((prompt_output, embedding_output)) + embedding_output = self.slice(embedding_output, + (0, 0, 0), + (batch_size, seq_length, self.hidden_size), + (1, 1, 1)) +``` + +3)在训练脚本中,从工具包中引入`freeze_delta`方法,定义优化器之前调用`freeze_delta`冻结除`PromptTuning`模块外其它原模型权重。([冻结方法参考《TK_GraphOperation_README.md》第一章](TK_GraphOperation_README.md)) + +```Python +from tk.graph import freeze_delta + +# freeze all cells except LoRA and head +freeze_delta(model=network, mode='prompttuning') +``` + +然后从工具包中引入`TrainableParamsCheckPoint`类,将保存ckpt的类改为`TrainableParamsCheckPoint`,仅保存需要更新的参数,可节约存储空间。([详细方法参考《TK_GraphOperation_README.md》第二章](TK_GraphOperation_README.md)) + +由于微调后只保存了部分参数,推理时具体如何加载ckpt请参考[附录A](###A 分布式微调后模型评估方法)。 + +```python +from tk.graph import TrainableParamsCheckPoint + +# original callback +# ckpt_callback = ModelCheckpoint(...) + +# replace ModelCheckpoint with TrainableParamsCheckPoint +ckpt_callback = TrainableParamsCheckPoint(...) +``` + +### 7.4 实验效果 + +下面实验基于Mindspore/Mindformers开源仓中的[llama](https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/llama.md)复现。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模型下游任务模式训练参数微调参数占比静态内存+动态内存Em/F1
epoch优化器学习率seq_lengthnum_virtual_tokens
llama_7bSQuADbaseline2Adam3.00E-052048\100%21976MB+8744MB82.57/65.84
PromptTuning2Adam1.00E-022048200.0095%14184MB+5265MB84.35/67.88
+ + + + ## 附录 ### A 微调后模型评估方法 diff --git a/doc/image/prompt_tuning.png b/doc/image/prompt_tuning.png new file mode 100644 index 0000000000000000000000000000000000000000..316652df5ad558a4a62cb825fbce05a074ecb39f GIT binary patch literal 68937 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𝔠-IJtRH$jeu3S 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 M85QX=kV(-02WzzS0{{R3 literal 0 HcmV?d00001 -- Gitee From 87fedce8c566e2aa476f24edf864bd104acc2615 Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:12:29 +0800 Subject: [PATCH 3/8] add prompt tuning total readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bf7cbc4..c87eff4 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ pip uninstall mindpet | LowRankAdapter | Compacter: Efficient low-rank hypercom plex adapter layers | [TK_DeltaAlgorithm_README](doc/TK_DeltaAlgorithm_README.md) 第四章 | | BitFit | BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Masked Language-models | [TK_DeltaAlgorithm_README](doc/TK_DeltaAlgorithm_README.md) 第五章 | | R_Drop | R-Drop: Regularized Dropout for Neural Networks | [TK_DeltaAlgorithm_README](doc/TK_DeltaAlgorithm_README.md) 第六章 | +| PromptTuning | The Power of Scale for Parameter-Efficient Prompt Tuning | [TK_DeltaAlgorithm_README](doc/TK_DeltaAlgorithm_README.md) 第七章 | -- Gitee From 3e72f665d3c2b13178aef3e993e58b5ad800edae Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:25:54 +0800 Subject: [PATCH 4/8] amend --- doc/TK_DeltaAlgorithm_README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/TK_DeltaAlgorithm_README.md b/doc/TK_DeltaAlgorithm_README.md index 280b5a3..0c5f6d8 100644 --- a/doc/TK_DeltaAlgorithm_README.md +++ b/doc/TK_DeltaAlgorithm_README.md @@ -1471,7 +1471,7 @@ Prompt-Tuning算法通过为文本任务的输入提娜佳前缀提示信息Prom 算法原理如下图所示,算法具体细节可参考相关论文[The Power of Scale for Parameter-Efficient Prompt Tuning](https://arxiv.org/abs/2104.08691)。 -

Prompt-Tuning算法原理图: 对于每个下游任务,给输入添加前缀信息,冻结预训练模型参数,只训练这些前缀。
+

Prompt-Tuning算法原理图: 对于每个下游任务,给输入添加前缀信息,冻结预训练模型参数,只训练这些前缀。
-- Gitee From daa01ae8e5103bc895a95a75bd45ded732a2ef1e Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:30:47 +0800 Subject: [PATCH 5/8] (gitignore commit and remove .idea) --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9fe17bc..dcf2d5a 100644 --- a/.gitignore +++ b/.gitignore @@ -126,4 +126,4 @@ venv.bak/ dmypy.json # Pyre type checker -.pyre/ \ No newline at end of file +.pyre/.idea -- Gitee From 7f14e5c58e592b4ff1de086d0a9735299c4e1878 Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:35:30 +0800 Subject: [PATCH 6/8] amend --- doc/TK_DeltaAlgorithm_README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/TK_DeltaAlgorithm_README.md b/doc/TK_DeltaAlgorithm_README.md index 0c5f6d8..8795db6 100644 --- a/doc/TK_DeltaAlgorithm_README.md +++ b/doc/TK_DeltaAlgorithm_README.md @@ -1471,7 +1471,7 @@ Prompt-Tuning算法通过为文本任务的输入提娜佳前缀提示信息Prom 算法原理如下图所示,算法具体细节可参考相关论文[The Power of Scale for Parameter-Efficient Prompt Tuning](https://arxiv.org/abs/2104.08691)。 -

Prompt-Tuning算法原理图: 对于每个下游任务,给输入添加前缀信息,冻结预训练模型参数,只训练这些前缀。
+

Prompt-Tuning算法原理图: 对于每个下游任务,给输入添加前缀信息,冻结预训练模型参数,只训练这些前缀。
-- Gitee From 60ad59d0abf2e393f74e74a7598a1119f76c4f16 Mon Sep 17 00:00:00 2001 From: huangxinliang Date: Tue, 11 Jul 2023 09:37:32 +0000 Subject: [PATCH 7/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20.git?= =?UTF-8?q?ignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 129 ----------------------------------------------------- 1 file changed, 129 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index dcf2d5a..0000000 --- a/.gitignore +++ /dev/null @@ -1,129 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/.idea -- Gitee From 52988f5768370db9df98f6b9980cad679483ae29 Mon Sep 17 00:00:00 2001 From: xinlianglalala Date: Tue, 11 Jul 2023 17:42:10 +0800 Subject: [PATCH 8/8] amend --- .gitignore | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9fe17bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,129 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ \ No newline at end of file -- Gitee