linux部署Mixtral-8x7B-Instruct实践(使用vLLM/ transformer+fastapi)

本文主要是介绍linux部署Mixtral-8x7B-Instruct实践(使用vLLM/ transformer+fastapi),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前提说明:

  • 这次实践用了两张A800(80G),每张卡消耗70G显存,总计140G

step1:下载模型

从huggingface(需科学上网)和modelscope两个平台下载模型
模型目录

step2:安装vLLM

之前部署大模型用transformer库+OpenAI api,会有推理速度慢,server部署起来比较复杂的缺点,vLLM是一个LLM推理和服务库,原理类似于操作系统的虚拟内存。
在这里插入图片描述
现在说怎么安装,安装很简单

pip install vLLM	

要安装3G左右的包。
#step3 使用vLLM部署Mixtral 8*7b(重点)
先丢一串命令

python -u -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --model /data/models/Mixtral-8x7B-Instruct-v0.1 --tensor-parallel-size 2

别着急,一个一个解释,先说跟python命令相关的,-u指python输出不缓冲,-m告诉python运行一个库模块,--host 指定服务器监听的主机地址,--model指定要使用的模型的路径,--tensor-parallel-size使得模型的张量可以分布在两个及以上GPU上,一张80G的A800放不下Mixtral 8*7b的参数(140),指定tensor-parallel-size=2将参数拆到两块上面,一张卡70G。

  • --host 0.0.0.0 允许任何IP地址的设备都能访问这个服务
  • --port 指定服务端口,默认是8000
  • --model /data/models/Mixtral-8x7B-Instruct-v0.1 可以是模型名称或者本地路径。指定咱们使用Mixtral-8x7B-Instruct-v0.1模型,注意这里指定了模型所在路径,如果模型需要在线下载,直接指定模型名称,超大模型不建议在线下载,因为不稳定,而且代理没有那么多流量啊。
  • --tensor-parallel-size 2指定张量并行的GPU数量,Mixtral模型有32个注意力头,必须均匀的分在GPU中,所以必须是32的因数(2、4、8、16),否则会报ValueError: Total number of attention heads (32) must be divisible by tensor parallel size (3).错误

其他没有用到的参数:

  • --chat-template 聊天的模板,用户的输入+模板=最后的prompt
  • --trust-remote-code 默认为false,如果人为修改过下载后的模型的话,会报错,建议设置成True
  • --download-dir 在线下载模型权重时,指定的下载路径,默认是~/.cache
  • --worker-use-ray 是否用ray来实现分布式推理服务,在GPU>2时默认开启
  • --gpu-memory-utilizationGPU的利用率,0~1之间,默认是0.9,比如我是两张80G的卡,参数0.9,每张卡最高使用72G显存。如果显卡多,4张80G的卡,参数设置成0.5,就是每张显卡最多占40G显存,需要4张卡才能跑。感觉用不到,设置成0.5四张卡,不如0.9两张卡,还能有两张卡空闲着,除非四张卡的并行推理能提高推理速度。
    在这里插入图片描述

step4 发请求

requests库来模拟请求。model换成模型的目录

import requests
import json# 定义请求的 URL 和数据
url = "http://<IP>:8000/v1/completions"
data = {"model": "/data/models/Mixtral-8x7B-Instruct-v0.1","prompt": "请介绍一下AI的发展历史,AI的未来会如何发展?","max_tokens": 1000,"temperature": 0.2
}# 发送 POST 请求
response = requests.post(url, json=data)# 检查响应
if response.status_code == 200:print("请求成功!")print("响应内容:", response.json()['choices'][0]["text"])
else:print("请求失败,状态码:", response.status_code)

解释一下参数:

  • max-tokens:inputs_tokens+response_tokens的最大值,这里设置成1000
  • temperature:温度越低,选可能性更高的token作为response,也就是回答越精炼、准确、字数越少。反之,更有多样性、发散、字数更多。建议值是0.2~1,如果设置成0,会导致每次询问都是同样的回答。

在这里插入图片描述

总结

vLLM作为一个推理和部署库,一条命令就能部署大模型推理服务。覆盖了用transformer和openapi或者FastAPI部署服务的过程,用起来很方便。

使用Transformer+fastapi

Step1:从本地加载模型

model_id = "/data/models/Mixtral-8x7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_id, padding_side='left')
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")	

float16精度下只能在GPU上推理,占用显存90G在这里插入图片描述
device_map="auto"自动把模型的不同层放到三块GPU上。
Step2:构造prompt模板
参考:huggingface Mixtral-8x7B-Instruct-v0.1主页 Instruction format部分
prompt必须严格遵循下面的格式,否则模型会胡言乱语(盲猜模型训练格式就是这个)

<s> [INST] Instruction [/INST] Model answer</s> [INST] Follow-up instruction [/INST]
def add_template_to_prompt(prompt):# prompt_templated = f"<s> [INST] {prompt} [/INST] Model answer </s> [INST] Follow-up instruction [/INST]"prompt_templated = f"<s> [INST] {prompt} [/INST] </s>"return prompt_templated

Step3: fastapi

app = FastAPI()
@app.post("/v1/completions")
async def chat(argument: ModelAugument):prompt_templated = add_template_to_prompt(argument.prompt)inputs = tokenizer(text=prompt_templated, return_tensors="pt")outputs = model.generate(**inputs, max_new_tokens=argument.max_tokens)outputs_text = tokenizer.decode(outputs[0], skip_special_tokens=True)return outputs_text[outputs_text.find("[/INST]") + 7:] # truncate the prompt(as prefix)

Mixtral的又把prompt作为前缀输出了一遍,在Mistral的回答中prompt后面的才是真正的回答,所以做了个截断。举个例子:
prompt:

你好

模板化后:

<s> [INST] 你好 [/INST] </s>

Mistral回答

  [INST] 你好 [/INST] Hello! 你需要什么帮助吗?(Hello! Do you need any help?)

完整代码:

from transformers import AutoTokenizer, AutoModelForCausalLM
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()model_id = "/data/models/Mixtral-8x7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_id, padding_side='left')
model = AutoModelForCausalLM.from_pretrained(model_id)class ModelAugument(BaseModel):prompt: strtemperature: floatmax_tokens: intdef add_template_to_prompt(prompt):# prompt_templated = f"<s> [INST] {prompt} [/INST] Model answer </s> [INST] Follow-up instruction [/INST]"prompt_templated = f"<s> [INST] {prompt} [/INST] </s>"return prompt_templated@app.post("/v1/completions")
async def chat(argument: ModelAugument):prompt_templated = add_template_to_prompt(argument.prompt)inputs = tokenizer(text=prompt_templated, return_tensors="pt")outputs = model.generate(**inputs, max_new_tokens=argument.max_tokens)outputs_text = tokenizer.decode(outputs[0], skip_special_tokens=True)# outputs_text = outputs_text[outputs_text.find("[/INST]") + 7:] # truncate the prompt(as prefix)return outputs_text

这篇关于linux部署Mixtral-8x7B-Instruct实践(使用vLLM/ transformer+fastapi)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828643

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推