一键部署DeepSeek-V3、DeepSeek-R1模型

为了集成DeepSeek系列大模型的能力,需搭建一个稳定、可扩展的后端模型服务。通过Model Gallery可一键部署DeepSeek-V3DeepSeek-R1系列模型,无需处理底层计算环境配置、模型加载和推理优化等基础设施管理工作。最终获得一个兼容标准API的模型服务终端节点,并可将其集成到应用程序中。

方案架构

方案基于PAI平台实现,其核心架构包括以下组件:

  • Model Gallery:作为模型的分发与部署入口,提供了预置的DeepSeek系列模型及相应的部署配置。

  • 模型在线服务 (EAS):承载模型部署与推理的核心服务。它负责自动化地管理底层计算资源(如GPU),并根据配置启动模型服务实例。

  • 推理加速引擎 (SGLang/vLLM/BladeLLM):用于优化模型推理性能。

    • SGLang/vLLM:提供与OpenAI API完全兼容的接口,便于现有应用迁移。

    • BladeLLM:自研的高性能推理框架,在特定场景下可提供更优的推理性能。

  • API网关:EAS将部署好的模型服务通过一个安全的API网关暴露出来,提供服务访问地址(Endpoint)和认证令牌(Token)。

步骤一:模型与资源规划

1. 选择推理引擎

  • 优先推荐 SGLang:在提供高性能的同时,完全兼容OpenAI API标准,适配主流应用生态,在多数场景下支持的最大上下文长度优于vLLM。

  • 备选vLLM:作为业界流行的框架,同样提供良好的API兼容性。

  • 特定场景使用 BladeLLM:仅在追求更高推理性能,且能接受APIOpenAI标准存在差异(例如,不支持通过client.models.list()max_tokens参数有默认截断行为)时,才选用阿里云 PAI 自研的高性能推理框架BladeLLM。

2. 选择模型与资源

模型的选择决定了所需的计算资源和部署成本。DeepSeek模型分为“满血版”和“蒸馏版”,其资源需求差异巨大。

  • 开发测试:推荐使用蒸馏版模型,如DeepSeek-R1-Distill-Qwen-7B。此类模型资源占用小(通常为单张24GB显存的GPU),部署快,成本低,适合快速验证功能。

  • 生产环境:根据效果和成本综合评估。DeepSeek-R1-Distill-Qwen-32B在效果和成本之间取得了较好的平衡。如需更强的模型效果,可选择满血版,但这需要多卡高端GPU(如896GB显存的GPU),成本会显著增加。

下表列出了不同模型版本所需的最低配置,以及使用不同机型和推理引擎时支持的最大Token数。

满血版模型

模型

部署方式

支持的最大Token数(输入+输出)

最低配置

SGLang(推荐)

vLLM

DeepSeek-R1

单机-Nvidia GPU

56000

65536

单机8GU120(8 * 96 GB显存)

单机-GP7V机型

56000

16384

分布式-灵骏资源

163840

163840

DeepSeek-V3

单机-Nvidia GPU

56000

65536

单机8GU120(8 * 96 GB显存)

单机-GP7V机型

56000

16384

分布式-灵骏智算资源

163840

163840

单机部署机型说明:

  • Nvidia GPU

    • ml.gu8v.c192m1024.8-gu120ecs.gn8v-8x.48xlarge:公共资源,库存可能较紧张。

    • ecs.ebmgn8v.48xlarge:无法通过公共资源使用,请购买EAS专属资源

  • GP7V机型ml.gp7vf.16.40xlarge为公共资源,仅可竞价使用。当Nvidia GPU资源紧张时,可切换至华北6(乌兰察布)寻找GP7V资源,部署时请务必配置VPC。

分布式部署(对性能要求较高时推荐使用)机型说明:

分布式部署依赖高速网络,故必须使用PAI灵骏智算资源(提供高性能、高弹性异构算力服务)且部署时务必配置VPC。使用灵骏智算资源请切换地域至华北6(乌兰察布)。

  • 灵骏公共资源

    • ml.gu7xf.8xlarge-gu108 :单实例部署需机器数4,仅可竞价使用。

    • GP7V机型:单实例部署需机器数2。

  • 灵骏预付费资源:需开通白名单,请联系销售经理或提交工单咨询。

