知识篇 -- 【Linux】大模型部署

Ray Shine 2025/11/2 Linux大模型

大模型在Linux集群中的命令手册

# 1. 前期准备:集群节点初始化

# 1.1 设置主机名

# 节点1(主节点)
hostnamectl set-hostname llm-master-01
# 节点2(从节点)
hostnamectl set-hostname llm-worker-01
# 生效(无需重启)
bash

# 1.2 配置SSH免密登录

生成密钥对(主节点执行):

ssh-keygen -t rsa -b 4096 -C "llm-cluster"
# 按回车键默认保存到~/.ssh/id_rsa

复制密钥到所有节点:

# 复制到主节点自身
ssh-copy-id llm-master-01
# 复制到从节点(需输入密码)
ssh-copy-id llm-worker-01

验证免密登录:

ssh llm-worker-01
# 无需密码即可登录表示成功

# 1.3 时间同步(chrony)

安装 chrony

yum install -y chrony

配置时间服务器(所有节点): 编辑/etc/chrony.conf ,添加阿里云时间服务器:

server ntp.aliyun.com  iburst

启动并设置开机自启:

systemctl enable chronyd --now
# 验证时间同步状态
chronyc sources

# 1.4 关闭防火墙与SELinux

关闭firewalld:

systemctl stop firewalld
systemctl disable firewalld

临时关闭SELinux:

setenforce 0

永久关闭SELinux(需重启): 编辑/etc/selinux/config,将SELINUX=enforcing改为:

SELINUX=permissive

# 2. 环境搭建:GPU与框架配置

# 2.1 安装NVIDIA GPU驱动

# 方式1:yum安装(推荐):

# 添加NVIDIA yum源
curl -s -L https://nvidia.github.io/nvidia-driver-rpm/centos7/x86_64/nvidia-driver.repo  | sudo tee /etc/yum.repos.d/nvidia-driver.repo 
# 安装最新驱动
yum install -y nvidia-driver-latest-dkms
# 重启生效
reboot

# 方式2:run文件安装(手动指定版本):

# 下载驱动(示例:535.113.01)
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.113.01/NVIDIA-Linux-x86_64-535.113.01.run 
# 关闭图形界面(避免冲突)
init 3
# 安装(--silent表示静默安装)
sh NVIDIA-Linux-x86_64-535.113.01.run  --silent --no-nouveau-check
# 重启
reboot

验证驱动:

nvidia-smi
# 输出GPU信息表示成功

# 2.2 安装CUDA与cuDNN

# 安装CUDA 11.8(示例):

# 下载CUDA安装包
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run 
# 安装(仅安装工具包,不覆盖驱动)
sh cuda_11.8.0_520.61.05_linux.run  --silent --toolkit --override
# 配置环境变量(~/.bashrc)
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
# 生效
source ~/.bashrc

# 安装cuDNN 8.9.2(示例):

# 下载cuDNN(需NVIDIA账号)
wget https://developer.download.nvidia.com/compute/cudnn/v8.9.2/local_installers/cudnn-linux-x86_64-8.9.2.26_cuda11-archive.tar.xz 
# 解压
tar -xvf cudnn-linux-x86_64-8.9.2.26_cuda11-archive.tar.xz 
# 复制文件到CUDA目录
sudo cp cudnn-linux-x86_64-8.9.2.26_cuda11-archive/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp cudnn-linux-x86_64-8.9.2.26_cuda11-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64
# 设置权限
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

验证CUDA:

nvcc -V
# 输出CUDA版本表示成功

# 2.3 配置Python环境

# 安装Anaconda:

# 下载Anaconda(Python 3.10版本)
wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 
# 安装(默认路径~/.anaconda3)
sh Anaconda3-2023.09-0-Linux-x86_64.sh  -b
# 配置环境变量(~/.bashrc)
echo 'export PATH=~/.anaconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 创建虚拟环境:

conda create -n llm-env python=3.10 -y
conda activate llm-env

# 安装大模型框架:

# PyTorch(支持CUDA 11.8)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 
# TensorFlow(支持CUDA 11.8)
pip install tensorflow[and-cuda]
# 其他依赖
pip install transformers datasets accelerate vllm deepspeed

# 3. 模型部署:集群训练与推理

# 3.1 PyTorch Distributed 分布式训练

命令格式:

torchrun \
  --nproc_per_node=4 \  # 每个节点的GPU数
  --nnodes=2 \           # 集群节点总数
  --node_rank=0 \        # 当前节点排名(主节点为0)
  --master_addr="192.168.1.100" \  # 主节点IP
  --master_port=29500 \  # 主节点端口(需开放)
  train.py  \             # 训练脚本
  --batch_size=32 \      # 自定义参数
  --lr=1e-5

