带着1060显卡从0到1学习RAG之 1.ubuntu系统安装docker并部署ollama+LightRAG+bge-base-zh-v1.5

1.ubuntu系统安装docker并部署ollama+LightRAG+bge-base-zh-v1.5


前言

1.人工智能爱好者

笔者认为,基于本地知识库的大模型是大模型专业化发展的一条前途光明的大道,也有利于各行业的专业化深入发展的有利工具,同时似乎对显卡要求没有那么高,因此将其作为业余爱好浅尝辄止。

2.技术路线

(1)docker

docker具有强移植性,所有的代码都可以一键带走,方便在不同平台使用,因此要用它。

(2)大模型管理工具

原本没有计划用大模型管理工具,但是不知道哪种docker镜像环境齐全,且体积较小,因此在找成品的环境镜像,后来发现这个ollama还挺火,管理很方面,因此选择将其作为docker基础环境。

(3)基础大模型

目前开源中文大模型,了解到通义千问比较有优势,很多人都用,7B的好像能用1060跑起来,因此用它。

(4)RAG和数据库

a)本地知识库,微信公众号有很多专业知识,每个作者都很有特点和思想,可以作为一种好的知识来源,通过搜集文章,构建知识库。
b)最近出现的LightRAG,在RAG领域效果不错,消耗据说也低,因此先考虑部署用一下。
c)向量数据库,了解到最近中文效果比较好的向量模式是bge-base-zh-v1.5,暂定用该模型。
d)根据前期了解,目前暂定技术路线如下:在ollama框架下面,使用LightRAG在Qwen2.5 7B大模型基础上运行。通过搜集特定领域微信公众号文章的方式构建本地知识库。

(5)硬件

默认新装ubuntu 20.04系统,本机1060 6G显卡,36G内存,246G固态硬盘,所有安装包下载离线包(现在没有,跑通再说)。
–2024.12.18

一、安装NVIDIA驱动

此节引用博客: Ubunut20.04/22.04安装NVIDIA驱动-HIT_Vanni原创,笔者做了简化。

1.官网下载适配本机的驱动

官网链接: 点此下载
适配本机的链接:点此下载

2.安装依赖

sudo apt-get update   #更新软件列表
sudo apt-get install g++
sudo apt-get install gcc   #显示最新版不用更新
sudo apt-get install make

3.不卸载显卡驱动安装

参考的博客为了避免其他问题,卸载了系统驱动,本机测试结果显示可以不卸载。

cd {你的NVIDIA安装文件路径}
sudo chmod 777 NVIDIA-Linux-x86_64-430.26.run   #给你下载的驱动赋予可执行权限,才可以安装
sudo ./NVIDIA-Linux-x86_64-430.26.run  --no-opengl-files  #安装

一直接受,最后出现了一个NVIDIA X驱动是否安装,我安装了,很快,也没有更新别的东西。了解如下:

CUDA-X 微服务由 NVIDIA 的 CUDA 专家打造,是一系列封装为云 API 的开发者工具、GPU 加速库和技术。
您可在数据处理、AI 和 HPC 应用中轻松集成、定制和部署这些微服务。

CUDA-X 微服务包括 NVIDIA® Riva(用于可自定义的语音和翻译 AI)、NVIDIA Earth-2(用于高分辨率气候和天气仿真)、
NVIDIA cuOpt™(用于路由优化)以及 NVIDIA NeMo™ Retriever(用于为企业提供响应式检索增强型生成 (RAG) 功能)。

重启系统,测试显示显存运行情况则成功。命令:

nvidia-smi

显示:

-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.142                Driver Version: 550.142        CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1060 6GB    Off |   00000000:01:00.0  On |                  N/A |
| 37%   36C    P8              8W /  120W |      32MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      1088      G   /usr/lib/xorg/Xorg                             29MiB |
+-----------------------------------------------------------------------------------------+

二、安装docker和Nvidia支持包

参考博客:Ubuntu 22.04下Docker安装(最全指引)- txzq 原创

有时候docker会挂掉,连不上,离线包也可以安装,笔者没记录之前的操作,以后补上。

1.Ubuntu在线安装docker:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

2.通过APT方式 安装NVIDIA Container Toolkit

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit  
# 主要安装了 libnvidia-container-tools libnvidia-container1 nvidia-container-toolkit nvidia-container-toolkit-base

3.配置使得nvidia支持docker

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

三、拉取ollama镜像

1.pull国内ollama镜像

由于官方镜像库不可使用,因此需要使用国内镜像源。
国内镜像源参考:这里

