1. 项目概述
在企业级AI开发领域,内网环境隔离是一个普遍存在的痛点。许多涉密单位、金融机构的服务器完全无法连接外网,这使得传统的"在线拉取依赖、在线下载模型"的部署方式变得不可行。本文将详细介绍如何在完全无外网的环境下,部署一套完整的私有化AI服务,包含大模型(Llama 3 8B 4-bit量化版)和Embedding模型(m3e-base)。
1.1 核心需求解析
无外网环境下的AI服务部署面临几个关键挑战:
- 依赖管理:所有Python包、系统依赖必须离线安装
- 模型部署:大模型和Embedding模型需要预先下载并完整传输
- 硬件适配:需要在消费级GPU上实现稳定运行
- 服务封装:需要提供标准化的API接口供内网调用
这套方案的核心优势在于:
- 完全离线部署,不依赖任何云服务
- 硬件门槛低(RTX 3090/4090即可运行)
- 提供标准化的API接口
- 支持中文文本处理(特别是m3e-base对中文优化)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前置准备
2.1 硬件准备
硬件选型需要根据实际使用场景进行规划。以下是两种典型配置方案:
| 场景类型 | GPU配置 | CPU配置 | 内存 | 存储 | 适用场景 |
|---|---|---|---|---|---|
| 测试/小型办公 | RTX 3090/4090 (24GB) | 8核16线程 (i7/Ryzen 9) | 32GB | 1TB NVMe SSD | 5-10人团队日常使用 |
| 生产/中型企业 | RTX 6000 Ada (48GB) | 16核32线程 (Xeon/EPYC) | 64GB | 2TB NVMe SSD | 100人以内企业应用 |
硬件选择注意事项:
- 必须使用NVIDIA显卡:目前主流部署框架仅支持CUDA,计算能力需≥7.0
- 存储优先选择NVMe SSD:机械硬盘会导致模型加载速度极慢
- 内存不要低于16GB:否则模型加载时容易出现内存溢出错误
2.2 软件与离线资源准备
所有资源需要在外网环境下预先下载,然后通过物理介质(如U盘)或内网传输工具拷贝到目标服务器。主要分为以下几类:
2.2.1 操作系统
推荐选择:
- CentOS 8
- Ubuntu 20.04 LTS
这两个版本对AI相关依赖的兼容性最好,稳定性也经过验证。避免使用CentOS 7等较旧版本。
下载方式:
- CentOS 8镜像:从阿里云镜像站下载
- Ubuntu 20.04镜像:从官网下载
2.2.2 CUDA与cuDNN
版本匹配至关重要:
- CUDA 11.8
- cuDNN 8.6
下载步骤:
- 访问NVIDIA开发者网站下载CUDA 11.8的runfile(local)格式安装包
- 下载与CUDA 11.8匹配的cuDNN 8.6 tar.gz包
2.2.3 Python环境与依赖包
使用Miniconda创建隔离的Python环境,并预先下载所有依赖包:
bash复制# 在外网机器上执行
# 1. 安装Miniconda
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda
source $HOME/miniconda/bin/activate
# 2. 创建虚拟环境
conda create -n private-ai python=3.10 -y
conda activate private-ai
# 3. 下载所有依赖包
mkdir -p /tmp/offline-pip-packages
pip download -d /tmp/offline-pip-packages torch==2.1.0+cu118 torchvision==0.16.0+cu118 torchaudio==2.1.0+cu118 -f https://download.pytorch.org/whl/torch_stable.html
pip download -d /tmp/offline-pip-packages vllm==0.5.4 transformers==4.44.2 sentence-transformers==2.2.2 fastapi==0.104.1 uvicorn==0.24.0 bitsandbytes==0.41.1 accelerate==0.23.0
# 4. 打包依赖
tar -zcvf offline-pip-packages.tar.gz /tmp/offline-pip-packages
2.2.4 模型文件
选择轻量高效的模型组合:
-
大模型:Llama 3 8B BNB 4-bit量化版
- 体积约5GB
- 8GB显存即可运行
- 性能接近原生版本
-
Embedding模型:m3e-base
- 专为中文优化
- 体积约400MB
- 适合知识库检索场景
下载方式:
- 大模型:从GitCode镜像站克隆仓库
- Embedding模型:从HuggingFace下载
重要提示:下载后务必检查文件完整性,确保没有缺失的配置文件或模型权重文件。
3. 无外网部署步骤
3.1 安装CUDA与cuDNN
以CentOS 8为例:
bash复制# 1. 安装CUDA 11.8(离线模式)
chmod +x cuda_11.8.0_520.61.05_linux.run
./cuda_11.8.0_520.61.05_linux.run --override --no-network --no-drm
# 2. 配置环境变量
echo "export CUDA_HOME=/usr/local/cuda-11.8" >> /etc/profile
echo "export PATH=\$CUDA_HOME/bin:\$PATH" >> /etc/profile
echo "export LD_LIBRARY_PATH=\$CUDA_HOME/lib64:\$LD_LIBRARY_PATH" >> /etc/profile
source /etc/profile
# 3. 验证安装
nvcc --version # 应显示CUDA 11.8
# 4. 安装cuDNN
tar -zxvf cudnn-linux-x86_64-8.6.0.163_cuda11.x.tar.gz
cp cudnn-*-linux-x86_64/include/cudnn*.h /usr/local/cuda-11.8/include/
cp -P cudnn-*-linux-x86_64/lib/libcudnn* /usr/local/cuda-11.8/lib64/
chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
# 5. 验证cuDNN
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
3.2 搭建Python虚拟环境
bash复制# 1. 安装Miniconda
bash Miniconda3-latest-Linux-x86_64.sh -b -p /root/miniconda
source /root/miniconda/bin/activate
# 2. 创建虚拟环境
conda create -n private-ai python=3.10 -y
conda activate private-ai
# 3. 安装离线依赖
tar -zxvf offline-pip-packages.tar.gz
pip install --no-index --find-links=./offline-pip-packages/ torch torchvision torchaudio vllm transformers sentence-transformers fastapi uvicorn bitsandbytes accelerate
# 4. 验证安装
pip list | grep -E "torch|vllm|transformers|fastapi"
3.3 部署大模型服务
使用vLLM框架部署Llama 3 8B模型:
bash复制# 1. 解压模型
mkdir -p /root/models/llm
tar -zxvf llama-3-8b-bnb-4bit.tar.gz -C /root/models/llm/
# 2. 设置环境变量(禁用远程检查)
export TRANSFORMERS_OFFLINE=1
export HF_DATASETS_OFFLINE=1
# 3. 启动服务
vllm serve /root/models/llm/llama-3-8b-bnb-4bit --port 8001 --host 0.0.0.0
# 后台运行
nohup vllm serve /root/models/llm/llama-3-8b-bnb-4bit --port 8001 --host 0.0.0.0 > /root/llm-service.log 2>&1 &
验证服务:
访问 http://服务器IP:8001/docs 应该能看到Swagger接口文档。
3.4 部署Embedding模型服务
使用FastAPI封装m3e-base模型:
bash复制# 1. 解压模型
mkdir -p /root/models/embedding
tar -zxvf m3e-base.tar.gz -C /root/models/embedding/
# 2. 创建服务脚本
cat > /root/embedding_service.py << EOF
from fastapi import FastAPI
from sentence_transformers import SentenceTransformer
import uvicorn
model = SentenceTransformer("/root/models/embedding/m3e-base", local_files_only=True)
app = FastAPI(title="私有化Embedding服务")
@app.post("/get_embedding")
def get_embedding(text: str):
embedding = model.encode(text, normalize_embeddings=True).tolist()
return {"text": text, "embedding": embedding}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8002)
EOF
# 3. 启动服务
nohup python /root/embedding_service.py > /root/embedding-service.log 2>&1 &
验证服务:
访问 http://服务器IP:8002/docs 可以测试Embedding接口。
3.5 配置防火墙
开放必要的端口:
bash复制# CentOS 8
firewall-cmd --permanent --add-port=8001/tcp
firewall-cmd --permanent --add-port=8002/tcp
firewall-cmd --reload
# Ubuntu
ufw allow 8001/tcp
ufw allow 8002/tcp
ufw reload
4. 服务整合与测试
将大模型和Embedding服务结合使用:
python复制import requests
import json
# 1. 生成查询的Embedding
query = "私有化AI服务如何保障数据安全?"
embedding_response = requests.post("http://服务器IP:8002/get_embedding", json={"text": query})
query_embedding = embedding_response.json()["embedding"]
# 2. 调用大模型生成回复
llm_data = {
"model": "/root/models/llm/llama-3-8b-bnb-4bit",
"prompt": f"基于以下文本向量对应的内容,回答问题:{query}\n文本向量:{query_embedding}",
"max_tokens": 300,
"temperature": 0.6
}
llm_response = requests.post("http://服务器IP:8001/v1/completions", json=llm_data)
print("回复:", llm_response.json()["choices"][0]["text"])
5. 常见问题排查
5.1 模型加载失败
可能原因:
- 依赖包缺失
- 模型文件不完整
- 路径错误
解决方案:
- 检查并补充缺失的依赖包
- 重新下载完整的模型文件
- 确认模型路径是否正确
5.2 GPU无法识别
可能原因:
- CUDA版本与驱动不匹配
- 显存不足
- 未启用GPU加速
解决方案:
- 安装匹配的CUDA版本
- 使用量化版模型或减少batch size
- 检查CUDA环境变量配置
5.3 接口无法访问
可能原因:
- 防火墙未开放端口
- 服务未启动
- 网络不通
解决方案:
- 检查并开放相应端口
- 确认服务进程是否运行
- 检查内网连通性
6. 扩展建议
- 加入向量数据库:部署Milvus等向量数据库,提升知识库检索效率
- 服务监控:配置Prometheus+Grafana监控服务状态
- 模型升级:硬件允许时可升级到更大模型
- Web界面:开发简易前端,方便非技术人员使用
这套方案在实际部署中已经验证可行,特别适合对数据安全要求高的金融、政务等领域。我在多个项目中采用类似架构,最大的优势在于完全自主可控,不依赖任何外部服务,同时保持了较好的性能表现。
