Files
openmind/docs/zh/developer_tutorial/contribution.md
2024-12-17 11:04:52 +00:00

9.3 KiB
Raw Blame History

贡献指南

入门

  • Gitee上Fork存储库。
  • 阅读README.md以获取项目信息和构建说明。
  • 社区行为准则coc

开发指导

测试用例

通过具体示例完成openMind Library的功能测试。

  1. 安装测试依赖包。 在项目根目录下执行如下命令。

    pip install -e .[test]
    
  2. 编写测试脚本。

    以PTTrainer.train为例分别在"tests/unit/trainer/"和"tests/functional/trainer/"路径下编写测试脚本文件test_trainer.py。

    以下示例仅为一个简单的用例实现,供用户参考。具体测试用例的实现,需要根据方法定义进行完整的覆盖才能保证功能的基本正确。

    # 引入依赖库
    import importlib
    
    import numpy as np
    from testtools import TestCase
    
    from tests.utils_for_test import slow
    
    
    # 定义PTTrainer测试用例类
    class TestPTTrainer(TestCase):
    
        # 定义测试初始化函数
        def setUp(self):
            super().setUp()
            import uuid
    
            from openmind.archived.trainers import trainer
    
            importlib.reload(trainer)
            self.output_dir = "test-trainer-%s" % uuid.uuid4()
            self.hub_model_id = f"{ORGANIZATION}/{self.output_dir}"
    
        # 定义测试资源清理函数
        def tearDown(self):
            from openmind_hub import delete_repo
    
            super().tearDown()
            try:
                delete_repo(self.hub_model_id)
            except Exception:
                pass
    
        # 定义具体的测试函数可以加入slow装饰器以便在执行ci的时候跳过执行较久的用例也可以在tests.utils_for_test中定义其他业务需要的装饰器比如require_npu等
        @slow("need 5 minutes to run, skip for PR")
        def test_train_and_push_to_hub(self):
            from openmind import AutoModelForSequenceClassification, Trainer, TrainingArguments
            from openmind import AutoTokenizer
            from openmind_hub import ModelInfo, repo_info
            from transformers import DataCollatorWithPadding
            from transformers.trainer import TrainOutput
    
            checkpoint = f"{ORGANIZATION}/tiny-random-BertModel"
            training_args = TrainingArguments(self.output_dir, push_to_hub=True)
            training_args.set_push_to_hub(self.hub_model_id, token=TOKEN)
            raw_datasets = get_glue_dataset()
            tokenizer = AutoTokenizer.from_pretrained(checkpoint)
    
            def tokenize_function(example):
                return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
    
            tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
            data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
    
            model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
    
            trainer = Trainer(
                model,
                training_args,
                train_dataset=tokenized_datasets["train"],
                eval_dataset=tokenized_datasets["validation"],
                data_collator=data_collator,
                tokenizer=tokenizer,
                compute_metrics=compute_metrics,
            )
            train_output = trainer.train()
            self.assertTrue(isinstance(repo_info(self.hub_model_id, token=TOKEN), ModelInfo))
    
            self.assertTrue(isinstance(train_output, TrainOutput))
            self.assertTrue(train_output.training_loss > 0)
    
  3. 执行测试用例脚本。

    单元测试在项目根目录下执行如下命令。

    pytest --cov=src --cov-report=html --no-cov-on-fail tests/unit/
    

    功能测试在项目根目录下执行如下命令。

    export HUB_TOKEN="your_token"
    pytest tests/functional/
    

代码风格

请遵循这些风格,使魔乐社区易于开发、审查和维护。

  • 编码指南

    请在魔乐社区使用统一的编码风格Python建议的编码风格是PEP 8编码样式。可以使用blackruff检查代码的格式建议您在IDE中安装这些插件。

    pip install black ruff -i https://mirrors.huaweicloud.com/repository/pypi/simple
    # 项目根目录下执行
    black .
    ruff --fix .
    
  • 单元测试指南

    请在魔乐社区使用统一的单元测试风格Python中建议的单元测试风格是pytest。测试用例的设计意图应该通过它的注释名称来反映。

  • 重构指南

    我们鼓励开发人员重构我们的代码以消除代码异味。所有的代码都应该符合编码风格和测试风格的需求,重构代码也不例外。当您收到警告时,您必须重构要合并的代码。