docker pull docker-mirror.aigc2d.com/ollama/ollama #3.3G 大小

其中 docker-mirror.aigc2d.com是我当前可用源,若失效可以参考更换其他国内源。
下载完毕后,查看当前镜像:

docker images

显示:

REPOSITORY                               TAG       IMAGE ID       CREATED        SIZE
docker-mirror.aigc2d.com/ollama/ollama   latest    325786c469da   18 hours ago   3.3GB

2.创建容器

docker run -d --gpus=all -v /opt/ollama:/root/.ollama -p 11434:11434 --name ollama docker-mirror.aigc2d.com/ollama/ollama
/opt/ollama:/root/.ollama 表示将宿主机/opt/ollama文件夹挂载在容器中,进行文件共享。
docker-mirror.aigc2d.com/ollama/ollama 是刚才查询到的镜像的名字

3.运行容器

docker exec -it ollama /bin/bash
参数说明:

    exec:在运行中的容器中执行命令。
    -it:表示以交互模式运行,并分配一个伪终端。
    ollama:容器的名称。
    /bin/bash:要执行的命令,这里是打开一个 Bash shell。

执行后,你将进入容器的命令行,和你本地机器上使用没有任何区别

官网推荐下面的指令:这会直接启动llama2大模型,适用于不想打开shell的小伙伴。

docker exec -it ollama ollama run llama2

运行后,ollama会首先在线下载一个3.8G的基础模型,猜测是因为镜像本身要最小,如果有离线需求,可能需要配置好其他大模型后再次封装,后续可能会出测试记录。下载到3.6G后速度变成了几十k,不过一会儿就好了
这是因为运行容器的指令里面加了 ‘ollama run llama2’,
它的意思是在打开容器的同时,自动运行命令’ollama run llama2’,
因此会自动下载llama2基础模型,更一般的运行容器指令参考第一条

4.对镜像中linux环境的配置

主要是该镜像中对文件进行编辑时,中文出现乱码,需要配置一下语言

# 解决中文乱码
apt-get install -y locales
vim /etc/profile
# 然后将export LANG="en_US.UTF-8"加到最后一行
# 保存后刷新
source /etc/profile

四、在docker中ollama的使用

1.部署开源大模型

ollama已经支持很多开源的大模型了,对于其支持的大模型,可一键部署:

支持列表见官网: https://ollama.com/library

部署方式:

ollama run qwen2.5
官方下载qwen2.5,和刚才一样,总共大小4.7G,下到4.6G后网速降到100k左右,慢慢下。

实测显卡显存占用也是4.7G左右,对话中不增加显存占用。

2.基础使用命令

ollama serve	# 启动ollama
ollama create	# 从模型文件创建模型
ollama show		# 显示模型信息
ollama run		# 运行模型,会先自动下载模型
ollama pull		# 从注册仓库中拉取模型
ollama push		# 将模型推送到注册仓库
ollama list		# 列出已下载模型
ollama ps		# 列出正在运行的模型
ollama cp		# 复制模型
ollama rm		# 删除模型

3.不在模型库的大模型调用

此小节引用博客:https://blog.csdn.net/u010522887/article/details/140651584
记录方便查看,该博客记录了更多的ollama使用方法。

GGUF (GPT-Generated Unified Format)模型

GGUF 是由 llama.cpp 定义的一种高效存储和交换大模型预训练结果的二进制格式。

Ollama 支持采用 Modelfile 文件中导入 GGUF 模型。

下面我们以本地的 llama3 举例,详细介绍下实操流程:

step 1: 新建一个文件名为 Modelfile 的文件,然后在其中指定 llama3 模型路径:

FROM /root/models/xxx/Llama3-FP16.gguf

step 2: 创建模型

ollama create llama3 -f Modelfile

step 3: 运行模型

ollama run llama3

终端出现 >>,开启和 Ollama 的对话旅程吧~

五、LightRAG部署和向量数据库部署

1.Ollama镜像基础上的LightRAG部署

Ollama镜像中没有封装conda来配置环境,笔者习惯于conda,因此先安装配置miniconda,然后按照LightRAG官网上的安装方式部署LightRAG。

(1)miniconda3的安装

如何在docker中拉取一个镜像后,具体如何进行环境配置,笔者已经在之前的博客中进行了详细阐述,详细可参考:docke拉取官方镜像及深度学习环境创建. 这里针对该ollama镜像进行步骤记录:

