xllm 部署 VLM 模型全流程本文档介绍在昇腾 NPU(A2 / A3)环境下,使用 xllm 部署多模态 VLM 模型的完整流程:拉取镜像 → 挂载容器 → (可选)编译 → 拉起服务 → 功能 / 性能 / 精度测试。VLM 与 LLM 部署的主要差异:启动命令需增加--backendvlm,且功能/性能/精度测试使用 chat(多模态)接口与 evalscope 工具。目录1. 拉镜像与挂载2. 编译 xllm(仅 dev 镜像)3. 单机拉起服务4. 功能性测试5. 性能测试6. 精度测试占位符说明文中xxx为需替换的占位符:占位符含义docker_name容器名称(自定义)docker_tap镜像 tag,可用docker images查看xllm_pathxllm 可执行文件路径model_path模型权重路径ip服务器 IPport服务端口(自定义)model_name模型名称(用于请求体)1. 拉镜像与挂载1.1 拉取镜像# A2 arm 机器dockerpull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-20260306# A3 arm 机器dockerpull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-20260306其他特定镜像可在 Quay 自行下载。说明dev镜像不自带xllm;release镜像自带 xllm,路径为/usr/local/bin/xllm。镜像标签中hc为 A3 镜像,hb为 A2 镜像。1.2 挂载并启动容器将docker_name替换为容器名,docker_tap替换为镜像 tag:dockerrun--namedocker_name-d\--privileged\--networkhost\--ipchost\--device/dev/davinci_manager\--device/dev/devmm_svm\--device/dev/hisi_hdc\-v/export:/export\-v/usr/local/dcmi:/usr/local/dcmi\-v/usr/local/bin/npu-smi:/usr/local/bin/npu-smi\-v/usr/local/Ascend/driver:/usr/local/Ascend/driver\-v/etc/ascend_install.info:/etc/ascend_install.info\-w/export\-i-tdocker_tapbash容器启动后,可通过以下命令重新进入:dockerexec-itdocker_namebash2. 编译 xllm(仅 dev 镜像)若拉取的是dev镜像,需额外编译 xllm:gitclone https://github.com/jd-opensource/xllmcdxllm# 首次需安装 pre-commitpipinstallpre-commit pre-commitinstallgitsubmodule update--init--recursivepython setup.py build编译完成后,xllm 可执行文件路径为:当前 xllm 路径/build/xllm/core/server/xllm3. 单机拉起服务模型权重可通过 huggingface、hf-mirror、魔乐社区、魔搭社区(ModelScope)下载。3.1 准备日志目录mkdirlogs3.2 设置环境变量exportPYTHON_INCLUDE_PATH$(python3 -c from sysconfig import get_paths; print(get_paths()[include]))exportPYTHON_LIB_PATH$(python3 -c from sysconfig import get_paths; print(get_paths()[include]))exportPYTORCH_NPU_INSTALL_PATH/usr/local/libtorch_npu/exportPYTORCH_INSTALL_PATH$(python3-cimport torch, os;print(os.path.dirname(os.path.abspath(torch.__file__))))exportLIBTORCH_ROOT$(python3-cimport torch, os;print(os.path.dirname(os.path.abspath(torch.__file__))))exportLD_LIBRARY_PATH/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATHsource/usr/local/Ascend/ascend-toolkit/set_env.shsource/usr/local/Ascend/nnal/atb/set_env.shexportPYTORCH_NPU_ALLOC_CONFexpandable_segments:TrueexportNPU_MEMORY_FRACTION0.9exportATB_WORKSPACE_MEM_ALLOC_ALG_TYPE3exportATB_WORKSPACE_MEM_ALLOC_GLOBAL1exportOMP_NUM_THREADS12exportHCCL_CONNECT_TIMEOUT7200exportLD_PRELOAD/usr/lib64/libtcmalloc.so.4:$LD_PRELOADexportPROFILING_MODEdynamic# 清理历史日志与残留\rm-rf/root/atb/log/\rm-rf/root/ascend/log/\rm-rf/root/mindie/\rm-rf~/dynamic_profiling_socket_*\rm-rfcore.*3.3 启动服务先设置以下变量(按实际环境替换):变量说明XLLM_PATHxllm 路径(xllm_path)MODEL_PATH模型路径(model_path)MASTER_NODE_ADDRip:9790,服务器 IP,端口任意START_PORT起始端口port,curl 地址为ip:portSTART_DEVICE从第几张卡开始跑NNODES卡数XLLM_PATHxllm_pathMODEL_PATHmodel_pathMASTER_NODE_ADDRip:9790START_PORTportSTART_DEVICE0LOG_DIRlogsNNODES1exportHCCL_IF_BASE_PORT43739for((i0;i$NNODES;i))doPORT$((START_PORTi))DEVICE$((START_DEVICEi))LOG_FILE$LOG_DIR/node_$i.lognohupnumactl-C$((DEVICE*40))-$((DEVICE*4039))$XLLM_PATH\--model$MODEL_PATH\--port$PORT\--devicesnpu:$DEVICE\--master_node_addr$MASTER_NODE_ADDR\--nnodes$NNODES\--node_rank$i\--max_memory_utilization0.85\--block_size128\--enable_prefix_cachefalse\--enable_chunked_prefillfalse\--communication_backendhccl\--enable_schedule_overlaptrue\--enable_graphfalse\--enable_shmtrue\--enable_prefill_spfalse\--backendvlm\--max_tokens_per_batch10240\--ep_size1\--dp_size1\$LOG_FILE21done--backendvlm:VLM 模型必需,区别于 LLM 部署。--max_tokens_per_batch:输入 输出的总长度。出现SIGINT was installed with 1表示服务拉起成功。启动前务必在当前路径下mkdir logs。4. 功能性测试通过 curl 验证多模态(文本 图片)回显:curl-XPOST http://ip:port/v1/chat/completions\-HContent-Type: application/json\-d{ model: oxygen-vlm-7b, messages: [ { role: user, content: [ {type: text, text: 你好}, {type: image_url, image_url: {url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg}} ] } ] }image_url支持 base64 内联图片,也可替换为可访问的图片 URL。5. 性能测试使用 evalscope 进行多模态性能压测:evalscope perf\--model$MODEL_NAME\--url$API_URL\--apiopenai\--datasetrandom_vl\--rate25\--number25\--parallel25\--min-prompt-length9914\--max-prompt-length9914\--image-width512\--image-height512\--image-format RGB\--image-num1\--min-tokens7168\--max-tokens7168\--tokenizer-path$TOKENIZER_PATH\--seed42\--outputs-dir./out4/qwen3vl_32b\--extra-args{ignore_eos: true}参考:快速上手 · EvalScope 文档中心6. 精度测试evalscopeeval\--modelmodel_name\--api-url http://ip:port/v1\--api-key EMPTY\--eval-type openai_api\--datasetsmmmu\--limit_image_per_prompt参考:快速上手 · EvalScope 文档中心
xllm部署vlm模型全流程
发布时间:2026/7/2 11:34:57
xllm 部署 VLM 模型全流程本文档介绍在昇腾 NPU(A2 / A3)环境下,使用 xllm 部署多模态 VLM 模型的完整流程:拉取镜像 → 挂载容器 → (可选)编译 → 拉起服务 → 功能 / 性能 / 精度测试。VLM 与 LLM 部署的主要差异:启动命令需增加--backendvlm,且功能/性能/精度测试使用 chat(多模态)接口与 evalscope 工具。目录1. 拉镜像与挂载2. 编译 xllm(仅 dev 镜像)3. 单机拉起服务4. 功能性测试5. 性能测试6. 精度测试占位符说明文中xxx为需替换的占位符:占位符含义docker_name容器名称(自定义)docker_tap镜像 tag,可用docker images查看xllm_pathxllm 可执行文件路径model_path模型权重路径ip服务器 IPport服务端口(自定义)model_name模型名称(用于请求体)1. 拉镜像与挂载1.1 拉取镜像# A2 arm 机器dockerpull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-20260306# A3 arm 机器dockerpull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-20260306其他特定镜像可在 Quay 自行下载。说明dev镜像不自带xllm;release镜像自带 xllm,路径为/usr/local/bin/xllm。镜像标签中hc为 A3 镜像,hb为 A2 镜像。1.2 挂载并启动容器将docker_name替换为容器名,docker_tap替换为镜像 tag:dockerrun--namedocker_name-d\--privileged\--networkhost\--ipchost\--device/dev/davinci_manager\--device/dev/devmm_svm\--device/dev/hisi_hdc\-v/export:/export\-v/usr/local/dcmi:/usr/local/dcmi\-v/usr/local/bin/npu-smi:/usr/local/bin/npu-smi\-v/usr/local/Ascend/driver:/usr/local/Ascend/driver\-v/etc/ascend_install.info:/etc/ascend_install.info\-w/export\-i-tdocker_tapbash容器启动后,可通过以下命令重新进入:dockerexec-itdocker_namebash2. 编译 xllm(仅 dev 镜像)若拉取的是dev镜像,需额外编译 xllm:gitclone https://github.com/jd-opensource/xllmcdxllm# 首次需安装 pre-commitpipinstallpre-commit pre-commitinstallgitsubmodule update--init--recursivepython setup.py build编译完成后,xllm 可执行文件路径为:当前 xllm 路径/build/xllm/core/server/xllm3. 单机拉起服务模型权重可通过 huggingface、hf-mirror、魔乐社区、魔搭社区(ModelScope)下载。3.1 准备日志目录mkdirlogs3.2 设置环境变量exportPYTHON_INCLUDE_PATH$(python3 -c from sysconfig import get_paths; print(get_paths()[include]))exportPYTHON_LIB_PATH$(python3 -c from sysconfig import get_paths; print(get_paths()[include]))exportPYTORCH_NPU_INSTALL_PATH/usr/local/libtorch_npu/exportPYTORCH_INSTALL_PATH$(python3-cimport torch, os;print(os.path.dirname(os.path.abspath(torch.__file__))))exportLIBTORCH_ROOT$(python3-cimport torch, os;print(os.path.dirname(os.path.abspath(torch.__file__))))exportLD_LIBRARY_PATH/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATHsource/usr/local/Ascend/ascend-toolkit/set_env.shsource/usr/local/Ascend/nnal/atb/set_env.shexportPYTORCH_NPU_ALLOC_CONFexpandable_segments:TrueexportNPU_MEMORY_FRACTION0.9exportATB_WORKSPACE_MEM_ALLOC_ALG_TYPE3exportATB_WORKSPACE_MEM_ALLOC_GLOBAL1exportOMP_NUM_THREADS12exportHCCL_CONNECT_TIMEOUT7200exportLD_PRELOAD/usr/lib64/libtcmalloc.so.4:$LD_PRELOADexportPROFILING_MODEdynamic# 清理历史日志与残留\rm-rf/root/atb/log/\rm-rf/root/ascend/log/\rm-rf/root/mindie/\rm-rf~/dynamic_profiling_socket_*\rm-rfcore.*3.3 启动服务先设置以下变量(按实际环境替换):变量说明XLLM_PATHxllm 路径(xllm_path)MODEL_PATH模型路径(model_path)MASTER_NODE_ADDRip:9790,服务器 IP,端口任意START_PORT起始端口port,curl 地址为ip:portSTART_DEVICE从第几张卡开始跑NNODES卡数XLLM_PATHxllm_pathMODEL_PATHmodel_pathMASTER_NODE_ADDRip:9790START_PORTportSTART_DEVICE0LOG_DIRlogsNNODES1exportHCCL_IF_BASE_PORT43739for((i0;i$NNODES;i))doPORT$((START_PORTi))DEVICE$((START_DEVICEi))LOG_FILE$LOG_DIR/node_$i.lognohupnumactl-C$((DEVICE*40))-$((DEVICE*4039))$XLLM_PATH\--model$MODEL_PATH\--port$PORT\--devicesnpu:$DEVICE\--master_node_addr$MASTER_NODE_ADDR\--nnodes$NNODES\--node_rank$i\--max_memory_utilization0.85\--block_size128\--enable_prefix_cachefalse\--enable_chunked_prefillfalse\--communication_backendhccl\--enable_schedule_overlaptrue\--enable_graphfalse\--enable_shmtrue\--enable_prefill_spfalse\--backendvlm\--max_tokens_per_batch10240\--ep_size1\--dp_size1\$LOG_FILE21done--backendvlm:VLM 模型必需,区别于 LLM 部署。--max_tokens_per_batch:输入 输出的总长度。出现SIGINT was installed with 1表示服务拉起成功。启动前务必在当前路径下mkdir logs。4. 功能性测试通过 curl 验证多模态(文本 图片)回显:curl-XPOST http://ip:port/v1/chat/completions\-HContent-Type: application/json\-d{ model: oxygen-vlm-7b, messages: [ { role: user, content: [ {type: text, text: 你好}, {type: image_url, image_url: {url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg}} ] } ] }image_url支持 base64 内联图片,也可替换为可访问的图片 URL。5. 性能测试使用 evalscope 进行多模态性能压测:evalscope perf\--model$MODEL_NAME\--url$API_URL\--apiopenai\--datasetrandom_vl\--rate25\--number25\--parallel25\--min-prompt-length9914\--max-prompt-length9914\--image-width512\--image-height512\--image-format RGB\--image-num1\--min-tokens7168\--max-tokens7168\--tokenizer-path$TOKENIZER_PATH\--seed42\--outputs-dir./out4/qwen3vl_32b\--extra-args{ignore_eos: true}参考:快速上手 · EvalScope 文档中心6. 精度测试evalscopeeval\--modelmodel_name\--api-url http://ip:port/v1\--api-key EMPTY\--eval-type openai_api\--datasetsmmmu\--limit_image_per_prompt参考:快速上手 · EvalScope 文档中心