推理服务极简部署:使用专用 vLLM 镜像
简介
本文将介绍如何使用专用容器镜像来部署大型语言模型(LLM)。我们提供的推理服务专用容器镜像已经预装了 FastChat 和 vLLM,通过使用这个镜像,您可以简化部署过程,并专注于模型的服务和优化。
目前已提供的专用镜像名称:
cr.infini-ai.com/infini-ai/inference-base:v1-vllm0.4.0-torch2.1-cuda12.3-ubuntu22.04
准备工作
在开始部署之前,请确保您的 LLM 已经放置在共享高性能存储服务中。您可以在创建推理服务时添加挂载点,以便访问模型文件。
创建推理服务
访问智算云控制台的推理服务页面,可创建推理服务。
启动命令
使用专用 vLLM 镜像时,只需要在启动命令中指定模型路径,并启动 FastChat 的相应服务。
TIP
请特别注意容器的生命周期管理,在启动命令中需要有一个前台运行的主进程。如果全部使用 nohup
命令启动服务,当容器的启动命令执行完毕,平台会认为容器的主进程已经结束,导致容器陷入销毁与创建的循环。
bash
#!/bin/bash
# 设置必要的环境变量
export MODEL="/path/to/model" # 模型在您租户的共享高性能存储的路径
# 检查环境变量是否已设置
if [ -z "$MODEL" ]; then
echo "Error: MODEL must have value."
exit 1
fi
echo "Loading model (${MODEL})"
echo "Running with log ..."
# 启动 Metrics 服务,输出监控指标;端口为 2000 时,可与平台的监控功能集成
echo "Running metrics (1/4) ... (see /app/metrics.log)"
nohup python3 -m fastchat.serve.metrics --host 0.0.0.0 --port 20000 > metrics.log 2>&1 &
# 启动 controller 服务
echo "Running controller (2/4) ... (see /app/controller.log)"
nohup python3 -m fastchat.serve.controller --host 0.0.0.0 > controller.log 2>&1 &
# 启动 api_server
echo "Running api_server (3/4) ... (see /app/api_server.log)"
nohup python3 -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 8000 > api_server.log 2>&1 &
# 启动 vLLM worker
echo "Running vllm_worker (4/4) ... (see /app/vllm_worker.log)"
python3 -m fastchat.serve.vllm_worker --host 0.0.0.0 --model-path ${MODEL} 2>&1 | tee vllm_worker.log
您将可以将以上启动命令封装为一个 Shell 脚本,方便管理。
详细介绍
环境变量
MODEL
:指定要服务的模型路径。
命令选项
fastchat.serve.metrics
: 启动监控服务,监控 2000 端口。fastchat.serve.controller
:启动控制器服务,监听所有接口上的 21001 端口。fastchat.serve.vllm_worker
:启动 vLLM 工作节点服务,监听 21002 端口,使用指定的模型路径。fastchat.serve.openai_api_server
:启动 OpenAI API服务器,监听 8000 端口,并连接到控制器。
日志处理
- 使用
> log_file 2>&1 &
将标准输出和标准错误重定向到日志文件中,并在后台运行命令。这样可以记录每个服务的日志,便于调试和监控。
- 使用
通过以上步骤,您可以使用预装 FastChat 和 vLLM 的容器镜像,轻松部署和管理大型语言模型。希望这篇指南能帮助您更好地理解和应用这项技术。
参考脚本
预置镜像中打包一个 /app/entrypoint
脚本,您可以自行查看,仅供参考。
bash
#!/bin/bash
export LOGDIR="" # don't output to local file
VLLM_USE_MODELSCOPE=False # use local model path
# check envs
LOG=${LOG:-1} # LOG=1 as default
if [ -z "$MODEL" ] || [ -z "$TP" ]; then
echo "Error: MODEL and TP must have values."
exit 1
fi
echo "Load model (${MODEL}) with tp (${TP}) ..."
# build lora options
if [ -n "${LORA_MODELS}" ]; then
LORA_OPTIONS="--enable-lora --lora-modules "
IFS=',' read -ra LORA_MODELS <<< "${LORA_MODELS}"
for LORA_MODEL in "${LORA_MODELS[@]}"; do
LORA_OPTIONS+="${LORA_MODEL}=/app/model/${LORA_MODEL} "
done
fi
# load services
if [ "${LOG}" = "1" ]; then
echo "Running with log ..."
echo "Running metrics (1/4) ... (see /app/metrics.log)"
nohup python3 -m fastchat.serve.metrics \
--host 0.0.0.0 --port 20000 > metrics.log 2>&1 &
echo "Running controller (2/4) ... (see /app/controller.log)"
nohup python3 -m fastchat.serve.controller \
--host 0.0.0.0 > controller.log 2>&1 &
echo "Running api_server (3/4) ... (see /app/api_server.log)"
nohup python3 -m fastchat.serve.openai_api_server \
--host 0.0.0.0 --port 8000 > api_server.log 2>&1 &
echo "Running vllm_worker (4/4) ... (see /app/vllm_worker.log)"
python3 -m fastchat.serve.vllm_worker \
--host 0.0.0.0 \
--model-path /app/model/${MODEL} \
--trust-remote-code \
--tensor-parallel-size ${TP} \
--gpu-memory-utilization 0.95 \
--dtype auto \
${LORA_OPTIONS} 2>&1 | tee vllm_worker.log
else
echo "Running without log ..."
echo "Running metrics (1/4) ... "
nohup python3 -m fastchat.serve.metrics \
--host 0.0.0.0 --port 20000 >/dev/null 2>&1 &
echo "Running controller (2/4) ..."
nohup python3 -m fastchat.serve.controller \
--host 0.0.0.0 > /dev/null 2>&1 &
echo "Running api_server (3/4) ..."
nohup python3 -m fastchat.serve.openai_api_server \
--host 0.0.0.0 --port 8000 > /dev/null 2>&1 &
echo "Running vllm_worker (4/4) ..."
python3 -m fastchat.serve.vllm_worker \
--host 0.0.0.0 \
--model-path /app/model/${MODEL} \
--trust-remote-code \
--tensor-parallel-size ${TP} \
--gpu-memory-utilization 0.95 \
--dtype auto \
${LORA_OPTIONS} > /dev/null 2>&1
fi
参考资料
- 关于 FastChat 的详细介绍,请参考 FastChat