apt-get update
apt-get install wget   
apt-get install vim  
# 打开要存放conda安装包的位置
cd /opt
# 下载安装包 
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 安装
bash Miniconda3-latest-Linux-x86_64.sh
# 一直按着Enter键,等待出现yes,然后输入yes

然后出现让你确认conda的安装位置:

Miniconda3 will now be installed into this location:
/root/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

可自行输入安装位置,也可直接按ENTER确认默认位置。
接着等待安装完毕,之后:

# 刷新一下
source ~/.bashrc
# 创建环境
conda create --name LightRAG python=3.10
# 可以修改一下conda的源
vim /etc/apt/sources.list

清华源:

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - defaults
show_channel_urls: true

(2)LightRAG的下载和环境配置

1)LightRAG:点击官网,下载zip,关于LightRAG的全面介绍,点击这里.
2)解压到docker中的安装包,可在本机中解压,然后通过共享文件夹传到docker的安装目录中
3)根据官网介绍,打开LightRAG主目录后,输入:

# 激活环境
conda activate LightRAG
# 更换pip国内源,默认源下不了,太慢了
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 
# 在更新环境时遇到错误:RuntimeError: Unsupported compiler -- at least C++11 support is needed!
# 这是因为该镜像没有安装 gcc,需要提前安装好
apt-get update
apt-get install gcc g++
# 更新环境
cd LightRAG-main
pip install -e .

(3)初步跑通LightRAG

## 不出意外遇到了问题
这两天遇到的问题是这样的,通过调研,现有推荐的embedding模型是bge-base-zh-v1.5,所以我下载了他训练好的模型,准备给ollama统一调用。但是我发现ollama并不能识别该模型,一开始是以为ollama这个镜像有问题,后来通过广泛阅读发现,需要先让ollama识别到这个向量模型,但是bge本身是bert系列用pytorch框架的模型,ollama并不能直接支持,因此需要对其进行转换。
我不知道是不是这个问题,我感觉是,如果有经验的大佬凑巧看到了,请指教。

转换方法参考这里

现在我正在转换

oh,好消息,原来已经有好人转换过了,在[ollama的模型库](https://ollama.com/library)里面直接搜就行。阿里嘎多。
  1. 在LightRAG提供的例子基础上配置自己的模型
    官方的运行样例在这里:LightRAG-main/examples/lightrag_ollama_demo.py
    具体如下:
import asyncio
import os
import inspect
import logging
from lightrag import LightRAG, QueryParam
from lightrag.llm import ollama_model_complete, ollama_embedding
from lightrag.utils import EmbeddingFunc

WORKING_DIR = "../work_dir_ollama"

logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO)

if not os.path.exists(WORKING_DIR):
    os.mkdir(WORKING_DIR)

rag = LightRAG(
    working_dir=WORKING_DIR,
    llm_model_func=ollama_model_complete,  #指定使用ollama框架来管理各种模型
    llm_model_name="qwen2.5",    #配置基础大模型Qwen2.5
    llm_model_max_async=1,       #并发数量,默认是4,显卡不太行设置为1
    llm_model_max_token_size=8192,  #大模型最大支持tokensize
    llm_model_kwargs={"host": "http://localhost:11434", "options": {"num_ctx":8192}},   # ollama占用11434端口,num_ctx表示模型处理的最大上下文长度
    embedding_func=EmbeddingFunc(
        embedding_dim=768,    # embedding模型的向量维度
        max_token_size=8192,  # embedding模型的最大句子长度,同上
        func=lambda texts: ollama_embedding(
            texts, embed_model="quentinz/bge-base-zh-v1.5", host="http://localhost:11434"  # 指定让ollama调用的embedding模型
        ),
    ),
)

with open("./book.txt", "r", encoding="utf-8") as f:    # 打开本地知识库,样例给的是一本书,叫做《圣诞颂歌》,LightRAG将直接对这本书进行处理,构建知识库,用于检索
    rag.insert(f.read())            #这就是LightRAG对知识库的处理,主要包括向量化、实体抽取和关系吧,兴许,我暂时还没开始细读。
    
# LightRAG的主要工作有
#1 索引阶段:对文档进行切分处理,提取其中的实体和边分别进行向量化处理,存放在向量知识库
2 检索阶段:对用于输入分别提取局部和全局关键词,分别用于检索向量知识库中的实体和边关系,同时结合相关的chunk进行总结#

# Perform naive search   #回答问题的时候在知识库直接检索
print(
    rag.query("What are the top themes in this story?", param=QueryParam(mode="naive"))
)

