1、模型部署脚本:
#!/bin/bash
# 参数校验,必须传两个参数,第一个参数需要是一个目录,同时目录不为空,第二个参数是使用的GPU数量
if [ $# -ne 2 ]; then
echo "参数错误,请输入模型存放位置和需要使用的加速卡数量"
echo "Example,sh install_gpu_for_model.sh /data/DeepSeek-R1-Distill-Qwen-70B 8"
exit 1
fi
# 定义变量
MODEL_PATH="$1"
GPU_NUM=$2
MODEL_NAME=$(echo "$1" | sed 's/\/$//' | awk -F"/" '{print $NF}')
TAR_FILE="vllm0.8.5-torch2.7.0.tar"
IMAGE_NAME="vllm:0.8.5-torch2.7.0"
CONTAINER_NAME="vllm-$MODEL_NAME"
INSTALL_IP=$(hostname -I | awk '{print $1}')
CONTAINER_MODEL_PATH="/root/vllm/$MODEL_NAME"
LOCAL_LOG_DIR="/opt/gridview/vllm"
LOG_DIR="/root/vllm/logs"
LOG_FILE="$LOG_DIR/$CONTAINER_NAME-$(date +%Y%m%d_%H%M%S).log"
# 步骤 1: 检查tar包是否存在,若存在则加载镜像
# 检查tar包是否存在
if [ -f "$TAR_FILE" ]; then
echo "Tar包存在,正在检查镜像是否已存在..."
# 检查镜像是否已存在
if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_NAME$"; then
echo "镜像 $IMAGE_NAME 已经存在,跳过加载镜像。"
else
echo "镜像不存在,正在加载镜像..."
if ! docker load -i $TAR_FILE; then
echo "加载镜像失败"
exit 1
fi
fi
else
echo "Tar包文件不存在,"
# 检查镜像是否已存在
if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_NAME$"; then
echo "镜像 $IMAGE_NAME 已经存在,跳过加载镜像。"
else
echo "Tar包文件和镜像都不存在,请检查文件路径:$TAR_FILE"
exit 1
fi
fi
# 步骤 2: 判断模型文件夹是否存在
if [ ! -d "$MODEL_PATH" ]; then
echo "模型文件夹 $MODEL_PATH 不存在,请检查路径!"
exit 1
fi
# 步骤 3: 检查容器是否存在,如果存在则停止并删除容器;如果不存在则启动新容器
# 检查容器是否存在
if [ "$(docker ps -a -q -f name=$CONTAINER_NAME)" ]; then
echo "容器 $CONTAINER_NAME 已存在,正在停止并删除容器..."
docker rm -f $CONTAINER_NAME
else
echo "容器 $CONTAINER_NAME 不存在,正在创建并启动新容器..."
fi
# 启动新的容器
NV_GPU=$GPU_NUM docker run -dit \
--shm-size 100g \
--ulimit memlock=-1 \
--privileged \
--group-add video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
-v $MODEL_PATH:$CONTAINER_MODEL_PATH \
-v $LOCAL_LOG_DIR:$LOG_DIR \
-p 8015:8000 \
--name $CONTAINER_NAME \
$IMAGE_NAME \
/bin/bash
# 步骤 4: 检查容器是否存在,若不存在报错,若存在则进入容器
echo "正在检查容器 $CONTAINER_NAME 是否存在..."
if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
echo "容器 $CONTAINER_NAME 存在..."
else
echo "容器 $CONTAINER_NAME 不存在,无法进入容器。"
exit 1
fi
# 步骤 5: 容器内检查模型文件是否存在,若存在则运行模型
echo "正在检查容器内模型文件路径 $CONTAINER_MODEL_PATH..."
if docker exec $CONTAINER_NAME bash -c "[ -d \"$CONTAINER_MODEL_PATH\" ]"; then
echo "模型文件存在,正在运行模型..."
# 修改后的关键部分:激活conda环境后启动服务
if docker exec $CONTAINER_NAME bash -c "\
export VLLM_USE_V1=1 && \
export VLLM_WORKER_MULTIPROC_METHOD=spawn && \
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 && \
export VLLM_HOST_IP=$(hostname -I | awk '{print $1}') && \
export VLLM_HOST_IP && echo $VLLM_HOST_IP && \
nohup vllm serve $CONTAINER_MODEL_PATH \
--trust-remote-code \
--served-model-name $MODEL_NAME \
--gpu-memory-utilization 0.9 \
--tensor-parallel-size 8 \
--host 0.0.0.0 \
--port 8000 \
--enforce-eager \
--enable-auto-tool-choice \
--tool-call-parser llama3_json \
--enable-reasoning \
--reasoning-parser deepseek_r1 \
> $LOG_FILE 2>&1 & "; then
echo "模型启动,日志输出到路径: $LOCAL_LOG_DIR,待日志中模型启动成功后,您可以使用此地址进行调用http://$INSTALL_IP:8015/v1"
else
echo "模型启动失败"
exit 1
fi
else
echo "模型文件挂载失败,请检查容器挂载路径:$MODEL_PATH"
exit 1
fi
2、启动模型服务
sh install_gpu_for_model.sh /public/model/DeepSeek-R1-Distill-Llama-70B/ 8