通义千问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 本地部署的话4060TI能跑起来吗 [酷] 学习到了,很快就搭建好了
页:
[1]