手把手教你用 RTX 3090 本地部署 27B 大模型

43 次阅读 0 点赞 0 评论 8 分钟原创技术教程

在单张或双张 RTX 3090 上跑起 27B 级大语言模型,本文带你从零完成模型下载、引擎配置、服务启动与 API 调用全流程。掌握 vLLM 与 llama.cpp 的选型逻辑,避开长上下文 OOM 等高频坑,跑通属于自己的本地 LLM 服务。

#LLM本地部署 #RTX3090 #vLLM #大模型推理 #Docker
手把手教你用 RTX 3090 本地部署 27B 大模型

手把手教你用 RTX 3090 本地部署 27B 大模型

24GB 显存的 RTX 3090 放在本地不用来跑大模型确实可惜。实际动手部署 LLM 会遇到不少坑:模型下载慢、显存不够导致 OOM、引擎选择困难、启动后各种报错。这篇教程带你在一台带单张或双张 RTX 3090 的 Linux 机器上,完整跑起支持 OpenAI 兼容 API 的本地 LLM 服务。学完后你能用 GPU 跑 Qwen3.6-27B 这类模型,并掌握 vLLM 和 llama.cpp 的选型逻辑。

环境准备

开始前确认环境满足以下要求:

项目 要求 说明
GPU 1× 或 2× NVIDIA RTX 3090(24GB/张) 4090/5090 兼容,12GB 卡跑不动 27B
系统 Linux(Ubuntu 22.04+) Windows 需先装 WSL2
Docker 已安装 + NVIDIA Container Toolkit 本项目基于容器化部署
NVIDIA 驱动 580.x 及以上 需要 CUDA 13 运行时
磁盘空间 至少 30GB 空余 每个模型约 30GB

驱动版本低于 580 会导致 vLLM 容器无法启动,先运行 nvidia-smi 确认版本。

克隆项目与安装依赖

克隆项目到本地:

bash 复制代码
git clone https://github.com/noonghunna/club-3090.git
cd club-3090

安装 PyYAML 依赖:

bash 复制代码
python3 -m pip install pyyaml
## Ubuntu/Debian 也可用 apt:sudo apt install python3-yaml

核心工具全部封装在 scripts/ 目录下,包含下载模型、启动服务、切换配置的交互式脚本,省去了手动编写 Docker Compose 文件和查文档的时间。

下载模型

运行交互式下载脚本:

bash 复制代码
bash scripts/setup.sh

或直接指定模型名称:

bash 复制代码
bash scripts/setup.sh qwen3.6-27b

脚本自动完成三件事:硬件预检(确认 GPU 数量、驱动版本、磁盘空间)、模型权重下载(默认拉取量化好的 AutoRound INT4 版本,保留 BF16 的 MTP head)、SHA 校验(验证完整性防损坏文件)。

27B 模型的 INT4 量化版本约 15-20GB,下载时间取决于网络状况,建议配置代理或使用镜像站。脚本提供路径选择功能,磁盘空间不足时可指定到挂载的额外硬盘。通过 MODEL_DIR 环境变量可跳过交互式确认。

选择引擎并启动服务

项目支持三种推理引擎:

  • vLLM:双卡推荐,高吞吐,支持视觉、tool calling、MTP。双卡 code 场景可达 127 TPS
  • llama.cpp:单卡推荐,极致鲁棒性,支持 200K 上下文,不会出现长上下文 prefill OOM
  • ik_llama:单卡最快,基于 IQ4_KS 量化,约 69 TPS

单卡体验推荐 llama.cpp 或 ik_llama,追求生产级吞吐用双卡 vLLM。

启动服务:

bash 复制代码
bash scripts/launch.sh

脚本交互式询问模型、GPU 数量和显存预算后自动启动。跳过向导直接指定配置:

bash 复制代码
## 单卡 vLLM(轻量模式,32K 上下文,约 32-33 TPS)
bash scripts/launch.sh --variant vllm/minimal

