a669091781 发表于 2025-3-28 13:11:06

通义千问7b大模型本地部署

最近有时间打算做个垂直领域的大模型,顺便学习下大模型的技术,将具体的操作流程记录下来,方便后续查看和学习。
1. 模型下载

   通义千问的大模型都被开源在阿里的魔塔社区,地址:
   考虑到环境配置和资源等原因选择Qwen2.5-7B-Instruct模型,地址:通义千问2.5-7B-Instruct · 模型库 (modelscope.cn),选择模型文件:
模型下载首先需要安装ModelScope:
pip install modelscope下载模型文件:
from modelscope import snapshot_download, AutoModel, AutoTokenizermodel_dir= snapshot_download('qwen/Qwen2.5-7B-Instruct', cache_dir='/root/tf-logs', revision='master')cache_dir为本地环境路径。
2. 环境选择

为了更流畅的运行模型,需要GPU支持,本次采用的方法是使用线上租赁GPU服务器的方法,租赁平台为AutoDL,官网地址为:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL
AutoDL服务器注册好后会有ssh,密码等,可以通过wcp远程连接,传递文件。开机后选择快捷工具的JupyterLab可以打开jupyter、命令终端等,可以调试代码和安装Python模块,如下图所示。
3. 模型部署

模型部署分为两个部分,第一是环境安装,第二是模型调用,以下分别介绍。
3.1 环境安装

基础环境如下:
----------------ubuntu 22.04python 3.12cuda 12.1pytorch 2.3.0----------------pip 换源加速下载并安装依赖包
# 升级pippython -m pip install --upgrade pip# 更换 pypi 源加速库的安装pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip install transformers==4.44.2pip install huggingface-hub==0.25.0pip install accelerate==0.34.2pip install modelscope==1.18.0pip install langchain==0.3.0(需要的注意的是AutoDL环境可以直接通过第一节modelscope的方式下载模型,不需要先下载下来再传输过去。)
3.2 模型调用

新建api.py文件并在其中输入以下内容,粘贴代码后请及时保存文件。以下代码有很详细的注释,大家如有不理解的地方,欢迎提出 issue 。
from fastapi import FastAPI, Requestfrom transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfigimport uvicornimport jsonimport datetimeimport torch# 设置设备参数DEVICE = "cuda"# 使用CUDADEVICE_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("/")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(, return_tensors="pt").to('cuda')    generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512)    generated_ids = [      output_ids for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)    ]    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)    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 = '/root/autodl-tmp/qwen/Qwen2.5-7B-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应用    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)# 在指定端口和主机上启动应用注意:记得修改model_name_or_path为你的模型下载路径。
在终端输入以下命令启动api服务:
cd /root/autodl-tmppython api.py# orpython /root/autodl-tmp/api.py加载完毕后出现如下信息说明成功。
默认部署在 6006 端口,通过 POST 方法进行调用,可以使用 curl 调用,如下所示:
curl -X POST "http://127.0.0.1:6006" \   -H 'Content-Type: application/json' \   -d '{"prompt": "你好"}'也可以使用 python 中的 requests 库进行调用,如下所示:
import requestsimport jsondef get_completion(prompt):    headers = {'Content-Type': 'application/json'}    data = {"prompt": prompt}    response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))    return response.json()['response']if __name__ == '__main__':    print(get_completion('你好'))得到的返回值如下所示:
3.3 问题解决

在模型安装好后遇到了'RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'''的报错,经过尝试发现是torch版的的问题,将原理的2.2.0的版本卸载后安装了2.2.2的版本就可以了。
pip unistall torchpip install torch==2.2.2

Mr·Jax 发表于 2024-11-22 10:17:32

本地部署的话4060TI能跑起来吗

youyou 发表于 2024-10-24 10:28:00

[酷]

橙子 发表于 2024-9-26 18:38:05

学习到了,很快就搭建好了
页: [1]
查看完整版本: 通义千问7b大模型本地部署