YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
九格大模型使用文档
本文档介绍九格大模型7B版本的推理方式。本仓库支持三种推理方式:
- 使用原生huggingface transformer的generate函数进行推理;
- 使用性能更好的vllm框架进行推理;
- 使用vllm将模型部署为服务,可使用OpenAI API发送请求来进行推理。
推理代码示例可参见后文说明。完成模型下载并依照步骤安装所需的各项依赖后,即可使用全部的三种推理方式。
目录
环境配置
完成模型下载后,需要安装所需的各项依赖。除本文介绍的7B模型外,九格还有4B和70B两种不同的版本可供选用,4B、7B、70B模型的依赖完全相同,如果已经配置完成其中任意一种,即可跳过此环境配置步骤。环境配置步骤分为Conda环境安装、Pytorch安装、其余依赖项安装三步。
conda 环境安装
使用python 3.10.16 创建conda环境
conda create -n fm-9g python=3.10.16
激活环境
conda activate fm-9g
安装Pytorch
如果不使用vllm推理,可使用如下方法安装Pytorch
# 需要先查看CUDA版本,根据CUDA版本挑选合适的pytorch版本 (测试CUDA版本为12.2)
conda install pytorch==2.3.0
如果使用vllm,则需要安装与我们预编译的vllm whl文件匹配的pytorch。可在此链接处下载对应版本的Pytorch安装包。
安装其他依赖包
pip install transformers==4.44.0
pip install datamodel-code-generator
pip install accelerate
pip install jsonschema
pip install pytrie
pip install sentencepiece
pip install protobuf
安装vllm依赖
使用vllm进行推理需要使用我们预编译的vllm whl安装包。此安装包在CUDA12.2、python3.10环境下编译,可安装后执行推理。您可在此链接处下载vllm安装包,并使用以下命令安装:
cd ..
pip install vllm-0.5.0.dev0+cu122-cp310-cp310-linux_x86_64.whl
推理脚本示例
transformers原生代码推理脚本示例
此代码适用于7B模型单卡推理。在指定路径时,需指定pytorch_model.bin文件所在目录的路径,注意不是pytorch_model.bin文件本身的路径。
import os
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
if __name__ == "__main__":
model_path = "XXXX" # 请替换为你的pytorch_model.bin文件所在的目录的路径
prompt = "山东最高的山是?"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.bfloat16,
trust_remote_code=True
)
model.to(device)
model.eval()
prompt = tokenizer.apply_chat_template(conversation=[{"role": "user", "content": prompt}], add_generation_prompt=True, tokenize=False)
inputs = tokenizer(prompt, return_tensors="pt")
inputs.to(model.device)
with torch.no_grad():
res = model.generate(**inputs, max_new_tokens=256)
responses = tokenizer.decode(res[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
ai_answer = responses.strip()
print(ai_answer)
vllm离线批量推理脚本示例
此脚本适用于7B模型vllm离线推理。同样,在指定路径时,需指定pytorch_model.bin文件所在目录的路径。
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
if __name__ == '__main__':
# 提示用例,定义了一个包含多个问题的列表,这些问题将被用于生成回答
prompts = [
"你是谁?",
"山东最高的山是?",
"介绍一下大模型的旋转位置编码。",
]
# 模型路径,指定了模型文件所在的目录路径
model_path = "XXXX"
# 设置采样参数以控制生成文本,更多参数详细介绍可见/vllm/sampling_params.py
# temperature越大,生成结果的随机性越强,top_p过滤掉生成词汇表中概率低于给定阈值的词汇,控制随机性
# max_tokens表示生成文本的最大长度
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=100)
# tensor_parallel_size是模型张量并行的GPU数量,用于加速模型的计算.
# 7B模型可在单块A100 40G上推理;对于显存较小的显卡,可考虑使用多块GPU并行推理
tensor_parallel_size = 1
llm = LLM(model=model_path, tensor_parallel_size=tensor_parallel_size, trust_remote_code=True, tokenizer_mode='auto')
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 初始化一个空列表,用于存储对话
conversations = []
for prompt in prompts:
# 使用分词器的apply_chat_template方法将提示用例转换为对话格式
conversations.append(
tokenizer.apply_chat_template(conversation=[{"role": "user", "content": prompt}], add_generation_prompt=True, tokenize=False)
)
# 根据提示生成文本,将对话列表和采样参数传递给LLM的generate方法
outputs = llm.generate(conversations, sampling_params)
# 打印输出结果
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
部署OpenAI API服务推理
vLLM可以为 LLM 服务进行部署,这里提供了一个示例:
启动服务:
#! /usr/bin/env bash
set -ue
python -m vllm.entrypoints.openai.api_server \
--model modelpath \
--tokenizer-mode auto \
--dtype auto \
--trust-remote-code \
--served-model-name 9g \
--api-key fm9g \
--gpu-memory-utilization 0.9 \
--port 8020 \
--tensor-parallel-size 1
# tensor_parallel_size是模型张量并行的GPU数量,用于加速模型的计算;
# 7B模型可在单块A100 40G上推理;对于显存较小的显卡,可考虑使用多块GPU并行推理
执行对应指令后,在http://localhost:8020 地址上启动服务,启动成功后终端会出现如下提示:
INFO: Started server process [3511795]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8020 (Press CTRL+C to quit)
调用推理API:
启动服务端成功后,重新打开一个终端,可参考执行以下python脚本:
from openai import OpenAI
client = OpenAI(
api_key="fm9g",
base_url="http://localhost:8020/v1",
)
messages = [{"role": "user", "content": "介绍一下大语言模型的旋转位置编码"}]
response = client.chat.completions.create(
model="9g",
messages=messages,
stream=True, # 流式输出
# 其他可选推理参数
# max_tokens=200,
# n = 1,
# stream = False,
# frequency_penalty = 0.8,
# presence_penalty = 0.9,
# logit_bias = {}
)
for chunk in response:
try:
content = chunk.choices[0].delta.content
except:
content = None
if content is not None:
print(content, end="")
print()
调用多轮对话API:
启动服务端成功后,重新打开一个终端,可参考执行以下python脚本:
from openai import OpenAI
client = OpenAI(
api_key="fm9g",
base_url="http://localhost:8020/v1",
)
messages = []
while True:
print("开始对话(输入 'quit' 结束):")
user_input = input("请输入内容:")
if user_input.strip().lower() == "quit":
break
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="9g",
messages=messages,
# 其他生成的超参数,看需求来加
stream=True,
# max_tokens=200,
# n = 1,
# frequency_penalty = 0.8,
# presence_penalty = 0.9,
# logit_bias = {}
)
full_reply = ""
for chunk in response:
try:
content = chunk.choices[0].delta.content
except:
content = None
if content is not None:
print(content, end="")
full_reply += content
print()
messages.append({"role": "assistant", "content": full_reply})
- Downloads last month
- 8