蒸馏版模型

模型

支持的最大Token数(输入+输出)

最低配置

SGLang(推荐)

vLLM

BladeLLM

DeepSeek-R1-Distill-Qwen-1.5B

131072

131072

131072

1A10(24 GB显存)

DeepSeek-R1-Distill-Qwen-7B

131072

32768

131072

1A10(24 GB显存)

DeepSeek-R1-Distill-Llama-8B

131072

32768

131072

1A10(24 GB显存)

DeepSeek-R1-Distill-Qwen-14B

131072

32768

131072

1GPU L(48 GB显存)

DeepSeek-R1-Distill-Qwen-32B

131072

32768

131072

2GPU L(2 * 48 GB显存)

DeepSeek-R1-Distill-Llama-70B

131072

32768

131072

2GU120(2 * 96 GB显存)

步骤二:部署模型服务

  1. 登录PAI控制台,在顶部左上角选择目标地域,从左侧导航栏进入工作空间列表,并选择目标工作空间。

  2. 在工作空间内,导航至快速开始 > Model Gallery

  3. 在模型列表中搜索并选择目标模型,例如 DeepSeek-R1-Distill-Qwen-7B,进入模型详情页。

  4. 单击页面右上角部署,在部署配置页面,参考步骤一的规划设置配置以下参数。

    • 推理引擎:推荐使用SGLangvLLM。

    • 部署资源:选择公共资源或专属资源,并根据模型要求选择合适的GPU规格。

      • 默认使用公共资源,并给出了推荐规格。若库存不足,可尝试切换地域。

        重要

        使用公共资源部署,服务进入运行中状态即开始按时长计费,即使无调用。测试后请及时停止服务。

      • 若选择资源配额,请注意根据机型选择对应的推理引擎和部署模板。如使用GP7V机型,推理引擎可选择SGLang,部署模板可选择单机-GP7V机型

    部署页面_新

  5. 确认所有配置无误后,单击部署。系统将开始创建服务。

    说明

    对于大型模型(如DeepSeek-R1满血版),模型加载过程可能需要20-30分钟。

  6. 部署任务的状态可在Model Gallery > 任务管理 > 部署任务页面查看。单击服务名称可进入服务详情页。还可以通过右上角的更多信息,跳转到PAI-EAS的模型服务详情页,获取更多信息。

    查看更多信息

步骤三:在线调试

Model Gallery > 任务管理 > 部署任务中单击已部署的服务名称,在在线测试模块中找到EAS在线调试的入口。

SGLang/vLLM部署为例,可通过<EAS_ENDPOINT>/openapi.json获取服务的API 描述文件。以下测试对话接口POST <EAS_ENDPOINT>/v1/chat/completions

  1. 补充请求路径。在线调试中已经填充的路径是<EAS_ENDPOINT>,需补充具体API路径v1/chat/completions

  2. 构造请求体

    如果提示词是:请计算3+5等于几?

    请求体格式如下。其中,model参数值为模型列表接口<EAS_ENDPOINT>/v1/models获取的模型名称,这里以DeepSeek-R1-Distill-Qwen-7B为例。

    {
        "model": "DeepSeek-R1-Distill-Qwen-7B",
        "messages": [
            {
                "role": "user",
                "content": "请计算3+5等于几?"
            }
        ]
    }
  3. 发起请求。

    image

单击查看BladeLLM对话接口请求数据示例

{
    "messages": [
        {
            "role": "user",
            "content": "请计算3+5等于几?"
        }
    ],
    "max_tokens": 2000
}

步骤四:调用模型服务

对于DeepSeek-R1系列模型,官方给出使用建议如下:

  • temperature设置在0.5-0.7之间,推荐 0.6,防止输出重复或不连贯。

  • 不要添加system prompt,所有的指令应添加在 user prompt 中。

  • 针对数学类问题,建议在 prompt 中包含“请逐步推理,并将最终答案放在\boxed{}中。”

重要

