From 65ccd278c9b518c06019e19fdc9565f087802a8d Mon Sep 17 00:00:00 2001 From: SZCJW <792430652@qq.com> Date: Tue, 10 Mar 2026 23:57:37 +0800 Subject: [PATCH] x --- Dockerfile | 24 +--- README.md | 57 +++++++--- build_and_run.sh | 25 +++-- params_config.yaml | 269 --------------------------------------------- 4 files changed, 63 insertions(+), 312 deletions(-) delete mode 100644 params_config.yaml diff --git a/Dockerfile b/Dockerfile index 1d94a13..9fe662a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ ARG ROCM_MAJOR_VER=7 ARG GFX=gfx120X-all RUN set -euo pipefail; \ BASE="https://therock-nightly-tarball.s3.amazonaws.com"; \ - PREFIX="therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}"; \ + PREFIX="therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}-${ROCM_MAJOR_VER}"; \ KEY="$(curl -s "${BASE}?list-type=2&prefix=${PREFIX}" \ | tr '<' '\n' \ | grep -o "therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}\..*\.tar\.gz" \ @@ -80,7 +80,7 @@ RUN echo "import sys, re" > patch_vllm.py && \ echo "p = Path('vllm/platforms/__init__.py')" >> patch_vllm.py && \ echo "txt = p.read_text()" >> patch_vllm.py && \ echo "txt = txt.replace('import amdsmi', '# import amdsmi')" >> patch_vllm.py && \ - echo "txt = re.sub(r'is_rocm = .*', 'is_rocm = True', txt)" >> patch_vllm.py && \ + echo "txt = re.sub(r'import is_rocm = .*', 'is_rocm = True', txt)" >> patch_vllm.py && \ echo "txt = re.sub(r'if len\(amdsmi\.amdsmi_get_processor_handles\(\)\) > 0:', 'if True:', txt)" >> patch_vllm.py && \ echo "txt = txt.replace('amdsmi.amdsmi_init()', 'pass')" >> patch_vllm.py && \ echo "txt = txt.replace('amdsmi.amdsmi_shut_down()', 'pass')" >> patch_vllm.py && \ @@ -145,21 +145,9 @@ RUN chmod -R a+rwX /opt && \ rm -rf /root/.cache/pip || true && \ dnf clean all && rm -rf /var/cache/dnf/* -# Create vLLM configuration directory -RUN mkdir -p /etc/vllm - -# Create default YAML configuration file -RUN printf '# model_config.yaml - 多模型配置\n# 默认启动的模型\ndefault: "deepseek_r1_distill_qwen_32b_awq"\n\n# 模型配置\nmodels:\n deepseek_r1_distill_qwen_14b:\n path: "/app/vllm/models/DeepSeek-R1-Distill-Qwen-14B"\n name: "DeepSeek-R1-Distill-Qwen-14B"\n max_model_len: 8192\n gpu_memory_utilization: 0.9\n port: 2001\n dtype: "float16"\n quantization: "awq"\n tensor_parallel_size: 1\n enforce_eager: true\n api_key: "sk-14b-20240101-abcdef123456"\n \n deepseek_r1_distill_qwen_32b_awq:\n path: "/app/vllm/models/DeepSeek-R1-Distill-Qwen-32B-AWQ"\n name: "DeepSeek-R1-Distill-Qwen-32B-AWQ"\n \n # 模型性能参数\n max_model_len: 32768\n gpu_memory_utilization: 0.95\n enforce_eager: true\n max_num_seqs: 2\n max_num_batched_tokens: 1024\n block_size: 16\n tensor_parallel_size: 1\n swap_space: 0\n \n # 新增:采样参数默认值\n sampling_defaults:\n temperature: 0.6\n max_tokens: 4096\n top_p: 0.9\n frequency_penalty: 0.0\n presence_penalty: 0.0\n stop:\n - "用户:" - - "助手:" - - "###" - - "问题:" - - "回答:" - \n # 其他配置\n dtype: "auto"\n quantization: "awq"\n port: 2001\n api_key: "sk-32b-20240101-ghijk789012"\n \n glm_4_7_flash_awq:\n path: "/app/vllm/models/GLM-4.7-Flash-AWQ"\n name: "GLM-4.7-Flash-AWQ"\n \n # 模型性能参数\n max_model_len: 32768\n gpu_memory_utilization: 0.9\n enforce_eager: false\n max_num_seqs: 2\n max_num_batched_tokens: 1024\n block_size: 16\n tensor_parallel_size: 1\n swap_space: 0\n \n # 新增:采样参数默认值\n sampling_defaults:\n temperature: 0.6\n max_tokens: 4096\n top_p: 0.9\n frequency_penalty: 0.0\n presence_penalty: 0.0\n stop:\n - "用户:" - - "助手:" - - "###" - - "问题:" - - "回答:" - \n # 其他配置\n dtype: "auto"\n quantization: "awq"\n port: 2001\n api_key: "sk-32b-20240101-ghijk789012"\n \n qwen3_vl_32b_instruct_awq:\n path: "/app/vllm/models/Qwen3-VL-32B-Instruct-AWQ"\n name: "Qwen3-VL-32B-Instruct-AWQ"\n max_model_len: 32768\n gpu_memory_utilization: 0.7\n port: 2001\n dtype: "auto"\n quantization: "awq"\n tensor_parallel_size: 1\n enforce_eager: true\n api_key: "sk-glm-20240101-lmnop345678"\n\n# 服务器通用设置\nserver:\n host: "0.0.0.0"\n log_level: "info"\n # 全局管理员密钥(拥有所有模型的访问权限)\n admin_key: "sk-admin-20240101-xyz789"\n # 允许的请求头名称(支持多个,按顺序检查)\n api_key_headers: ["Authorization", "X-API-Key", "api-key"]\n # 是否允许通过查询参数传递密钥\n allow_query_param: true\n # 查询参数名称\n api_key_param: "api_key"' > /etc/vllm/model_config.yaml +# Create vLLM configuration directory and model directory +RUN mkdir -p /etc/vllm && \ + mkdir -p /model # Copy necessary scripts COPY scripts/01-rocm-envs.sh /etc/profile.d/01-rocm-envs.sh @@ -169,4 +157,4 @@ COPY scripts/start_vllm.py /usr/local/bin/start-vllm RUN chmod 0644 /etc/profile.d/*.sh && chmod +x /usr/local/bin/start-vllm RUN printf 'ulimit -S -c 0\n' > /etc/profile.d/90-nocoredump.sh && chmod 0644 /etc/profile.d/90-nocoredump.sh -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] diff --git a/README.md b/README.md index cff7e19..f5aadb2 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ docker build -t custom-vllm-r9700:latest . # 运行容器 docker run -it --device /dev/dri --device /dev/kfd \ --group-add video --group-add render --security-opt seccomp=unconfined \ - -v /path/to/models:/models \ - -v /path/to/model_config.yaml:/etc/vllm/model_config.yaml \ + -v /opt/models:/models \ + -v /opt/model_config.yaml:/etc/vllm/model_config.yaml \ -e LOCAL_MODEL_DIR=/models \ custom-vllm-r9700:latest ``` @@ -57,8 +57,8 @@ docker build -t custom-vllm-r9700:latest . ```bash docker run -it --device /dev/dri --device /dev/kfd \ --group-add video --group-add render --security-opt seccomp=unconfined \ - -v /path/to/models:/models \ - -v /path/to/model_config.yaml:/etc/vllm/model_config.yaml \ + -v /opt/models:/models \ + -v /opt/model_config.yaml:/etc/vllm/model_config.yaml \ -e LOCAL_MODEL_DIR=/models \ custom-vllm-r9700:latest ``` @@ -86,7 +86,7 @@ distrobox enter vllm-custom ## 配置文件 -容器使用 YAML 格式的配置文件来设置 vLLM 服务器参数。默认配置文件位于 `/etc/vllm/model_config.yaml`。项目根目录中提供了配置文件示例 `model_config.yaml.example`,您可以参考它来创建自己的配置文件。 +容器使用 YAML 格式的配置文件来设置 vLLM 服务器参数。配置文件需要挂载到 `/etc/vllm/model_config.yaml`。项目根目录中提供了配置文件示例 `model_config.yaml.example`,您可以参考它来创建自己的配置文件。 ### 配置文件示例 @@ -98,7 +98,7 @@ default: "deepseek_r1_distill_qwen_32b_awq" # 模型配置 models: deepseek_r1_distill_qwen_14b: - path: "/app/vllm/models/DeepSeek-R1-Distill-Qwen-14B" + path: "/models/DeepSeek-R1-Distill-Qwen-14B" name: "DeepSeek-R1-Distill-Qwen-14B" max_model_len: 8192 gpu_memory_utilization: 0.9 @@ -110,7 +110,7 @@ models: api_key: "sk-14b-20240101-abcdef123456" deepseek_r1_distill_qwen_32b_awq: - path: "/app/vllm/models/DeepSeek-R1-Distill-Qwen-32B-AWQ" + path: "/models/DeepSeek-R1-Distill-Qwen-32B-AWQ" name: "DeepSeek-R1-Distill-Qwen-32B-AWQ" # 模型性能参数 @@ -144,7 +144,7 @@ models: api_key: "sk-32b-20240101-ghijk789012" glm_4_7_flash_awq: - path: "/app/vllm/models/GLM-4.7-Flash-AWQ" + path: "/models/GLM-4.7-Flash-AWQ" name: "GLM-4.7-Flash-AWQ" # 模型性能参数 @@ -178,7 +178,7 @@ models: api_key: "sk-32b-20240101-ghijk789012" qwen3_vl_32b_instruct_awq: - path: "/app/vllm/models/Qwen3-VL-32B-Instruct-AWQ" + path: "/models/Qwen3-VL-32B-Instruct-AWQ" name: "Qwen3-VL-32B-Instruct-AWQ" max_model_len: 32768 gpu_memory_utilization: 0.7 @@ -208,7 +208,7 @@ server: - `default`:默认启动的模型名称 - `models`:模型配置列表 - 每个模型包含: - - `path`:模型路径 + - `path`:模型路径(相对于 LOCAL_MODEL_DIR) - `name`:模型名称 - `max_model_len`:最大模型上下文长度 - `gpu_memory_utilization`:GPU 内存利用率 @@ -233,7 +233,7 @@ server: ## 环境变量 -- `LOCAL_MODEL_DIR`:本地模型目录路径(必须设置) +- `LOCAL_MODEL_DIR`:本地模型目录路径(必须设置,默认:/models) - `VLLM_CONFIG_FILE`:配置文件路径(默认:/etc/vllm/model_config.yaml) ## 启动 vLLM 服务器 @@ -276,7 +276,7 @@ chmod +x build_and_run.sh ./build_and_run.sh -p 8080 # 指定配置文件和模型目录 -./build_and_run.sh -c /path/to/config.yaml -m /path/to/models +./build_and_run.sh -c /opt/model_config.yaml -m /opt/models # 交互式运行(前台运行) ./build_and_run.sh -i @@ -313,8 +313,8 @@ docker build -t custom-vllm-r9700:latest . # 2. 运行容器 docker run -it --device /dev/dri --device /dev/kfd \ --group-add video --group-add render --security-opt seccomp=unconfined \ - -v /path/to/models:/models \ - -v /path/to/model_config.yaml:/etc/vllm/model_config.yaml \ + -v /opt/models:/models \ + -v /opt/model_config.yaml:/etc/vllm/model_config.yaml \ -e LOCAL_MODEL_DIR=/models \ custom-vllm-r9700:latest ``` @@ -425,7 +425,7 @@ print(response.choices[0].text) 正确的目录结构示例: ``` -/models/ +/opt/models/ ├── deepseek_r1_distill_qwen_14b/ │ ├── config.json │ └── model.safetensors @@ -463,7 +463,28 @@ print(response.choices[0].text) - `Dockerfile` - Docker 镜像构建文件 - `README.md` - 项目说明文档 -- `model_config.yaml.example` - 配置文件示例 -- `params_config.yaml` - 参数配置文件(定义各类参数的类型和验证规则) +- `model_config.yaml.example` - 配置文件示例(包含所有模型配置参数) - `build_and_run.sh` - 智能部署脚本(自动检测 Git 更新) -- `scripts/start_vllm.py` - vLLM 启动脚本 +- `scripts/` - 脚本目录 + - `start_vllm.py` - vLLM 启动脚本 + - `01-rocm-envs.sh` - ROCm 环境配置 + - `99-toolbox-banner.sh` - Toolbox 横幅 + - `zz-venv-last.sh` - 虚拟环境配置 + +## 部署说明 + +### Docker 运行命令 + +```bash +docker run -it --device /dev/dri --device /dev/kfd \ + --group-add video --group-add render --security-opt seccomp=unconfined \ + -v /opt/models:/models \ + -v /opt/model_config.yaml:/etc/vllm/model_config.yaml \ + -e LOCAL_MODEL_DIR=/models \ + custom-vllm-r9700:latest +``` + +**挂载说明:** +- `/opt/models` - 本地模型目录,挂载到容器的 `/models` +- `/opt/model_config.yaml` - 本地配置文件,挂载到容器的 `/etc/vllm/model_config.yaml` +- `LOCAL_MODEL_DIR=/models` - 指定模型目录环境变量 diff --git a/build_and_run.sh b/build_and_run.sh index 6c1a0b0..d7acad9 100644 --- a/build_and_run.sh +++ b/build_and_run.sh @@ -5,15 +5,26 @@ set -e -# 配置变量 +# ============== 配置变量(可修改) ============== +# 项目目录 +PROJECT_DIR="/opt/project/vllm-r9700-container" + +# 挂载配置 +MODEL_DIR="${MODEL_DIR:-/opt/model}" # 本地模型目录(独立于项目目录) +CONFIG_FILE="${CONFIG_FILE:-${PROJECT_DIR}/model_config.yaml}" # 本地配置文件(项目根目录下) + +# 容器内配置 +LOCAL_MODEL_DIR="${LOCAL_MODEL_DIR:-/model}" # 容器内模型目录(与 Dockerfile 保持一致) +CONFIG_FILE_IN_CONTAINER="/etc/vllm/model_config.yaml" # 容器内配置文件路径 + +# Docker 镜像配置 IMAGE_NAME="custom-vllm-r9700" IMAGE_TAG="latest" CONTAINER_NAME="custom-vllm-r9700" -PROJECT_DIR="/opt/project/vllm-r9700-container" -MODEL_DIR="${MODEL_DIR:-/opt/models}" -CONFIG_FILE="${CONFIG_FILE:-/opt/model_config.yaml}" -LOCAL_MODEL_DIR="${LOCAL_MODEL_DIR:-/models}" + +# Git 配置 GIT_BRANCH="${GIT_BRANCH:-main}" +# ================================================ # 颜色定义 RED='\033[0;31m' @@ -286,8 +297,8 @@ run_container() { fi if [ -f "$CONFIG_FILE" ]; then - VOLUME_ARGS="$VOLUME_ARGS -v ${CONFIG_FILE}:/etc/vllm/model_config.yaml" - print_info "配置文件:${CONFIG_FILE}" + VOLUME_ARGS="$VOLUME_ARGS -v ${CONFIG_FILE}:${CONFIG_FILE_IN_CONTAINER}" + print_info "配置文件:${CONFIG_FILE} -> ${CONFIG_FILE_IN_CONTAINER}" else print_warning "配置文件不存在:${CONFIG_FILE}" print_info "将使用容器内默认配置" diff --git a/params_config.yaml b/params_config.yaml deleted file mode 100644 index fd3da40..0000000 --- a/params_config.yaml +++ /dev/null @@ -1,269 +0,0 @@ -# vLLM 参数配置文件 -# 用于定义和识别 vLLM 服务器的各类参数 - -# 模型参数配置 -model_params: - # 必需参数 - required: - - path # 模型路径 - - # 可选参数 - optional: - - name # 模型名称 - - dtype # 数据类型 (auto, float16, float32, bfloat16) - - quantization # 量化方式 (awq, gptq, squeezellm) - - trust_remote # 是否信任远程代码 - -# 性能参数配置 -performance_params: - # GPU 相关 - gpu: - - tensor_parallel_size # 张量并行度 - - pipeline_parallel_size # 流水线并行度 - - gpu_memory_utilization # GPU 内存利用率 (0.0-1.0) - - swap_space # CPU 交换空间大小 (GB) - - max_num_batched_tokens # 最大批量 tokens 数 - - max_num_seqs # 最大并发请求数 - - num_scheduler_steps # 调度器步数 - - # 内存管理 - memory: - - block_size # 块大小 (8, 16, 32) - - max_model_len # 最大模型上下文长度 - - max_logprobs # 最大 logprobs 数 - - disable_sliding_window # 禁用滑动窗口 - -# 服务参数配置 -server_params: - # 网络配置 - network: - - host # 服务器主机地址 - - port # 服务器端口 - - ssl_keyfile # SSL 密钥文件 - - ssl_certfile # SSL 证书文件 - - ssl_ca_certs # SSL CA 证书 - - ssl_keyfile_password # SSL 密钥密码 - - # API 配置 - api: - - api_key # API 密钥 - - allowed_origins # 允许的源 - - timeout_keep_alive # 保持连接超时时间 - -# 采样参数配置 -sampling_params: - # 温度控制 - - temperature # 温度 (0.0-2.0) - - top_p # 核采样参数 (0.0-1.0) - - top_k # Top-K 采样 - - min_p # 最小概率 - - # 惩罚参数 - - frequency_penalty # 频率惩罚 (-2.0 到 2.0) - - presence_penalty # 存在惩罚 (-2.0 到 2.0) - - repetition_penalty # 重复惩罚 - - # 生成长度 - - max_tokens # 最大生成 tokens 数 - - min_tokens # 最小生成 tokens 数 - - stop # 停止词列表 - - stop_token_ids # 停止 token IDs - - # 其他采样选项 - - seed # 随机种子 - - use_beam_search # 使用束搜索 - - best_of # 束搜索的最佳候选数 - - length_penalty # 长度惩罚 - - early_stopping # 早期停止 - - ignore_eos # 忽略 EOS token - - skip_special_tokens # 跳过特殊 tokens - - spaces_between_special_tokens # 特殊 tokens 之间的空格 - -# 日志参数配置 -logging_params: - - log_level # 日志级别 (debug, info, warning, error) - - log_requests # 是否记录请求 - - log_responses # 是否记录响应 - -# 高级参数配置 -advanced_params: - # 执行模式 - - enforce_eager # 强制使用 eager 模式 - - cuda_graphs # CUDA 图 - - use_v2_block_manager # 使用 V2 块管理器 - - # 注意力后端 - - use_rocm_attn # 使用 ROCm 注意力后端 - - attention_backend # 注意力后端类型 - - # 分布式 - - distributed_executor_backend # 分布式执行器后端 - - ray_workers_use_nsight # Ray workers 使用 nsight - - # 其他 - - load_format # 加载格式 - - download_dir # 下载目录 - - revision # 模型版本 - - code_revision # 代码版本 - - tokenizer_revision # tokenizer 版本 - -# 参数类型映射 -param_types: - # 整数类型 - integer: - - tensor_parallel_size - - pipeline_parallel_size - - max_num_batched_tokens - - max_num_seqs - - block_size - - max_model_len - - max_tokens - - min_tokens - - top_k - - best_of - - seed - - num_scheduler_steps - - max_logprobs - - swap_space - - timeout_keep_alive - - # 浮点数类型 - float: - - gpu_memory_utilization - - temperature - - top_p - - min_p - - frequency_penalty - - presence_penalty - - repetition_penalty - - length_penalty - - # 布尔类型 - boolean: - - trust_remote - - enforce_eager - - use_rocm_attn - - use_beam_search - - early_stopping - - ignore_eos - - skip_special_tokens - - spaces_between_special_tokens - - log_requests - - log_responses - - disable_sliding_window - - use_v2_block_manager - - # 字符串类型 - string: - - path - - name - - dtype - - quantization - - host - - port - - api_key - - ssl_keyfile - - ssl_certfile - - ssl_ca_certs - - ssl_keyfile_password - - log_level - - attention_backend - - load_format - - download_dir - - revision - - code_revision - - tokenizer_revision - - # 列表类型 - list: - - stop - - stop_token_ids - - allowed_origins - -# 参数默认值 -param_defaults: - host: "0.0.0.0" - port: 8000 - dtype: "auto" - gpu_memory_utilization: 0.9 - max_model_len: 8192 - tensor_parallel_size: 1 - max_num_seqs: 256 - block_size: 16 - temperature: 0.7 - top_p: 0.9 - max_tokens: 256 - enforce_eager: false - trust_remote: false - log_level: "info" - -# 参数验证规则 -param_validation: - gpu_memory_utilization: - min: 0.0 - max: 1.0 - - temperature: - min: 0.0 - max: 2.0 - - top_p: - min: 0.0 - max: 1.0 - - min_p: - min: 0.0 - max: 1.0 - - frequency_penalty: - min: -2.0 - max: 2.0 - - presence_penalty: - min: -2.0 - max: 2.0 - - tensor_parallel_size: - min: 1 - max: 8 - - block_size: - allowed_values: [8, 16, 32] - -# 参数分组(用于配置文件组织) -param_groups: - basic: - name: "基础配置" - params: - - path - - name - - port - - api_key - - performance: - name: "性能配置" - params: - - tensor_parallel_size - - gpu_memory_utilization - - max_model_len - - max_num_seqs - - block_size - - sampling: - name: "采样配置" - params: - - temperature - - top_p - - max_tokens - - frequency_penalty - - presence_penalty - - stop - - advanced: - name: "高级配置" - params: - - dtype - - quantization - - enforce_eager - - trust_remote - - swap_space