- 深度学习
- 计算机视觉
- NLP
- 多模态
- 模型训练
- 大模型
【免费下载链接】corenet
CoreNet: A library for training deep neural networks
ByteFormer(论文 "Bytes Are All You Need: Transformers Operating Directly On File Bytes",arXiv 2306.00238)是一种无需图像解码即可直接在文件字节序列上执行分类推理的 Transformer 架构,已作为classification模型原生集成在 CoreNet 库中。本文以 projects/byteformer/README.md 为主线,结合 CoreNet 的模型源码、collate 函数与实验配置,完整讲解 ByteFormer 的架构原理、配置参数、训练/评估命令、字节级数据增强以及 ImageNet 与 Speech Commands v2 上的实验复现方案,帮助你直接上手在 CoreNet 中训练与部署字节级分类模型。
ByteFormer 架构:输入文件字节序列 → Token Embedding → Conv1D 下采样 → Windowed Transformer → 输出类别。图片来源:projects/byteformer/model_arch.png。
ByteFormer 核心思想:为什么可以直接吃字节
传统图像 Transformer 的输入是解码后的像素张量,推理时需要完整走一遍图像解码流程。ByteFormer 则把输入视为一串原始文件字节(int序列),让模型自行从字节模式中学习语义。原 README 给出的关键结论如下:
- 在相似参数量下,ByteFormer 在 ImageNet 上达到77.33%Top-1 准确率,高于原始 DeiT-Ti 的72.2%,且推理时完全不需要图像解码;
- 因为网络只消费字节,可以不加修改地用于不同图像编码(TIFF/JPEG/PNG/fHWC 等)以及不同模态(如图像与音频);
- 在不修改架构和训练超参数的情况下,ByteFormer 在 Speech Commands v2 音频分类上达到95.42%(对照该领域当时的 SOTA 98.7%);
- 通过向网络输入混淆后的字节,可以在推理阶段增强隐私保护。
注意:以上数字均引自项目官方 README 及其论文,用于说明该架构在论文设定实验下的表现,不代表与所有后续模型的横向对比结论。
源码级架构拆解:ByteFormer 在 CoreNet 中的实现
ByteFormer 的模型类位于 corenet/modeling/models/classification/byteformer.py,通过MODEL_REGISTRY.register(name="byteformer", type="classification")注册(见 byteformer.py)。其前向流程为:字节序列 → 词元嵌入 → 可选的 Conv1D 序列压缩 → 位置编码 → Windowed Transformer 骨干(含 Token Merging 下采样)→ 均值池化 → 线性分类头。各模块逐一拆解如下。
字节词元嵌入(Byte Token Embedding)
模型接收形状为[batch_size, sequence_length]的整数张量作为输入(用整数而非 byte 类型,是因为填充位用-1表示,见 byteformer.py)。词元嵌入的vocab_size默认为257,对应 256 个字节值加上 1 个 mask token(源码注释与参数说明见 byteformer.py)。嵌入权重除 padding 索引外使用trunc_normal重新初始化,标准差为sqrt(1.0 / embed_dim)(byteformer.py)。
Conv1D 序列压缩(Token Reduction Net)
在嵌入之后,ByteFormer 用一个nn.Conv1d对 token 序列做下采样(byteformer.py):
kernel_size由--model.classification.byteformer.conv-kernel-size控制,默认16;stride = kernel_size // 2,即使用重叠一半的滑动窗口;- 当
kernel_size == 0时跳过卷积(token_reduction_net = None)。
对应的 mask 使用unfold_tokens(byteformer.py)以相同窗口做同步折叠,通过max合并窗口内 mask 值,保证填充位置在压缩后仍然被标记为-inf。
位置编码
位置编码长度由--model.classification.byteformer.max-num-tokens决定(默认 10000),默认使用可学习位置嵌入,也可通过--model.classification.byteformer.sinusoidal-pos-emb切换为固定正弦编码(byteformer.py)。前向时按self.pos_embed(self.max_num_tokens)[:, :x.shape[1]]截取当前序列长度所需的部分(byteformer.py)。
Windowed Transformer 骨干与 Token Merging 下采样
骨干由WindowedTransformerEncoder堆叠而成(corenet/modeling/modules/windowed_transformer.py),核心超参数为:
window_sizes:滑动窗口注意力窗口大小,默认[128];若只给一个值会自动广播到所有层(byteformer.py);window_shifts:窗口偏移列表,默认在 0 与 64 之间交替([0, 64] * 6);downsample:布尔列表,指定在哪些层之后做下采样,默认[True, True] + [False, True] * 4 + [False, False](12 层配置);stochastic_dropout:随机深度,按层在 0 到设定值之间线性插值分配(byteformer.py)。
下采样通过TokenMerging(embed_dim)(来自 corenet/modeling/layers/token_merging.py)实现,它会同步缩减序列长度与 key-padding mask(byteformer.py)。层数、窗口、偏移、下采样四者的长度必须严格一致,否则抛ValueError。
池化与分类头
骨干输出经过post_transformer_norm(默认 LayerNorm)后,按 mask 做排除填充位的均值池化(把-inf位置置 0 后求和再除以有效 token 数),最后接一个LinearLayer(embed_dim, num_classes)分类器(byteformer.py)。
模型规模配置
模型规模由--model.classification.byteformer.mode控制,各档位定义在 corenet/modeling/models/classification/config/byteformer.py:
| mode | embed_dim | 层数 | 注意力头数 | FFN 维度 | 头维度 |
|---|---|---|---|---|---|
| tiny | 192 | 12 | 3 | 768 | 64 |
| small | 384 | 12 | 6 | 1536 | 64 |
| base | 768 | 12 | 12 | 3072 | 64 |
| huge | 1280 | 32 | 20 | 5120 | 64 |
各档位的注意力和 FFN dropout 均为 0,pos_emb_drop_p在 tiny 下为 0.1,其余为 0。实验配置中普遍使用tiny。
配置文件详解:以 ImageNet TIFF 编码为例
每个实验对应一个 YAML 配置文件。以 encoding_type=TIFF.yaml 为例,完整配置如下:
common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: TIFF sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true要点解读:
image_augmentation.pil_save:file_encoding: TIFF表示训练时将增强后的图像重新编码为 TIFF 文件字节再喂给网络,这正是"直接消费文件字节"的关键一环;JPEG 实验还需quality字段(如quality: 100),fCHW/fHWC 则直接展平像素张量而不经过 PIL 编码(见下文增强一节);collate_fn_name_*:三者都指向byteformer_image_collate_fn(注册于 byteformer_collate_functions.py),字节级变换与 padding 都在 collate 阶段完成;model.classification.byteformer:mode: tiny、max_num_tokens: 50000(配置里常放大到 50000 以便实验,源码默认 10000)、conv_kernel_size: 32、window_sizes: [128];- 训练策略为 AdamW(weight_decay 0.05)+ 余弦调度(max_epochs 300、warmup 7500 迭代、max_lr 0.001)+ 标签平滑 0.1 + EMA(momentum 0.0001)+ 混合精度训练。
训练 ByteFormer
训练命令(来自原 README):
corenet-train --common.config-file $CONFIG_FILE原 README 说明,ImageNet 实验在单节点 8 块 A100 GPU上训练,Speech Commands v2 实验在单节点 4 块 A100 GPU上训练。直接用各子目录下的 YAML 配置文件即可,例如:
corenet-train --common.config-file projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml评估 ByteFormer(加载预训练权重)
原 README 给出的评估命令示例(TIFF 模型):
export CFG_FILE=projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_tiff.pt export DATASET_PATH=/mnt/vision_datasets/imagenet/validation/ CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH命令要点:
--common.config-file指向对应实验配置(此处为 TIFF 编码配置);--model.classification.pretrained加载预训练权重文件(imagenet_tiff.pt);--common.override-kwargs dataset.root_val=$DATASET_PATH用命令行覆盖验证集路径,不必修改 YAML 文件;CUDA_VISIBLE_DEVICES=0指定单卡评估。
评估入口的实现位于 corenet/cli/main_eval.py,训练/评估/转换等命令的统一入口说明见 corenet/cli/main.py。
实验配置目录速览
原 README 的projects/byteformer/下每个子目录对应论文中一张实验表格,均可直接用于复现:
| 子目录 | 实验内容 |
|---|---|
| imagenet_file_encodings/ | 使用 TIFF 或其他编码(fCHW/fHWC/PNG/TIFF)的图像实验 |
| imagenet_jpeg_q100/ | JPEG 质量因子为 100 的实验(含不同conv_kernel_size) |
| imagenet_jpeg_q60/ | JPEG 质量因子为 60 的实验(含不同 kernel size 与窗口大小) |
| imagenet_jpeg_shuffle_bytes/ | 打乱字节顺序的消融实验(reverse / random_shuffle / cyclic_half_length / stride / window_shuffle) |
| imagenet_obfuscation/ | 字节值替换(混淆)实验,见论文细节 |
| imagenet_privacy_preserving_camera/ | 掩码像素值(隐私保护相机)实验,不同keep_frac与 kernel size |
| speech_commands_mp3/ | Speech Commands v2 上的 MP3 音频分类实验 |
| speech_commands_wav/ | Speech Commands v2 上的 WAV 音频分类实验 |
字节级数据增强:collate 阶段的变换链
ByteFormer 的字节变换不在模型内部、也不在常规 transform 阶段执行,而是在collate 函数中串行应用,原因正如 byteformer_collate_functions.py 所述:这些变换无法在 GPU 上完成,放在 collate 阶段可以并行化,并避免张量在 GPU→CPU→GPU 之间反复搬运。
图像侧byteformer_image_collate_fn的变换链为(byteformer_collate_functions.py):
apply_pil_save → apply_shuffle_bytes → apply_mask_positions → apply_random_uniform_noise → apply_byte_permutation → apply_padding → pytorch_default_collate_fn对应变换类均定义在 corenet/data/transforms/image_bytes.py:
| 变换 | 开关配置 | 关键参数与源码行为 |
|---|---|---|
PILSave | image_augmentation.pil_save.enable | file_encoding支持fCHW、fHWC、TIFF、PNG(compress_level=0)、JPEG(quality默认 100);前两种直接展平[C,H,W]像素为字节,后三种经 PIL 编码为文件字节(image_bytes.py) |
ShuffleBytes | image_augmentation.shuffle_bytes.enable | mode支持reverse(整段倒序)、random_shuffle(全随机重排)、cyclic_half_length(半长循环滚动)、stride(按stride默认 1024 重排)、window_shuffle(按window_size默认 1024 的固定随机置换分窗打乱)(image_bytes.py) |
MaskPositions | image_augmentation.mask_positions.enable | keep_frac默认 0.5,用固定种子生成一次性的随机掩码,仅保留keep_frac比例的字节(模拟只传输部分像素的隐私保护相机)(image_bytes.py) |
RandomUniformNoise | image_augmentation.random_uniform.enable | width_range默认[-5, 5],对每个字节加均匀噪声后% 256取模,用于混淆实验(image_bytes.py) |
BytePermutation | image_augmentation.byte_permutation.enable | 用固定种子生成 0–255 的随机置换,把字节值映射到新值,也是混淆手段之一(image_bytes.py) |
填充由apply_padding完成:取 batch 内最大序列长度,用--model.classification.byteformer.padding-index(默认-1)补齐短样本(byteformer_collate_functions.py)。这解释了为何模型输入是可能含负值的整数张量:padding 位用-1而非真实字节值。
以混淆实验为例,width_range=[-20,20].yaml 同时开启pil_save(file_encoding: fHWC)、byte_permutation与random_uniform(width_range: [-20, 20]);隐私保护相机实验 keep_frac=0.05,conv_kernel_size=4.yaml 则开启mask_positions(keep_frac: 0.05)并把conv_kernel_size降为 4 以适配更短的字节序列。
音频分类:Speech Commands v2(WAV / MP3)
ByteFormer 同样覆盖音频模态。音频侧 collate 函数为byteformer_audio_collate_fn(byteformer_collate_functions.py),流程为:apply_torchaudio_save → apply_padding(key="audio") → 删除 metadata → 默认 collate。
TorchaudioSave(corenet/data/transforms/audio_bytes.py)由audio_augmentation.torchaudio_save.enable开关控制,通过encoding_dtype(如float32、int16、uint8等)与format(wav或mp3)把音频重新编码为文件字节。
以 speech_commands_wav/encoding_dtype=float32,conv_kernel_size=32.yaml 为例,其与图像配置的关键差异:
dataset.name: speech_commands_v2、category: audio_classification,speech_commands_v2.mixup: true;collate_fn_name_*: byteformer_audio_collate_fn;- 音频增强使用
audio_augmentation.noise(levels 如-50,refresh_freq 100)与audio_augmentation.roll(window 0.1); - 模型侧
classification.byteformer.mode: tiny、conv_kernel_size: 32、window_sizes: [128],n_classes: 12(12 类命令词); - 调度器 warmup 迭代数更少(500)。
MP3 实验配置位于 speech_commands_mp3/,将format改为mp3、conv_kernel_size与window_size按需调整(如 k=4、w=32)。
复现 FLOPs 与模型规模估计的关键注意点
原 README 特别提醒(此处完整保留):默认情况下,配置中的--model.classification.byteformer.max-num-tokens设置得比实际所需更大,目的是允许在不改配置的情况下自由试验(例如调低 Conv1D 的 kernel size 会导致输入到 Transformer 骨干的 token 数变长)。论文中估算 FLOPs 与模型规模时,将该值设为对应输入类型(TIFF、JPEG 等)经 BF-Ti 的 Conv1D 下采样后的平均 token 长度;但训练时若直接设为平均输入长度,对于变长输入(如 JPEG)会因必然出现超过max-num-tokens的样本而报错。
同理,--model.classification.byteformer.dummy-input-token-length应设为你目标输入域(在 Conv1D 下采样之前)的预期输入长度,以获得准确的性能估算。源码中该参数默认值为48564,对应 ImageNet 上 224×224 JPEG 图像的平均字节长度(byteformer.py)。dummy_input_and_label(byteformer.py)会用该长度生成随机字节 dummy 输入,用于 FLOPs/模型规模统计。
此外,预训练权重由于同样包含比必要值更大的嵌入,模型文件本身也会略大于最小所需体积(详见原 README 关于模型规模的说明)。
预训练模型
原 README 提供的预训练模型列表如下(配置链接已转换为仓库内相对路径,权重文件为官方发布,可通过 CoreNet 模型下载说明获取imagenet_tiff.pt等文件):
| 数据集 | 任务 | Top-1 | 配置 |
|---|---|---|---|
| ImageNet | 图像分类 | 77.05 | IN TIFF |
| ImageNet | 图像分类 | 67.64 | IN JPEG Q100 k=8 w=128 |
| ImageNet | 图像分类 | 62.43 | IN JPEG Q60 k=4 w=128 |
| ImageNet(字节打乱) | 图像分类 | 61.14 | IN Shuffle Bytes Reverse |
| ImageNet(混淆) | 图像分类 | 76.00 | IN Random Uniform [-20, 20] |
| ImageNet(隐私保护相机) | 图像分类 | 68.10 | IN k=4 keep_pixels=0.05 |
| Speech Commands v2 12 类 | 音频分类 | 94.95 | SC WAV FP32 k=32 w=128 |
| Speech Commands v2 12 类 | 音频分类 | 90.25 | SC MP3 k=4 w=32 |
评估时按前文命令,将--model.classification.pretrained指向对应权重文件(如imagenet_tiff.pt),并结合相应 YAML 配置即可复现表内 Top-1 指标。
延伸阅读与引用
- 论文:Bytes Are All You Need: Transformers Operating Directly On File Bytes(Horton, Mehta, Farhadi, Rastegari, 2023,arXiv 2306.00238);
- 配套架构实现:byteformer.py、模型配置 config/byteformer.py;
- 数据侧实现:byteformer_collate_functions.py、变换实现 image_bytes.py 与 audio_bytes.py;
- 测试覆盖可参考 tests/data/collate_fns/test_byteformer_collate_fn.py 与 tests/modeling/models/classification/;
- CoreNet 库的整体说明见 README.md。
若你的工作使用了本实现,可按原 README 提供的 BibTeX 引用:
@article{Horton2023BytesAA, title={Bytes Are All You Need: Transformers Operating Directly On File Bytes}, author={Maxwell Horton and Sachin Mehta and Ali Farhadi and Mohammad Rastegari}, journal={ArXiv}, year={2023}, volume={abs/2306.00238} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} }- 深度学习
- 计算机视觉
- NLP
- 多模态
- 模型训练
- 大模型
【免费下载链接】corenet
CoreNet: A library for training deep neural networks
相关推荐
go-git 扩展机制完全指南:Storer、Filesystem、Transport、Cache 与 Hash 五大扩展点深度解析
go git 扩展机制完全指南:Storer、Filesystem、Transport、Cache 与 Hash 五大扩展点深度解析 go git 是使用 Go
深度学习计算机视觉NLP多模态模型训练大模型游戏 DLSS 版本怎么换、怎么回退:DLSS Swapper 完整教程
游戏 DLSS 版本怎么换、怎么回退:DLSS Swapper 完整教程 游戏更新后塞来一个新 DLSS 版本,画面开始闪,你又不想动游戏目录里的文件。DLSS
桌面应用终极指南:如何快速掌握CoreNet Byteformer字节级处理技术
终极指南:如何快速掌握CoreNet Byteformer字节级处理技术 CoreNet是字节跳动开源的深度学习训练库,专门用于训练深度神经网络。其中Bytef
深度学习计算机视觉NLP多模态模型训练大模型
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考