File size: 7,106 Bytes
399f3c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
#!/bin/bash
# GPU部署脚本 - 一键部署自适应RAG系统到Linux RTX 4090环境

set -e  # 遇到错误立即退出

echo "🚀 开始部署自适应RAG系统到GPU环境..."

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 检查是否为root用户
if [[ $EUID -eq 0 ]]; then
   echo -e "${RED}请不要使用root用户运行此脚本${NC}"
   exit 1
fi

# 检查GPU
check_gpu() {
    echo "🔍 检查GPU环境..."
    if command -v nvidia-smi &> /dev/null; then
        echo -e "${GREEN}✅ 发现NVIDIA GPU:${NC}"
        nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
    else
        echo -e "${RED}❌ 未发现NVIDIA GPU或驱动未安装${NC}"
        exit 1
    fi
}

# 检查CUDA
check_cuda() {
    echo "🔍 检查CUDA环境..."
    if command -v nvcc &> /dev/null; then
        echo -e "${GREEN}✅ CUDA版本:${NC}"
        nvcc --version | grep "release"
    else
        echo -e "${YELLOW}⚠️ CUDA未安装或未添加到PATH${NC}"
    fi
}

# 安装Docker
install_docker() {
    if ! command -v docker &> /dev/null; then
        echo "📦 安装Docker..."
        curl -fsSL https://get.docker.com -o get-docker.sh
        sudo sh get-docker.sh
        sudo usermod -aG docker $USER
        rm get-docker.sh
        echo -e "${GREEN}✅ Docker安装完成${NC}"
    else
        echo -e "${GREEN}✅ Docker已安装${NC}"
    fi
}

# 安装NVIDIA Container Toolkit
install_nvidia_docker() {
    if ! docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi &> /dev/null; then
        echo "🐳 安装NVIDIA Container Toolkit..."
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
        curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
        curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
                sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
                sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
        
        sudo apt-get update
        sudo apt-get install -y nvidia-container-toolkit
        sudo systemctl restart docker
        echo -e "${GREEN}✅ NVIDIA Container Toolkit安装完成${NC}"
    else
        echo -e "${GREEN}✅ NVIDIA Container Toolkit已配置${NC}"
    fi
}

# 创建环境配置
setup_env() {
    echo "⚙️ 配置环境变量..."
    if [ ! -f .env ]; then
        cp .env.example .env
        echo -e "${YELLOW}⚠️ 请编辑 .env 文件并设置您的API密钥${NC}"
        echo "   - TAVILY_API_KEY: 从 https://tavily.com/ 获取"
        read -p "按回车键继续..."
    fi
}

# 选择部署方式
choose_deployment() {
    echo "🎯 选择部署方式:"
    echo "1) Docker Compose部署 (推荐)"
    echo "2) 直接Python部署"
    read -p "请选择 (1-2): " choice
    
    case $choice in
        1)
            deploy_docker
            ;;
        2)
            deploy_python
            ;;
        *)
            echo -e "${RED}无效选择${NC}"
            exit 1
            ;;
    esac
}

# Docker部署
deploy_docker() {
    echo "🐳 使用Docker Compose部署..."
    
    # 安装docker-compose
    if ! command -v docker-compose &> /dev/null; then
        echo "安装Docker Compose..."
        sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
        sudo chmod +x /usr/local/bin/docker-compose
    fi
    
    # 构建并启动服务
    echo "构建镜像..."
    docker-compose -f docker-compose.gpu.yml build
    
    echo "启动服务..."
    docker-compose -f docker-compose.gpu.yml up -d
    
    echo -e "${GREEN}✅ Docker部署完成!${NC}"
    echo "访问: http://localhost:8000"
    echo "监控: http://localhost:9445 (GPU监控)"
    echo "日志: docker-compose -f docker-compose.gpu.yml logs -f"
}

# Python直接部署
deploy_python() {
    echo "🐍 使用Python直接部署..."
    
    # 检查Python
    if ! command -v python3 &> /dev/null; then
        echo "安装Python3..."
        sudo apt-get update
        sudo apt-get install -y python3 python3-pip python3-venv
    fi
    
    # 创建虚拟环境
    if [ ! -d "rag_env" ]; then
        echo "创建Python虚拟环境..."
        python3 -m venv rag_env
    fi
    
    # 激活虚拟环境并安装依赖
    source rag_env/bin/activate
    pip install --upgrade pip
    pip install -r requirements_gpu.txt
    
    # 安装Ollama
    if ! command -v ollama &> /dev/null; then
        echo "安装Ollama..."
        curl -fsSL https://ollama.ai/install.sh | sh
    fi
    
    # 启动Ollama服务
    echo "启动Ollama服务..."
    ollama serve &
    sleep 5
    
    # 下载模型
    echo "下载Mistral模型..."
    ollama pull mistral
    
    # 创建启动脚本
    cat > start_gpu.sh << 'EOF'
#!/bin/bash
export CUDA_VISIBLE_DEVICES=0
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512
export TOKENIZERS_PARALLELISM=false
source rag_env/bin/activate
python main.py
EOF
    chmod +x start_gpu.sh
    
    echo -e "${GREEN}✅ Python部署完成!${NC}"
    echo "启动命令: ./start_gpu.sh"
}

# 验证部署
verify_deployment() {
    echo "🔍 验证部署..."
    sleep 10
    
    if curl -f http://localhost:8000/health 2>/dev/null; then
        echo -e "${GREEN}✅ 服务运行正常${NC}"
    else
        echo -e "${YELLOW}⚠️ 服务可能还在启动中,请稍后检查${NC}"
    fi
    
    # 显示GPU使用情况
    echo "📊 GPU状态:"
    nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv,noheader,nounits
}

# 显示部署信息
show_info() {
    echo ""
    echo "🎉 部署完成!"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "📊 服务地址:"
    echo "   - 主服务: http://localhost:8000"
    echo "   - Ollama: http://localhost:11434"
    echo ""
    echo "🔧 常用命令:"
    echo "   - 查看日志: docker-compose -f docker-compose.gpu.yml logs -f"
    echo "   - 重启服务: docker-compose -f docker-compose.gpu.yml restart"
    echo "   - 停止服务: docker-compose -f docker-compose.gpu.yml down"
    echo "   - GPU监控: watch -n 1 nvidia-smi"
    echo ""
    echo "📚 文档位置:"
    echo "   - 部署指南: DEPLOYMENT_GUIDE.md"
    echo "   - 快速开始: QUICKSTART.md"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
}

# 主函数
main() {
    echo "🤖 自适应RAG系统 GPU部署脚本"
    echo "适用于: Linux + RTX 4090"
    echo ""
    
    check_gpu
    check_cuda
    install_docker
    install_nvidia_docker
    setup_env
    choose_deployment
    verify_deployment
    show_info
}

# 运行主函数
main "$@"

reactive