LLM大语言模型部署

更新时间: 2025-09-02 13:58:05

手动部署LLM大语言模型需自行配置各项参数,操作复杂,难以保证推理性能。EAS提供了一站式LLM部署解决方案,支持DeepSeek、Qwen等热门模型一键部署,也允许自定义模型灵活上线。通过集成 vLLM、SGLang 等高性能推理引擎,并应用PD分离、动态调度等推理优化技术,显著降低推理延迟,提升吞吐,最大化节约成本。

使用模板部署EAS服务

重要

公共模型建议使用部署模板,或通过Model Gallery进行部署。

Qwen3-8B为例,操作步骤如下:

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

  2. 模型在线服务(EAS)页面,单击部署服务,然后在场景化模型部署区域,单击LLM大语言模型部署

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

    • 模型配置:选择公共模型中的Qwen3-8B

    • 推理引擎:选择vLLM

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

  4. 单击部署,等待大约5分钟,服务进入运行中状态,即部署成功。

调用EAS服务

在线调试

  1. 模型在线服务(EAS)页面,单击目标服务操作列下的image>在线调试

  2. 在调试页面的在线调试请求参数区域,构造并发送请求。

    • 请求路径:vLLM部署的服务兼容OpenAI API标准,以对话接口为例,需在自动填充的URL后添加具体接口路径/v1/chat/completions

    • 请求体:示例如下

      {
        "model": "Qwen3-8B",
        "messages": [
          {
            "role": "user",
            "content": "Hello!"
          }
        ],
        "max_tokens": 1024
      }
      重要
      • vLLM/SGLang:model值需配置为模型名称,可通过/v1/models接口发送GET请求获取。

      • BladeLLM:无需model参数。 若未设置max_tokens参数,默认会按照max_tokens=16进行截断。建议根据实际需要设置该参数

    结果如下:

    image

API调用

一、获取服务访问地址和Token

  1. 推理服务页签,单击您的服务名称进入概览页面,在基本信息区域单击查看调用信息

  2. 调用信息面板,可获取访问地址和Token。根据您的实际情况选择公网或VPC地址,下文使用<EAS_ENDPOINT>和<EAS_TOKEN>指代它们。

    image

二、调用API

不同推理引擎调用方式略有差异,示例如下:

OpenAI SDK

vLLM/SGLang

完全兼容OpenAI API标准,适配主流AI应用接入。示例如下:

from openai import OpenAI

##### API 配置 #####
# <EAS_TOKEN> 替换为服务Token。
# <EAS_ENDPOINT> 替换服务访问地址。
openai_api_key = "<EAS_TOKEN>"
openai_api_base = "<EAS_ENDPOINT>/v1"

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

models = client.models.list()
model = models.data[0].id
print(model)

stream = True

# 如不支持max_completion_tokens参数,请升级openai版本
chat_completion = client.chat.completions.create(
    messages=[
        {"role": "system", "content": "You are a helpful and harmless assistant."},
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "hello",
                }
            ],
        },
    ],
    model=model,
    max_completion_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)

BladeLLM

BladeLLM暂不支持使用client.models.list()方式获取模型列表,可设置model值为空字符串("")以兼容使用。

from openai import OpenAI

##### API 配置 #####
# <EAS_ENDPOINT>需替换为部署服务的访问地址,<EAS_TOKEN>需替换为部署服务的Token。
openai_api_key = "<EAS_TOKEN>"
openai_api_base = "<EAS_ENDPOINT>/v1"

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

# BladeLLM加速部署暂不支持使用client.models.list()方式获取模型名称,您可以直接指定model的值为""以兼容使用。
model = ""
stream = True

chat_completion = client.chat.completions.create(
    messages=[
        {"role": "system", "content": "You are a helpful and harmless assistant."},
        {"role": "user", "content": "hello"},
    ],
    model=model,
    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)

HTTP

vLLM/SGLang

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 and harmless assistant."},
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "hello"
                }
            ]
        }
        ]
    }' 
import json
import requests

# <EAS_ENDPOINT>需替换为部署服务的访问地址,<EAS_TOKEN>需替换为部署服务的Token。
EAS_ENDPOINT = "<EAS_ENDPOINT>"
EAS_TOKEN = "<EAS_TOKEN>"

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

