通过EAS部署大语言模型

手动部署大语言模型涉及复杂的环境配置、性能调优和成本管理。EAS提供了一站式LLM部署解决方案,支持DeepSeek、Qwen等热门模型一键部署。

步骤一:部署LLM服务

以部署公共模型中的Qwen3-8B为例。

说明

公共模型是指已预置部署模板的模型,可一键部署,无需准备模型文件。如选择自定义模型,需通过对象存储OSS等方式挂载模型文件。

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 推理服务页签,单击部署服务,然后在场景化模型部署区域,单击LLM大语言模型部署

  3. 部署LLM大语言模型页面,配置以下关键参数。

    • 模型配置:选择公共模型,在列表中搜索并选择Qwen3-8B

    • 推理引擎:推荐使用SGLang/vLLM(高度兼容OpenAI API标准)。本文以vLLM为例,更多说明,请参见选择合适的推理引擎

    • 部署模板:选择单机。系统将根据模板自动填充推荐的实例规格、镜像等参数。

  4. 单击部署,服务部署耗时约5分钟。当服务状态变为运行中,表示部署成功。

    说明

    若服务部署失败,请参考服务状态异常解决。

步骤二:在线调试

部署成功后,建议先通过在线调试验证服务正常运行。单击目标服务名称进入详情页面,切换到在线调试页签,如下构造并发送请求。

  1. 选择POST方法。

  2. 在自动填充的URL末尾,追加路径/v1/chat/completions

  3. 确保请求头(Headers)中包含Content-Type: application/json

  4. 填入请求体(Body):使用vLLM推理引擎,model值必须替换为正确的模型名称(可通过/v1/models接口发送GET请求获取)。按照步骤一部署Qwen3-8B此处需将<model_name>需替换为Qwen3-8B

    {
      "model": "<model_name>",
      "messages": [
        {
          "role": "user",
          "content": "Hello!"
        }
      ],
      "max_tokens": 1024
    }

image

步骤三:调用LLM服务

在调用之前,请在服务详情页面的概览页签查看调用信息获取访问地址和Token,后续使用<EAS_ENDPOINT>和<EAS_TOKEN>指代这两个值。

API调用

不同推理引擎的model参数处理存在关键差异:

  • vLLM/SGLang:model值配置为模型名称,可通过/v1/models接口发送GET请求获取。

  • BladeLLM:BladeLLM服务端点本身无需model参数。但在使用OpenAI SDK时,由于客户端强制要求该参数,可设置为空字符串""以作兼容。详情请参见BladeLLM服务调用参数配置说明

    重要

    使用BladeLLM时,请务必在请求中显式设置max_tokens参数,否则输出将默认在16token后被截断。

代码示例如下:

OpenAI SDK

推荐使用官方Python SDK与服务交互。确保已安装OpenAI SDK:pip install openai

from openai import OpenAI

# 1. 配置客户端
# <EAS_TOKEN>需替换为部署服务的Token
openai_api_key = "<EAS_TOKEN>"
# <EAS_ENDPOINT>需替换为部署服务的访问地址
openai_api_base = "<EAS_ENDPOINT>/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

# 2. 获取模型名称
# 对于BladeLLM, 设置model = ""。 因为BladeLLM不需要model入参,也不支持使用client.models.list()方式获取模型名称。设置空字符串以兼容OpenAI SDK的强制参数要求
models = client.models.list()
model = models.data[0].id
print(model)

# 3. 发起对话请求
# 支持流式(stream=True)和非流式(stream=False)输出
stream = True
chat_completion = client.chat.completions.create(
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "hello"},          
    ],
    model=model,
    top_p=0.8,
    temperature=0.7,
    max_tokens=1024,
    stream=stream,
)

if stream:
    for chunk in chat_completion:
        print(chunk.choices[0].delta.content, end="")
else:
    result = chat_completion.choices[0].message.content
    print(result)

cURL

对于快速测试或脚本集成,可使用cURL。

curl -X POST <EAS_ENDPOINT>/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: <EAS_TOKEN>" \
    -d '{
        "model": "<model_name>",
        "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "hello"
        }
        ],
        "max_tokens":1024,
        "temperature": 0.7,
        "top_p": 0.8,
        "stream":true
    }' 

其中:

  • <EAS_ENDPOINT>和<EAS_TOKEN>需替换为部署服务的访问地址和Token。

  • <model_name>需替换为模型名称。对于vLLM/SGLang,可通过模型列表接口<EAS_ENDPOINT>/v1/models获取。对于BladeLLM,不支持该接口,可省略该字段或设为 ""。

    curl -X GET <EAS_ENDPOINT>/v1/models -H "Authorization: <EAS_TOKEN>"

Python requests

对于不希望引入OpenAI SDK依赖的场景,可使用requests库。

import json
import requests

# <EAS_ENDPOINT>需替换为部署服务的访问地址
EAS_ENDPOINT = "<EAS_ENDPOINT>"
# <EAS_TOKEN>需替换为部署服务的Token
EAS_TOKEN = "<EAS_TOKEN>"
# <model_name>需替换为模型名称,可通过模型列表接口<EAS_ENDPOINT>/v1/models获取(对于BladeLLM,不支持该接口,可省略 "model" 字段或设为 "")。
model = "<model_name>"

url = f"{EAS_ENDPOINT}/v1/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": EAS_TOKEN,
}

stream = True
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "hello"},
]

req = {
    "messages": messages,
    "stream": stream,
    "temperature": 0.7,
    "top_p": 0.8,
    "max_tokens": 1024,
    "model": model,
}
response = requests.post(
    url,
    json=req,
    headers=headers,
    stream=stream,
)