示例(2节点×4 GPU):

主节点(node_rank=0): torchrun --nproc_per_node=4 --nnodes=2 --node_rank=0 --master_addr="192.168.1.100" --master_port=29500 train.py 从节点(node_rank=1): torchrun --nproc_per_node=4 --nnodes=2 --node_rank=1 --master_addr="192.168.1.100" --master_port=29500 train.py

# 3.2 vLLM 推理部署(支持张量并行)

命令格式:

vllm serve \
  --model meta-llama/Llama-2-7b-chat-hf \  # 模型名称(Hugging Face)
  --tensor-parallel-size 4 \               # 张量并行的GPU数
  --gpu-memory-utilization 0.9 \           # GPU内存使用率(建议0.8-0.9)
  --port 8000 \                            # 推理服务端口
  --served-model-name llama-2-7b-chat      # 服务名称(可选)

示例(4 GPU张量并行):

vllm serve --model meta-llama/Llama-2-7b-chat-hf --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --port 8000

验证推理:

curl -X POST http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama-2-7b-chat",
    "messages": [{"role": "user", "content": "解释什么是大模型?"}]
  }'

# 3.3 Kubernetes 容器化部署

编写部署文件(llm-deployment.yaml ):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: llm-vllm-deployment
spec:
  replicas: 2  # 副本数(从节点数量)
  template:
    metadata:
      labels:
        app: llm-vllm
    spec:
      containers:
      - name: vllm-container
        image: llm-vllm:latest  # 自定义镜像(包含vLLM和模型)
        resources:
          limits:
            nvidia.com/gpu:  1  # 每个Pod占用1块GPU
        ports:
        - containerPort: 8000
      nodeSelector:
        node-role.kubernetes.io/worker:  "true"  # 调度到从节点
---
apiVersion: v1
kind: Service
metadata:
  name: llm-vllm-service
spec:
  type: NodePort
  ports:
  - port: 8000
    targetPort: 8000
    nodePort: 30000  # 集群外部访问端口
  selector:
    app: llm-vllm

部署到Kubernetes集群:

# 应用部署文件
kubectl apply -f llm-deployment.yaml 
# 查看Pod状态
kubectl get pods -l app=llm-vllm
# 查看Service状态(获取外部访问地址)
kubectl get service llm-vllm-service

# 4. 集群管理:监控与运维

# 4.1 Kubernetes 集群管理

查看节点状态:

kubectl get nodes
# 输出节点列表及状态(Ready表示正常)

查看Pod日志:

# 查看指定Pod的日志(实时更新)
kubectl logs -f llm-vllm-deployment-xxxx-xxxx
# 查看Pod的资源使用情况
kubectl top pod llm-vllm-deployment-xxxx-xxxx

扩容/缩容:

# 扩容到3个副本(3个从节点)
kubectl scale deployment llm-vllm-deployment --replicas=3
# 缩容到1个副本
kubectl scale deployment llm-vllm-deployment --replicas=1

# 4.2 监控:Prometheus + Grafana

安装Prometheus:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts 
helm repo update
helm install prometheus prometheus-community/prometheus

安装Grafana:

helm repo add grafana https://grafana.github.io/helm-charts 
helm install grafana grafana/grafana

访问Dashboard:

# 端口转发(Prometheus)
kubectl port-forward service/prometheus-server 9090:80
# 端口转发(Grafana)
kubectl port-forward service/grafana 3000:80
Prometheus:http://localhost:9090
Grafana:http://localhost:3000(默认账号:admin,密码:kubectl get secret grafana -o jsonpath="{.data.admin-password}"  | base64 --decode)

导入大模型监控仪表盘:

Grafana官网搜索LLM MonitoringvLLM,导入对应的仪表盘ID(如1860 for Prometheus)。

# 4.3 日志管理:ELK Stack

安装Elasticsearch:

helm repo add elastic https://helm.elastic.co 
helm install elasticsearch elastic/elasticsearch --version 8.11.1

安装Kibana:

helm install kibana elastic/kibana --version 8.11.1

收集Pod日志(Fluentd):

helm install fluentd bitnami/fluentd --set elasticsearch.hosts[0]()=elasticsearch-master:9200 

访问Kibana:

kubectl port-forward service/kibana 5601:5601
Kibana:http://localhost:5601(默认账号:elastic,密码:kubectl get secret elasticsearch-master-credentials -o jsonpath="{.data.elastic}"  | base64 --decode)

# 5. 性能优化:提升集群效率

# 5.1 混合精度训练(PyTorch)

代码中的命令:

import torch
from torch.cuda.amp  import autocast, GradScaler

