[Paper] [引用] [剪辑Colab] [可口可乐]
欢迎使用OpenAI剪辑的开源实施(对比语言图像预训练)。
使用此代码库,我们在各种数据源和计算预算上培训了几个模型,从小型实验到较大的运行范围,包括在LAION-400M,LAION-2B和DATACOMP-1B等数据集中训练的型号。我们的许多模型及其缩放属性在论文可再现的缩放定律中进行了详细研究,以进行对比的语言图像学习。我们已经训练过的一些最佳型号及其零照片ImaTEnet-1k精度以及由OpenAI和其他最先进的开源替代方案训练的VIT-L模型(所有这些都可以通过OpenCLIP加载)。我们在此处提供了有关我们完整的预算模型集合的更多详细信息,并在此处提供38个数据集的零摄像结果。
| 模型 | 培训数据 | 解决 | 看到的样本# | ImageNet零射击ACC。 |
|---|---|---|---|---|
| convnext-base | Laion-2B | 256px | 13b | 71.5% |
| Convnext-large | Laion-2B | 320px | 29b | 76.9% |
| convnext-xxlarge | Laion-2B | 256px | 34B | 79.5% |
| VIT-B/32 | Datacomp-1b | 256px | 34B | 72.8% |
| VIT-B/16 | Datacomp-1b | 224px | 13b | 73.5% |
| VIT-L/14 | Laion-2B | 224px | 32B | 75.3% |
| VIT-H/14 | Laion-2B | 224px | 32B | 78.0% |
| VIT-L/14 | Datacomp-1b | 224px | 13b | 79.2% |
| VIT-G/14 | Laion-2B | 224px | 34B | 80.1% |
| VIT-L/14(原始剪辑) | 机智 | 224px | 13b | 75.5% |
| VIT-SO400M/14(siglip) | 威布利 | 224px | 45B | 82.0% |
| VIT-SO400M-14-SIGLIP-384(siglip) | 威布利 | 384px | 45B | 83.1% |
| VIT-H/14 Quickgelu(DFN) | DFN-5B | 224px | 39b | 83.4% |
| VIT-H-14-378-Quickgelu(DFN) | DFN-5B | 378px | 44b | 84.4% |
带有其他型号的模型卡可以在OpenClip库标签下的拥抱面中心上找到:https://huggingface.co/models?library = open_clip。
如果您发现此存储库有用,请考虑引用。如果您还有其他请求或建议,我们欢迎任何人提交问题或发送电子邮件。
请注意, src/open_clip/建模和令牌代码的部分是OpenAI官方存储库的改编。
| 图片来源:https://github.com/openai/clip |
pip install open_clip_torch
import torch
from PIL import Image
import open_clip
model , _ , preprocess = open_clip . create_model_and_transforms ( 'ViT-B-32' , pretrained = 'laion2b_s34b_b79k' )
model . eval () # model in train mode by default, impacts some models with BatchNorm or stochastic depth active
tokenizer = open_clip . get_tokenizer ( 'ViT-B-32' )
image = preprocess ( Image . open ( "docs/CLIP.png" )). unsqueeze ( 0 )
text = tokenizer ([ "a diagram" , "a dog" , "a cat" ])
with torch . no_grad (), torch . cuda . amp . autocast ():
image_features = model . encode_image ( image )
text_features = model . encode_text ( text )
image_features /= image_features . norm ( dim = - 1 , keepdim = True )
text_features /= text_features . norm ( dim = - 1 , keepdim = True )
text_probs = ( 100.0 * image_features @ text_features . T ). softmax ( dim = - 1 )
print ( "Label probs:" , text_probs ) # prints: [[1., 0., 0.]]另请参阅此[剪辑colab]。
为了有效地计算数十亿个嵌入,您可以使用具有OpenCLIP支持的夹子返回。
我们提供了一个简单的模型接口,以实例化预训练和未经训练的模型。要查看可以使用哪些预告片的型号,请使用以下代码段。有关我们审慎模型的更多详细信息,请参见此处。
> >> import open_clip
> >> open_clip . list_pretrained ()您可以在此表中找到有关我们支持的模型(例如参数,flops的数量)的更多信息。
注意:许多现有检查点都使用原始OpenAI型号的QuickGelu激活。在最近版本的Pytorch中,这种激活实际上不如天然Torch.nn.gelu效率。现在,模型默认值为nn.gelu,因此应该将模型定义与-quickgelu Postfix一起进行openclip预处理的权重。所有OpenAi预估计的权重始终将默认为QuickGelu。一个人还可以使用QuickGelu进行验证的权重的非-quickgelu模型定义,但精确度可能会降低,以便进行微调,这可能会消失。未来训练的模型将使用nn.gelu。
可以使用open_clip.create_model_and_transforms加载模型,如下示例所示。模型名称和相应的pretrained密钥与open_clip.list_pretrained()的输出兼容。
pretrained论点还接受本地路径,例如/path/to/my/b32.pt 。您也可以通过这种方式从拥抱面加载检查点。为此,下载open_clip_pytorch_model.bin文件(例如,https://huggingface.co/laion/clip-vit-l-14-datacomp.xl-s13b-b90k/tree/main),并使用pretrained=/path/to/open_clip_pytorch_model.bin 。
# pretrained also accepts local paths
model , _ , preprocess = open_clip . create_model_and_transforms ( 'ViT-B-32' , pretrained = 'laion2b_s34b_b79k' ) 该存储库专注于培训剪辑模型。要在下游分类任务(例如ImageNet)上微调训练有素的零拍模型,请参阅我们的其他存储库:Wise-ft。 Wise-FT存储库包含有关我们论文的代码,涉及零击模型的稳健微调,在该模型中,我们引入了一种用于微调零拍模型的技术,同时保留了分配偏移的鲁棒性。
要将数据集作为WebDataSet下载,我们建议IMG2DataSet。
请参阅CC3M IMG2DATASET示例。
除了通过上述CSV文件指定培训数据外,我们的代码库还支持WebDataSet,该WebDataSet建议用于大型数据集。预期格式是一系列.tar文件。这些.tar文件中的每个文件都应包含每个培训示例的两个文件,一个用于图像,一个用于相应的文本。这两个文件都应具有相同的名称,但分机不同。例如, shard_001.tar可以包含诸如abc.jpg和abc.txt之类的文件。您可以在https://github.com/webdataset/webdataset上了解有关webdataset更多信息。我们使用.tar文件,每个文件都有1,000个数据点,我们使用TARP创建。
您可以从Multimedia Commons下载YFCC数据集。与OpenAI类似,我们使用YFCC的一部分来达到上述精度数字。该子集中的图像索引在OpenAI的剪辑存储库中。
我们建议您首先创建一个虚拟环境:
python3 -m venv .env
source .env/bin/activate
pip install -U pip
然后,您可以安装OpenCLIP进行培训,以pip install 'open_clip_torch[training]' 。
如果您想更改贡献代码,则可以克隆OpenClip,然后在OpenClip文件夹中运行make install (创建VirtualEnv之后)
按照https://pytorch.org/get-started/locally/安装pip pytorch
您可以运行make install-training以安装训练DEPS
可以使用make install-test进行测试,然后make test
python -m pytest -x -s -v tests -k "training"以运行特定测试
针对特定的git修订或标签进行回归测试:
生成测试数据
python tests/util_test.py --model RN50 RN101 --save_model_list models.txt --git_revision 9d31b2ec4df6d8228f370ff20c8267ec6ba39383警告:这将调用git并修改您的工作树,但在生成数据后将其重置为当前状态!
在以这种方式生成测试数据时,请勿修改工作树。
运行回归测试
OPEN_CLIP_TEST_REG_MODELS=models.txt python -m pytest -x -s -v -m regression_testpython -m open_clip_train.main
--save-frequency 1
--zeroshot-frequency 1
--report-to tensorboard
--train-data= " /path/to/train_data.csv "
--val-data= " /path/to/validation_data.csv "
--csv-img-key filepath
--csv-caption-key title
--imagenet-val=/path/to/imagenet/root/val/
--warmup 10000
--batch-size=128
--lr=1e-3
--wd=0.1
--epochs=30
--workers=8
--model RN50注意: imagenet-val是用于零射门评估的ImageNet验证集的途径,而不是训练集!如果您不想在整个培训中对ImageNet进行零射门评估,则可以删除此参数。请注意, val文件夹应包含子文件夹。如果没有,请使用此脚本。
该代码经过了最多1024 A100的战斗测试,并提供了各种用于分布式培训的解决方案。我们包括对Slurm簇的本机支持。
随着用于训练的设备的数量增加,logit矩阵的空间复杂性也增加。使用幼稚的全采集方案,空间复杂性将为O(n^2) 。取而代之的是,如果使用旗帜--gather-with-grad和--local-loss的标志,复杂性可能会有效地线性。这种变化导致一对一的数值结果作为幼稚的方法。
对于较大的数据集(例如LAION2B),我们建议将征用--train-num-samples低于整个时期的值,例如, --train-num-samples 135646078至1/16的时代,以与--dataset-resampled一起使用以下方式进行采样。这允许具有频繁的检查点可以更频繁地评估。
最近的研究表明,可以将视觉令牌的一半到四分之三的辍学,导致高达2-3倍的训练速度而不会损失准确性。
您可以使用键patch_dropout在Visual Transformer配置上设置此此设置。
在纸上,他们还没有在末尾没有补丁掉落的情况。您可以使用命令行的参数--force-patch-dropout 0.
OpenCLIP通过使用::将不同的数据路径分开,使用多个数据源支持。例如,要在CC12M和Laion上训练--train-data "/data/cc12m/cc12m-train-{0000..2175}.tar::/data/LAION-400M/{00000..41455}.tar" 。对于这些情况,建议使用--dataset-resampled 。
默认情况下,按期望,该模型将看到每个源的样本与源大小成正比。例如,当对一个尺寸为400m和一个具有10m尺寸的数据源进行训练时,从第一个来源的样本中可以看到40倍的可能性。
我们还通过使用--train-data-upsampling-factors标志来支持数据源的不同权重。例如,在上面的情况下,使用--train-data-upsampling-factors=1::1等效于不使用标志,而--train-data-upsampling-factors=1::2等于等于上采样第二个数据源。如果要从具有相同频率的数据源进行采样,则UPSMPLING因子应与数据源的大小成反比。例如,如果数据集A具有1000个示例,并且数据集B有100个样本,则可以使用--train-data-upsampling-factors=0.001::0.01 (或类似地, --train-data-upsampling-factors=1::10 )。
我们利用torchrun推出分布式作业。以下在4个GPU的节点上启动了A工作:
cd open_clip/src
torchrun --nproc_per_node 4 -m open_clip_train.main
--train-data ' /data/cc12m/cc12m-train-{0000..2175}.tar '
--train-num-samples 10968539
--dataset-type webdataset
--batch-size 320
--precision amp
--workers 4
--imagenet-val /data/imagenet/validation/上面相同的脚本可以正常工作,只要用户包括有关节点和主机节点的信息。
cd open_clip/src
torchrun --nproc_per_node=4
--rdzv_endpoint= $HOSTE_NODE_ADDR
-m open_clip_train.main
--train-data ' /data/cc12m/cc12m-train-{0000..2175}.tar '
--train-num-samples 10968539
--dataset-type webdataset
--batch-size 320
--precision amp
--workers 4
--imagenet-val /data/imagenet/validation/这可能是最容易使用的解决方案。以下脚本用于培训我们最大的模型:
#! /bin/bash -x
# SBATCH --nodes=32
# SBATCH --gres=gpu:4
# SBATCH --ntasks-per-node=4
# SBATCH --cpus-per-task=6
# SBATCH --wait-all-nodes=1
# SBATCH --job-name=open_clip
# SBATCH --account=ACCOUNT_NAME
# SBATCH --partition PARTITION_NAME
eval " $( /path/to/conda/bin/conda shell.bash hook ) " # init conda
conda activate open_clip
export CUDA_VISIBLE_DEVICES=0,1,2,3
export MASTER_PORT=12802
master_addr= $( scontrol show hostnames " $SLURM_JOB_NODELIST " | head -n 1 )
export MASTER_ADDR= $master_addr
cd /shared/open_clip
export PYTHONPATH= " $PYTHONPATH : $PWD /src "
srun --cpu_bind=v --accel-bind=gn python -u src/open_clip_train/main.py
--save-frequency 1
--report-to tensorboard
--train-data= " /data/LAION-400M/{00000..41455}.tar "
--warmup 2000
--batch-size=256
--epochs=32
--workers=8
--model ViT-B-32
--name " ViT-B-32-Vanilla "
--seed 0
--local-loss
--gather-with-gradpython -m open_clip_train.main
--train-data= " /path/to/train_data.csv "
--val-data= " /path/to/validation_data.csv "
--resume /path/to/checkpoints/epoch_K.pt训练可口可乐模型是通过使用训练脚本的--model参数来指定可口可乐配置的。当前可用的配置为“ COCA_BASE”,“ COCA_VIT-B-32”和“ COCA_ROBERTA-VIT-B-32”(使用Roberta作为文本编码)。可口配置与夹式配置不同,因为它们具有另一个“多模式_CFG”组件,该组件指定了多模式文本解码器的参数。这是COCA_VIT-B-32配置的一个示例:
"multimodal_cfg" : {
"context_length" : 76 ,
"vocab_size" : 49408 ,
"width" : 512 ,
"heads" : 8 ,
"layers" : 12 ,
"latent_dim" : 512 ,
"attn_pooler_heads" : 8
}归功于Lucidrains的初始代码,GPUCCE将代码调整为Open_Clip,以及IEJMAC以训练模型。
import open_clip
import torch
from PIL import Image
model , _ , transform = open_clip . create_model_and_transforms (
model_name = "coca_ViT-L-14" ,
pretrained = "mscoco_finetuned_laion2B-s13B-b90k"
)
im = Image . open ( "cat.jpg" ). convert ( "RGB" )
im = transform ( im ). unsqueeze ( 0 )
with torch . no_grad (), torch . cuda . amp . autocast ():
generated = model . generate ( im )
print ( open_clip . decode ( generated [ 0 ]). split ( "<end_of_text>" )[ 0 ]. replace ( "<start_of_text>" , "" ))另请参阅此[可口可乐]
要在Mscoco上微调可口可乐,首先创建数据集,一种方法是使用CSVDATASET,也许最简单的方法是使用clip_benchmark,而clip_benchmark又使用pycocotools(也可以本身也可以使用)。
from clip_benchmark . datasets . builder import build_dataset
import pandas as pd
import os
root_path = "path/to/data/dir" # set this to smth meaningful
ds = build_dataset ( "mscoco_captions" , root = root_path , split = "train" , task = "captioning" ) # this downloads the dataset if it is not there already
coco = ds . coco
imgs = coco . loadImgs ( coco . getImgIds ())
future_df = { "filepath" :[], "title" :[]}
for img in imgs :
caps = coco . imgToAnns [ img [ "id" ]]
for cap in caps :
future_df [ "filepath" ]. append ( img [ "file_name" ])
future_df [ "title" ]. append ( cap [ "caption" ])
pd . DataFrame . from_dict ( future_df ). to_csv (
os . path . join ( root_path , "train2014.csv" ), index = False , sep = " t "
)这应该创建一个CSV数据集,可以使用open_clip来微调可可
python -m open_clip_train.main
--dataset-type " csv "
--train-data " path/to/data/dir/train2014.csv "
--warmup 1000
--batch-size 128
--lr 1e-5
--wd 0.1
--epochs 1
--workers 3
--model " coca_ViT-L-14 "
--report-to " wandb "
--coca-contrastive-loss-weight 0
--coca-caption-loss-weight 1
--log-every-n-steps 100这是一个通用设置,Open_Clip具有可以设置的非常参数, python -m open_clip_train.main --help应该显示它们。与培训前相比,唯一相关的更改是两个参数
--coca-contrastive-loss-weight 0
--coca-caption-loss-weight 1这使该模型仅训练生成方面。
如果您希望使用不同的语言模型作为剪辑的文本编码器,则可以通过在src/open_clip/model_configs中使用拥抱的面部模型配置之一,并分别将其作为tokenizer作为--model和--hf-tokenizer-name参数。目前,我们仅支持Roberta(“ Test-Roberta”配置),但是添加新型号应该是微不足道的。您还可以确定从末端开始有多少层,以使--lock-text-unlocked-layers参数离开未散发。这是一个示例命令,可以与Roberta LM一起训练剪辑,该剪辑的最后10层未汇合:
python -m open_clip_train.main
--train-data= " pipe:aws s3 cp s3://s-mas/cc3m/{00000..00329}.tar - "
--train-num-samples 3000000
--val-data= " pipe:aws s3 cp s3://s-mas/cc3m/{00330..00331}.tar - "
--val-num-samples 10000
--dataset-type webdataset
--batch-size 256
--warmup 2000
--epochs 10
--lr 5e-4
--precision amp
--workers 6
--model " roberta-ViT-B-32 "
--lock-text
--lock-text-unlocked-layers 10
--name " 10_unfrozen "
--report-to " tensorboard " 当在具有8 GPU的机器上运行时,命令应为概念标题产生以下训练曲线:
概念标题的更详细的曲线是在/DOCS/clip_conceptual_captions.md上给出的。
当在YFCC上训练RN50时,使用了与上述相同的超参数,除了lr=5e-4和epochs=32 。
请注意,使用另一种模型,例如ViT-B/32或RN50x4或RN50x16或ViT-B/16 ,使用--model RN50x4指定。
对于张板记录,请运行:
tensorboard --logdir=logs/tensorboard/ --port=7777对于WandB日志记录,我们建议查看step变量而不是Step ,因为该代码库的早期版本未正确设置。对于在#613之前训练的型号,应忽略Step变量。对于较新的运行,在该PR之后,两个变量是相同的。
我们建议https://github.com/laion-ai/clip_benchmark#how-to-use用于系统评估40个数据集。
python -m open_clip_train.main
--val-data= " /path/to/validation_data.csv "
--model RN101
--pretrained /path/to/checkpoints/epoch_K.ptpython -m open_clip_train.main
--imagenet-val /path/to/imagenet/validation
--model ViT-B-32-quickgelu
--pretrained laion400m_e32您可以通过使用--distill-model和--distill-pretrained预先训练,以指定要从中提取的模型。例如,从OpenAI VIT-L/14使用--distill-model ViT-L-14 --distill-pretrained openai 。
为了模拟较大的批次使用--accum-freq k 。如果按GPU --batch-size大小为m,则为m ,则有效批量大小为k * m * num_gpus 。
当增加--accum-freq默认值为1时,样本/s将保持大致恒定(批量大小将翻倍,每批批次将增加一倍)。建议使用其他功能来降低批处理大小,例如--grad-checkpointing --local-loss --gather-with-grad之前,然后增加--accum-freq 。 --accum-freq除了这些功能外还可以使用。
现在有2个正向通行证,而不是每例示例。但是,第一个是用torch.no_grad完成的。
需要其他一些GPU内存---所有m批次的功能和数据都存储在内存中。
也有m损失计算,而不是通常的1。
有关更多信息,请参见Cui等。 (https://arxiv.org/abs/2112.09331)或Pham等。 (https://arxiv.org/abs/2111.10050)。
我们对INT8培训和推断有Beta支持。您可以使用--use-bnb-linear SwitchBackLinearGlobal或--use-bnb-linear SwitchBackLinearGlobalMemEfficient启用INT8培训。有关这些层的定义,请参阅BitsandBytes库。对于剪辑vit-nuge,目前应对应于10%的训练速度,而准确性损失没有。当对注意力层进行重构时,更多的加速度会加速,以便在那里更换线性层。
请参阅教程https://github.com/mlfoundations/open_clip/blob/main/main/tutorials/int8_tutorial.ipynb或Paper。
始终可以直接从远程文件中恢复S3存储库中的文件。只需设置--resume s3://<path-to-checkpoint>即可。这将与fsspec支持的任何文件系统一起使用。
也可以在连续备份S3的同时训练open_clip型号。这可以有助于避免慢速本地文件系统。
假设您的节点具有本地SSD /scratch ,一个S3存储桶s3://<path-to-bucket> 。
在这种情况下,set --logs /scratch和--remote-sync s3://<path-to-bucket> 。然后,一个背景过程将同步/scratch/<run-name>与s3://<path-to-bucket>/<run-name> 。同步后,背景过程将入睡--remote-sync-frequency秒,默认为5分钟。
还提供了与其他远程文件系统同步的实验支持,而不仅仅是S3。为此,指定--remote-sync-protocol fsspec 。但是,目前非常慢,不建议。
另外,要选择避免在使用这些功能时在本地保存过多的检查点,您可以使用--delete-previous-checkpoint 。
注意:如果您将此功能与--resume latest一起使用,则会有一些警告。首先,不支持与--save-most-recent一起使用。其次,仅支持s3 。最后,由于同步发生在后台,因此最新检查点可能无法完成与遥控器的同步。
模块open_clip.push_to_hf_hub包括用于推动模型 /W权重的帮助者,并将配置为HF集线器。
该工具可以从命令行,例如: python -m open_clip.push_to_hf_hub --model convnext_large_d_320 --pretrained /train/checkpoints/epoch_12.pt --repo-id laion/CLIP-convnext_large_d_320.laion2B-s29B-b131K-ft
我们感谢高斯超级计算中心(www.gauss-centre.eu)通过在JülichSupercuting Center(JSC)的GCS SuperComputer Juwels Booster上通过John superComputer Juwels Booster在GCS SuperComputer Juwels Booster上提供计算时间,以资助这部分工作。
该存储库的当前发展由Ross Wightman,Romain Beaumont,Cade Gordon和Vaishaal Shankar领导。
该存储库的原始版本来自UW,Google,Stanford,Amazon,Columbia和Berkeley的一组研究人员。
Gabriel Ilharco*,Mitchell Wortsman*,Nicholas Carlini,Rohan Taori,Achal Dave,Vaishaal Shankar,John Miller,Hongseok Namkoong,Hannaneh Hajishirzi,Ali Farhadi,Ludwig Schmidt
特别感谢Jong Wook Kim和Alec Radford在复制剪辑方面的帮助!
如果您发现此存储库有用,请考虑引用:
@software { ilharco_gabriel_2021_5143773 ,
author = { Ilharco, Gabriel and
Wortsman, Mitchell and
Wightman, Ross and
Gordon, Cade and
Carlini, Nicholas and
Taori, Rohan and
Dave, Achal and
Shankar, Vaishaal and
Namkoong, Hongseok and
Miller, John and
Hajishirzi, Hannaneh and
Farhadi, Ali and
Schmidt, Ludwig } ,
title = { OpenCLIP } ,
month = jul,
year = 2021 ,
note = { If you use this software, please cite it as below. } ,
publisher = { Zenodo } ,
version = { 0.1 } ,
doi = { 10.5281/zenodo.5143773 } ,
url = { https://doi.org/10.5281/zenodo.5143773 }
} @inproceedings { cherti2023reproducible ,
title = { Reproducible scaling laws for contrastive language-image learning } ,
author = { Cherti, Mehdi and Beaumont, Romain and Wightman, Ross and Wortsman, Mitchell and Ilharco, Gabriel and Gordon, Cade and Schuhmann, Christoph and Schmidt, Ludwig and Jitsev, Jenia } ,
booktitle = { Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition } ,
pages = { 2818--2829 } ,
year = { 2023 }
} @inproceedings { Radford2021LearningTV ,
title = { Learning Transferable Visual Models From Natural Language Supervision } ,
author = { Alec Radford and Jong Wook Kim and Chris Hallacy and A. Ramesh and Gabriel Goh and Sandhini Agarwal and Girish Sastry and Amanda Askell and Pamela Mishkin and Jack Clark and Gretchen Krueger and Ilya Sutskever } ,
booktitle = { ICML } ,
year = { 2021 }
} @inproceedings { schuhmann2022laionb ,
title = { {LAION}-5B: An open large-scale dataset for training next generation image-text models } ,
author = { Christoph Schuhmann and
Romain Beaumont and
Richard Vencu and
Cade W Gordon and
Ross Wightman and
Mehdi Cherti and
Theo Coombes and
Aarush Katta and
Clayton Mullis and
Mitchell Wortsman and
Patrick Schramowski and
Srivatsa R Kundurthy and
Katherine Crowson and
Ludwig Schmidt and
Robert Kaczmarczyk and
Jenia Jitsev } ,
booktitle = { Thirty-sixth Conference on Neural Information Processing Systems Datasets and Benchmarks Track } ,
year = { 2022 } ,
url = { https://openreview.net/forum?id=M3Y74vmsMcY }
}