if stream:
    for chunk in response.iter_lines(chunk_size=8192, decode_unicode=False):
        msg = chunk.decode("utf-8")
        # 以下代码用于处理Server-Sent Events (SSE)格式的流式响应
        if msg.startswith("data:"):
            info = msg[6:]
            if info == "[DONE]":
                break
            else:
                resp = json.loads(info)
                if resp["choices"][0]["delta"].get("content") is not None:
                    print(resp["choices"][0]["delta"]["content"], end="", flush=True)
else:
    resp = json.loads(response.text)
    print(resp["choices"][0]["message"]["content"])

本地构建WebUI

Gradio是一个基于Python的用户友好的界面库,能快速创建机器学习模型的交互式界面。请参考以下步骤,在本地运行Gradio WebUI。

  1. 下载代码:根据部署时选择的推理引擎,下载对应代码。如网络环境可稳定访问GitHub,请使用GitHub链接,否则请使用OSS链接。

  2. 环境准备:要求Python3.10 或更高版本,并安装依赖 pip install openai gradio

  3. 启动Web应用:在终端执行以下命令(其中<EAS_ENDPOINT>和<EAS_TOKEN> 需替换为部署服务的访问地址和Token)。

    python webui_client.py --eas_endpoint "<EAS_ENDPOINT>" --eas_token "<EAS_TOKEN>"
  4. 启动成功后,会输出一个本地URL(通常是 http://127.0.0.1:7860),在浏览器中打开该URL进行访问。

集成至第三方应用

EAS服务可集成至支持OpenAI API的各类客户端和开发工具。配置的核心要素是服务访问地址、Token和模型名称。

Dify

  1. 安装模型供应商OpenAI-API-compatible

    单击页面右上角的头像-设置,左侧选择模型供应商。如果模型列表中没有OpenAI-API-compatible,在下方列表查找安装。

    image

  2. 添加模型

    单击OpenAI-API-compatible卡片右下角添加模型,参数如下配置:

    • 模型类型:选择LLM。

    • 模型名称:vLLM部署请通过/v1/models接口发送GET请求获取。示例填写Qwen3-8B

    • API Key:填写EAS服务Token。

    • API endpoint URL:填写EAS服务公网调用地址(注意末尾加上/v1)。

  3. 测试使用

    1. Dify主界面单击创建空白应用,选择Chatflow类型,填入应用名称等信息后单击创建。

    2. 单击LLM节点,选择添加的模型,并设置上下文和提示词。image

    3. 单击右上角预览,输入问题。

      image

Chatbox

  1. 前往Chatbox,根据您的设备下载并安装合适的版本,或直接启动网页版。本方案以macOS M3为例。

  2. 添加模型提供方。单击设置,添加模型提供方,填写名称如pai,API模式选择OpenAI API兼容

    image

  3. 选择模型提供方pai,配置如下参数。

    • API 密钥:填写EAS服务Token。

    • API 主机:填写EAS服务公网调用地址(注意末尾加上/v1)。

    • API 路径:无需填写。

    • 模型:单击获取进行添加(若推理引擎为BladeLLM,不支持通过接口获取,可单击新建填写)。

    image

  4. 对话测试。单击新对话,文本输入框右下角选择模型服务。

    image

Cherry Studio

计费说明

包括但不限于以下费用,详情请参见模型在线服务(EAS)计费说明

  • 计算费用:主要成本来源,在创建EAS服务时,根据需求选择按量付费或包年包月的资源。

  • 存储费用:如果使用自定义模型,模型文件存储在对象存储OSS中,会根据存储用量产生相应的对象存储费用。

应用于生产环境

选择合适的模型

  1. 明确应用场景

    • 通用对话:请务必选择指令微调模型,而非基础模型,以确保模型能理解并遵循您的指令。

    • 代码生成:选择专门的代码模型,如 Qwen3-Coder 系列,它们在代码相关任务上表现通常远超通用模型。

    • 特定领域任务:如果任务非常专业(如金融、法律),可以考虑寻找在该领域微调过的模型,或者使用通用模型进行微调。

  2. 性能与成本:通常,模型参数量越大,能力越强,但部署所需的计算资源也越多,推理成本相应更高。建议您从较小的模型(如7B级别)开始验证,若性能无法满足需求,再逐步尝试更大的模型。

  3. 参考权威评测:可以参考OpenCompass、LMSys Chatbot Arena等行业公认的评测榜单。这些榜单从推理、编码、数学等多个维度对模型进行客观评估,能提供有价值的选型依据。

选择合适的推理引擎

  • vLLM/SGLang:作为开源社区的主流选择,拥有广泛的模型支持和丰富的社区文档与示例,易于集成和问题排查。

  • BladeLLM:阿里云PAI团队自研的推理引擎,针对特定模型(尤其是Qwen系列)有深度优化,可能获得更高的性能和更低的显存占用。

推理优化

  • LLM智能路由:基于实时token吞吐量、GPU显存使用率等指标动态分发请求,均衡各推理实例的算力与显存分配,适用于部署多个推理实例,且预期请求负载不均的场景,提升集群资源利用率与系统稳定性。

  • 基于专家并行和PD分离部署MoE模型:针对专家混合(Mixture-of-Experts, MoE)模型,通过专家并行(EP)和Prefill-Decode(PD)分离部署等技术,提升推理吞吐、降低部署成本。

常见问题

  1. 调用返回错误Unsupported Media Type: Only 'application/json' is allowed

    请确保请求Headers中包含 Content-Type: application/json

  2. 调用返回错误The model '<model_name>' does not exist.

    vLLM推理引擎要求model字段必须填写正确。可通过调用/v1/models接口(GET请求)获取模型名称。

更多问题请参见EAS常见问题