使用pyproject.toml文件管理 HuggingFace Transformers 项目配置

news2025/1/3 4:08:13

使用 pyproject.toml 文件管理 HuggingFace Transformers 项目配置——详细解析与实践

Source:https://github.com/huggingface/transformers

一、前言

在开发与维护大型 Python 项目时,统一的项目配置和工具管理变得尤为重要。HuggingFace 的 Transformers 项目采用了 pyproject.toml 文件作为配置入口,整合了代码风格检查、单元测试设置和依赖管理等内容。

本文将详细解析 Transformers 项目的 pyproject.toml 文件结构,分析其用途及如何在开发过程中利用它来规范代码和简化测试工作流程。


二、pyproject.toml 文件是什么?

pyproject.toml 是一个基于 TOML 格式的配置文件,最初由 PEP 518 提出。它的主要用途包括:

  1. 定义项目的依赖和元数据(如名称、版本号)。
  2. 配置构建工具,如 setuptoolspoetry
  3. 设置代码质量检查工具,如 ruffpytest

在 Transformers 项目中,这个文件不仅定义了代码风格规范,还配置了测试框架和代码覆盖率工具,以帮助开发者维持高质量的代码标准。


三、Transformers 项目中的 pyproject.toml 配置详解

1. 代码覆盖率工具:coverage

[tool.coverage.run]
source = ["transformers"]
omit = [
    "*/convert_*",
    "*/__main__.py"
]

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "raise",
    "except",
    "register_parameter"
]
作用:
  • coverage.run 配置:指定代码覆盖率分析的范围,只统计 transformers 目录下的代码,并排除 convert_*__main__.py 文件。
  • coverage.report 配置:定义代码覆盖率报告中忽略的代码行,例如异常处理和特殊标记 (pragma: no cover) 的代码行不会纳入覆盖率计算。
使用方法:

运行以下命令生成代码覆盖率报告:

pytest --cov=transformers

2. 代码风格与静态检查工具:ruff

[tool.ruff]
line-length = 119
作用:
  • 指定代码的最大行宽为 119 个字符,与 PEP 8 推荐的 79 字符不同,更符合现代显示器的宽屏设计。
