服务器部署LLM、Embedding

news2025/1/3 3:41:08

服务器部署LLM、Embedding

  • 1.提要
  • 2.搭建python环境
    • 2.1安装python
    • 2.2 安装虚拟环境管理软件(Miniconda3)
  • 3.部署LLM模型
    • 3.1安装git:
    • 3.2模型文件来源
    • 3.3Transformers模型推理部署
    • 3.4vllm启动模型推理
  • 4.本地部署embedding模型

1.提要

服务器环境: 32vCPU + 128GiB + 2NVIDIA A100 2*80GB
服务器操作系统:Ubuntu 22.04 64位
驱动:CUDA 版本 12.4.1/Driver 版本 550.90.07/CUDNN 版本 9.2.0.82

Qwen2.5-14B环境要求
Python >= 3.10;
Transformers>= 4.37.0;
PyTorch >= 2.3.1;

2.搭建python环境

2.1安装python

Ubuntu 22.04 64位系统一般默认已经安装python 3.10;Linux系统一般都默认安装有python环境。

安装指定版本python

sudo apt install python3.10

查看安装版本命令:

python3 --version

2.2 安装虚拟环境管理软件(Miniconda3)

下载虚拟环境安装脚本

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

执行脚本

bash Miniconda3-latest-Linux-x86_64.sh

重启终端,生效

source ~/.bashrc

验证安装

conda --version

创建python环境

conda create --name inference_model python=3.10

激活环境:

conda activate inference_model

注意:
PyTorch 版本参照链接:https://pytorch.org/;PyTorch是模型运行的基础环境框架,版本很重要,需要根据链接选择合适的版本;其他依赖可以根据需要安装.

3.部署LLM模型

3.1安装git:

安装git

sudo apt install git

安装大型文件的版本控制插件lfs

sudo apt-get install git-lfs

验证安装

git lfs --version

3.2模型文件来源

AI模型社区:

阿里魔塔: https://modelscope.cn/my/overview
huggingface: https://huggingface.co/
百度飞浆 https://www.paddlepaddle.org.cn/

下载模型权重方式通常有两种:
git:

git clone https://www.modelscope.cn/Qwen/Qwen2.5-72B-Instruct.git

魔塔、huggingface等可以通过使用模型名称的方式,自动加载。

3.3Transformers模型推理部署

简介: Transformers是huggingface的开源流行库,集成了深度学习领域中预训练模型的推理、训练方式;在这里结合使用fastapi、uvicorn,将模型发布为api服务。

启动命令为:

 nohup python chatdemo.py &

执行命令:启动后,外部访问的接口为:http://localhost:8080/v1

测试:

curl -X POST "http://127.0.0.1:8080/v1" 
     -H 'Content-Type: application/json' 
     -d '{"prompt": "你好"}'

chatdemo.py的代码为:

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import uvicorn
import json
import datetime
import torch

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/v1")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示

    messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
    ]

    # 调用模型进行对话生成
    input_ids = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)
    model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
    generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512)
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]
    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    model_name_or_path = '/home/llm/model/Qwen/Qwen2.5-72B-Instruct/'
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)
    model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", torch_dtype=torch.bfloat16)

    # 启动FastAPI应用
    # 用8080端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=8080, workers=1)  # 在指定端口和主机上启动应用

3.4vllm启动模型推理

简介: 使用vllm启动,可以查看相关的接口文档。

启动命令:

python -m vllm.entrypoints.openai.api_server --model Qwen2.5-72B-Instruct --trust-remote-code --tensor-parallel-size 2 --port 8080

测试:

curl http://localhost:8080/v1/chat/completions -H "Content-Type: application/json" -d '{  "model": "Qwen/Qwen2.5-72B-Instruct",  "messages": [    {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},    {"role": "user", "content": "Tell me something about large language models."}  ],  "temperature": 0.7,  "top_p": 0.8,  "repetition_penalty": 1.05,  "max_tokens": 512}'

4.本地部署embedding模型

简介: embedding模型可以采用transformers进行推理,结合fastapi和uvicorn发布为api服务。使用的是BAAI智源研究院模型:https://model.baai.ac.cn/models