使用BladeLLM加速部署方式,如果不指定max_tokens参数,默认会按照max_tokens=16进行截断。建议您根据实际需要调整请求参数max_tokens

API调用

  1. 获取服务的访问地址和Token。

    1. Model Gallery > 任务管理 > 部署任务中单击已部署的服务名称,进入服务详情页。

    2. 单击查看调用信息获取调用的访问地址和Token。

      image

  2. 对话接口调用示例。

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

    OpenAI SDK

    注意:

    • 需要补全endpoint最后的/v1。

    • BladeLLM加速部署不支持使用client.models.list()方式获取模型列表,您可以直接指定model的值为""以兼容使用。

    SGLang/vLLM加速部署
    from openai import OpenAI
    
    # 1. 配置客户端
    # 将<<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,
    )
    
    # 2. 获取模型名称 
    try:
        model = client.models.list().data[0].id
        print(model)
    except Exception as e:
        print(f"无法获取模型列表,检查EndpointToken。错误: {e}")
        
    # 3. 构造并发送请求
    stream = True
    
    chat_completion = client.chat.completions.create(
        messages=[
            {"role": "user", "content": "你好,请介绍一下你自己。"}
        ],
        model=model,
        max_tokens=2048,
        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加速部署
    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": "user", "content": "你好,请介绍一下你自己。"}
        ],
         model=model,
         max_tokens=2048,
         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

    SGLang/vLLM加速部署

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

    curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: <EAS_TOKEN>" \
        -d '{
            "model": "<model_name>",
            "messages": [
            {
                "role": "user",
                "content": "hello!"
            }
            ]
        }' \
        <EAS_ENDPOINT>/v1/chat/completions
    
    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": "user", "content": "你好,请介绍一下你自己。"},
    ]
    
    req = {
        "messages": messages,
        "stream": stream,
        "temperature": 0.6,
        "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"])
    
    BladeLLM加速部署
    curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: <EAS_TOKEN>" \
        -d '{
            "messages": [
            {
                "role": "user",
                "content": "hello!"
            }
            ]
        }' \
        <EAS_ENDPOINT>/v1/chat/completions
    
    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": "user", "content": "你好,请介绍一下你自己。"},
    ]
    # 使用BladeLLM加速部署方式,如果不指定max_tokens参数,默认会按照max_tokens=16进行截断。建议您根据实际需要调整请求参数max_tokens。
    req = {
        "messages": messages,
        "stream": stream,
        "temperature": 0.6,
        "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"])
  3. 不同的模型以及不同的部署框架,在使用推理服务时也会存在区别。您可以在Model Gallery的模型介绍页查看更多API调用方式的详细说明。

    image

本地构建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进行访问。

集成第三方应用

接入ChatboxDifyCherry Studio,请参见集成第三方客户端

步骤五:清理资源

使用公共资源部署的实例,创建成功后按实例运行时长计费,不满1小时按具体分钟数折算计费;为避免产生更多资源消耗,在完成使用后,应停止或删除实例。

  1. 返回任务管理 > 部署任务页面。

  2. 找到需要停止的服务,在其操作列单击停止删除

    • 停止:服务实例将被释放,停止计费,但服务配置会保留,可以稍后重新启动。

    • 删除:服务配置和实例都将被永久删除。

资源清理

成本与风险说明

成本构成

使用公共资源部署的服务,从创建成功(状态为“运行中”)到停止或删除为止,按分钟计费,账单按小时结算。即使服务空闲,计费依然持续。停止服务即可停止计费。

更多详情,请参见模型在线服务(EAS)计费说明

成本控制建议

  • 及时清理:开发测试后,立即停止删除服务,以有效控制成本。

  • 使用试用资源:若首次使用EAS,可前往阿里云试用中心领取PAI-EAS试用资源。领取成功后,可以选择部署最低配置为 A10 的模型(如DeepSeek-R1-Distill-Qwen-7B),并在部署时修改资源规格为试用活动中的机型。

  • 选择合适模型:在非生产环境,优先使用成本较低的蒸馏版模型。

  • 竞价使用资源:对于非生产任务,可在部署时开启竞价模式,但注意需满足一定条件才能竞价成功,且有资源不稳定的风险。

  • 长期使用优惠:对于长期运行的生产服务,可通过购买节省计划或预付费资源来降低成本。

