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

使用 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.mzph.cn/pingmian/65601.shtml

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

相关文章

PySide6 SQLite3 做的 电脑组装报价系统

一、数据库结构说明 1. 配件类别表 (component_categories) 字段名类型说明约束category_idINTEGER类别IDPRIMARY KEY, AUTOINCREMENTcategory_nameTEXT类别名称NOT NULL, UNIQUEdescriptionTEXT类别描述 2. 配件表 (components) 字段名类型说明约束component_idINTEGER配件…

Android 部分操作(待补充

新建的线性布局.xml文件,文件名是 linearlayout.xml,根元素设置LinearLayout; 对于线性布局,调整第一个元素相对于顶部的位置,通过属性 layout_marginTop 设置后调整第一个元素的位置,后边的元素会依次向…

Android笔试面试题AI答之Android基础(7)

Android入门请看《Android应用开发项目式教程》,视频、源码、答疑,手把手教 文章目录 1.Android开发如何提高App的兼容性?**1. 支持多版本 Android 系统****2. 适配不同屏幕尺寸和分辨率****3. 处理不同硬件配置****4. 适配不同语言和地区**…

CSS学习记录21

CSS 工具提示 通过CSS 创建工具提示&#xff08;Tooltip)。 当用户将鼠标指针移动到元素上时&#xff0c;工具提示通常用于提供关于某内容的额外信息&#xff1a; <style> /* Tooltip 容器 */ .tooltip {position: relative;display: inline-block;border-bottom: 1px …

2025经典的软件测试面试题(答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 以下是软件测试相关的面试题及答案&#xff0c;希望对各位能有帮助&#xff01; 1、测试分为哪几个阶段? 一般来说分为5个阶段&#xff1a;单元测试、集成测试…

021-spring-springmvc

比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是&#xff1a; org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc.method.annotation.Requ…

rocketmq5源码系列--(二)--生产者发送消息

这是broker源码系列第一篇。还是和往常一样&#xff0c;建议copy到本地阅读 broker是基于netty的 rocketmq队列分物理队列和逻辑队列&#xff0c;物理队列只有一个而逻辑队列有很多个 rocketmq 物理队列&#xff0c;一个物理队列对应一个文件&#xff0c;一个物理队列可以对…

【每日学点鸿蒙知识】RichText展示问题、slider组件内置间距、WebView性能优化、AVSession错误

1、HarmonyOS RichText 展示问题&#xff1f; build() {Column() {Row({space:10}) {Column() {RichText( this.item.title ?? "" ).width("100%").height(80)Text(this.item.desc ?? "").fontSize(12).fontColor(0x9e9e9e)}.margin({left…

【C语言】指针大小排列

从键盘输入3个整数&#xff0c;要求定义3个指针变量p1,p2,p3&#xff0c;使p1指向3个数的最大者&#xff0c;p2 指向次大者&#xff0c;p3指向最小者&#xff0c;然后按由小到大的次序输出3个数。 #include <stdio.h> void func(int* p1, int* p2, int* p3) {if (*p1 <…

Redisson 框架详解

目录 一.为什么要使用分布式锁&#xff1f; 二.Redisson 的基本使用&#xff1a; 1.添加 Redisson 依赖&#xff1a; 2.在 application.yml 配置 Redis&#xff1a; 3. 创建 Redisson 客户端&#xff1a; &#xff08;1&#xff09;单节点模式&#xff1a; &#xff08;…

Facebook 上的社群文化:连接与共享

随着社交媒体的普及&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;不仅改变了人们的沟通方式&#xff0c;还塑造了独特的社群文化。在Facebook上&#xff0c;用户可以轻松地与朋友、家人保持联系&#xff0c;同时也能加入兴趣相投的群组、参与讨论和共享内容。社…

语言模型的革命:大型概念模型(LCM)的崛起

在人工智能领域&#xff0c;Meta最近推出的一项重大突破正在引起研究人员和开发者的广泛关注&#xff1a;大型概念模型&#xff08;Large Concept Models&#xff0c;简称LCM&#xff09;。这一创新彻底改变了我们对语言模型的理解&#xff0c;并为未来AI技术的进展指明了新的方…

Python Polars快速入门指南:LazyFrames

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions&#xff0c;本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一&#xff0c;使用惰性API可以设定一系列操作&#xff0c;而无需立即运行它们。相反&#xff0c;这些操作被保存为计算图&#xff0c;只在必要…

C# 读取多种CAN报文文件转换成统一格式数据,工具类:CanMsgRead

因为经常有读取CAN报文trace文件的需求&#xff0c;而且因为CAN卡不同、记录软件不同会导致CAN报文trace文件的格式都有差异。为了方便自己后续开发&#xff0c;我写了一个CanMsgRead工具类&#xff0c;只要提供CAN报文路径和CAN报文格式的选项即可将文件迅速读取转换为统一的C…

Redis 多机功能 — 复制、Sentinel及集群

Redis 的复制功能通过主从模式实现&#xff0c;允许用户为存储着目标数据库的服务器&#xff08;主服务&#xff09;创建多个拥有相同数据库副本的服务器&#xff08;从服务&#xff09;。让客户端的读请求可以分摊到从服务器中&#xff0c;从而提升性能。复制功能适合对数据一…

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统&#xff0c;顾名思义&#xff0c;是一种将连续变化的模拟信号转换为离散的数字信号&#xff0c;并通过适当的传输媒介进行传递的系统。在数字传输系统中&#xff0c;信息被编码成一系列的二进制数字&#xff0c;即0和1&#xff0c;这些数字序列能够…

leecode377.组合总和IV

本题其实是多重背包问题&#xff0c;对于价值和重量都是nums[i]的的物品&#xff0c;求装满这个容量为4的背包共有多少种排列方式 如果是组合问题&#xff0c;那么遍历顺序是先物品后背包&#xff0c;这样能保证物品按从小到大顺序依次放置&#xff0c;对于实例1求出来为4&…

【学生管理系统】element ui级联菜单bug

级联后端 通过父id来进行查询 GetMapping("/{parentId}")public BaseResult findAllByParentId(PathVariable("parentId") String parentId){//1 根据父id查询所有城市QueryWrapper<TbCity> queryWrapper new QueryWrapper<>();queryWrapper.…

第十七周:Fast R-CNN论文阅读

Fast R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Fast R-CNN框架2.1 RoI位置信息映射2.2 RoI pooling2.3 分类器与边界框回归器2.4 以VGG16为backbone的Fast RCNN的网络结构 3. 训练细节3.1 采样3.2 多任务损失 4. 优缺点分析总结 摘要 这篇博客介绍了Fast R-CNN&#xff0…

Python爬虫(二)- Requests 高级使用教程

文章目录 前言一、Session 对象1. 简介2. 跨请求保持 Cookie3. 设置缺省数据4. 方法级别参数不被跨请求保持5. 会话作为上下文管理器6. 移除字典参数中的值 二、请求与响应1. 请求与响应对象1.1 获取响应头信息1.2 获取发送到服务器的请求头信息 三、SSL 证书验证1. 忽略 SSL 证…