AIStudio SSH 公钥管理,一处配置,处处可用AIStudio SSH 公钥管理,一处配置,处处可用 ,只为更佳开发体验如何配置
Skip to content

GenStudio M×N 推理服务使用教程

本文将指导您如何通过常用工具适配 M×N 推理 API 端点。

NOTE

M×N 多模型芯片推理服务仅支持部分预置大语言模型。

什么是 M×N ?

我们致力于国产化 AI 算力适配和性能极致优化,已适配多种国产 AI 芯片,实现开源模型的无缝迁移。大模型服务平台(GenStudio)的部分预置模型支持多芯片推理,可同时体验不同芯片的模型性能和效果。

大模型服务平台(GenStudio)为 LLM 提供了专用的多模型芯片(M×N)推理 API 端点。

OpenAI API 兼容性

M×N 多模型芯片 API 服务与 OpenAI Chat Completions 接口兼容。

NOTE

M×N API 接口路径不同于 OpenAI 的 /v1/chat/completions

  • 没有 /v1 部分
  • 模型/芯片组合决定具体路径: /maas/{model}/{chiptype}/chat/completions

在线体验 M×N

大模型服务平台(GenStudio)体验中心已在 Web UI 上提供 M×N 体验

开启多模型多芯片体验

开启 M×N 体验后可尝试不同模型和芯片组合,并在右侧的交互体验区对比效果。

开启步骤如下:

  1. 进入体验中心后,打开 M*N 体验开关,推荐切换为按芯片选择,随后选择 2 ~ 4 个需要对比体验的模型芯片组合。

    NOTE

    当前仅大语言模型支持 M×N 体验。请确保顶部已切换为大语言模型

  2. 在 M×N 体验模式下,您可直观体验不同模型和不同芯片对于同样的指令的返回差异。您可以在左侧调整各个模型的参数,不同模型支持的参数数量及范围均可能有差异。

    WARNING

    选中的模型不共享参数配置,例如 System Prompt、Temperature 等。如有需要,请逐个模型调整。

    alt text

    当模型完成或被停止生成后,可根据模型的回答情况,点击重新生成按钮,对之前所生成的最新一轮反馈进行重新生成。对模型已经完成输出生成的内容,平台会统计本轮对话所产生的输入与输出 Token 总和。

TIP

当对比中的模型仍正在输出时,您无法进行新对话的发起或者输入下一轮的指令,当所有模型都完成内容返回时,则可以开启下一轮的对话对比。

大语言模型交互参数配置

体验大语言模型时,各个模型拥有独立的配置区域。因模型系列的不同,可能会支持不同的可配置参数。大语言模型主要的参数包括:

  • Stream:指模型是否以流式返回回答的内容,默认开启,关闭时,将一次性返回此次生成的所有内容。
  • System Prompt:指模型在回答问题时的系统提示,默认为空,您可以根据需要自行调整。
  • Max_tokens:指模型输出的最大 Token 数量。模型输入与输出的 Token 数量将共享模型可处理的文本长度。
  • Temperature:采样温度,控制输出的随机性。值越高,会使输出更加随机,更具创造性;值越低,会使输出更加集中和确定性。我们推荐您根据应用场景调整 top_p 或 temperature 参数,但不建议同时调整两个参数。
  • Top_p:用于控制输出文本的随机性和多样性,取值越大,生成文本越丰富。我们推荐您根据应用场景调整 top_p 或 temperature 参数,但不建议同时调整两个参数。
  • Top_k:用于控制输出文本的随机性和多样性(并非所有模型均支持),控制语言模型在生成文本时,从前 k 个 tokens 随机选择。1 适用于返回有明确答案的问题,例如 "5 乘以 7 等于多少?"
如果希望体验更完整的参数配置,建议使用 GenStudio API 文档中的调试面板。

获取 M×N API 端点

模型广场点击模型卡片后,切换到调用说明标签页面,可一键复制当前模型的 M×N API 调用示例。

alt text

GenStudio API 服务的 API Server 地址(模型名称、芯片类型)已经在调用示例中拼接好,可直接使用。

使用 Curl

您可以通过调用示例中的 curl 命令直接发送 API 请求。

TIP

请将 $API_KEY 修改为您获取的 API 密钥。

验证单轮对话(非流式)