[tool.ruff.lint]
ignore = ["C901", "E501", "E741", "F402", "F823" ]
select = ["C", "E", "F", "I", "W"]
作用:
  • ignore:忽略指定规则。例如:
    • E501:忽略代码行长度超标警告。
    • C901:忽略复杂度超标警告。
  • select:启用某些规则类别:
    • C:代码复杂度检查。
    • EF:语法和逻辑错误。
    • I:导入顺序检查。
    • W:警告类问题。
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["E402", "F401", "F403", "F811"]
作用:
  • 针对特定文件(如 __init__.py),忽略导入顺序、未使用变量等常见警告。
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
作用:
  • 使用双引号(") 作为字符串引用格式,与 Black 工具风格保持一致。
  • 统一采用空格进行缩进,确保格式一致性。
使用方法:

运行以下命令检查代码规范:

ruff check .

自动修复代码问题:

ruff check . --fix

3. 单元测试框架:pytest

[tool.pytest.ini_options]
addopts = "--doctest-glob='**/*.md'"
doctest_optionflags="NUMBER NORMALIZE_WHITESPACE ELLIPSIS"
markers = [
    "flash_attn_test: marks tests related to flash attention (deselect with '-m \"not flash_attn_test\"')",
    "bitsandbytes: select (or deselect with `not`) bitsandbytes integration tests",
    "generate: marks tests that use the GenerationTesterMixin"
]
作用:
  • addopts:允许对 Markdown 文档中的代码示例运行测试,从而确保文档代码与实际代码一致。
  • doctest_optionflags:指定测试选项,例如忽略浮点数格式差异(NUMBER)和多余的空格(NORMALIZE_WHITESPACE)。
  • markers:定义自定义测试标签,用于分类和选择特定测试用例。例如:
    • flash_attn_test:测试 Flash Attention 相关功能。
    • bitsandbytes:测试 bitsandbytes 库的集成。
使用方法:

运行指定标签的测试:

pytest -m "flash_attn_test"

运行所有测试:

pytest

四、pyproject.toml 执行流程解析

  1. 安装依赖和工具:

    pip install ruff pytest pytest-cov
    

    确保 ruffpytest 已经安装,并按 pyproject.toml 配置启用相关规则。

  2. 代码检查:
    使用 ruff 对代码风格和错误进行检查和修复:

    ruff check . --fix
    
  3. 代码覆盖率分析:
    执行单元测试并生成覆盖率报告:

    pytest --cov=transformers
    
  4. 标记测试分类:
    运行特定标签的测试,例如 Flash Attention 功能:

    pytest -m "flash_attn_test"
    
  5. 自动格式化代码:
    使用 ruff 格式化代码,保持与 black 一致:

    ruff format .
    

五、总结

通过 pyproject.toml 文件,HuggingFace Transformers 项目实现了统一管理代码质量检查、单元测试和代码覆盖率分析。

关键功能:

  1. 代码风格规范: 利用 ruff 确保一致的格式和最佳实践。
  2. 代码质量控制: 静态分析工具自动检测潜在错误和复杂度问题。
  3. 测试自动化: 使用 pytest 管理测试分类和执行,并生成覆盖率报告。

实际应用:
开发者可以快速集成这些工具到自己的项目中,提高代码质量和开发效率。

示例项目应用:

  • 创建一个新的 pyproject.toml
    touch pyproject.toml
    
  • 将上述配置复制到该文件,并运行以下命令进行格式检查和测试:
    ruff check . --fix
    pytest --cov=src
    

这样就能让 pyproject.toml 文件中的规则在项目中生效。

希望这篇文章能帮助大家更好地理解和应用 pyproject.toml 文件,提升项目开发流程的效率和规范性。

后记

2024年12月30日19点50分于上海,在GPT4o大模型辅助下完成。

附录

https://github.com/huggingface/transformers/blob/main/pyproject.toml文件内容如下:

[tool.coverage.run]
source = ["transformers"]
omit = [
    "*/convert_*",
    "*/__main__.py"
]

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "raise",
    "except",
    "register_parameter"
]

[tool.ruff]
line-length = 119

[tool.ruff.lint]
# Never enforce `E501` (line length violations).
ignore = ["C901", "E501", "E741", "F402", "F823" ]
select = ["C", "E", "F", "I", "W"]

# Ignore import violations in all `__init__.py` files.
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["E402", "F401", "F403", "F811"]
"src/transformers/file_utils.py" = ["F401"]
"src/transformers/utils/dummy_*.py" = ["F401"]

[tool.ruff.lint.isort]
lines-after-imports = 2
known-first-party = ["transformers"]

[tool.ruff.format]
# Like Black, use double quotes for strings.
quote-style = "double"

# Like Black, indent with spaces, rather than tabs.
indent-style = "space"

# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false

# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

