通过 FunModel 的自定义模型部署功能,可以将自有的或开源社区的预训练模型部署为在线API服务。本文将指导您如何选择合适的部署方案,并使用 vLLM、SGLang 或自定义镜像完成模型部署、调用及运维。
准备工作
在开始之前,请确保您已拥有一个可用的阿里云账号,并已登录到FunModel控制台。
切换至新版控制台:如果当前为旧版,请单击页面右上角的 新版控制台。
完成授权:首次登录时,请根据页面指引完成 RAM 角色授权等配置。
部署方案选择
在部署模型前,了解以下概念有助于您根据业务需求选择合适的方案。
部署模式对比:弹性实例 vs. 常驻实例
FunModel 提供两种实例类型,以适应不同负载特征的业务场景。弹性实例是按时付费的灵活模式,侧重于成本控制,常驻实例是长期预留的稳定模式,侧重于性能保障。详情可参见:实例类型和规格。
推理框架对比:vLLM vs. SGLang
FunModel 内置了 vLLM 和 SGLang 这两种主流的高性能推理框架(vLLM 和 SGLang 部署方式目前仅针对大语言模型)。
对比维度 | vLLM | SGLang | 决策建议 |
核心特点 | 通过 PagedAttention 技术实现高吞吐量、高效的显存管理。 | 专为复杂 LLM 程序设计,通过 RadixAttention 优化结构化输出和多路并行推理。 | vLLM 是通用高性能推理的优秀选择,社区活跃,支持模型广泛。 SGLang 在需要复杂提示工程、并行生成或结构化输出(如 JSON)的场景下更具优势。 |
模型兼容性 | 支持绝大多数主流的 Transformer架构模型。 | 同样支持广泛的 Transformer 模型,对特定复杂结构的兼容性可能更佳。 | 两者兼容性都很好,通常选择 vLLM 即可满足需求。若遇到 vLLM 不支持的特定模型或高级用法,可尝试 SGLang。 |
适用场景 | 文本生成、对话、摘要等通用 LLM 推理任务。 | Agent 应用、多角色对话模拟、JSON 模式输出、思维链(CoT)推理。 | - |
说明:vLLM 是通用的高性能推理方案,社区支持广泛。当需要处理复杂的提示工程或结构化输出时,SGLang 可能提供更好的支持。
模型来源说明
FunModel 支持从不同来源加载模型,模型文件最终都会被挂载到实例的 /mnt/ 目录下。
模型来源 | 模型路径说明 |
ModelScope 模型 ID | 提供模型 ID,如 |
对象存储 OSS | 提供 OSS 完整路径。文件将被挂载到 |
硬盘挂载 NAS | 提供 NAS 绝对路径。路径将被挂载到 |
部署步骤
方法一:使用预置框架部署 (vLLM/SGLang)
此方法适用于大多数标准 LLM 模型,无需用户自行构建镜像,是推荐的快速部署方式。
在FunModel控制台,点击 自定义开发。
根据您的需求选择模型环境,并填写 模型名称 和 模型描述。
选择 模型来源,并根据模型来源说明填写相关路径信息。
选择 实例类型(弹性实例 或 常驻实例)和合适的实例规格。
注意:所选的 实例规格(尤其是 GPU 显存)必须满足模型运行的要求,否则可能导致显存溢出(OOM)而部署失败。
配置 启动命令 和 监听端口。此命令将在容器启动后执行,用以加载模型并启动推理服务。系统会根据您选择的模型来源提供一个默认的启动命令参考,您可以根据实际需求进行调整。
vLLM 启动命令示例
# 部署 Qwen3-0.6B 模型 # /mnt/Qwen3-0.6B为模型在容器内的挂载路径,需与模型来源的挂载路径一致。 # --served-model-name: API调用时使用的模型名称。 # --tensor-parallel-size: 张量并行数,通常设为实例的GPU卡数。 vllm serve /mnt/Qwen3-0.6B \ --served-model-name Qwen/Qwen3-0.6B \ --port 9000 \ --trust-remote-code \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.9 \ --max-model-len 8192说明:更多启动参数请参考 vLLM 官方文档。
SGLang 启动命令示例
# 部署 Llama3-8B 模型 # --model-path: 指定模型在容器内的挂载路径。 # --host: 服务监听地址,必须设为 0.0.0.0。 # --tp-size: 张量并行大小,即张量并行数。 python3 -m sglang.launch_server \ --model-path /mnt/Llama3-8B-Instruct \ --host 0.0.0.0 \ --port 9000 \ --tp-size 1说明:更多启动参数请参考SGLang 官方文档。
角色名称:用于访问云资源的RAM角色,需具备必要权限,建议选择AliyunFCDefaultRole。
确认所有配置无误后,点击 创建模型服务。
方法二:使用自定义镜像部署
当默认的运行时环境无法满足您的特定需求时,自定义镜像部署提供了最高的灵活性。推荐在以下场景中使用:
需要特定版本的框架: 需要使用特定版本的推理框架(如 vLLM、SGLang),而非平台预置的版本。
依赖特殊的软件包: 应用需要特定的操作系统依赖(如通过
apt安装的库)、Python 包或特殊的环境配置。模型与代码一体化(离线部署): 您希望将模型文件直接打包进镜像,以实现离线部署或加速启动。适用于模型本身就是应用一部分的场景。
示例:
PaddleOCR-VL的离线服务镜像serverless-registry.cn-hangzhou.cr.aliyuncs.com/functionai/paddlex-genai-vllm-server:20251111-offline。
操作流程
准备自定义镜像
编写 Dockerfile,构建一个包含所有依赖和代码的 Docker 镜像。建议使用官方 CUDA 镜像作为基础。以下为一个示例的Dockerfile文件:
# 1. 基础镜像 # 选择与 vLLM 兼容的 CUDA 12.1 镜像。'devel' 版本包含了构建工具,对于某些需要即时编译的模型很友好。 FROM nvidia/cuda:12.1.1-devel-ubuntu22.04 # 2. 设置环境变量 # - 避免 apt-get 在构建时进行交互式提问 # - 设置时区,方便查看日志 ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai # 3. 安装系统依赖 # - 一次性运行 apt-get update, install 并清理缓存,减小镜像层大小 # - 安装 python3, pip,以及 git (某些模型可能需要从 huggingface clone) 和 build-essential (编译依赖) RUN apt-get update && \ apt-get install -y --no-install-recommends \ python3.10 \ python3-pip \ git \ build-essential \ && rm -rf /var/lib/apt/lists/* # 4. 设置工作目录 WORKDIR /app # 5. 安装 Python 依赖 # - 升级 pip # - 使用 --no-cache-dir 避免缓存,减小镜像大小 # - 不指定 vllm 版本号,默认安装 PyPI 上的最新稳定版 # - 同时安装 transformers,因为 vLLM 经常需要它来处理 tokenizer RUN pip3 install --no-cache-dir --upgrade pip && \ pip3 install --no-cache-dir \ vllm \ transformers # 6. 暴露服务端口 # vLLM 新的 OpenAI 兼容服务默认端口是 8000 EXPOSE 8000 # 7. 定义容器启动命令 # - 使用 `python -m vllm.entrypoints.openai.api_server` 作为新的标准启动方式 # - 将模型路径、host、port 等作为参数传入 # - `--model` 参数指向你将要挂载的模型目录 CMD [ \ "python3", \ "-m", "vllm.entrypoints.openai.api_server", \ "--host", "0.0.0.0", \ "--port", "8000", \ "--model", "/data/models/your-model-name", \ "--trust-remote-code" \ ]构建并推送镜像至阿里云 ACR
将构建好的镜像推送到您的阿里云容器镜像服务(ACR)仓库,可参考:使用个人版实例推送拉取镜像。
在 FunModel 中部署
在创建模型服务时,模型环境 选择 自定义环境。
容器镜像填写您的 ACR 镜像,例如 :
serverless-registry.cn-hangzhou.cr.aliyuncs.com/functionai/vllm-openai:v0.11.0。根据模型来源说明填写模型来源及相关路径信息。例如:选择模型来源为对象存储OSS,填写您提前在OSS上准备的模型。
选择弹性实例或者常驻实例。
配置 启动命令 和 监听端口。例如:
vllm serve /mnt/fun-model-test/Qwen/Qwen3-0.6B --served-model-name Qwen/Qwen3-0.6B --port 9000 --trust-remote-code,参数说明同方法一:使用预置框架部署 (vLLM/SGLang)。如果 Dockerfile 中已包含CMD或ENTRYPOINT,此项可留空。说明无论是在
Dockerfile还是在控制台的 启动命令 中,您的服务监听地址host必须设置为0.0.0.0。
点击 创建模型服务 ,等待模型服务启动完成。
使用DevPod开发自定义镜像
如果模型无法通过命令行直接运行,建议使用自定义镜像启动 DevPod,在其中完成模型的开发与调试,最终将调试好的环境打包为镜像以完成部署。具体流程请参考:最佳实践:使用 DevPod 搭建 DeepSeek-OCR 开发环境。
官方预置镜像
如需在官方环境基础上微调,可使用 FunModel 预置镜像作为基础镜像:
国内地域:
serverless-registry.cn-hangzhou.cr.aliyuncs.com/functionai/vllm-openai:<tag>海外地域:
serverless-registry.ap-southeast-1.cr.aliyuncs.com/functionai/vllm-openai:<tag>
可用 <tag> 包括 v0.10.1、v0.10.2和v0.11.0 。为确保使用最新的环境,推荐您查阅以下链接获取完整的镜像版本列表:FunModel 预置镜像列表。
服务运维
服务部署成功后,您可以进行服务调用、监控和问题排查。
服务调用
在服务详情页的中获取访问地址和认证 Token。vLLM 和 SGLang 部署的服务通常兼容 OpenAI API 格式。
cURL 调用示例
# 请将 <YOUR_ENDPOINT> 和 <YOUR_TOKEN> 替换为您的实际信息
ENDPOINT_URL="<YOUR_ENDPOINT>"
TOKEN="<YOUR_TOKEN>"
curl $ENDPOINT_URL/v1/chat/completions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-0.6B",
"messages": [
{"role": "user", "content": "你好"}
],
"stream": false
}'
Python SDK调用示例
import requests
import json
# 请将 <YOUR_ENDPOINT> 和 <YOUR_TOKEN> 替换为您的实际信息
ENDPOINT_URL = "<YOUR_ENDPOINT>/v1/chat/completions"
TOKEN = "<YOUR_TOKEN>"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
data = {
"model": "Qwen3-0.6B", # 此处 model 名称需与启动命令中 --served-model-name 一致
"messages": [
{"role": "user", "content": "你好,请介绍一下你自己"}
],
"stream": False
}
response = requests.post(ENDPOINT_URL, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print(response.json())
else:
print(f"Error: {response.status_code}, {response.text}")
日志与监控
:记录服务部署过程中的关键步骤,包括模型下载、镜像拉取、实例启动以及加载模型等,是排查部署失败的核心依据。
日志:记录服务启动后运行期间的请求处理和错误信息,用于排查调用异常。
监控:查看 QPS、延迟、GPU 使用率等指标,用于评估服务性能。
常见问题与排查
部署失败
检查部署日志:首先查看部署日志中的错误信息。
检查模型路径:确认启动命令中引用的模型路径 (
/mnt/...) 与模型来源的挂载规则是否匹配。检查实例规格:日志中若出现
OutOfMemoryError或OOM,通常表示实例显存不足,请尝试更换更高规格的实例。检查 RAM 权限:若出现
permission denied或403 Forbidden,通常是由于操作的子账号缺少 Devs 相关权限,导致服务配置无法保存。
服务启动失败
检查服务日志:确认服务启动命令是否执行成功,有无报错。
检查端口配置:确保启动命令中指定的端口(如
--port 9000)与控制台配置的端口一致。检查监听地址:对于自定义镜像,确保服务监听的 host 是
0.0.0.0。
性能问题
优化启动参数:对于多 GPU 实例,确保设置了
--tensor-parallel-size以启用并行计算。升级实例规格:如果监控显示 GPU 使用率等资源已达瓶颈,可考虑升级到更高性能的实例。
使用模型量化:通过模型量化技术(如 AWQ, GPTQ)可降低显存占用和计算量,此操作可能需要通过自定义镜像实现。