## 双卡 vLLM(262K 上下文 + 视觉支持)
bash scripts/launch.sh --variant vllm/dual

## 单卡 llama.cpp(稳健路线,大上下文不 OOM)
bash scripts/switch.sh llamacpp/default

启动完成后脚本自动调用 verify-full.sh 跑健康检查(8 项检查约 1-2 分钟),确保服务正常响应,比直接 curl 祈祷的方式靠谱得多。

发起 API 调用

服务在 localhost:8020 暴露 OpenAI 兼容 API,任何兼容 OpenAI SDK 的代码都能直接使用。

快速验证:

bash 复制代码
curl -sf http://localhost:8020/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.6-27b",
    "messages": [
      {"role": "user", "content": "用中文解释一下什么是 Transformer 架构的核心思想?"}
    ],
    "max_tokens": 500
  }'

Python 调用示例:

python 复制代码
from openai import OpenAI

client = OpenAI(
    api_key="local-not-needed",
    base_url="http://localhost:8020/v1"
)

response = client.chat.completions.create(
    model="qwen3.6-27b",
    messages=[
        {"role": "system", "content": "你是一个资深的技术博主"},
        {"role": "user", "content": "用一段话给刚入门的后端开发者解释 Docker 的价值"}
    ],
    max_tokens=300,
    temperature=0.7
)

print(response.choices[0].message.content)

只需将 base_urlapi.openai.com 改为 localhost:8020/v1 即可无缝切换本地模型,开发阶段做功能联调无需每次请求都烧钱。

性能基准测试

项目提供现成测试脚本:

bash 复制代码
## 吞吐量测试(3 次预热 + 5 次正式测量)
bash scripts/bench.sh

## 行为质量测试(工具调用正确性、指令遵循、结构化输出等)
bash scripts/quality-test.sh --medium   # 5 个测试包,约 15-25 分钟

bench.sh 打印 TPS(每秒 token 数)用于评估吞吐能力。双卡 vLLM code 场景 89-127 TPS,单卡 llama.cpp 约 51-60 TPS。

常见问题

单卡 vLLM 长文本 OOM

单卡 24GB 在处理超过 50K 的长 prompt prefill 时会 OOM。换双卡 vLLM(vllm/dual,TP=2 可绕过此问题)或单卡切回 llama.cpp 可解决。

HuggingFace 下载慢

国内网络不佳时,先手动下载模型权重到 MODEL_DIR,运行 setup.sh 时指定已存在路径,或设环境变量跳过下载。

启动失败排查

检查日志:

bash 复制代码
docker logs <容器名称> 2>&1 | tail -50

常见原因:显存不足或驱动版本不对。预检脚本误判时用 --force 跳过:

bash 复制代码
bash scripts/switch.sh --force llamacpp/default

Windows 用户

原生 Windows 无法运行 Docker 方案,需先装 WSL2,参考 docs/WSL_SETUP.md 在 WSL2 中完成部署。

后续拓展

服务跑起来后可按需拓展:

  1. 切换配置bash scripts/switch.sh vllm/dual 一键切换引擎和参数,无需停服务重装
  2. 添加模型:支持 Qwen3.6-27B、Gemma 4 31B、Qwen3.6 35B-A3B(MoE)等,运行 bash scripts/setup.sh <model_name>
  3. 接 Open WebUI:Web 聊天界面后端地址指向 localhost:8020
  4. 保持更新bash scripts/update.sh 获取引擎版本和新补丁
  5. 终端 UI:安装 c3 驾驶舱获得可视化操作:
    bash 复制代码
    uv pip install -e tools/serve-cockpit
    c3

把量化方案、引擎配置、上下文长度都验证好并封装成可用的一键脚本,能节省大量时间。按教程步骤操作,跑通本地 LLM 服务后,把精力放在用模型创造价值上,而不是跟 OOM 较劲。

最后更新:2026-09-02T10:03:30

评论 (0)

发表评论

blog.comments.form.loading
0/500
加载评论中...