在Jetson上玩转大模型Day5:Ollama指令模式的智能助手
AI 這個項目是一个CUDA优化的多模态向量数据库,使用CLIP vision Transformer 中的嵌入模型进行txt2img和img2img相似性搜索,實現下面的“以文找圖”與“以圖找圖”的功能,這對現代人來說是一項福音,因爲大部分人總是困擾着,得在一堆圖片中找到所需要的目標,但是文件名能表達的意義有太有限。
這個項目支持'.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'等格式圖片,除了在边缘有效地索引和搜索数据之外,这些矢量数据库还经常与LLM结合使用,用于检索增强生成(RAG),以完成超出其内置上下文长度(Llama-2模型为4096个token)的长期记忆,并且视觉语言模型也使用相同的嵌入作为输入。
項目最耗時費力的環節,就是啓動多模態大模型對所需要的圖像文件進行全盤的掃描(scan),並建立龐大的向量資料庫(vector DB),在最終執行圖片搜索的功能方面,除了CLI終端指令之外,還提供Web交互模式,便於未來可以開發成工程化的應用。
爲了提高項目的通用性,我們使用COCO圖像字幕數據集中的12萬張圖像進行示範,包括建立向量資料庫的過程。因此我們使用32GB內存的Jetson AGX Orin設備來進行這個示範,讀者可以使用自己的圖片集來進行實驗。
雖然這個應用整合了多項先進的技術,還好在 Jetson AI Lab裏面已經爲我們先弄好一個docker鏡像文件,我們只要執行下面指令就可以開始安裝並啓動:
$ jetson-containers run $(autotag nanodb)
下载完需要的镜像文件之后,就会进入容器执行环境。第一次执行“python -m nanodb”时,因为系统找不到预设所需要的CLIP的ViT-L/14@336px模型,于是调用模型下载功能,自动下载的系统中。
执行到最后的地方,会出现以下信息:
现在就可以开始对我们准备好的图像集进行扫描工作。在容器内的/data目录直接映射到容器外jetson-containers/data目录,因此我们可以在这里创建一个 my_dataset,然后将数据集内容全部复制进去。
注:由于这里牵涉到容器内外的映射,因此 ln -s 这种软链接的方式是会造成错误的。
现在將COCO數據集的train2017.zip複製到my_dataset下,解壓縮到這裏就可以,然後在容器內執行以下指令:
$ time python3 -m nanodb \
--scan /data/my_dataset/train2017 \
--path /data/my_dataset/nanodb \
--autosave --validate
现在系统就开始扫描我们数据集里的 118,287 张图片,如下图所示:
這裏要簡單說明一下nanodb應用的一些重要參數,主要有下面幾個:
--scan:可选地指定一个目录来递归扫描图像,支持'.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'等格式。可以同時使用多個 --scan導入不同的目录。
--path:指定 NanoDB 配置/数据库将保存到或加载的目录,
如果该目录不存在,则会为新数据库创建该目录。
如果那里已经存在 NanoDB,它将首先被加载,并且任何执行的扫描都会添加到该数据库中。
添加图像后,您只需启动 NanoDB 即可--path加载已准备好的数据库。
--autosave:每次扫描后以及每扫描1000张图像后,自动保存NanoDB嵌入向量。
--validate:将根据数据库对每幅图像进行交叉检查,以确认其返回自身(或找到已包含的重复项)
NanoDB可以递归扫描图像目录,计算其CLIP嵌入并以float16格式保存到磁盘。要将内容提取到数据库中,请启动已挂载数据集路径的容器。实际上,只有嵌入向量才保存在NanoDB数据库中。如果您仍想查看图像,则应将图像本身保留在其他地方。索引过程后,原始图像不需要用于搜索/检索,它们仅供人类查看。
建立好向量資料庫之後,就會出現“>”的執行提示符號,我們可以在這裏輸入我們所要問的提示詞,例如“a girl riding a horse”,下面就會列出符號條件的圖片路徑,後面還會顯示相似度(similarity)數字,如下圖。預設會顯示top 8結果,可以使用“--k”參數改變這個設定值。
我們在文章一開頭的地方,看到的是Web界面。現在只要執行以下指令,就能啓動Web交互界面:
$ time python3 -m nanodb \
--path /data/my_dataset/nanodb \
--server --port=8760 (端口號可以自己隨便給)
然後在瀏覽器中輸入http://HOSTNAME:7860?__theme=dark,就能出現以下界面:
在左上角輸入提示詞,例如“reading”,就幫我們找出與讀書有關的圖片。
當我從這些圖片將左上角第二張圖片(坐在公園讀書的人)拉到右上角框內,nanodb會從數據庫中找出與這個張圖片相類似的圖片。
是不是很有趣?這就是nanodb結合多模態大數據模型所實現的功能,可以作爲很多應用的基礎模塊。
更多