83d151f0148b27cdd5ee0081d35b7afd5743e46d
自定义 vLLM 容器
这是一个基于 Fedora 的 Docker/Podman 容器,专为在 AMD Radeon R9700 (gfx1201) GPU 上运行 vLLM 而设计。
特性
- 基于 Fedora 43
- 使用最新的 TheRock ROCm 7.x SDK
- 包含 PyTorch 预发布版本(ROCm 支持)
- 内置 Flash-Attention(ROCm 版本)
- 支持多种大型语言模型
- 基于配置文件的启动方式
- 仅支持本地模型(无网络下载功能)
- 多模型配置支持
- 提供标准的 OpenAI API 服务
- 智能部署(自动检测 Git 更新)
快速开始
1. 构建并运行(推荐)
# 赋予脚本执行权限
chmod +x build_and_run.sh
# 一键构建并运行
./build_and_run.sh
2. 手动构建和运行
# 构建镜像
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 /opt/models:/models \
-v /opt/model_config.yaml:/etc/vllm/model_config.yaml \
-e LOCAL_MODEL_DIR=/models \
custom-vllm-r9700:latest
构建容器
在项目目录中运行:
docker build -t custom-vllm-r9700:latest .
使用方法
使用 Docker/Podman
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
使用 Toolbx(Fedora)
toolbox create vllm-custom \
--image custom-vllm-r9700:latest \
-- --device /dev/dri --device /dev/kfd \
--group-add video --group-add render --security-opt seccomp=unconfined
toolbox enter vllm-custom
使用 Distrobox(Ubuntu)
distrobox create -n vllm-custom \
--image custom-vllm-r9700:latest \
--additional-flags "--device /dev/kfd --device /dev/dri --group-add video --group-add render --security-opt seccomp=unconfined"
distrobox enter vllm-custom
配置文件
容器使用 YAML 格式的配置文件来设置 vLLM 服务器参数。配置文件需要挂载到 /etc/vllm/model_config.yaml。项目根目录中提供了配置文件示例 model_config.yaml.example,您可以参考它来创建自己的配置文件。
配置文件示例
# model_config.yaml - 多模型配置示例
# 默认启动的模型
default: "deepseek_r1_distill_qwen_32b_awq"
# 模型配置
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
port: 2001
dtype: "float16"
quantization: "awq"
tensor_parallel_size: 1
enforce_eager: true
api_key: "sk-14b-20240101-abcdef123456"
deepseek_r1_distill_qwen_32b_awq:
path: "/models/DeepSeek-R1-Distill-Qwen-32B-AWQ"
name: "DeepSeek-R1-Distill-Qwen-32B-AWQ"
# 模型性能参数
max_model_len: 32768
gpu_memory_utilization: 0.95
enforce_eager: true
max_num_seqs: 2
max_num_batched_tokens: 1024
block_size: 16
tensor_parallel_size: 1
swap_space: 0
# 新增:采样参数默认值
sampling_defaults:
temperature: 0.6
max_tokens: 4096
top_p: 0.9
frequency_penalty: 0.0
presence_penalty: 0.0
stop:
- "用户:"
- "助手:"
- "###"
- "问题:"
- "回答:"
# 其他配置
dtype: "auto"
quantization: "awq"
port: 2001
api_key: "sk-32b-20240101-ghijk789012"
glm_4_7_flash_awq:
path: "/models/GLM-4.7-Flash-AWQ"
name: "GLM-4.7-Flash-AWQ"
# 模型性能参数
max_model_len: 32768
gpu_memory_utilization: 0.9
enforce_eager: false
max_num_seqs: 2
max_num_batched_tokens: 1024
block_size: 16
tensor_parallel_size: 1
swap_space: 0
# 新增:采样参数默认值
sampling_defaults:
temperature: 0.6
max_tokens: 4096
top_p: 0.9
frequency_penalty: 0.0
presence_penalty: 0.0
stop:
- "用户:"
- "助手:"
- "###"
- "问题:"
- "回答:"
# 其他配置
dtype: "auto"
quantization: "awq"
port: 2001
api_key: "sk-32b-20240101-ghijk789012"
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
port: 2001
dtype: "auto"
quantization: "awq"
tensor_parallel_size: 1
enforce_eager: true
api_key: "sk-glm-20240101-lmnop345678"
# 服务器通用设置
server:
host: "0.0.0.0"
log_level: "info"
# 全局管理员密钥(拥有所有模型的访问权限)
admin_key: "sk-admin-20240101-xyz789"
# 允许的请求头名称(支持多个,按顺序检查)
api_key_headers: ["Authorization", "X-API-Key", "api-key"]
# 是否允许通过查询参数传递密钥
allow_query_param: true
# 查询参数名称
api_key_param: "api_key"
配置参数说明
default:默认启动的模型名称models:模型配置列表- 每个模型包含:
path:模型路径(相对于 LOCAL_MODEL_DIR)name:模型名称max_model_len:最大模型上下文长度gpu_memory_utilization:GPU 内存利用率port:服务器端口dtype:数据类型quantization:量化方式tensor_parallel_size:张量并行度enforce_eager:是否强制使用 eager 模式max_num_seqs:最大并发请求数max_num_batched_tokens:最大批量 tokens 数block_size:块大小swap_space:交换空间大小sampling_defaults:采样参数默认值api_key:API 密钥(用于 OpenAI 兼容模式)
- 每个模型包含:
server:服务器通用设置host:服务器主机地址log_level:日志级别admin_key:全局管理员密钥api_key_headers:允许的请求头名称allow_query_param:是否允许通过查询参数传递密钥api_key_param:查询参数名称
环境变量
LOCAL_MODEL_DIR:本地模型目录路径(必须设置,默认:/models)VLLM_CONFIG_FILE:配置文件路径(默认:/etc/vllm/model_config.yaml)
启动 vLLM 服务器
使用智能部署脚本(推荐)
项目提供了 build_and_run.sh 脚本,具有智能检测和自动部署功能:
智能部署逻辑:
-
检测 Git 代码更新:
- 自动拉取远程仓库最新代码
- 比较本地和远程代码版本
- 检测本地未提交的更改
-
智能构建决策:
- ✅ 代码有更新 → 重新构建镜像
- ✅ 本地有更改 → 重新构建镜像
- ✅ 镜像不存在 → 构建镜像
- ⏭️ 代码无更新且镜像存在 → 跳过构建,直接部署
-
自动部署:
- 停止并删除旧容器
- 使用新镜像(或现有镜像)启动新容器
# 赋予执行权限
chmod +x build_and_run.sh
# 智能部署(自动检测 Git 更新)
./build_and_run.sh
# 强制重新构建(忽略 Git 状态)
./build_and_run.sh -f
# 仅停止并删除容器
./build_and_run.sh -s
# 指定端口运行
./build_and_run.sh -p 8080
# 指定配置文件和模型目录
./build_and_run.sh -c /opt/model_config.yaml -m /opt/models
# 交互式运行(前台运行)
./build_and_run.sh -i
# 指定 Git 分支
./build_and_run.sh -b master
脚本选项:
-f, --force:强制重新构建镜像(忽略 Git 状态)-s, --stop:仅停止并删除容器-d, --detach:后台运行容器(默认)-i, --interactive:交互式运行容器-c, --config FILE:指定配置文件路径-m, --models DIR:指定模型目录路径-p, --port PORT:指定服务端口-b, --branch NAME:指定 Git 分支(默认:main)-h, --help:显示帮助信息
使用场景:
- 首次部署:直接运行
./build_and_run.sh,自动构建并部署 - 日常更新:运行
./build_and_run.sh,自动检测代码更新并重新部署 - 快速重启:代码无更新时,跳过构建,直接重启容器
- 强制更新:使用
-f参数强制重新构建
手动部署
# 1. 构建镜像
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 /opt/models:/models \
-v /opt/model_config.yaml:/etc/vllm/model_config.yaml \
-e LOCAL_MODEL_DIR=/models \
custom-vllm-r9700:latest
容器内运行
进入容器后,可以使用以下命令启动 vLLM 服务器:
# 使用默认模型启动
start-vllm
# 或指定模型名称启动
start-vllm deepseek_r1_distill_qwen_14b
# 或直接指定模型路径
vllm serve /models/model-name --tensor-parallel-size 2 --max-model-len 128000
测试 API(OpenAI 兼容)
vLLM 提供与 OpenAI API 完全兼容的服务接口。
1. 使用 curl 测试
# 聊天补全接口
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-32b-20240101-ghijk789012" \
-d '{
"model": "deepseek_r1_distill_qwen_32b_awq",
"messages": [
{"role": "user", "content": "你好,请介绍一下你自己"}
],
"temperature": 0.6,
"max_tokens": 4096,
"top_p": 0.9
}'
# 文本补全接口
curl -X POST http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-32b-20240101-ghijk789012" \
-d '{
"model": "deepseek_r1_distill_qwen_32b_awq",
"prompt": "Once upon a time",
"max_tokens": 100
}'
# 列出可用模型
curl http://localhost:8000/v1/models \
-H "Authorization: Bearer sk-32b-20240101-ghijk789012"
2. 使用 Python OpenAI SDK
from openai import OpenAI
# 初始化客户端
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="sk-32b-20240101-ghijk789012"
)
# 聊天补全
response = client.chat.completions.create(
model="deepseek_r1_distill_qwen_32b_awq",
messages=[
{"role": "user", "content": "你好,请介绍一下你自己"}
],
temperature=0.6,
max_tokens=4096
)
print(response.choices[0].message.content)
# 文本补全
response = client.completions.create(
model="deepseek_r1_distill_qwen_32b_awq",
prompt="Once upon a time",
max_tokens=100
)
print(response.choices[0].text)
3. 使用其他 OpenAI 兼容工具
由于提供标准的 OpenAI API,您可以使用任何支持 OpenAI 的工具和库,例如:
- LangChain
- LlamaIndex
- AutoGen
- FastChat
- 等等
只需将 base_url 设置为 http://localhost:8000/v1,并使用配置的 API 密钥即可。
本地模型目录结构
确保本地模型目录包含以下文件之一:
config.jsonpytorch_model.binmodel.safetensors
正确的目录结构示例:
/opt/models/
├── deepseek_r1_distill_qwen_14b/
│ ├── config.json
│ └── model.safetensors
├── deepseek_r1_distill_qwen_32b_awq/
│ ├── config.json
│ └── pytorch_model.bin
├── glm_4_7_flash_awq/
│ ├── config.json
│ └── model.safetensors
└── qwen3_vl_32b_instruct_awq/
├── config.json
└── pytorch_model.bin
注意事项
- 确保您的 AMD Radeon R9700 GPU 驱动已正确安装
- 容器需要访问 GPU 设备,因此运行时需要添加
--device /dev/dri --device /dev/kfd参数 - 首次启动时,vLLM 会编译计算图,可能需要较长时间
- 如果遇到内存不足的问题,可以调整
gpu_memory_utilization参数 - API 密钥在配置文件的每个模型中单独配置,用于 OpenAI 兼容模式的认证
OpenAI API 兼容性
本容器提供的服务完全兼容 OpenAI API 标准,包括:
- 聊天补全:
/v1/chat/completions - 文本补全:
/v1/completions - 模型列表:
/v1/models - 嵌入:
/v1/embeddings(如支持)
所有端点都支持标准的 OpenAI 请求格式和参数,您可以无缝切换使用。
项目文件说明
Dockerfile- Docker 镜像构建文件README.md- 项目说明文档model_config.yaml.example- 配置文件示例(包含所有模型配置参数)build_and_run.sh- 智能部署脚本(自动检测 Git 更新)scripts/- 脚本目录start_vllm.py- vLLM 启动脚本01-rocm-envs.sh- ROCm 环境配置99-toolbox-banner.sh- Toolbox 横幅zz-venv-last.sh- 虚拟环境配置
部署说明
Docker 运行命令
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.yamlLOCAL_MODEL_DIR=/models- 指定模型目录环境变量
Description
Languages
Shell
54.2%
Dockerfile
25.2%
Python
20.6%