主流开源LLM(Qwen、ChatGLM等)的本地化部署

一、环境准备

1. 先下载conda(或者Anaconda、Miniconda)
2. 在下载目录进入命令提示符(地址栏输入CMD)
3. 运行自带的激活脚本.\Scripts\activate

E:\anaconda>就会变成(base) E:\anaconda>

现在输入conda --version 可以验证版本

复制代码
(base) E:\anaconda>conda --version
conda 24.9.2
4. 创建LLM 专用环境
复制代码
# 1. 创建名为 llm_env 的新环境,指定 Python 3.10
conda create -n llm_env python=3.10 -y

# 2. 激活新创建的环境。第二次进入时,运行自带的激活脚本后,直接运行这条命令进入环境。
conda activate llm_env

激活后,命令提示符会从 (base) 变成 (llm_env),表示你现在位于独立的环境中。

5. 安装依赖库
  • 1 安装PyTorch

    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

    验证 PyTorch 和 CUDA 是否可用

    先输入python,进入python交互环境

    再逐行输入以下代码

    python 复制代码
    import torch
    print(torch.__version__)
    print(torch.cuda.is_available())
    print(torch.cuda.get_device_name(0))

    如果第一行就报错

    复制代码
    (llm_env) E:\anaconda>python
    Python 3.12.7 | packaged by Anaconda, Inc. | (main, Oct  4 2024, 13:17:27) [MSC v.1929 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.

    说明你的 python 指向的是 Python 3.12.7,但 PyTorch 我们刚刚是装在 Python 3.10 的环境里的

    这时候先输入exit()退出

    再用完整路径强制调用

    E:\anaconda\envs\llm_env\python.exe

  • 2 安装部署 LLM 必需的库

    pip install transformers accelerate bitsandbytes scipy sentencepiece

    安装完成后,就可以开始下载并运行模型了。

二、模型获取

  • 1.Qwen.

在方便的地方(比如桌面),创建一个名为 test_qwen.py 的Python文件,内容如下:

python 复制代码
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 1. 指定模型名称
model_name = "Qwen/Qwen2.5-1.5B-Instruct"

print("正在下载并加载模型,首次运行需要下载约3GB文件...")

# 2. 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

# 3. 加载模型(不量化,FP16精度,显存占用约2.5GB)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True
)

print("模型加载完成!开始对话...\n")

# 4. 对话循环
messages = []
while True:
    user_input = input("你: ")
    if user_input.lower() in ["exit", "quit", "退出"]:
        break
    
    messages.append({"role": "user", "content": user_input})
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    
    inputs = tokenizer(text, return_tensors="pt").to(model.device)
    outputs = model.generate(
        **inputs,
        max_new_tokens=512,
        temperature=0.7,
        do_sample=True
    )
    
    response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
    print(f"助手: {response}\n")
    messages.append({"role": "assistant", "content": response})

在命令行(确保 (llm_env) 环境是激活的)中,cd 到脚本所在目录,然后在命令行中设置环境变量,让下载走国内镜像

set HF_ENDPOINT=https://hf-mirror.com

接着运行文件

python test_qwen.py

会输出

复制代码
正在下载并加载模型,首次运行需要下载约3GB文件...
...
模型加载完成!开始对话...

现就就可以对话了

复制代码
你: 你好,你是谁
助手: 我是Qwen,由阿里云开发的大规模语言模型。我是一个人工智能助手,可以帮助回答问题、提供信息和进行对话。有什么我可以帮助你的吗?
  • 2.ChatGLM
python 复制代码
from transformers import AutoTokenizer, AutoModel
import torch

# ChatGLM3-6B 模型名称
model_name = "THUDM/chatglm3-6b"

print("正在下载并加载 ChatGLM3-6B (4-bit 量化)...")

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(
    model_name,
    trust_remote_code=True
    )

# 4-bit 量化加载模型
model = AutoModel.from_pretrained(
    model_name,
    load_in_4bit=True,           # 启用 4-bit 量化
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True
)

print("模型加载完成!开始对话...\n")

# ChatGLM 的对话方式与 Qwen 不同,使用 model.chat()
while True:
    user_input = input("你: ")
    if user_input.lower() in ["exit", "quit", "退出"]:
        break
    
    # ChatGLM 内置了对话历史管理
    response, history = model.chat(tokenizer, user_input, history=[])
    print(f"助手: {response}\n")

三、部署API

在虚拟环境llm_env 中安装FastAPIUvicornFastAPI 和 Uvicorn这两个库

bash 复制代码
# 临时使用清华镜像源安装 fastapi 和 uvicorn
pip install fastapi uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple/

然后新建文件qwen_API.py

复制代码
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

app = FastAPI()

# 加载模型(全局加载一次)
model_name = "Qwen/Qwen2.5-1.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True
)

class ChatRequest(BaseModel):
    prompt: str
    max_new_tokens: int = 512

@app.post("/generate")
def generate(request: ChatRequest):
    inputs = tokenizer(request.prompt, return_tensors="pt").to(model.device)
    outputs = model.generate(**inputs, max_new_tokens=request.max_new_tokens)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return {"response": response}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

如果你的网络无法稳定访问 Hugging Face,需要先设置镜像

bash 复制代码
set HF_ENDPOINT=https://hf-mirror.com

现在就可以启动 API 服务了:

bash 复制代码
python qwen_API.py

看见以下信息就表示成功了

bash 复制代码
INFO:     Started server process [8476]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

接下来就可以访问http://localhost:8000/docs查看 Swagger 文档。