#!/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