自定义模型部署

通过 FunModel 的自定义模型部署功能,可以将自有的或开源社区的预训练模型部署为在线API服务。本文将指导您如何选择合适的部署方案,并使用 vLLM、SGLang 或自定义镜像完成模型部署、调用及运维。

准备工作

在开始之前,请确保您已拥有一个可用的阿里云账号,并已登录到FunModel控制台

  1. 切换至新版控制台:如果当前为旧版,请单击页面右上角的 新版控制台。

  2. 完成授权:首次登录时,请根据页面指引完成 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,如 Qwen/Qwen3-0.6B。FunModel 将自动下载并挂载到 /mnt/<模型名称>

对象存储 OSS

提供 OSS 完整路径。文件将被挂载到 /mnt/<OSS Bucket 名称>/<OSS 路径>

硬盘挂载 NAS

提供 NAS 绝对路径。路径将被挂载到 /mnt/<NAS 挂载点名称>/<NAS 路径>

部署步骤

方法一:使用预置框架部署 (vLLM/SGLang)

此方法适用于大多数标准 LLM 模型,无需用户自行构建镜像,是推荐的快速部署方式。

  1. FunModel控制台,点击 自定义开发

  2. 根据您的需求选择模型环境,并填写 模型名称 模型描述

  3. 选择 模型来源,并根据模型来源说明填写相关路径信息。

  4. 选择 实例类型(弹性实例 或 常驻实例)和合适的实例规格。

    • 注意:所选的 实例规格(尤其是 GPU 显存)必须满足模型运行的要求,否则可能导致显存溢出(OOM)而部署失败。

  5. 配置 启动命令监听端口。此命令将在容器启动后执行,用以加载模型并启动推理服务。系统会根据您选择的模型来源提供一个默认的启动命令参考,您可以根据实际需求进行调整。

    • 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 官方文档
  6. 角色名称:用于访问云资源的RAM角色,需具备必要权限,建议选择AliyunFCDefaultRole

  7. 确认所有配置无误后,点击 创建模型服务

方法二:使用自定义镜像部署

当默认的运行时环境无法满足您的特定需求时,自定义镜像部署提供了最高的灵活性。推荐在以下场景中使用:

  • 需要特定版本的框架: 需要使用特定版本的推理框架(如 vLLM、SGLang),而非平台预置的版本。

  • 依赖特殊的软件包: 应用需要特定的操作系统依赖(如通过 apt 安装的库)、Python 包或特殊的环境配置。

  • 模型与代码一体化(离线部署): 您希望将模型文件直接打包进镜像,以实现离线部署或加速启动。适用于模型本身就是应用一部分的场景。

    • 示例: PaddleOCR-VL 的离线服务镜像serverless-registry.cn-hangzhou.cr.aliyuncs.com/functionai/paddlex-genai-vllm-server:20251111-offline

操作流程

  1. 准备自定义镜像

    编写 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" \
    ]
    
  2. 构建并推送镜像至阿里云 ACR

    将构建好的镜像推送到您的阿里云容器镜像服务(ACR)仓库,可参考:使用个人版实例推送拉取镜像

  3. 在 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.1v0.10.2v0.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 使用率等指标,用于评估服务性能。

常见问题与排查

  1. 部署失败

    • 检查部署日志:首先查看部署日志中的错误信息。

    • 检查模型路径:确认启动命令中引用的模型路径 (/mnt/...) 与模型来源的挂载规则是否匹配。

    • 检查实例规格:日志中若出现 OutOfMemoryError 或 OOM,通常表示实例显存不足,请尝试更换更高规格的实例。

    • 检查 RAM 权限:若出现 permission denied 或 403 Forbidden,通常是由于操作的子账号缺少 Devs 相关权限,导致服务配置无法保存。

  2. 服务启动失败

    • 检查服务日志:确认服务启动命令是否执行成功,有无报错。

    • 检查端口配置:确保启动命令中指定的端口(如 --port 9000)与控制台配置的端口一致。

    • 检查监听地址:对于自定义镜像,确保服务监听的 host 是 0.0.0.0

  3. 性能问题

    • 优化启动参数:对于多 GPU 实例,确保设置了--tensor-parallel-size以启用并行计算。

    • 升级实例规格:如果监控显示 GPU 使用率等资源已达瓶颈,可考虑升级到更高性能的实例。

    • 使用模型量化:通过模型量化技术(如 AWQ, GPTQ)可降低显存占用和计算量,此操作可能需要通过自定义镜像实现。