启动命令:

nohup python inference.py &

inference:

import uvicorn
from fastapi import FastAPI, Request
from fastapi.params import Query
from transformers import AutoTokenizer, AutoModel
import torch

app = FastAPI()


@app.post('/v1')
async def predict(sentence: list[str] = Query(default='', description='关键字')):
    global model, tokenizer
    print("predict", dict)

    # Sentences we want sentence embeddings for
    sentences = ["好好学习-1", "天天向上-2"]
    sentences.extend(sentence)
    print("sentences", sentences)

    # Tokenize sentences
    encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
    # for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
    # encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')

    # Compute token embeddings
    with torch.no_grad():
        model_output = model(**encoded_input)
        # Perform pooling. In this case, cls pooling.
        sentence_embeddings = model_output[0][:, 0]
    # normalize embeddings
    sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)

    torch.set_printoptions(linewidth=120, precision=4, threshold=10000, edgeitems=10000)

    print("Sentence embeddings:", sentence_embeddings)
    return {"code": 0, "msg": "success", "data": sentence_embeddings.tolist(), "dict": dict}


if __name__ == '__main__':
    # Load model from HuggingFace Hub
    model_name_or_path = '/home/embedding/BAAI/bge-small-zh-v1.5'
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
    model = AutoModel.from_pretrained(model_name_or_path)
    model.eval()

    # 启动FastAPI应用
    # 用8080端口启动服务
    uvicorn.run(app, host='127.0.0.1', port=8099, workers=1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSES-1135 Distance Queries

题目传送门https://vjudge.net/problem/CSES-1135#authorGPT_zh 解题思路 题目让我们求树上两个点的距离。 那么就可以转化为两点到其 LCA 的距离之和。 代码 #include<bits/stdc.h> using namespace std;int n,q; vector<int> g[200001]; int dis[200001],dep…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

kafka小实站

需要先在前面的文章里面照着下载好kafka&#xff0c;并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集&#xff08;Assembly&#xff09;3、元数据&#xff08;Metadata&#xff09; 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…

(桌面运维学习)通过备份C盘,进行Windows系统的软件初始化

通过PE工具备份C盘&#xff0c;进行Windows系统的软件初始化 需求场景&#xff1a;快速初始化一批型号和主板一样的电脑系统型号也要一致&#xff08;Win10专业版就最好全是WIn10专业版&#xff09;&#xff0c;初始化的内容包括已配置好的环境和已安装的软件。主要用于公司桌面…

【ELK】ES单节点升级为集群模式--太细了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件&#xff0c;增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

Path-of-Thoughts:将“思维链“升级为“思维图“,三阶段框架取代单一推理,提升大模型复杂关系推理准确性至88.2%与效率提升5%

Path-of-Thoughts&#xff1a;将"思维链"升级为"思维图"&#xff0c;三阶段框架取代单一推理&#xff0c;提升大模型复杂关系推理准确性至88.2%与效率提升5% 论文大纲理解通用流程框架 观察和假设观察现象提出假设实验验证解法拆解解法&#xff1a;Path-of…

ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 我们先实现一…

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度&#xff0c;使⽤不同的数据类型&#xff0c;能够创建出⻓度不同的变量&#xff0c;变量⻓度的不同&#xff0c;存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字&#xff0c;也是操作符&#xff0c;专⻔是⽤来计算特…

大数据组件(一)快速入门调度组件Airflow

大数据组件(一)快速入门调度组件Airflow DolphinScheduler和 Airflow是数据领域很流行的两款开源任务调度系统。DolphinScheduler 致力于用可视化的方式去完成一个 DAG 工作流&#xff0c;而 Airflow 则想的是用类似于编程的方式完成一个 DAG 工作流。 Apache DolphinSchedule…

jpeg学习

相关最全的一篇文章链接&#xff1a;https://www.cnblogs.com/wtysos11/p/14089482.html YUV基础知识 Y表示亮度分量&#xff1a;如果只显示Y的话&#xff0c;图像看起来会是一张黑白照。 U&#xff08;Cb&#xff09;表示色度分量&#xff1a;是照片蓝色部分去掉亮度&#x…