Lychee-Rerank快速部署指南:Docker容器化一键启动

Lychee-Rerank快速部署指南:Docker容器化一键启动 Lychee-Rerank快速部署指南Docker容器化一键启动你是不是也遇到过这样的烦恼好不容易找到一个好用的开源重排序模型比如Lychee-Rerank结果被复杂的依赖安装、环境配置搞得焦头烂额。Python版本冲突、CUDA驱动不匹配、各种库装不上……光是想想就头疼。别担心今天咱们就来解决这个问题。我准备了一份保姆级的Docker容器化部署方案让你能像安装一个普通软件一样轻松把Lychee-Rerank跑起来。整个过程基本上就是“复制、粘贴、回车”三步走不需要你懂太多Docker的复杂原理跟着做就行。用上Docker之后部署复杂度会大幅降低。你不需要再关心宿主机上有什么、缺什么所有东西都打包在一个镜像里开箱即用。而且我还为你准备好了GPU直通的配置方法如果你有显卡能让推理速度飞起来。1. 准备工作先看看你的电脑行不行在开始之前咱们先花两分钟检查一下你的电脑环境确保一切顺利。这就像出门旅行前检查证件虽然有点烦但能避免后面的大麻烦。1.1 系统要求首先你的操作系统得支持Docker。目前主流的Linux发行版比如Ubuntu、CentOS、macOS以及Windows 10/11的专业版、企业版或教育版需要开启WSL2都是可以的。对于硬件建议至少有4GB的内存。如果你想用GPU来加速推理那么需要一块支持CUDA的NVIDIA显卡。你可以打开终端Linux/macOS或命令提示符/PowerShellWindows输入下面的命令来检查nvidia-smi如果能看到显卡的型号、驱动版本和CUDA版本信息那就说明你的显卡驱动装好了可以支持GPU。如果提示命令找不到那可能就需要先安装一下NVIDIA驱动。1.2 安装Docker和必要的工具如果你的系统上还没有Docker需要先安装它。这里以最常见的Ubuntu系统为例其他系统的安装方法也大同小异你可以在Docker官网上找到详细的指南。打开终端依次执行下面的命令# 更新软件包列表 sudo apt-get update # 安装一些必要的工具让apt可以通过HTTPS使用仓库 sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker的官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定的Docker仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 再次更新并安装Docker引擎 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装完成后运行下面的命令验证一下Docker是否安装成功。如果能看到版本号就说明没问题了。docker --version为了让每次运行Docker命令不用都加sudo我们可以把当前用户加入到docker用户组里sudo usermod -aG docker $USER注意执行完这个命令后你需要完全退出当前终端然后重新登录这个改动才会生效。重新登录后再运行docker ps命令试试应该就不需要sudo了。如果你打算使用GPU还需要安装NVIDIA Container Toolkit这样Docker容器才能调用宿主机的GPU。继续在终端里执行# 添加NVIDIA容器工具包的仓库 distribution$(. /etc/os-release;echo $ID$VERSION_ID) \ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ curl -fsSL https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.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 # 配置Docker使用nvidia作为默认的运行时 sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker好了基础环境咱们就准备好了。接下来进入正题。2. 编写Dockerfile打造专属的“安装包”Docker镜像就像是一个软件的“安装包”而Dockerfile就是制作这个安装包的“食谱”。我们会把Lychee-Rerank运行所需的一切——Python环境、依赖库、模型文件、启动脚本——都写进这个“食谱”里。在你电脑上找个合适的地方新建一个文件夹比如叫lychee-rerank-docker。然后在这个文件夹里创建一个名为Dockerfile的文件注意没有后缀名。用你喜欢的文本编辑器打开它把下面的内容复制进去。# 使用一个轻量化的Python 3.10镜像作为基础 FROM python:3.10-slim # 设置工作目录后续的操作都在这个目录下进行 WORKDIR /app # 安装系统依赖主要是为了能顺利编译一些Python包 RUN apt-get update apt-get install -y \ gcc \ g \ rm -rf /var/lib/apt/lists/* # 将当前目录下的所有文件复制到容器的/app目录下 # 这里假设你的代码文件如app.py, requirements.txt放在和Dockerfile同一目录 COPY . . # 安装Python依赖包 # 使用清华大学的PyPI镜像源国内下载速度会快很多 RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 暴露容器内部的端口这里假设Lychee-Rerank服务运行在8000端口 EXPOSE 8000 # 设置容器启动时默认执行的命令 # 这里启动一个基于FastAPI的Web服务监听所有网络接口 CMD [uvicorn, app:app, --host, 0.0.0.0, --port, 8000]这个Dockerfile做了几件关键的事选定基础环境基于官方的Python 3.10精简版镜像它已经包含了Python和pip我们不用从头安装。安装编译工具有些Python包比如某些Tokenizer库在安装时需要编译所以提前装好gcc和g。复制代码把咱们本地的代码文件全部拷贝到容器里。安装依赖根据requirements.txt文件安装所有Python包。声明端口告诉Docker这个容器会使用8000端口提供服务。设置启动命令容器一启动就自动运行uvicorn命令来启动Web服务。你可能注意到了这里引用了一个requirements.txt文件和一个app.py文件。别急我们马上就来创建它们。3. 准备应用代码和依赖光有“食谱”还不行我们还得准备好“食材”。在这个例子里食材就是Lychee-Rerank的代码和它依赖的Python库。3.1 创建依赖文件在同一个目录lychee-rerank-docker下创建一个名为requirements.txt的文件。这个文件里列出了所有需要安装的Python包。你可以根据Lychee-Rerank项目的官方说明来填写这里我给出一个常见的示例fastapi0.104.0 uvicorn[standard]0.24.0 pydantic2.0.0 torch2.0.0 transformers4.35.0 sentence-transformers2.2.0 # 添加其他你的项目需要的包例如 # numpy1.24.0 # pandas2.0.03.2 创建简单的应用入口文件接下来创建一个最简单的应用入口文件app.py。这是一个基于FastAPI的Web服务它加载Lychee-Rerank模型并提供一个API接口来进行重排序。为了教程的简洁我们这里实现一个最基础的功能。from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List import torch from sentence_transformers import CrossEncoder # 初始化FastAPI应用 app FastAPI(titleLychee-Rerank Service, version1.0) # 全局变量用于存储加载的模型 model None class RerankRequest(BaseModel): 重排序请求的数据结构 query: str passages: List[str] top_k: int 10 # 默认返回前10个最相关的结果 class RerankResponse(BaseModel): 重排序响应的数据结构 scores: List[float] ranked_indices: List[int] ranked_passages: List[str] app.on_event(startup) async def load_model(): 在服务启动时加载模型 global model print(正在加载Lychee-Rerank模型...) # 这里替换成你实际使用的模型名称例如 BAAI/bge-reranker-large model_name BAAI/bge-reranker-large try: model CrossEncoder(model_name, devicecuda if torch.cuda.is_available() else cpu) print(f模型 {model_name} 加载成功运行在 {model.device} 上。) except Exception as e: print(f模型加载失败: {e}) # 在生产环境中这里可能需要更严谨的错误处理 app.get(/) async def root(): 根路径返回简单的服务状态 return {message: Lychee-Rerank Service is running!} app.post(/rerank, response_modelRerankResponse) async def rerank(request: RerankRequest): 重排序的核心API接口 if model is None: raise HTTPException(status_code503, detailModel is not loaded yet.) if not request.passages: raise HTTPException(status_code400, detailPassages list cannot be empty.) # 准备模型输入将查询和每个段落配对 model_inputs [[request.query, passage] for passage in request.passages] # 使用模型进行预测得到相关性分数 scores model.predict(model_inputs) # 根据分数对段落进行降序排序 ranked_indices sorted(range(len(scores)), keylambda i: scores[i], reverseTrue) # 只保留前 top_k 个结果 top_k min(request.top_k, len(ranked_indices)) top_indices ranked_indices[:top_k] # 构建响应 response RerankResponse( scores[float(scores[i]) for i in top_indices], ranked_indicestop_indices, ranked_passages[request.passages[i] for i in top_indices] ) return response # 可选添加一个健康检查端点 app.get(/health) async def health_check(): 健康检查端点用于监控服务状态 if model is not None: return {status: healthy, model_loaded: True} else: return {status: unhealthy, model_loaded: False}, 503这个文件创建了一个Web服务它会在启动时自动下载并加载指定的重排序模型这里以BAAI/bge-reranker-large为例你需要替换成Lychee-Rerank实际的模型名。服务提供了两个主要接口一个根路径用于检查服务是否运行一个/rerank的POST接口用于提交查询和文档段落并返回重排序后的结果。现在你的lychee-rerank-docker目录下应该有三个文件了Dockerfile,requirements.txt,app.py。我们的“食材”就备齐了。4. 构建镜像与运行容器一键启动服务准备工作全部完成现在到了最激动人心的环节把“食材”按照“食谱”做成“菜”然后端上桌。4.1 构建Docker镜像打开终端进入到lychee-rerank-docker目录。执行下面的命令来构建镜像docker build -t lychee-rerank:latest .命令解释docker build告诉Docker要开始构建镜像了。-t lychee-rerank:latest给构建出来的镜像打一个标签Tag名字叫lychee-rerank版本是latest。你可以起任何你喜欢的名字。.最后一个点很重要它表示Dockerfile所在的当前目录。Docker会读取当前目录下的Dockerfile并将当前目录的所有文件作为构建上下文发送给Docker守护进程。这个过程可能会花几分钟时间因为Docker需要下载基础镜像然后一步步执行Dockerfile里的指令。你会看到屏幕上输出很多行信息。如果最后出现Successfully built和Successfully tagged的字样就说明镜像构建成功了。你可以用下面的命令查看本地已有的镜像应该能看到刚刚构建的lychee-rerank。docker images4.2 运行Docker容器CPU版本镜像构建好之后它就像是一个静止的“安装包”。我们需要运行它把它变成一个正在执行的“进程”这就是容器。运行一个最简单的CPU版本容器docker run -d -p 8000:8000 --name my-rerank-service lychee-rerank:latest命令解释docker run运行一个容器。-d让容器在后台运行detached mode。-p 8000:8000进行端口映射。格式是宿主机端口:容器端口。这里把容器内部的8000端口映射到了宿主机的8000端口。这样你访问宿主机的8000端口就能访问到容器内的服务了。--name my-rerank-service给这个容器起个名字方便后续管理。这里叫my-rerank-service。lychee-rerank:latest指定使用哪个镜像来创建容器。运行成功后你可以用下面的命令查看容器状态docker ps如果看到my-rerank-service这个容器的状态是Up就说明服务已经跑起来了。现在打开你的浏览器访问http://localhost:8000你应该能看到{message:Lychee-Rerank Service is running!}的返回信息。4.3 运行Docker容器GPU版本如果你的系统有NVIDIA GPU并且按照第一步装好了NVIDIA Container Toolkit那么你可以让容器直接使用GPU这会极大提升模型推理速度。运行GPU版本的容器只需要在docker run命令里加上--gpus all参数docker run -d -p 8000:8000 --gpus all --name my-rerank-service-gpu lychee-rerank:latest--gpus all表示将宿主机的所有GPU都分配给这个容器使用。你也可以指定特定的GPU比如--gpus device0,1表示只使用第0和第1块GPU。运行后你可以进入容器内部检查GPU是否可用# 进入容器的交互式终端 docker exec -it my-rerank-service-gpu bash # 在容器内启动Python并检查CUDA python3 -c import torch; print(torch.cuda.is_available())如果打印出True恭喜你GPU加速已经成功启用了模型加载和推理都会在GPU上进行速度会比CPU快很多。5. 数据持久化与常用管理命令服务跑起来之后我们还需要考虑两个实际问题一是模型文件下载到了容器里如果容器被删除下次又得重新下载很耗时二是怎么管理这些容器。5.1 数据持久化让模型文件“住”在外面默认情况下容器内产生的所有数据如下载的模型都只存在于这个容器内部。如果容器被删除这些数据也就没了。为了解决这个问题我们可以使用Docker的“卷挂载”Volume Mount功能把宿主机上的一个目录“映射”到容器内的某个目录。这样容器对这个目录的读写实际上是在读写宿主机的硬盘。假设我们在宿主机上创建一个目录/home/yourname/rerank_models来存放模型。运行容器时可以这样操作# 先在宿主机上创建目录 mkdir -p /home/yourname/rerank_models # 运行容器并挂载目录 docker run -d -p 8000:8000 \ --gpus all \ -v /home/yourname/rerank_models:/app/models \ # 将宿主机的目录挂载到容器的/app/models --name my-rerank-service-persist \ lychee-rerank:latest然后你需要修改一下app.py中load_model函数里的代码让模型下载或加载到/app/models这个路径下比如使用cache_folder参数model CrossEncoder(model_name, devicecuda if torch.cuda.is_available() else cpu, cache_folder/app/models) # 指定缓存目录这样即使容器被删除模型文件依然安全地保存在你的宿主机上。下次启动新容器时只要挂载同一个目录模型就能直接使用无需重新下载。5.2 常用的容器管理命令学会这几个命令你就能轻松管理你的服务了查看运行中的容器docker ps查看所有容器包括已停止的docker ps -a停止容器docker stop my-rerank-service启动已停止的容器docker start my-rerank-service重启容器docker restart my-rerank-service进入容器内部就像登录一台小电脑docker exec -it my-rerank-service bash查看容器日志排查错误非常有用docker logs my-rerank-service实时查看日志docker logs -f my-rerank-service删除已停止的容器docker rm my-rerank-service删除镜像docker rmi lychee-rerank:latest6. 测试你的重排序服务服务运行起来后我们当然要试试它好不好用。这里给你一个简单的Python测试脚本保存为test_client.py放在宿主机上任何地方运行都可以。import requests import json # 服务的地址如果你映射的是其他端口请修改 url http://localhost:8000/rerank # 准备测试数据 query 什么是人工智能 passages [ 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。, 机器学习是人工智能的一个分支它使计算机能够在没有明确编程的情况下学习。, 深度学习是机器学习的一个子领域它使用神经网络来模拟人脑的工作方式。, 今天的天气真好阳光明媚适合出去散步。, # 一个不相关的段落 人工智能在图像识别、自然语言处理和机器人等领域有广泛应用。 ] # 构造请求数据 data { query: query, passages: passages, top_k: 3 # 要求返回最相关的3个结果 } # 发送POST请求 headers {Content-Type: application/json} response requests.post(url, datajson.dumps(data), headersheaders) # 打印结果 if response.status_code 200: result response.json() print(查询, query) print(\n重排序后的前3个段落) for i, (idx, passage, score) in enumerate(zip(result[ranked_indices], result[ranked_passages], result[scores])): print(f{i1}. [索引{idx}, 分数{score:.4f}]: {passage}) else: print(f请求失败状态码{response.status_code}) print(response.text)运行这个脚本你应该能看到服务返回了重排序后的结果最相关的段落排在了最前面而那个关于天气的不相关段落应该被过滤掉了如果没在top_k里或者排在很后面。走完上面这些步骤一个基于Docker的Lychee-Rerank服务就已经在你的机器上稳稳地跑起来了。从环境准备到编写Dockerfile再到构建镜像和运行容器整个过程其实就像搭积木每一步都有明确的目标。用上Docker之后最大的好处就是环境隔离和一致性。你再也不用担心你的程序在别人机器上跑不起来或者因为系统升级导致依赖冲突。把这个镜像和Dockerfile交给任何人在任何支持Docker的机器上都能一键复现出完全相同的运行环境。如果你是在生产环境使用可能还需要考虑更多比如用Docker Compose来管理多个相关服务或者将镜像推送到私有的镜像仓库方便分发。但就入门和日常开发测试而言今天这套方案已经完全够用了。希望这个指南能帮你省下不少折腾环境的时间让你更专注于模型和应用本身。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。