Bootstrap

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

本文详细介绍了如何在本地服务器上部署大模型(如DeepSeek、Llama3、Qwen等),并通过接口实现外部调用。首先,从HuggingFace或魔搭网站下载模型,使用git lfs和screen确保大文件完整下载;接着,使用FastAPI封装模型推理过程,支持多GPU运行并通过CUDA_VISIBLE_DEVICES指定显卡,提供完整的app.py代码实现模型加载和接口响应;然后,通过conda创建Python 3.10环境并安装依赖,使用nohup后台运行服务;最后,展示如何通过Postman或代码调用接口,发送请求并获取模型生成的文本。本文提供了从模型下载、部署到接口调用的完整流程,适合在本地服务器上运行大模型并实现高效的推理服务。

模型地址

在HuggingFace中搜索对应模型,并选择git clone
比如

git clone https://huggingface.co/deepseek-ai/DeepSeek-V2-Chat

huggingface网站可能会访问超时,因此可以选择国内的魔搭网站,同样登录网站后,搜索对应模型并下载

在这里插入图片描述

git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-V2-Lite-Chat.git

模型下载

由于模型比较大,所以需要用git lfs install

如果是下载70B或者更大的模型,可能git clone还是会遗漏一些文件,所以推荐使用Screen在后台下载

创建conda环境后,使用conda install -c conda-forge screen安装screen

为 screen 会话指定一个名称,可以使用 -S 参数:

screen -S mysession

暂时离开当前 screen 会话(但保持会话在后台运行)

Ctrl + A,然后按 D

重新连接到之前创建的 screen 会话,可以使用以下命令:

screen -r mysession

screen相当于启动了一个新的终端,与其他的终端互不影响,其中的工作都在后台运行

在screen中运行 git clone命令即可

如果出现文件遗漏,可以使用sh脚本指定文件下载,比如指定三个文件进行下载的download_files.sh

#!/bin/bash

# 目标 URL 和文件名的前缀
BASE_URL="https://www.modelscope.cn/models/LLM-Research/Llama-3.3-70B-Instruct/resolve/master"
FILES=(
    "model-00028-of-00030.safetensors"
    "model-00029-of-00030.safetensors"
    "model-00030-of-00030.safetensors"
)

# 循环下载文件
for FILE in "${FILES[@]}"; do
    echo "开始下载 $FILE ..."
    curl -O "$BASE_URL/$FILE"  # 使用 curl 下载文件
    if [ $? -eq 0 ]; then
        echo "$FILE 下载成功"
    else
        echo "$FILE 下载失败"
    fi
done

echo "所有文件下载完毕!"

在终端中运行脚本:

./download_files.sh
  • ./ 表示当前目录,确保系统知道从当前目录查找脚本。

模型部署

模型下载后,本地就有了完整的模型仓库

在这里插入图片描述
接下来就要进行模型的部署,采用fastapi进行模型部署,使用下列代码作为app.py

指定显卡运行

如果你有多张显卡,并且想指定使用第4和第5张GPU运行,可以在环境变量中设置仅4,5 GPU可见,此时第4变为0 第5变为1

if "DeepSeek" in MODEL_PATH_OR_NAME:
    os.environ['CUDA_VISIBLE_DEVICES'] = '4'
else:
    os.environ['CUDA_VISIBLE_DEVICES'] = '4,5'

然后加载模型时设置device_map="auto"

model = AutoModelForCausalLM.from_pretrained(MODEL_PATH_OR_NAME, torch_dtype=torch.float16, device_map="auto")

app.py

import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch
import torch.nn as nn
# Initialize FastAPI app
app = FastAPI()

MODEL_PATH_OR_NAME = "/yourpath/DeepSeek-V2-Lite-Chat"

# Set CUDA devices for visibility
if "DeepSeek" in MODEL_PATH_OR_NAME:
    os.environ['CUDA_VISIBLE_DEVICES'] = '4'
else:
    os.environ['CUDA_VISIBLE_DEVICES'] = '4,5'
device = torch.device('cuda:0')  # Using GPU 2

# Declare global variables for model and tokenizer
model = None
tokenizer = None

# Use startup and shutdown events for model loading and unloading
@app.on_event(
;