UForm

口袋大小的多模态人工智能
用于内容理解和生成


Discord       LinkedIn       Twitter       Blog       GitHub

多模态嵌入,维度从 64 到 768 • 10 亿参数聊天模型
短文本 • 图像 • 🔜 视频片段 • 🔜 长文档
ONNX • CoreML • PyTorch
PythonJavaScriptSwift


UForm Chat Preview

欢迎使用 UForm,一个多模态 AI 库,它既通用又高效。 UForm 微型嵌入模型 将帮助您理解和搜索各种语言的视觉和文本内容。 另一方面,UForm 小型生成模型 不仅支持对话和聊天用例,而且非常适合快速图像描述和视觉问答 (VQA)。 凭借紧凑的自定义预训练 Transformer 模型,它可以从您的服务器集群一直运行到您的智能手机。

特性

模型

有关准确性和速度基准,请参阅评估页面

嵌入模型

模型 参数 语言 架构
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 聊天、图像描述、视觉问答 qwen1.5-0.5B, ViT-H/14
uform-gen2-qwen-500m 1.2 B 聊天、图像描述、视觉问答 qwen1.5-0.5B, ViT-H/14
uform-gen ⚠️ 1.5 B 图像描述、视觉问答 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 = 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)

更多详细信息请查看

生成模型

生成模型与以下内容原生兼容

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 = 'Question or Instruction'
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]

更多详细信息请查看

技术细节

向下转换、量化、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 实现比 Torch、NumPy、SciPy 和 vanilla Python 高出 5 倍-2500 倍的性能提升

from simsimd import cosine, hamming

distance: float = cosine(f32_embedding, f32_embedding) # 32x SciPy performance on Apple M2 CPU
distance: float = cosine(f16_embedding, f16_embedding) # 79x SciPy performance on Apple M2 CPU
distance: float = cosine(i8_embedding, i8_embedding) # 133x SciPy performance on Apple M2 CPU
distance: float = hamming(b1_embedding, b1_embedding) # 17x SciPy performance on Apple M2 CPU

同样,当处理大型集合(每个服务器最多数十亿个条目)并寻找高吞吐量搜索时,您可以使用 USearch 实现比 FAISS 和其他向量搜索解决方案高出 100 倍的性能提升 。这里有一些例子

from usearch.index import Index

f32_index = Index(ndim=64, metric='cos', dtype='f32') # for Matryoshka embeddings
f16_index = Index(ndim=64, metric='cos', dtype='f16') # for Matryoshka embeddings
i8_index = Index(ndim=256, metric='cos', dtype='i8') # for quantized embeddings
b1_index = Index(ndim=768, metric='hamming', dtype='b1') # for binary embeddings

紧凑封装

PyTorch 是一个沉重的依赖项,特别是如果您在边缘或物联网设备上运行。 使用 vanilla 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

对于模型和运行时,大部分重量可以进一步减少到 100 MB。您可以选择许多受支持的 ONNX 执行提供程序之一,其中包括用于 Nvidia GPU 的 XNNPACK、CUDA 和 TensorRT、Intel 上的 OpenVINO、Windows 上的 DirectML、AMD 上的 ROCm、Apple 设备上的 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