多模态数据训练的高效开源库
chug是一个面向多模态数据训练的开源库,集成了webdataset和Hugging Face datasets的高效数据处理流程。它支持图像、文档和文本任务,提供实时PDF解码、灵活数据加载和预处理功能,并为文档阅读、视觉问答等任务设计了专用管道。尽管处于alpha阶段,chug已在多个PDF数据集上测试,可为大规模多模态模型训练提供有力支持。
一个用于多模态数据高效训练的库。最初专注于图像、文档和文本任务。
chug
目前利用 webdataset
和 Hugging Face 的 datasets
。
webdataset
tar 文件和数据集管道是可扩展预训练的首选。
支持 Hugging Face 的 datasets
,非常适合探索、验证和微调用例。
chug
通过 pypdfium2 (https://github.com/pypdfium2-team/pypdfium2) 作为默认选项,或者如果您的用例可以接受 AGPL-3.0 许可,则使用 fitz/pymupdf (https://github.com/pymupdf/PyMuPDF) 提供即时 PDF 解码和渲染。必须手动启用 fitz
支持。PDF 处理在 webdataset 级别实现,因此您可以将其插入到其他 webdataset 管道中。这使得可以大规模分片流式传输原生 .pdf 文件,而无需预先渲染为 .png/.tiff 等格式。
该库仍在开发中,将其视为 alpha 版本(预发布)。主要功能应该可以正常工作,该库已经通过我们即将公开的几个 PDF 数据集进行了测试。但是,请预期仍会有重大变更、大量改进等。
pip install --pre chug
将安装当前的开发版本。
该库的设计使得不同层级的函数、类可以独立使用。
如果想使用 JSON/YAML 可序列化配置构建加载器和管道,请使用 chug/loader.py
中的顶级 chug.create_loader()
。根据数据集来源,可以轻松在 webdataset、HF datasets(未来还有其他来源)之间切换。
绕过最高级别,还可以调用 task_pipeline
中的 build_pipeline_*
方法,然后用一系列完整的参数调用 create_loader_wds
,仅用于 wds
用例。
如果完全不想使用 chug
加载器和管道,image
、text
和 wds
(尤其是解码器)功能可能在其他项目中有用。
库内模块的依赖关系旨在遵循以下层次结构。例如,doc 依赖于 wds,但 wds 永远不应依赖于 doc。
app
|
loader (chug/loader.py)
|
task_pipeline
|
doc
|
wds, hfds, image, text
|
common
common
通用配置、结构(数据类)供整个库使用
wds
特定于 Webdataset(简称 wds
)的代码。扩展和修改 webdataset 功能以适应涵盖的用例并提高鲁棒性。
chug
中的所有数据管道目前都利用 wds
管道,即使不使用 wds
数据集。
面向文档的解码(pdf 解码器)存在于 chug/wds/decode.py
中,它可以与任何 webdataset 管道一起用作解码器。例如 wds.decode(chug.wds.DecodeDoc('pill'), 'pill')
hfds
Hugging Face datasets
支持。最小包装器允许 datasets
与 chug 处理管道一起使用。
使用 datasets
时,处理管道仍然基于 webdataset,通过自定义整理类调用。
image
图像处理,基于 torchvision
和 albumentations
的转换构建代码。包括通用图像(imagenet、simclr)转换和特定文档转换的混合,包括基于 albumentations
的 nougat
转换实现。
text
文本处理、标记化代码。
doc
文档处理代码。目前专注于应用图像/PDF 解码器并处理文档 OCR 或 VQA 注释的处理器。
task_pipeline
特定任务的管道,数据集格式与建模需求在此处相遇。
任务管道的输入是基于数据集形式的样本字典,它们被解码然后处理成符合模型输入要求的输出。
处理数据 <--> 模型输入接口的特定任务管道被插入到一个包围性的数据管道中,该管道处理分片列表、随机化、包装、分布式工作、拆分、批处理等。
chug.loader
这个独立的顶级文件包含从配置数据类创建加载器及其关联管道的主要工厂方法。
app
使用 chug
的大多数应用程序将存在于库外的训练库等中。这里将包含一些内置的实用/探索应用程序。
待完善
与该库配合良好的数据集可以在 Hugging Face Hub 上的 pixparse
组织(https://huggingface.co/pixparse)下找到。
我们会在了解到其他值得注意的可用数据集时添加相关链接。
import chug img_cfg = chug.ImageInputCfg(size=(1024, 768), transform_type='doc_better') img_fn = chug.create_image_preprocessor(input_cfg=img_cfg, is_training=True) txt_fn = chug.create_text_preprocessor( 'naver-clova-ix/donut-base', prompt_end_token='<s_idl>', task_start_token='<s_idl>', # 注意:需要添加到分词器 ) task_cfg = chug.DataTaskDocReadCfg( image_process_fn=img_fn, text_process_fn=txt_fn, page_sampling='random', error_handler='dump_and_reraise', ) data_cfg = chug.DataCfg( source='pipe:curl -s -f -L https://huggingface.co/datasets/pixparse/idl-wds/resolve/main/idl-train-0{0000..2999}.tar', batch_size=8, num_samples=3144726, format='wds', ) lb = chug.create_loader( data_cfg, task_cfg, is_training=True, ) ii = iter(lb) sample = next(ii)
import chug task_cfg = chug.DataTaskDocReadCfg(page_sampling='all') data_cfg = chug.DataCfg( source='pixparse/idl-wds', split='train', batch_size=None, format='hfids', num_workers=0, ) lb = chug.create_loader( data_cfg, task_cfg, ) ii = iter(lb) sample = next(ii)
import chug img_cfg = chug.ImageInputCfg(size=(1024, 768), transform_type='doc_nougat') img_fn = chug.create_image_preprocessor(input_cfg=img_cfg, is_training=True) txt_fn = chug.create_text_preprocessor( 'naver-clova-ix/donut-base', prompt_end_token='<s_pdfa>', task_start_token='<s_pdfa>', # 注意:需要添加到分词器 ) task_cfg = chug.DataTaskDocReadCfg( image_process_fn=img_fn, text_process_fn=txt_fn, page_sampling='random', ) data_cfg = chug.DataCfg( source='pipe:curl -s -f -L https://huggingface.co/datasets/pixparse/pdfa-english-train/resolve/main/pdfa-eng-train-{000000..005000}.tar', batch_size=8, num_samples=1000000, # 待修复:替换为实际值 format='wds', ) lb = chug.create_loader( data_cfg, task_cfg, is_training=True, ) ii = iter(lb) sample = next(ii) ### 文档阅读,探索PDFA import chug task_cfg = chug.DataTaskDocReadCfg( page_sampling='all', ) data_cfg = chug.DataCfg( source='pixparse/pdfa-eng-wds', split='train', batch_size=None, format='hfids', num_workers=0, ) lb = chug.create_loader( data_cfg, task_cfg, ) ii = iter(lb) sample = next(ii) ### 图像 + 文本 ### 训练 import chug import transformers from functools import partial img_cfg = chug.ImageInputCfg(size=(512, 512), transform_type='image_timm') img_fn = chug.create_image_preprocessor(input_cfg=img_cfg, is_training=True) tokenizer = transformers.AutoTokenizer.from_pretrained('laion/CLIP-ViT-H-14-laion2B-s32B-b79K') txt_fn = partial(chug.tokenize, max_length=1000, tokenizer=tokenizer) task_cfg = chug.DataTaskImageTextCfg( image_process_fn=img_fn, text_process_fn=txt_fn, ) data_cfg = chug.DataCfg( source='pipe:curl -s -f -L https://huggingface.co/datasets/pixparse/cc12m-wds/resolve/main/cc12m-train-{0000..2175}.tar', batch_size=8, num_samples=10968539, format='wds', ) lb = chug.create_loader( data_cfg, task_cfg, is_training=True, ) ii = iter(lb) sample = next(ii) ### 文档VQA #### 训练、微调 import chug from chug.task_pipeline import create_task_pipeline img_cfg = chug.ImageInputCfg(size=(1024, 768), transform_type='doc_basic') img_fn = chug.create_image_preprocessor(img_cfg, is_training=True) txt_fn = chug.create_text_preprocessor( 'naver-clova-ix/donut-base-finetuned-docvqa', prompt_end_token='<s_answer>', task_start_token='<s_docvqa>', ) task_cfg = chug.DataTaskDocVqaCfg( image_process_fn=img_fn, text_process_fn=txt_fn, ) data_cfg = chug.DataCfg( source='pipe:curl -s -f -L https://huggingface.co/datasets/pixparse/docvqa-wds/resolve/main/docvqa-train-{000..383}.tar', batch_size=8, format='wds', num_samples=39463, ) lb = chug.create_loader( data_cfg, task_cfg, is_training=True, ) ii = iter(lb) sample = next(ii) #### 探索 import chug from chug.task_pipeline import create_task_pipeline task_cfg = chug.DataTaskDocVqaCfg( question_prefix='问题:', question_suffix='', answer_prefix='答案:', answer_suffix='' ) data_cfg = chug.DataCfg( source='pixparse/docvqa-single-page-questions', split='validation', batch_size=None, format='hfids', num_workers=0, ) lb = chug.create_loader( data_cfg, task_cfg ) ii = iter(lb) sample = next(ii) ## 致谢 `chug`源自于在[OpenCLIP](https://github.com/mlfoundations/open_clip)项目中成功使用的`webdataset`数据管道。感谢该项目中的所有贡献者。未来的工作可能会涉及闭环并在OpenCLIP中利用`chug`以增强功能。 `chug`中的图像/文档增强依赖于多个外部影响。我们面向文档的`doc_better` torchvision增强受到`nougat`的影响,而`doc_nougat`则是对[`nougat`](https://github.com/facebookresearch/nougat)中[`albumentations`](https://albumentations.ai/) + `cv2`文档管道的直接改编。几个图像增强利用了`timm`库中的现有工作。 同时,非常感谢[`webdataset`](https://github.com/webdataset/webdataset)和Hugging Face [`datasets`](https://github.com/huggingface/datasets)的维护者们。
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号