# 初始化混合精度
scaler = GradScaler()

# 训练循环
for batch in dataloader:
    inputs, targets = batch
    inputs = inputs.cuda() 
    targets = targets.cuda() 
    
    # 自动混合精度(FP16)
    with autocast():
        outputs = model(inputs)
        loss = criterion(outputs, targets)
    
    # 反向传播(缩放梯度)
    scaler.scale(loss).backward() 
    scaler.step(optimizer) 
    scaler.update() 
    optimizer.zero_grad() 

# 5.2 分布式优化器(FusedAdam)

命令格式:

from torch.optim  import AdamW

# 使用FusedAdam优化器(需CUDA支持)
optimizer = AdamW(
    model.parameters(), 
    lr=1e-5,
    fused=True  # 开启融合操作(提升速度)
)

# 5.3 张量并行(PyTorch TensorParallel)

命令格式:

from torch.nn.parallel  import TensorParallel

# 加载模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf") 
# 张量并行(分配到4块GPU)
model = TensorParallel(model, device_ids=[0,1,2,3])
# 移动到GPU
model = model.cuda() 

# 6. 故障排查:常见问题解决

# 6.1 GPU故障

查看GPU状态:

nvidia-smi -l 1  # 实时监控GPU使用率

查看驱动日志:

dmesg | grep nvidia  # 查找NVIDIA驱动错误

重启GPU驱动:

sudo rmmod nvidia  # 卸载驱动模块
sudo modprobe nvidia  # 重新加载驱动模块

# 6.2 网络故障(分布式训练失败)

验证节点连通性:

ping llm-worker-01  # 主节点ping从节点

查看端口开放情况:

netstat -tuln | grep 29500  # 检查主节点端口是否开放

抓包分析网络流量:

tcpdump -i eth0 port 29500 -n  # 捕获端口29500的流量

# 6.3 进程与日志排查

查看Python进程:

ps -ef | grep python  # 查找大模型训练进程

终止异常进程:

kill -9 <pid>  # <pid>为进程ID(从ps命令输出中获取)

查看训练日志:

tail -f logs/train.log   # 实时查看日志最后10行
grep "Error" logs/train.log   # 查找日志中的错误信息

# 7. 最佳实践:安全与效率

# 7.1 容器化最佳实践

编写Dockerfile(包含vLLM与模型):

FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive

# 安装依赖
RUN apt-get update && apt-get install -y python3-pip python3-dev git

# 安装vLLM
RUN pip3 install vllm transformers

# 下载模型(示例:Llama-2-7b-chat)
RUN git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf  /models/llama-2-7b-chat-hf
RUN echo "MODEL_PATH=/models/llama-2-7b-chat-hf" >> /etc/environment

# 暴露端口
EXPOSE 8000

# 启动vLLM服务
CMD ["vllm", "serve", "--model", "/models/llama-2-7b-chat-hf", "--tensor-parallel-size", "4"]

构建镜像:

docker build -t llm-vllm:latest .

# 7.2 安全性配置

限制SSH登录权限: 编辑/etc/ssh/sshd_config

PermitRootLogin no  # 禁止root用户登录
AllowUsers llm-user  # 允许指定用户登录

重启SSH服务:

systemctl restart sshd

配置SSL证书(HTTPS): 使用Certbot获取免费SSL证书(Let's Encrypt):

yum install -y certbot python3-certbot-nginx
certbot --nginx -d llm-cluster.example.com 

# 7.3 资源调度优化(Kubernetes)

设置QoS等级(Guaranteed):

spec:
  containers:
  - name: llm-container
    image: llm-vllm:latest
    resources:
      limits:
        cpu: "8"
        memory: "64Gi"
        nvidia.com/gpu:  1
      requests:
        cpu: "8"
        memory: "64Gi"
        nvidia.com/gpu:  1
  qosClass: Guaranteed  # 保证资源分配(优先调度)

# 附录:常用命令速查

功能 命令示例 查看GPU状态

nvidia-smi

查看集群节点状态

kubectl get nodes

查看Pod日志

kubectl logs -f <pod-name>

实时监控GPU使用率

nvidia-smi -l 1

检查CUDA版本

nvcc -V

启动vLLM推理服务

vllm serve --model meta-llama/Llama-2-7b-chat-hf --tensor-parallel-size 4

分布式训练(PyTorch)

torchrun --nproc_per_node=4 --nnodes=2 --node_rank=0 --master_addr="192.168.1.100" --master_port=29500 train.py

备注:手册中的命令需根据集群环境(如节点数量、GPU数量、模型名称)调整参数。建议在测试环境中验证后再部署到生产集群。

最后更新时间: 2025/11/20 22:59:30
ON THIS PAGE