以下请求示例发起一个单轮对话。以下示例未指定 stream 参数,因此 API 服务使用默认响应方式(非流式响应)。

  • API_KEY:GenStudio API key
  • API_HOST_DOMAIN:GenStudio API 服务域名,请使用 https://cloud.infini-ai.com
  • MODEL:模型名称,例如 megrez-3b-instruct
  • CHIP:芯片,例如 nvidia
shell
curl "${API_HOST_DOMAIN}/maas/${MODEL}/${CHIP}/chat/completions" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${API_KEY}" \
    -d '{
         "model": "'"${MODEL}"'",
         "messages": [
            { "role": "user", "content": "你是谁?" }
          ]
     }'

单轮对话也可以携带 system message,示例如下

json
"messages": [
    { "role": "system", "content": "请以嘲讽语气回答" },
    { "role": "user", "content": "你是谁?" }
]

API 服务默认使用非流式响应。请求成功时,一次性返回生成的内容。

响应正文示例如下:

json
{
    "id": "chatcmpl-n5McEDBxBdxNDbx2CA8Rz8",
    "object": "chat.completion",
    "created": 1708497105,
    "model": "qwen2.5-7b-instruct",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "我是来自阿里云的大规模语言模型"
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 22,
        "total_tokens": 39,
        "completion_tokens": 17
    }
}

IMPORTANT

  • 若文本审核违规,则新增 blocked 字段且值为 true,后面响应不再继续输出
  • 若文本审核通过,则无 blocked 字段,后面响应正常输出。

验证单轮对话(流式)

以下示例明确指定 stream 参数为 true,因此 API 服务将会采用流式响应方式返回类型。

shell
curl "${API_HOST_DOMAIN}/maas/${MODEL}/${CHIP}/chat/completions" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $API_KEY" \
    -d '{
         "model": "megrez-3b-instruct",
         "stream": true,
         "messages": [
            { "role": "user", "content": "你是谁?" }
          ]
     }'

在流式响应模式下,请求成功时,一次性返回生成的内容。

IMPORTANT

当前仅 chip3chip4chip5 存在以下问题:

  1. 流式响应模式下,暂不支持返回 Content-Type 为 text/event-stream 的 data-only server-sent events,因此响应体中的数据不会带有 data: 字段。
  2. 流式响应模式下,暂不支持返回标志对话结束标志 data: [DONE]
  3. 流式响应模式下,仅在最后一条返回数据中携带携带 objectcreated 字段。

响应正文示例如下:

json
{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "我是"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "来自"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "无问"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "芯穹"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "的"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "超"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "大规模"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "语言"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "模型"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": ","}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "我"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "叫"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "无"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "问"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "天"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "权"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {"content": "。"}, "finish_reason": null}]}

{"id": "chatcmpl-3HjYf888MzQ6XAHADiPanf", "object": "chat.completion.chunk", "created": 1708486029, "model": "megrez-3b-instruct", "choices": [{"index": 0, "delta": {}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 22, "total_tokens": 40, "completion_tokens": 18}}

验证多轮对话

API 服务可接受多轮对话请求,一对 user message + assistant message 算一轮(也可包含 system message)。

以下示例展示了一个多轮对话请求。

shell
curl https://cloud.infini-ai.com/maas/megrez-3b-instruct/nvidia/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $API_KEY" \
    -d '{
        "model": "megrez-3b-instruct",
        "messages": [
            { "role": "user", "content": "你是谁?" },
            { "role": "assistant", "content": "我是大模型回答助手" },
            { "role": "user", "content": "你能做什么?" },
        ]
     }'

使用 OpenAI Python SDK

无问芯穹大模型 API 服务支持通过 OpenAI 官方 Python SDK 进行调用。

TIP

部分国产芯片的 API 服务目前尚不能完全兼容 OpenAI Python SDK。

创建客户端

以下示例从环境变量中加载了 API 路径和 API 密钥。

  • GENSTUDIO_API_KEY :GenStudio API Key
  • API_HOST_DOMAIN:GenStudio MxN API 服务域名,为 https://cloud.infini-ai.com
  • MODEL:模型名称,例如 megrez-3b-instruct
  • CHIP:芯片,例如 nvidia
python
from openai import OpenAI
import os

API_KEY = os.getenv("GenStudio_API_KEY")
API_HOST_DOMAIN = os.getenv("API_HOST_DOMAIN")
MODEL = os.getenv("MODEL", "megrez-3b-instruct")
CHIP = os.getenv("CHIP", "nvidia")

BASE_URL = f"{API_HOST_DOMAIN}/maas/{MODEL}/{CHIP}"

client = OpenAI(api_key=API_KEY, base_url=BASE_URL)

验证一(流式)

python
stream = client.chat.completions.create(
    model="qwen1.5-72b-chat",
    messages=[{"role": "user", "content": "根据中国古代圣人孔子的思想,人生的意义是什么?"}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")
孔子认为,人生的意义在于实现“仁”,即以仁爱之心对待他人,追求道德完善,以及实现社会和谐。他强调“修身、齐家、治国、平天下”,认为一个人应该首先修养自身,然后才能管理好家庭,进一步治理好国家,最终达到天下和平。此外,孔子也重视学习和知识,他认为“学而时习之,不亦说乎?”通过不断学习和实践,可以提升自我,接近人生的意义。

验证二(非流式)

python
chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "say '谁是卧底。'",
        }
    ],
    model="qwen1.5-72b-chat",
)