[tool.pytest.ini_options]
addopts = "--doctest-glob='**/*.md'"
doctest_optionflags="NUMBER NORMALIZE_WHITESPACE ELLIPSIS"
markers = [
    "flash_attn_test: marks tests related to flash attention (deselect with '-m \"not flash_attn_test\"')",
    "bitsandbytes: select (or deselect with `not`) bitsandbytes integration tests",
    "generate: marks tests that use the GenerationTesterMixin"
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka小实站

需要先在前面的文章里面照着下载好kafka,并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集(Assembly)3、元数据(Metadata) 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…

(桌面运维学习)通过备份C盘,进行Windows系统的软件初始化

通过PE工具备份C盘,进行Windows系统的软件初始化 需求场景:快速初始化一批型号和主板一样的电脑系统型号也要一致(Win10专业版就最好全是WIn10专业版),初始化的内容包括已配置好的环境和已安装的软件。主要用于公司桌面…

【ELK】ES单节点升级为集群模式--太细了!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件,增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

Path-of-Thoughts:将“思维链“升级为“思维图“,三阶段框架取代单一推理,提升大模型复杂关系推理准确性至88.2%与效率提升5%

Path-of-Thoughts:将"思维链"升级为"思维图",三阶段框架取代单一推理,提升大模型复杂关系推理准确性至88.2%与效率提升5% 论文大纲理解通用流程框架 观察和假设观察现象提出假设实验验证解法拆解解法:Path-of…

ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 我们先实现一…

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算特…

大数据组件(一)快速入门调度组件Airflow

大数据组件(一)快速入门调度组件Airflow DolphinScheduler和 Airflow是数据领域很流行的两款开源任务调度系统。DolphinScheduler 致力于用可视化的方式去完成一个 DAG 工作流,而 Airflow 则想的是用类似于编程的方式完成一个 DAG 工作流。 Apache DolphinSchedule…

jpeg学习

相关最全的一篇文章链接:https://www.cnblogs.com/wtysos11/p/14089482.html YUV基础知识 Y表示亮度分量:如果只显示Y的话,图像看起来会是一张黑白照。 U(Cb)表示色度分量:是照片蓝色部分去掉亮度&#x…

内部类(3)

大家好,今天我们继续来看看内部类,今天我们来学习一下内部类的分类,我们来看看一共有几种,它们有什么作用,那么话不多说,我们直接开始。 9.1 内部类的分类 先来看下,内部类都可以在一个类的哪些位置进行定…

你还在用rand()生成随机数?

1. rand() 的缺陷 伪随机数生成器使用数学算法来产生具有良好统计特性的数字序列,但这些数字并非真正随机。 C 标准库中的 rand() 函数并不保证所生成的随机序列的质量。某些 rand() 实现生成的数字周期较短,且这些数字是可以预测的。对于有强伪随机数…

基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 2ASK调制解调 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印): 设置SNR8db 设置SNR20db 整体波形效果&…

RT-Thread中堆和栈怎么跟单片机内存相联系

现在RT-ThreadMCU的应用方式越来越普遍,RT-Thread需要配置MCU中的RAM到的系统中,进入系统内存管理,才能提供给基于实时系统的应用程序使用,比如给应用程序提供malloc、free等函数调用功能。在嵌入式软件开发中,我们经常…

2、Bert论文笔记

Bert论文 1、解决的问题2、预训练微调2.1预训练微调概念2.2深度双向2.3基于特征和微调(预训练下游策略) 3、模型架构4、输入/输出1.输入:2.输出:3.Learned Embeddings(学习嵌入)1. **Token Embedding**2. **Position Embedding**3…

TiDB 的MPP架构概述

MPP架构介绍: 如图,TiDB Server 作为协调者,首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换,让表连接在一个TiFlash上。另外 TiFlash会作为计算节点,每个TiFlash都负责数据交换,表连接…

3、redis的高可用

主从复制 主从复制:这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从,从节点只能读不能写。read only。 不能做高可用的切换&#xff…

【架构-38】如何选择通信协议和数据格式

一、通信协议选择 不同的协议适用于不同的应用场景,关键在于数据传输的需求,如:实时性、带宽、可靠性等。下面是几种常见通信协议的适用场景: WebSocket 适用场景:实时、双向数据传输、低延迟、持久连接 特点&#x…

SpringCloudAlibaba 技术栈—Sentinel

1、什么是sentinel? Sentinel是一个用于微服务架构的流量管理和控制系统,它通过限制和控制进入系统的流量,来保护系统免受过载和故障的影响,确保服务的稳定性。简而言之,它就是一个帮助微服务在高负载情况下也能稳定运行的工具。…

初学STM32 ---高级定时器互补输出带死区控制

互补输出,还带死区控制,什么意思? 带死区控制的互补输出应用之H桥 捕获/比较通道的输出部分(通道1至3) 死区时间计算 举个栗子(F1为例):DTG[7:0]250,250即二进制&#x…

RoboMIND:多体现基准 机器人操纵的智能规范数据

我们介绍了 RoboMIND,这是机器人操纵的多体现智能规范数据的基准,包括 4 个实施例、279 个不同任务和 61 个不同对象类别的 55k 真实世界演示轨迹。 工业机器人企业 埃斯顿自动化 | 埃夫特机器人 | 节卡机器人 | 珞石机器人 | 法奥机器人 | 非夕科技 | C…