关键风险点

  • 意外费用:忘记停止服务将导致持续计费。务必在使用完毕后立即清理资源。

  • BladeLLM输出截断:使用BladeLLM引擎时,若API请求中未指定max_tokens,输出将被截断为16token,导致功能不符合预期。

  • API调用规范错误

    • 调用DeepSeek-R1系列模型时,在messages中包含system prompt可能会导致非预期的行为。

    • API请求的URL必须以/v1/chat/completions等路径结尾,否则将返回404错误。

  • 资源库存:部署大型模型(特别是满血版)时,特定地域的高端GPU资源可能库存紧张,导致部署失败或长时间等待。可尝试切换到其他地域。

模型部署FAQ

点击部署后服务长时间等待

可能的原因:

  • 当前地域下机器资源不足。

  • 由于模型较大,模型加载耗时较长(对于DeepSeek-R1、DeepSeek-V3这样的大模型,需要20-30min)。

您可以耐心等待观察一段时间,如果服务仍长时间无法正常启动运行,建议尝试以下步骤:

  1. 进入任务管理-部署任务,查看部署任务详情页。在页面右上角单击更多 > 更多信息,跳转到PAI-EAS的模型服务详情,查看服务实例状态。

    EAS实例状态

  2. 关闭当前服务,并在控制台左上角切换到其他地域重新部署服务。

    说明

    对于DeepSeek-R1、DeepSeek-V3这样的超大参数量模型,需要8GPU才能启动服务(资源库存较紧张),您可以选择部署DeepSeek-R1-Distill-Qwen-7B等蒸馏小模型(资源库存较富裕)。

模型调用FAQ

调用API返回404

请检查调用的URL是否加上了OpenAIAPI后缀,例如v1/chat/completions。详情可以参考模型主页调用方式介绍。

如果是vLLM加速部署,检查对话接口的请求体中model参数是否填写了正确的模型名称。可以通过v1/models获取模型名称。

请求太长导致网关超时

部署使用的默认网关请求超时时间是180秒,如果需要延长超时时间,可以配置专属网关,并提交工单调整专属网关的请求超时时间,最大可以调整到600秒。

为何没有“联网搜索”

“联网搜索”功能并不是仅通过直接部署一个模型服务就能实现的,而是需要基于该模型服务自行构建一个AI应用(Agent)来完成。

通过PAI的大模型应用开发平台LangStudio,可以构建一个联网搜索的AI应用,详情请参考基于LangStudio&阿里云信息查询服务搭建DeepSeek联网搜索应用流

模型跳过思考怎么办?

如果部署DeepSeek-R1模型,针对模型有时会跳过思考过程的情况,可采用DeepSeek更新的强制思考的chat模板。使用方式:

  1. 修改启动命令

    如图,在服务配置中,编辑JSON配置,修改containers-script字段,加上"--chat-template /model_dir/template_force_thinking.jinja"(可以加在"--served-model-name DeepSeek-R1"之后)。JSON编辑

    如果是已经部署的服务,在Model Gallery > 任务管理 > 部署任务中单击已部署的服务名称,在详情页面右上角单击更新服务,即可进入上述页面。

    更新服务

  2. 请求体修改。在每次请求中,message最后加上{"role": "assistant", "content": "<think>\n"}。

deepSeek-r1可以关闭思考模式么?

deepseek-r1系列模型目前不支持关闭思考过程。

如何实现多轮对话?

模型服务本身不会保存历史对话信息,需要客户端保存历史对话,再添加到模型调用的请求中。以SGLang部署的服务,示例如下。

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: <EAS_TOKEN>" \
    -d '{
        "model": "<model_name>",
        "messages": [
         {
            "role": "user", 
            "content": "你好"
        },
        {
            "role": "assistant",
            "content": "你好!很高兴见到你,有什么我可以帮忙的吗?"
        },
        {
            "role": "user",
            "content": "我上一个问题是什么"
        }
        ]
    }' \
    <EAS_ENDPOINT>/v1/chat/completions