print(chat_completion.choices[0].message.content)
谁是卧底?

使用 Langchain 的 OpenAI 插件

无问芯穹大模型 API 服务支持通过 Langchain 的 OpenAI 插件进行调用。

TIP

部分国产芯片的 API 服务目前尚不能完全兼容 OpenAI 官方格式。

验证一(流式)

以下示例从环境变量中加载了 API 路径和 API 密钥。

  • GENSTUDIO_API_KEY :GenStudio API Key
  • API_HOST_DOMAIN:GenStudio MxN API 服务域名,为 https://cloud.infini-ai.com
  • MODEL:模型名称,例如 megrez-3b-instruct
  • CHIP:芯片,例如 nvidia
python
from openai import OpenAI
import os

API_KEY = os.getenv("GenStudio_API_KEY")
API_HOST_DOMAIN = os.getenv("API_HOST_DOMAIN")
MODEL = os.getenv("MODEL", "megrez-3b-instruct")
CHIP = os.getenv("CHIP", "nvidia")

BASE_URL = f"{API_HOST_DOMAIN}/maas/{MODEL}/{CHIP}"

from langchain_openai import ChatOpenAI
from langchain.callbacks.base import BaseCallbackHandler
from typing import Any, Dict, List

# Define a callback handler to process streaming tokens
class StreamHandler(BaseCallbackHandler):
    def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
        print(token, end="", flush=True)

# Initialize the ChatOpenAI model with streaming enabled
llm_streaming = ChatOpenAI(
    openai_api_key=API_KEY, 
    openai_api_base=BASE_URL,
    streaming=True,
    callbacks=[StreamHandler()]  # Pass the callback handler
)

# Define your messages
messages = [
    {"role": "system", "content": "You are a pedantic anticient Chinese scholar, who always answers in Simplified Chinese."},
    {"role": "user", "content": "Tell me a joke."}
]

# Get a response from the chat model
response = llm_streaming.invoke(input=messages)

# Output the response (optional, as it is already printed by the callback)
print("\n\n***********\n\n以下是 LLM 的完整回复:\n\n", response)
有一只深海鱼,每天都自由地游来游去,但它却一点也不开心。因为它压力很大。

***********

以下是 LLM 的完整回复:

content='有一只深海鱼,每天都自由地游来游去,但它却一点也不开心。因为它压力很大。' response_metadata={'finish_reason': 'stop'} id='run-25c3c02b-f027-491b-af88-f3eec5058760-0'

验证二(非流式)

python
from langchain_openai import ChatOpenAI
from typing import Any, Dict, List

# Initialize the ChatOpenAI model with streaming enabled
llm_non_streaming = ChatOpenAI(
    openai_api_key=API_KEY, 
    openai_api_base=BASE_URL,
    streaming=False
)

# Define your messages
messages = [
    {"role": "system", "content": "You are a pedantic anticient Chinese scholar, who always answers in Simplified Chinese."},
    {"role": "user", "content": "Tell me a joke."}
]

# Get a response from the chat model
response = llm_non_streaming.invoke(input=messages)

# Output the response (optional, as it is already printed by the callback)
print("\n\n***********\n\n以下是 LLM 的完整回复:\n\n", response)
***********
    
以下是 LLM 的完整回复:

content='有一只深海鱼,每天都自由地游来游去,但它却一点也不开心。因为它压力很大。' response_metadata={'token_usage': {'completion_tokens': 24, 'prompt_tokens': 36, 'total_tokens': 60}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-48bb7543-1312-4f94-8313-dc3b18b2d87e-0'