UForm
口袋大小的多模态 AI
用于内容理解和生成
多模态嵌入从 64 到 768 维度 • 10 亿参数聊天模型
短文本 • 图片 • 🍌 即将推出的视频剪辑 • 🍌 即将推出的长文档
ONNX • CoreML • PyTorch
Python
•
JavaScript
•
Swift
欢迎来到 UForm,这是一个既多才又高效的多模态 AI 库。 UForm 小嵌入模型 将帮助您跨各种语言理解和搜索视觉和文本内容。 另一方面,UForm 小生成模型 不仅支持对话和聊天用例,还非常适合快速的图像字幕生成和视觉问答 (VQA)。 借助紧凑的__定制预训练 Transformer 模型__,它可以在从服务器农场到您的智能手机的任何地方运行。
特点
- 小型嵌入:64 维度 Matryoshka 样式嵌入,用于极快的 搜索。
- 吞吐量:由于体积小,推理速度比竞争对手快 2-4 倍。
- 便携性:模型支持原生 ONNX,轻松部署到任何平台。
- 量化感知:将嵌入从
f32
向下转换到i8
,几乎不损失召回率。 - 多语言支持:在平衡数据集上训练,召回率在 20 多种语言中表现出色。
模型
有关准确性和速度基准,请参阅评估页面。
嵌入模型
模型 | 参数 | 语言 | 架构 |
---|---|---|---|
uform3-image-text-english-large 🆕 | 365 M | 1 | 12 层 BERT, ViT-L/14 |
uform3-image-text-english-base | 143 M | 1 | 4 层 BERT, ViT-B/16 |
uform3-image-text-english-small 🆕 | 79 M | 1 | 4 层 BERT, ViT-S/16 |
uform3-image-text-multilingual-base | 206M | 21 | 12 层 BERT, ViT-B/16 |
生成模型
模型 | 参数 | 用途 | 架构 |
---|---|---|---|
uform-gen2-dpo 🆕 | 1.2 B | 聊天,图像字幕生成,VQA | qwen1.5-0.5B, ViT-H/14 |
uform-gen2-qwen-500m | 1.2 B | 聊天,图像字幕生成,VQA | qwen1.5-0.5B, ViT-H/14 |
uform-gen ⚠️ | 1.5 B | 图像字幕生成,VQA | llama-1.3B, ViT-B/16 |
快速开始示例
嵌入模型
首先,pip install uform
。
然后,加载模型:
from uform import get_model, Modality
processors, models = get_model('unum-cloud/uform3-image-text-english-small')
model_text = models[Modality.TEXT_ENCODER]
model_image = models[Modality.IMAGE_ENCODER]
processor_text = processors[Modality.TEXT_ENCODER]
processor_image = processors[Modality.IMAGE_ENCODER]
嵌入图片:
import requests
from io import BytesIO
from PIL import Image
image_url = 'https://media-cdn.tripadvisor.com/media/photo-s/1b/28/6b/53/lovely-armenia.jpg'
image_url = Image.open(BytesIO(requests.get(image_url).content))
image_data = processor_image(image)
image_features, image_embedding = model_image.encode(image_data, return_features=True)
嵌入查询:
text = 'a cityscape bathed in the warm glow of the sun, with varied architecture and a towering, snow-capped mountain rising majestically in the background'
text_data = processor_text(text)
text_features, text_embedding = model_text.encode(text_data, return_features=True)
有关更多详细信息,请查看:
- Python文档关于嵌入模型在 python/README.md 中
- JavaScript文档关于嵌入模型在 javascript/README.md 中
- Swift文档关于嵌入模型在 swift/README.md 中
生成模型
生成模型本身与以下内容兼容
from transformers import AutoModel, AutoProcessor
model = AutoModel.from_pretrained('unum-cloud/uform-gen2-dpo', trust_remote_code=True)
processor = AutoProcessor.from_pretrained('unum-cloud/uform-gen2-dpo', trust_remote_code=True)
prompt = '问题或指示'
image = Image.open('image.jpg')
inputs = processor(text=[prompt], images=[image], return_tensors='pt')
with torch.inference_mode():
output = model.generate(
**inputs,
do_sample=False,
use_cache=True,
max_new_tokens=256,
eos_token_id=151645,
pad_token_id=processor.tokenizer.pad_token_id
)
prompt_len = inputs['input_ids'].shape[1]
decoded_text = processor.batch_decode(output[:, prompt_len:])[0]
欲了解更多细节,请查看:
- Python文档关于生成模型在 python/README.md 中
- JavaScript文档关于生成模型 🔜
- Swift文档关于生成模型 🔜
技术细节
降位、量化、Matryoshka和切分
根据应用的不同,可以将嵌入降位到较小的数字表示而不损失太多的召回率。
除非使用非常老旧的硬件没有半精度支持,否则推荐几乎所有情况下从 f32
切换到 f16
。
也可以使用线性缩放切换到 i8
,但在有数百万可搜索条目的大型集上可见度会减少。
类似地,对于高维嵌入(512或768),常用策略是将其量化为单位二进制表示以加快搜索速度。
import numpy as np
f32_embedding: np.ndarray = model.encode_text(text_data, return_features=False)
f16_embedding: np.ndarray = f32_embedding.astype(np.float16)
i8_embedding: np.ndarray = (f32_embedding * 127).astype(np.int8)
b1_embedding: np.ndarray = np.packbits((f32_embedding > 0).astype(np.uint8))
量化的另一种方法是使用Matryoshka嵌入,将嵌入切成较小的部分,并以分层的方式进行搜索。
import numpy as np
large_embedding: np.ndarray = model.encode_text(text_data, return_features=False)
small_embedding: np.ndarray = large_embedding[:, :256]
tiny_embedding: np.ndarray = large_embedding[:, :64]
这两种方法均由 USearch 向量搜索引擎和 SimSIMD 数字库本身支持。 在处理小集合(最多数百万条目)并寻找低延迟余弦距离计算时,你可以使用SimSIMD获得5倍到2500倍的性能提升,超过Torch、NumPy、SciPy和原始Python。
from simsimd import cosine, hamming
distance: float = cosine(f32_embedding, f32_embedding) # 在Apple M2 CPU上SciPy性能32倍提升
distance: float = cosine(f16_embedding, f16_embedding) # 在Apple M2 CPU上SciPy性能79倍提升
distance: float = cosine(i8_embedding, i8_embedding) # 在Apple M2 CPU上SciPy性能133倍提升
distance: float = hamming(b1_embedding, b1_embedding) # 在Apple M2 CPU上SciPy性能17倍提升
类似地,在处理大型集合(每台服务器最多数十亿条目)并寻求高吞吐量搜索时,你可以使用USearch获得100倍性能提升,超过FAISS和其他向量搜索解决方案。 这里有几个例子:
from usearch.index import Index
f32_index = Index(ndim=64, metric='cos', dtype='f32') # 用于Matryoshka嵌入
f16_index = Index(ndim=64, metric='cos', dtype='f16') # 用于Matryoshka嵌入
i8_index = Index(ndim=256, metric='cos', dtype='i8') # 用于量化嵌入
b1_index = Index(ndim=768, metric='hamming', dtype='b1') # 用于二进制嵌入
紧凑包装
PyTorch是一个沉重的依赖,尤其是在边缘或物联网设备上运行时。 使用原始的ONNX运行时,可以显著减少内存消耗和部署延迟。
$ conda create -n uform_torch python=3.10 -y
$ conda create -n uform_onnx python=3.10 -y
$ conda activate uform_torch && pip install -e ".[torch]" && conda deactivate
$ conda activate uform_onnx && pip install -e ".[onnx]" && conda deactivate
$ du -sh $(conda info --envs | grep 'uform_torch' | awk '{print $2}')
> 5.2G ~/conda/envs/uform_torch
$ du -sh $(conda info --envs | grep 'uform_onnx' | awk '{print $2}')
> 461M ~/conda/envs/uform_onnx
大部分重量可以进一步减少到100MB以下,包括模型和运行时。 你可以选择多种支持的 ONNX执行提供者,其中包括XNNPACK、Nvidia GPU上的CUDA和TensorRT、Intel上的OpenVINO、Windows上的DirectML、AMD上的ROCm、苹果设备上的CoreML,未来还会更多。
在CLI中进行多模态聊天
生成模型可用于命令行中的类似聊天体验。
为此,您可以使用UForm包中的uform-chat
CLI工具。
$ pip install uform
$ uform-chat --model unum-cloud/uform-gen2-dpo --image=zebra.jpg
$ uform-chat --model unum-cloud/uform-gen2-dpo \
> --image="https://bit.ly/3tIVg9M" \
> --device="cuda:0" \
> --fp16