门禁异常处理

门禁异常主要包含如下几种,请根据相关提示解决异常问题。

  • 静态检查异常代码Bug、代码漏洞、代码异味

    请根据提示查找代码中的异常并解决。

  • UT测试未通过

    请根据提示,查找测试用例不通过项并检查原因,解决后再测试。

  • FT测试未通过

    请根据提示,查找测试用例不通过项并检查原因,解决后再测试。

  • 文档测试未通过

    请依照提示查找文档中的规范异常并解决。

开发模式

  1. Fork openMind Library存储库。

    在向openMind Library项目提交代码之前请确保该项目已经Fork到您自己的存储库。这意味着openMind Library存储库和您自己的存储库之间将存在并行开发因此请注意避免存储库之间的不一致。

  2. 克隆远程仓库。

    可以使用git将代码下载到本地环境。

    # For Gitee
    git clone https://gitee.com/{insert_your_forked_repo}/openmind.git
    git remote add upstream https://gitee.com/modelers/openmind.git
    
  3. 本地开发代码。

    为了避免多个分支之间的不一致,建议创建新的分支进行开发。

    git checkout -b {new_branch_name} origin/dev
    

    以dev分支为例openMind Library可能会根据需要创建版本分支和下游开发分支请先修复上游的bug。然后即可以自由地对代码进行修改。

  4. 将代码推送到远程仓库。

    更新代码后,您需要以正式的方式推送更新。

    git add .
    git status # Check the update status
    git commit -m "Your commit title"
    git commit -s --amend # Add the concrete description of your commit
    git push origin {new_branch_name}
    
  5. 向openMind Library存储库拉取请求。

    在最后一步中,您需要在新分支和"openMind Library dev"分支之间拉取比较请求。完成拉取请求后后端将自动构建、测试。您的Pull Request应该尽快合并到上游dev分支以降低冲突的风险。

报告问题

在遇到问题时发送详细报告也是对项目的一种贡献。我们对那些精心编写、全面周到的错误报告表示衷心的感谢!在您的支持下,我们将能够更有效地识别并解决问题,从而提升整个项目的稳定性和效能。

在报告问题时,请遵循以下标准格式以确保问题能够得到有效处理:

  • 环境版本信息请明确指出您所使用的openMind Library、操作系统OS、Python等关键组件的版本号。
  • 问题类型:请明确指出这是一份错误报告还是一项功能请求。
  • 问题描述与分类:清晰阐述出现的问题,并为其添加适当的标签以便分类处理。
  • 实际发生情况:详细描述问题的具体表现,包括出现的错误消息、异常行为等。
  • 预期结果:阐述在正常情况下,您期望系统或功能如何运作。
  • 重现步骤:提供一套尽可能简单且精确的操作步骤,以便他人能够重现您遇到的问题。
  • 特别说明:如有任何对审稿人而言至关重要的额外信息或注意事项,请在此处详细说明。

解决问题:

  • 如果您发现一个未解决的问题,而这正是您要解决的问题,请对该问题发表一些评论,告诉其他人您将负责它。
  • 如果问题已打开一段时间,建议贡献者在解决该问题之前进行预检查。
  • 如果您解决了自己报告的问题,则还需要在关闭该问题之前让其他人知道。

提出PR

  • Gitee上提出您的问题。
  • 如果是需要大量设计细节的新功能,还应提交设计方案。
  • 在问题讨论和设计提案审查中达成共识后在您的分支完成开发并提交PRPull Request
  • 在从审核者那里收到3+ LGTMLooks Good To Me之前不允许合入任何PR 。请注意提请人不允许在自己的PR上添加LGTM。
  • 在PR被充分讨论后它将根据讨论的结果被合并、放弃或拒绝。

注意事项:

  • 应避免任何不相关的更改。
  • 确保您的提交历史的顺序是正确的。
  • 确保分支与主分支保持一致。
  • 对于错误修复类型的PR请确保关联所有相关问题。