![]()
![]()
![]()
![]()
![]()
Embeddings multimodal dari 64 hingga 768 dimensi • Obrolan parameter 1B
Teks Pendek • Gambar • Klip Video • Dokumen Panjang
Onnx • coreml • pytorch
Python • JavaScript • Swift

Selamat datang di UFORM, perpustakaan AI multimodal yang serba guna seperti efisien. Model embedding kecil UForm akan membantu Anda memahami dan mencari konten visual dan tekstual di berbagai bahasa. Model generatif kecil UForm, di sisi lain, tidak hanya mendukung kasus penggunaan percakapan dan obrolan, tetapi sangat bagus untuk captioning gambar cepat dan penjawab pertanyaan visual (VQA). Dengan model transformator pra-terlatih yang ringkas, ini dapat berjalan di mana saja dari server Anda hingga ke ponsel cerdas Anda.
f32 ke i8 tanpa kehilangan banyak penarikan.Untuk tolok ukur akurasi dan kecepatan, lihat halaman evaluasi.
| Model | Parameter | Bahasa | Arsitektur |
|---|---|---|---|
uform3-image-text-english-large ? | 365 m | 1 | 12 Lapisan Bert, Vit-L/14 |
uform3-image-text-english-base | 143 m | 1 | 4 lapisan Bert, Vit-B/16 |
uform3-image-text-english-small ? | 79 m | 1 | 4 lapisan Bert, Vit-S/16 |
uform3-image-text-multilingual-base | 206m | 21 | 12 lapisan Bert, Vit-B/16 |
| Model | Parameter | Tujuan | Arsitektur |
|---|---|---|---|
uform-gen2-dpo ? | 1.2 b | Obrolan, captioning gambar, VQA | QWEN1.5-0.5B, VIT-H/14 |
uform-gen2-qwen-500m | 1.2 b | Obrolan, captioning gambar, VQA | QWEN1.5-0.5B, VIT-H/14 |
uform-gen | 1.5 b | Captioning gambar, VQA | llama-1.3b, vit-b/16 |
Pertama, pip install uform . Kemudian, muat model:
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 ]Gambar embed:
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 )Embed kueri:
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 )Untuk detail lebih lanjut, periksa:
Model generatif kompatibel dengan
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 ]Untuk detail lebih lanjut, periksa:
Bergantung pada aplikasinya, embedding dapat down-casap ke representasi numerik yang lebih kecil tanpa kehilangan banyak penarikan. Beralih dari f32 ke f16 direkomendasikan di hampir semua kasus, kecuali jika Anda menjalankan perangkat keras yang sangat lama tanpa dukungan setengah presisi. Beralih ke i8 dengan penskalaan linier juga dimungkinkan, tetapi akan terlihat dalam penarikan kembali pada koleksi yang lebih besar dengan jutaan entri yang dapat dicari. Demikian pula, untuk embeddings dimensi yang lebih tinggi (512 atau 768), strategi umum adalah untuk mengukurnya menjadi representasi bit tunggal untuk pencarian yang lebih cepat.
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 ))Pendekatan alternatif untuk kuantisasi adalah dengan menggunakan embeddings matryoshka, di mana embedding diiris menjadi bagian yang lebih kecil, dan pencarian dilakukan dengan cara hierarkis.
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 ]Kedua pendekatan tersebut secara asli didukung oleh mesin pencari vektor USEarch dan perpustakaan SimSimd Numerics. Saat berhadapan dengan koleksi kecil (hingga jutaan entri) dan mencari perhitungan jarak cosinus latensi rendah, Anda dapat mencapai peningkatan kinerja 5x-2500x di atas obor, numpy, scipy, dan vanilla python menggunakan Simsimd.
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 CPUDemikian pula, ketika berhadapan dengan koleksi besar (hingga miliaran entri per server) dan mencari pencarian throughput tinggi, Anda dapat mencapai peningkatan kinerja 100x dibandingkan FAISS dan solusi pencarian vektor lainnya menggunakan USEARCH. Berikut adalah beberapa contoh:
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 embeddingsPytorch adalah ketergantungan yang berat untuk dibawa, terutama jika Anda berlari di tepi atau perangkat IoT. Menggunakan runtime Vanilla Onnx, orang dapat secara signifikan mengurangi konsumsi memori dan latensi penyebaran.
$ 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_onnxSebagian besar bobot itu dapat dikurangi hingga 100 MB untuk model dan runtime. Anda dapat memilih salah satu dari banyak penyedia eksekusi ONNX yang didukung, yang mencakup XNNPack, Cuda dan Tensorrt untuk NVIDIA GPU, Openvino di Intel, DirectMl di Windows, ROCM di AMD, COREML pada perangkat Apple, dan banyak lagi yang akan datang.
Model generatif dapat digunakan untuk pengalaman seperti obrolan di baris perintah. Untuk itu, Anda dapat menggunakan alat uform-chat CLI, yang tersedia dalam paket UForm.
$ 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