# Perform local search  #回答问题的时候在知识库进行局部检索
print(
    rag.query("What are the top themes in this story?", param=QueryParam(mode="local"))
)

# Perform global search  ##回答问题的时候在知识库进行全局检索
print(
    rag.query("What are the top themes in this story?", param=QueryParam(mode="global"))
)

# Perform hybrid search  #回答问题的时候在知识库局部+全局混合检索
print(
    rag.query("What are the top themes in this story?", param=QueryParam(mode="hybrid"))
)

  1. 下载知识库样例
    官方链接:
curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
  1. 运行
python  lightrag_ollama_demo.py

下面是运行中的结果

Generating embeddings:  50%|█████████▌         | 1/2 [00:03<00:03,  3.13s/batch]INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/embeddings "HTTP/1.1 200 OK"
Generating embeddings: 100%|███████████████████| 2/2 [00:03<00:00,  1.88s/batch]
INFO:lightrag:[Entity Extraction]...
Extracting entities from chunks:   0%|                | 0/42 [00:00<?, ?chunk/s]INFO:httpx:HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK"
Extracting entities from chunks:   2%|     | 1/42 [03:38<2:29:38, 218.98s/chunk]INFO:httpx:HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK"

4.运行分析
a.运行速度:1060显卡的实体抽取和向量化进度,一个chunk需要218秒左右,这跟我设置有关,设置的8092大小,一个文章了42个块。这么说这本书完成知识库构建可能需要两三个小时左右。
b.运行消耗,我的显卡是6G的,并且是游戏显卡,知识库构建时需要5个G显存,功耗从刚开机的70w 升到250w。

小结

本篇文章到此为止,这里主要从0到1在docker中部署好了基础大模型Qwen2.5+向量模型bge-base-zh-v1.5+大模型管理工具ollama,具备良好的环境迁移性,初步具备了构建本地知识库,并且令大模型从本地知识库中检索回答问题的基本能力,相信能够为以后自己重新部署,或者其他伙伴学习入门提供非常详细的指导帮助。
后续主要工作,一是尝试从微信公众号中构建专门领域的知识库,二是继续深入学习了解ollama、LightRAG等更加丰富的功能,三是继续跟踪最新的技术,包括基于知识图谱的检索增强,四是基于RAG的大模型推理的现实应用等等。最后的最后,1060确实捉襟见肘。
后续再见。

在构建基于RAG模型的问答系统之前,你需要理解RAG模型的核心原理和组成。RAG模型结合了检索系统和生成模型,能够通过检索相关文档片段来增强生成答案的质量。接下来,我们将详细讨论从零开始构建和部署系统的步骤。 参考资源链接:[高分通过的计算机专业毕业设计:RAG问答系统](https://wenku.csdn.net/doc/3o1kvt9bkt?spm=1055.2569.3001.10343) 首先,你需要准备开发环境。尽管本资源提供了Docker配置文件以方便环境搭建,但了解必要的依赖安装也是必要的。Python环境的搭建是基础,确保安装了所有必需的库和框架,如transformers、torch等。 接着,获取和准备数据集。问答系统的质量在很大程度上取决于数据的质量。你需要收集、清洗和整理问题与答案对的数据集,这些数据将用于训练你的模型。本资源提供了一些用于演示的数据集,但对于实际项目,你可能需要更大规模和多样化的数据。 然后是模型训练。使用准备好的数据集,你可以开始训练RAG模型。这一步需要调整模型参数和训练策略,以确保模型在你的数据集上表现良好。由于RAG模型的复杂性,可能需要较长的训练时间,进行多次迭代以达到理想效果。 模型训练完成后,需要进行评估和测试。通过设计测试集和评估指标来测试模型的性能。主要关注的指标可能包括准确率、召回率和F1分数等。 系统集成和接口开发是下一步。你需要编写代码将训练好的模型嵌入到问答系统中,开发用户接口以接收问题输入和展示生成的答案。 最后,部署你的问答系统。使用Docker可以将你的应用容器化,便于在不同的服务器或平台上部署和运行。确保你的部署环境安全,进行充分的测试以保证系统的稳定性和可靠性。 在整个过程中,你可能会遇到各种问题和挑战,但请记得,本资源《高分通过的计算机专业毕业设计:RAG问答系统》已经为你准备了项目的源码、说明文档以及数据集,这将大大减轻你的学习曲线,帮助你快速理解和实践相关技术。 参考资源链接:[高分通过的计算机专业毕业设计:RAG问答系统](https://wenku.csdn.net/doc/3o1kvt9bkt?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值