pip3 install --upgrade kosmosx
import torch
from kosmosx . model import Kosmos
# Create a sample text token tensor
text_tokens = torch . randint ( 0 , 32002 , ( 1 , 50 ), dtype = torch . long )
# Create a sample image tensor
images = torch . randn ( 1 , 3 , 224 , 224 )
# Instantiate the model
model = Kosmos ()
text_tokens = text_tokens . long ()
# Pass the sample tensors to the model's forward function
output = model . forward (
text_tokens = text_tokens ,
images = images
)
# Print the output from the model
print ( f"Output: { output } " )
建立您的配置: accelerate config
然后: accelerate launch train.py
KOSMOS-1 使用基于 Magneto(Foundation Transformers)的纯解码器 Transformer 架构,即采用所谓的 sub-LN 方法的架构,其中在注意模块之前(pre-ln)和之后(post-LN)添加层归一化。 ln) 结合了这两种方法分别在语言建模和图像理解方面的优点。该模型还根据论文中描述的特定指标进行初始化,从而允许以更高的学习率进行更稳定的训练。
他们使用 CLIP VIT-L/14 模型将图像编码为图像特征,并使用 Flamingo 中引入的感知器重采样器来池化256 -> 64
标记的图像特征。通过将图像特征添加到由特殊标记
和包围的输入序列中,将图像特征与标记嵌入相结合。一个例子是
。这允许图像与文本以相同的顺序交织在一起。
我们遵循论文中描述的超参数,如下图所示:
我们使用来自 Foundation Transformers 的仅解码器 Transformer 架构的 torchscale 实现:
from torchscale . architecture . config import DecoderConfig
from torchscale . architecture . decoder import Decoder
config = DecoderConfig (
decoder_layers = 24 ,
decoder_embed_dim = 2048 ,
decoder_ffn_embed_dim = 8192 ,
decoder_attention_heads = 32 ,
dropout = 0.1 ,
activation_fn = "gelu" ,
attention_dropout = 0.1 ,
vocab_size = 32002 ,
subln = True , # sub-LN approach
xpos_rel_pos = True , # rotary positional embeddings
max_rel_pos = 2048
)
decoder = Decoder (
config ,
embed_tokens = embed ,
embed_positions = embed_positions ,
output_projection = output_projection
)
对于图像模型 (CLIP VIT-L/14),我们使用预训练的 OpenClip 模型:
from transformers import CLIPModel
clip_model = CLIPModel . from_pretrained ( "laion/CLIP-ViT-L-14-laion2B-s32B-b82K" ). vision_model
# projects image to [batch_size, 256, 1024]
features = clip_model ( pixel_values = images )[ "last_hidden_state" ]
我们遵循感知器重采样器的默认超参数,因为论文中没有给出超参数:
from flamingo_pytorch import PerceiverResampler
perceiver = PerceiverResampler (
dim = 1024 ,
depth = 2 ,
dim_head = 64 ,
heads = 8 ,
num_latents = 64 ,
num_media_embeds = 256
)
# projects image features to [batch_size, 64, 1024]
self . perceive ( images ). squeeze ( 1 )
因为模型期望隐藏维度为2048
,所以我们使用nn.Linear
层将图像特征投影到正确的维度,并根据 Magneto 的初始化方案对其进行初始化:
image_proj = torch . nn . Linear ( 1024 , 2048 , bias = False )
torch . nn . init . normal_ (
image_proj . weight , mean = 0 , std = 2048 ** - 0.5
)
scaled_image_features = image_proj ( image_features )
论文描述了一个包含64007
token 的词汇表的 SentencePiece。为了简单起见(因为我们没有可用的训练语料库),我们使用下一个最佳的开源替代方案,即来自 HuggingFace 的预训练 T5-large 分词器。该分词器有32002
分词的词汇表。
from transformers import T5Tokenizer
tokenizer = T5Tokenizer . from_pretrained (
"t5-large" ,
additional_special_tokens = [ "" , "" ],
extra_ids = 0 ,
model_max_length = 1984 # 2048 - 64 (image features)
)
然后,我们使用nn.Embedding
层嵌入标记。我们实际上使用了 bitandbytes 中的bnb.nn.Embedding
,它允许我们稍后使用 8 位 AdamW。
import bitsandbytes as bnb
embed = bnb . nn . Embedding (
32002 , # Num embeddings
2048 , # Embedding dim
padding_idx
)
对于位置嵌入,我们使用:
from torchscale . component . embedding import PositionalEmbedding
embed_positions = PositionalEmbedding (
2048 , # Num embeddings
2048 , # Embedding dim
padding_idx
)
此外,我们添加一个输出投影层,将隐藏维度投影到词汇表大小,并根据 Magneto 的初始化方案对其进行初始化:
output_projection = torch . nn . Linear (
2048 , 32002 , bias = False
)
torch . nn . init . normal_ (
output_projection . weight , mean = 0 , std = 2048 ** - 0.5
)
我必须对解码器进行一些细微的更改,以使其能够接受前向传递中已嵌入的功能。这是允许上述更复杂的输入序列所必需的。这些更改在torchscale/architecture/decoder.py
第 391 行的以下 diff 中可见:
+ if kwargs.get("passed_x", None) is None:
+ x, _ = self.forward_embedding(
+ prev_output_tokens, token_embeddings, incremental_state
+ )
+ else:
+ x = kwargs["passed_x"]
- x, _ = self.forward_embedding(
- prev_output_tokens, token_embeddings, incremental_state
- )
这是一个 Markdown 表,其中包含论文中提到的数据集的元数据:
数据集 | 描述 | 尺寸 | 关联 |
---|---|---|---|
桩 | 多样化的英文文本语料库 | 800GB | 抱脸 |
普通爬行 | 网络抓取数据 | - | 普通爬行 |
莱昂-400M | 来自 Common Crawl 的图像文本对 | 400M对 | 抱脸 |
莱昂2B | 来自 Common Crawl 的图像文本对 | 2B对 | ArXiv |
科约 | 来自 Common Crawl 的图像文本对 | 700M 对 | 吉图布 |
概念性字幕 | 图像-替代文本对 | 15M 对 | ArXiv |
交错 CC 数据 | 文字和图像来自 Common Crawl | 7100 万个文档 | 自定义数据集 |
故事完形填空 | 常识推理 | 16k 个示例 | ACL 选集 |
海拉斯瓦格 | 常识性自然语言学 | 70k 个示例 | ArXiv |
维诺格拉德模式 | 词语歧义 | 273 个例子 | 2012年公共安全报告 |
维诺格兰德 | 词语歧义 | 1.7k 个示例 | 2020年亚洲人工智能大会 |
PIQA | 物理常识QA | 16k 个示例 | 2020年亚洲人工智能大会 |
布尔Q | 质量保证 | 15k 个示例 | 2019年亚冠 |
CB | 自然语言推理 | 250 个示例 | 2019 年正义与正义 |
科帕 | 因果推理 | 1000 个示例 | 2011年AAAI春季研讨会 |
相对大小 | 常识推理 | 486对 | 2016年ArXiv |
记忆色彩 | 常识推理 | 720个例子 | ArXiv 2021 |
颜色术语 | 常识推理 | 320个例子 | 2012年亚冠 |
智商测试 | 非语言推理 | 50个例子 | 自定义数据集 |
可可字幕 | 图像字幕 | 413k 图像 | 帕米2015 |
Flickr30k | 图像字幕 | 31,000 张图片 | 2014年TACL |
VQAv2 | 视觉质量保证 | 100 万个 QA 对 | 2017年CVPR |
维兹维兹 | 视觉质量保证 | 31k QA 对 | 2018年CVPR |
网络SRC | 网络质量检查 | 1.4k 个示例 | 欧洲管理国家实验室 2021 |
图像网 | 图像分类 | 128 万张图片 | CVPR 2009 |
幼兽 | 图像分类 | 200种鸟类 | 2011年TOG |
阿帕奇