292 lines
7.6 KiB
Bash
292 lines
7.6 KiB
Bash
#!/bin/bash
|
|
|
|
# vLLM R9700 Container 构建和部署脚本
|
|
# 用于一键构建镜像并部署运行
|
|
|
|
set -e
|
|
|
|
# 配置变量
|
|
IMAGE_NAME="custom-vllm-r9700"
|
|
IMAGE_TAG="latest"
|
|
CONTAINER_NAME="custom-vllm-r9700"
|
|
MODEL_DIR="${MODEL_DIR:-/opt/models}"
|
|
CONFIG_FILE="${CONFIG_FILE:-/opt/model_config.yaml}"
|
|
LOCAL_MODEL_DIR="${LOCAL_MODEL_DIR:-/models}"
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 打印带颜色的消息
|
|
print_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# 显示使用帮助
|
|
show_usage() {
|
|
echo "用法:$0 [选项]"
|
|
echo ""
|
|
echo "选项:"
|
|
echo " -b, --build-only 仅构建镜像,不运行容器"
|
|
echo " -r, --rebuild 重新构建镜像(不使用缓存)"
|
|
echo " -s, --stop 仅停止并删除容器"
|
|
echo " -d, --detach 后台运行容器(默认)"
|
|
echo " -i, --interactive 交互式运行容器"
|
|
echo " -c, --config FILE 指定配置文件路径"
|
|
echo " -m, --models DIR 指定模型目录路径"
|
|
echo " -p, --port PORT 指定服务端口"
|
|
echo " -h, --help 显示此帮助信息"
|
|
echo ""
|
|
echo "示例:"
|
|
echo " $0 # 构建并运行"
|
|
echo " $0 -b # 仅构建镜像"
|
|
echo " $0 -r # 重新构建并运行"
|
|
echo " $0 -s # 停止并删除容器"
|
|
echo " $0 -p 8080 # 使用端口 8080 运行"
|
|
echo " $0 -c /path/to/config.yaml # 使用指定配置文件"
|
|
echo " $0 -m /path/to/models # 使用指定模型目录"
|
|
exit 0
|
|
}
|
|
|
|
# 解析命令行参数
|
|
BUILD_ONLY=false
|
|
REBUILD=false
|
|
STOP_ONLY=false
|
|
DETACH=true
|
|
CUSTOM_CONFIG=""
|
|
CUSTOM_MODELS=""
|
|
CUSTOM_PORT=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-b|--build-only)
|
|
BUILD_ONLY=true
|
|
shift
|
|
;;
|
|
-r|--rebuild)
|
|
REBUILD=true
|
|
shift
|
|
;;
|
|
-s|--stop)
|
|
STOP_ONLY=true
|
|
shift
|
|
;;
|
|
-d|--detach)
|
|
DETACH=true
|
|
shift
|
|
;;
|
|
-i|--interactive)
|
|
DETACH=false
|
|
shift
|
|
;;
|
|
-c|--config)
|
|
CUSTOM_CONFIG="$2"
|
|
shift 2
|
|
;;
|
|
-m|--models)
|
|
CUSTOM_MODELS="$2"
|
|
shift 2
|
|
;;
|
|
-p|--port)
|
|
CUSTOM_PORT="$2"
|
|
shift 2
|
|
;;
|
|
-h|--help)
|
|
show_usage
|
|
;;
|
|
*)
|
|
print_error "未知选项:$1"
|
|
show_usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# 停止并删除容器
|
|
stop_container() {
|
|
print_info "停止并删除容器..."
|
|
|
|
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
|
docker stop "${CONTAINER_NAME}" 2>/dev/null || true
|
|
print_success "容器已停止"
|
|
|
|
docker rm "${CONTAINER_NAME}" 2>/dev/null || true
|
|
print_success "容器已删除"
|
|
else
|
|
print_warning "容器不存在"
|
|
fi
|
|
}
|
|
|
|
# 如果只需要停止容器,直接退出
|
|
if [ "$STOP_ONLY" = true ]; then
|
|
stop_container
|
|
exit 0
|
|
fi
|
|
|
|
# 检查 Docker 是否运行
|
|
check_docker() {
|
|
if ! docker info > /dev/null 2>&1; then
|
|
print_error "Docker 未运行或无权限访问"
|
|
print_error "请确保 Docker 服务正在运行,并且当前用户有 Docker 访问权限"
|
|
exit 1
|
|
fi
|
|
print_success "Docker 检查通过"
|
|
}
|
|
|
|
# 构建镜像
|
|
build_image() {
|
|
print_info "开始构建 Docker 镜像..."
|
|
print_info "镜像名称:${IMAGE_NAME}:${IMAGE_TAG}"
|
|
|
|
BUILD_ARGS="--no-cache"
|
|
if [ "$REBUILD" = false ]; then
|
|
BUILD_ARGS=""
|
|
fi
|
|
|
|
if docker build ${BUILD_ARGS} -t "${IMAGE_NAME}:${IMAGE_TAG}" .; then
|
|
print_success "镜像构建成功"
|
|
docker images "${IMAGE_NAME}:${IMAGE_TAG}" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
|
|
else
|
|
print_error "镜像构建失败"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 运行容器
|
|
run_container() {
|
|
print_info "开始部署容器..."
|
|
|
|
# 设置卷挂载参数
|
|
VOLUME_ARGS=""
|
|
|
|
# 模型目录
|
|
if [ -n "$CUSTOM_MODELS" ]; then
|
|
MODEL_DIR="$CUSTOM_MODELS"
|
|
fi
|
|
|
|
if [ -d "$MODEL_DIR" ]; then
|
|
VOLUME_ARGS="$VOLUME_ARGS -v ${MODEL_DIR}:${LOCAL_MODEL_DIR}"
|
|
print_info "模型目录:${MODEL_DIR} -> ${LOCAL_MODEL_DIR}"
|
|
else
|
|
print_warning "模型目录不存在:${MODEL_DIR}"
|
|
print_info "创建模型目录..."
|
|
mkdir -p "$MODEL_DIR"
|
|
VOLUME_ARGS="$VOLUME_ARGS -v ${MODEL_DIR}:${LOCAL_MODEL_DIR}"
|
|
fi
|
|
|
|
# 配置文件
|
|
if [ -n "$CUSTOM_CONFIG" ]; then
|
|
CONFIG_FILE="$CUSTOM_CONFIG"
|
|
fi
|
|
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
VOLUME_ARGS="$VOLUME_ARGS -v ${CONFIG_FILE}:/etc/vllm/model_config.yaml"
|
|
print_info "配置文件:${CONFIG_FILE}"
|
|
else
|
|
print_warning "配置文件不存在:${CONFIG_FILE}"
|
|
print_info "将使用容器内默认配置"
|
|
fi
|
|
|
|
# 端口设置
|
|
PORT_ARG="-p 8000:8000"
|
|
if [ -n "$CUSTOM_PORT" ]; then
|
|
PORT_ARG="-p ${CUSTOM_PORT}:8000"
|
|
fi
|
|
|
|
# 运行模式
|
|
RUN_MODE="-d"
|
|
if [ "$DETACH" = false ]; then
|
|
RUN_MODE="-it"
|
|
fi
|
|
|
|
# 构建运行命令
|
|
print_info "启动容器..."
|
|
|
|
docker run ${RUN_MODE} \
|
|
--name "${CONTAINER_NAME}" \
|
|
--device /dev/dri \
|
|
--device /dev/kfd \
|
|
--group-add video \
|
|
--group-add render \
|
|
--security-opt seccomp=unconfined \
|
|
${VOLUME_ARGS} \
|
|
${PORT_ARG} \
|
|
-e LOCAL_MODEL_DIR="${LOCAL_MODEL_DIR}" \
|
|
"${IMAGE_NAME}:${IMAGE_TAG}"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
print_success "容器启动成功"
|
|
|
|
if [ "$DETACH" = true ]; then
|
|
echo ""
|
|
print_info "容器信息:"
|
|
echo " 容器名称:${CONTAINER_NAME}"
|
|
echo " 镜像:${IMAGE_NAME}:${IMAGE_TAG}"
|
|
echo " 状态:运行中"
|
|
echo " API 地址:http://localhost:8000"
|
|
echo ""
|
|
print_info "常用命令:"
|
|
echo " 查看日志:docker logs -f ${CONTAINER_NAME}"
|
|
echo " 停止容器:docker stop ${CONTAINER_NAME}"
|
|
echo " 启动容器:docker start ${CONTAINER_NAME}"
|
|
echo " 删除容器:docker rm -f ${CONTAINER_NAME}"
|
|
echo " 进入容器:docker exec -it ${CONTAINER_NAME} /bin/bash"
|
|
fi
|
|
else
|
|
print_error "容器启动失败"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 主流程
|
|
main() {
|
|
echo "=========================================="
|
|
echo "vLLM R9700 Container 构建和部署"
|
|
echo "=========================================="
|
|
echo "开始时间:$(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo ""
|
|
|
|
# 检查 Docker
|
|
check_docker
|
|
|
|
# 停止旧容器
|
|
stop_container
|
|
|
|
# 构建镜像
|
|
build_image
|
|
|
|
# 如果仅构建,退出
|
|
if [ "$BUILD_ONLY" = true ]; then
|
|
print_success "镜像构建完成"
|
|
print_info "运行以下命令启动容器:"
|
|
echo " $0"
|
|
exit 0
|
|
fi
|
|
|
|
# 运行容器
|
|
run_container
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
print_success "部署完成"
|
|
echo "=========================================="
|
|
echo "完成时间:$(date '+%Y-%m-%d %H:%M:%S')"
|
|
}
|
|
|
|
# 执行主流程
|
|
main
|