# <model_name>请替换为模型列表接口<EAS_ENDPOINT>/v1/models获取的模型名称。
model = "<model_name>"
stream = True
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "hello"},
]
# 使用BladeLLM加速部署方式,如果不指定max_tokens参数,默认会按照max_tokens=16进行截断。建议您根据实际需要调整请求参数max_tokens。
req = {
    "messages": messages,
    "stream": stream,
    "temperature": 0.0,
    "top_p": 0.5,
    "top_k": 10,
    "max_tokens": 300,
    "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")
        if msg.startswith("data"):
            info = msg[6:]
            if info == "[DONE]":
                break
            else:
                resp = json.loads(info)
                print(resp["choices"][0]["delta"]["content"], end="", flush=True)
else:
    resp = json.loads(response.text)
    print(resp["choices"][0]["message"]["content"])

其中,<model_name>需替换为模型名称。可通过模型列表接口<EAS_ENDPOINT>/v1/models获取。

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

BladeLLM

curl -X POST <EAS_ENDPOINT>/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: <EAS_TOKEN>" \
    -d '{
        "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "hello!"
        }
        ],
        "max_tokens":1024
    }' 
import json
import requests

# <EAS_ENDPOINT>需替换为部署服务的访问地址,<EAS_TOKEN>需替换为部署服务的Token。
EAS_ENDPOINT = "<EAS_ENDPOINT>"
EAS_TOKEN = "<EAS_TOKEN>"

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": "你好,请介绍一下你自己。"},
]
# 使用BladeLLM加速部署方式,如果不指定max_tokens参数,默认会按照max_tokens=16进行截断。建议您根据实际需要调整请求参数max_tokens。
req = {
    "messages": messages,
    "stream": stream,
    "temperature": 0.2,
    "top_p": 0.5,
    "top_k": 10,
    "max_tokens": 300,
}
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")
        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的代码,参考以下步骤,本地启动Web应用。

  1. 下载WebUI代码。您可以通过GitHub页面下载,或者直接点击OSS链接下载。两种方式下载的代码完全一样。

  2. 执行以下命令,启动Web应用。

    python webui_client.py --eas_endpoint "<EAS_ENDPOINT>" --eas_token "<EAS_TOKEN>"

    其中,<EAS_ENDPOINT> 需替换为部署服务的访问地址,<EAS_TOKEN>需替换为部署服务的Token。

接入客户端/开发工具

接入客户端或开发工具所需的EAS服务地址和Token参见获取服务访问地址和Token

Dify

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

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

    image

  2. 添加模型

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

    • 模型类型:选择LLM。

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

    • 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 路径:无需填写。

    • 模型:单击获取进行添加(若接口不支持获取,可单击新建填写)。

    image

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

    image

Cherry Studio

  1. 快速体验模型

    回到对话框界面,在顶部选择模型后开始对话。

    image

推理优化

  • LLM智能路由:基于LLM特有的Metrics动态分发请求,均衡各推理实例的算力与显存分配,提升集群资源利用率与系统稳定性。

  • Prefill-Decode分离部署:将推理任务拆分为预填充(Prefill)与解码(Decode)两个阶段,并分配到不同的计算资源上执行,以提升整体吞吐与资源利用率,适用于高并发、长文本生成场景。

常见问题

  1. HTTP调用如何设置温度和top_p参数?

    在请求体中增加temperature和top_p参数,示例如下:

    curl -X POST <EAS_ENDPOINT>/v1/chat/completions \
        -H "Content-Type: application/json" \
        -H "Authorization: <EAS_TOKEN>" \
        -d '{
            "model": "<模型名,通过 /v1/models API获取>",
            "messages": [
                {
                    "role": "system",
                    "content": "You are a helpful assistant."
                },
                {
                    "role": "user",
                    "content": "Hello!"
                }
            ],
            "max_tokens": 1024,
            "top_p": 0.9,
            "temperature": 0.7
        }' 
  2. 调用返回错误Unsupported Media Type: Only 'application/json' is allowed

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

  3. 调用返回错误The model "模型名称" does not exist.

    请检查请求体中的model字段是否正确。可通过调用/v1/models接口(GET请求)获取模型名称。

相关文档

关于BladeLLM的部署,请参见BladeLLM快速入门

上一篇: AI绘画-SDWebUI部署 下一篇: LLM服务开启Prefill-Decode分离部署
阿里云首页 人工智能平台 PAI 相关技术圈