产品概述
产品定价
客户价值
应用场景
.bin 格式及 .safetensors 格式。smoothq_model-8bit-auto.safetensors 文件,并建议删除原始的非量化模型文件。ti_model_config.json 配置文件,格式如下:{"model_id": "Baichuan2-13B-Chat", "conv_template_name": "baichuan2-chat"}
ti_model_config.json 文件,也可以在启动服务时通过 MODEL_ID 环境变量来指定。ti_model_config.json 文件,也可以在启动服务时通过 CONV_TEMPLATE 环境变量来指定。对话模板名称 | 支持的模型系列 |
generate | 非对话模型(直接生成,无对话模板) |
shennong_chat | 腾讯行业大模型(行业大模型需要开通白名单) |
llama-3 | llama-3-8b-instruct、llama-3-70b-instruct 模型 |
llama-2 | llama-2-chat 系列模型 |
qwen-7b-chat | qwen-chat 系列模型(chatml格式) |
baichuan2-chat | baichuan2-chat 系列模型 |
baichuan-chat | baichuan-13b-chat 模型 |
chatglm3 | chatglm3-6b 模型 |
chatglm2 | chatglm2-6b 模型 |
模型参数量 | GPU 卡类型和数量 |
6 ~ 8B | L20 * 1 / A10 * 1 / A100 * 1 / V100 * 1 |
12 ~ 14B | L20 * 1 / A10 * 2 / A100 * 1 / V100 * 2 |
65 ~ 72B | L20 * 8 / A100 * 8 |
QUANTIZATION=ifq;MAX_MODEL_LEN=4096;GPU_MEMORY_UTILIZATION=0.95;--enforce-eager;run
启动参数 | 环境变量 | 默认值 | 含义 |
无 | MODEL_ID | 无 | |
无 | CONV_TEMPLATE | 无 | |
--model-path | MODEL_PATH | /data/model | 模型加载路径,启动服务时指定的 CFS 路径默认会自动挂载到容器中的 "/data/model" 路径,大多数情况您不需修改 |
--num-gpus | TP | 容器分配的显卡数量 | 模型并行推理的显卡数量,用于当单张显卡显存不够时,用多张显卡来加载模型。默认为您为单个容器分配的 GPU 资源数。 说明: angel-vllm(2.0) 镜像支持分布式推理,选择多机分布式部署时会自动设置为分布式推理集群的总卡数。 |
--worker-num | WORKER_NUM | 1 | 推理 Worker 数量,影响单个容器中跑推理服务的进程数,默认为1。一般分配给容器的 GPU 卡数等于 TP * WORKER_NUM |
--limit-worker-concurrency | MAX_CONCURRENCY | 128 | 每个推理 Worker 支持的最大并发数,正在处理的请求超过此数值时,新来的请求会进行排队 |
--dtype | DTYPE | float16 | 模型精度类型,可选值 ["auto", "float16", "bfloat16", "float32"],若配置 "auto" 则自动根据模型训练时使用的精度来配置 |
--seed | SEED | 无 | 每次生成的随机种子,默认不指定 |
--max-model-len | MAX_MODEL_LEN | 模型上下文长度 | 推理服务支持的最大上下文token数,默认自动读取模型配置信息的上下文长度,若一些长上下文的模型按默认配置加载显存不足,您可以手动设置此参数来调小此数值 |
--quantization | QUANTIZATION | none | 量化加速模式,可选值 ["none", "ifq", "ifq_nf4", "fp8", "smoothquant", "auto"] "none":表示关闭量化加速; "ifq":表示开启在线 Int8 Weight-Only 量化,可以在效果基本不损失的情况下加速推理,并减少模型权重的显存占用; "ifq_nf4": 表示开启在线 NF4 Weight-Only 量化,4bit 量化可以进一步加速推理并减少模型权重的显存占用;【angel-vllm(2.0) 镜像开始支持】 "fp8":表示开启在线 FP8 Weight-Only 量化,可以进一步加速推理并减少模型权重的显存占用;【angel-vllm(2.0) 镜像开始支持】【仅 NVIDIA Hopper 系列机型支持】 "smoothquant":表示开启 LayerwiseSearchSMQ 量化 ,可以在效果略微损失的情况下进一步加速推理(依赖提前准备量化后的模型文件,当前仅部分模型支持); "auto":表示自动判断量化模式,其中: 若机型的显卡不支持量化,自动关闭量化; 若模型目录中包含 smoothq_model-8bit-auto.safetensors 文件,会自动开启 LayerwiseSearchSMQ 量化加速;其他情况下,默认开启在线 Int8 Weight-Only 量化加速(ifq); 若您对推理速度有较高要求,或显存资源紧张,推荐您开启量化加速。 |
--use-lookahead | USE_LOOKAHEAD | 0 | Lookahead 并行解码加速,可选值["0", "1", "true", "false"],设置为"1"或"true"表示开启 Lookahead 并行解码加速。Lookahead 并行解码针对输入较长,特别是生成内容包含在输入文本中的如 RAG 场景生成加速效果较好。 【angel-vllm(2.0) 镜像开始支持】 |
--num-speculative-tokens | NUM_SPECULATIVE_TOKENS | 8 | 并行解码token数量,在开启并行解码时生效。表示一次并行解码长度,单并发推荐设置成12,BatchSize较大时可以适当降低一次解码长度,例如6或者4。 【angel-vllm(2.0) 镜像开始支持】 |
--api-keys | OPENAI_API_KEYS | 无 | |
--max-num-batched-tokens | 无 | max(模型上下文长度, 2048) | 每次迭代最大处理的 token 数,默认取2048和模型支持的上下文长度的较大值;若显存富余较多,且输入文本较长,可以适当调大此参数,以获得更好的吞吐性能。 |
--max-num-seqs | 无 | 256 | 每次迭代最大处理的生成序列数 |
--gpu_memory_utilization | GPU_MEMORY_UTILIZATION | 0.9 | 用于模型权重、激活及 KV cache 的预留 GPU 显存比例,值越大可支持的 KV cache 越大,但是越容易显存溢出 |
--enforce-eager | ENFORCE_EAGER | 1 | 是否强制开启 Pytorch 的 eager 模式,默认关闭,此时会额外使用 CUDA graph 做进一步加速,但会占用额外显存,并增加一些服务启动耗时。若启动报显存不足,您可以尝试启动命令中添加--enforce-eager参数来节约显存占用,但是推理性能会稍有下降。【angel-vllm(2.0) 镜像默认打开】 |
python3 -m vllm.entrypoints.openai.api_server 开头,此时支持开源 vllm 0.4.2 版本原生支持的各类参数,详见vllm官方文档。--use-lookahead: 表示开启 lookahead 并行解码,针对输入较长,特别是生成内容包含在输入文本中的如RAG场景生成加速效果较好,需同时开启--use-v2-block-manager--num-speculative-tokens: 表示一次并行解码长度,单并发推荐设置成12,BatchSize较大时可以适当降低一次解码长度,例如6或者4。--quantization: 可额外支持 ifq、smoothquant 量化方式,详见上文量化加速模式说明。python3 -m vllm.entrypoints.openai.api_server --model /data/model --served-model-name model --trust-remote-code --quantization ifq --use-v2-block-manager --use-lookahead --num-speculative-tokens 6
run
启动参数 | 环境变量 | 默认值 | 含义 |
无 | MODEL_ID | 无 | |
无 | CONV_TEMPLATE | 无 | |
--model-path | MODEL_PATH | /data/model | 模型加载路径,启动服务时指定的 CFS 路径默认会自动挂载到容器中的 "/data/model" 路径,大多数情况您不需修改 |
--num-gpus | TP | 1 | 模型并行推理的显卡数量,默认为 1 |
--worker-num | WORKER_NUM | 1 | 推理 Worker 数量,影响单个容器中跑推理服务的进程数,一般在分配给容器的 GPU 卡数大于设置的 --num-gpus 参数时才修改 |
--limit-worker-concurrency | MAX_CONCURRENCY | 32 | 每个推理 Worker 支持的最大并发数,正在处理的请求超过此数值时,新来的请求会进行排队 |
--dtype | DTYPE | float16 | 模型精度类型,可选值 ["float16", "bfloat16", "float32"],若配置 "auto" 则自动根据模型训练时使用的精度来配置 |
--seed | SEED | 无 | 每次生成的随机种子,默认不指定 |
--ds-dtype | DS_DTYPE | float16 | 表示使用 Angel-Deepspeed 加速时的精度类型,可选值 ["float16", "bfloat16", "int8"] |
--max-batch-size | MAX_BATCH_SIZE | 16 | 动态组 Batch 时,每个批次的请求数上限 |
--batch-wait-timeout | BATCH_WAIT_TIMEOUT | 0.1 | 动态组 Batch 时,每个批次的最长等待时间(秒) |
/v1/chat/completions名称 | 值 |
Content-Type | application/json |
参数名称 | 必填 | 类型 | 描述 |
messages | 是 | Array of Message | 会话内容,按对话时间序排列。 |
max_tokens | 否 | Integer | 默认为模型支持的上下文长度,表示模型可生成内容的最长 token 数量,最大不能超过模型支持的上下文长度; |
stream | 否 | Boolean | 默认 false,表示非流式返回;设置为 true 时表示流式返回,如果对首字返回延迟敏感建议使用流式,以获得更好的体验。 |
temperature | 否 | Float | 默认 0.7,取值区间为 [0.0, 2.0],表示采样温度,用于调整随机从生成模型中抽样的程度。
较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。设置为 0 时,表示使用贪心采样策略,此时生成结果没有随机性。 此参数会影响模型生成的回复的质量和多样性。 |
top_p | 否 | Float | 默认 1.0,取值区间为 (0.0, 1.0],表示将可能性之和不超过 top_p 的 tokens 列入候选名单。
影响输出文本的多样性,取值越大,生成文本的多样性越强。 此参数会影响模型生成的回复的质量和多样性。 |
top_k | 否 | Integer | 默认 -1,表示禁用 top-k 过滤采样。当取值大于 0 时,会先过滤可能性最高的 top-k 个 tokens 后再使用 top_p 采样。 此参数会影响模型生成的回复的质量和多样性。 |
presence_penalty | 否 | Float | 默认 0.0,取值区间为 [-2.0, 2.0],表示存在惩罚,为正时对于新 token 在现文本中是否出现进行惩罚,增大模型讨论新话题的概率。 此参数会影响模型生成的回复的质量和多样性。 |
frequency_penalty | 否 | Float | 默认 0.0,取值区间为 [-2.0, 2.0],表示频率惩罚,为正时对于新 token 在现文本中的出现次数进行惩罚,降低模型重复同一文本的概率。 此参数会影响模型生成的回复的质量和多样性。 |
repetition_penalty | 否 | Float | 默认 1.0,取值区间为 [1.0, 2.0],表示重复惩罚系数,大于 1 时会对抑制重复生成词,减少连续重复现象。 此参数会影响模型生成的回复的质量和多样性。 |
stop | 否 | Array of String | 默认 None,表示无额外停止词;可以根据实际业务需要设置1个或多个停止词,遇到停止词时自动停止生成。 |
ignore_eos | 否 | Boolean | 默认 false,表示不忽略停止词;设置为 true 时会强制生成 max_tokens 数量的 token 后才停止生成,一般只在调试时使用(此参数仅 angel-vllm 镜像支持)。 |
seed | 否 | Integer | 默认 None,表示不设置随机种子;设置为具体的数值后会在每次生成时使用此随机种子,一般用于复现特定生成结果使用(此参数仅 angel-vllm 镜像支持)。 |
参数名称 | 必填 | 类型 | 描述 |
role | 是 | String | 对话消息对应的角色,当前支持以下取值: system:表示系统提示(仅支持最开始出现一次) user:表示用户 assistant:表示对话助手 在 message 中必须是 user 与 assistant 交替出现(一问一答) |
content | 是 | String | 对话消息的内容 |
content-type: application/json 数据,格式如下:参数名称 | 类型 | 描述 |
id | String | 对话的唯一标识符 |
choices | Array of Choice | 生成结果 |
created | Integer | 对话开始的 Unix 时间戳 (秒级) |
model | String | 对话使用的模型名称 |
object | String | 本对象的类型,固定为 chat.completion |
usage | Usage | token 数量统计信息: 包含生成结果中的 token 数量 completion_tokens; 提示词中的 token 数量 prompt_tokens; 请求中的总 token 数量(提示词和生成结果)total_tokens; |
content-type: text/event-stream; charset=utf-8 数据data: 分片,分片数据格式如下:参数名称 | 类型 | 描述 |
id | String | 对话的唯一标识符 |
choices | Array of StreamChoice | 生成结果 |
created | Integer | 对话开始的 Unix 时间戳 (秒级) |
model | String | 对话使用的模型名称 |
object | String | 本对象的类型,固定为 chat.completion.chunk |
curl -H "content-type: application/json" http://localhost:8501/v1/chat/completions -d '{"messages":[{"role": "user", "content": "你好"}], "temperature": 0.0}'
{"id":"chatcmpl-4aeRgYwnaYe4RzmmcyKtYs","object":"chat.completion","created":1698291242,"model":"baichuan-13b-chat","choices":[{"index":0,"message":{"role":"assistant","content":"你好!有什么我能帮到你的吗?"},"finish_reason":"stop"}],"usage":{"prompt_tokens":4,"total_tokens":16,"completion_tokens":12}}
curl -H "content-type: application/json" http://localhost:8501/v1/chat/completions -d '{"messages":[{"role": "user", "content": "你好"}], "temperature": 0.0, "stream": true}'
data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "你"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "好!"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "有什么我"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "能帮"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "到你的"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {"content": "吗?"}, "finish_reason": null}]}data: {"id": "chatcmpl-3fYW8fqN3YYMJiebiZgpzZ", "object": "chat.completion.chunk", "created": 1698290857, "model": "baichuan-13b-chat", "choices": [{"index": 0, "delta": {}, "finish_reason": "stop"}]}data: [DONE]
import osfrom openai import OpenAI# 示例1:容器本地访问地址os.environ["OPENAI_BASE_URL"] = "http://127.0.0.1:8501/v1"# 示例2:外网访问地址,可以通过服务调用页面获取(使用openai sdk时,地址后面加上v1)os.environ["OPENAI_BASE_URL"] = "https://service-********.sh.tencentapigw.com:443/tione/v1"# 若服务启动设置了 --api-keys 参数或 OPENAI_API_KEYS 环境变量开启了鉴权,OPENAI_API_KEY 需要设置为任意一个可用的 api_key;否则可以任意填写os.environ["OPENAI_API_KEY"] = "EMPTY"client = OpenAI()# 非流式请求示例:print("----- standard request -----")completion = client.chat.completions.create(model="model",messages=[{"role": "user","content": "你好",},],temperature=0.7,top_p=1.0,max_tokens=128,)print(completion.choices[0].message.content)# 流式请求示例:print("----- streaming request -----")stream = client.chat.completions.create(model="model",messages=[{"role": "user","content": "你好",},],temperature=0.7,top_p=1.0,max_tokens=128,stream=True,)for chunk in stream:if not chunk.choices or not chunk.choices[0].delta.content:continueprint(chunk.choices[0].delta.content, end="")print()
import argparseimport requestsimport jsondef chat(messages):data = {"messages": messages,"temperature": args.temperature,"max_tokens": args.max_tokens,"top_p": args.top_p,"stream": True, # 开启流式输出}header = {"Content-Type": "application/json",}if args.token:header["Authorization"] = f"Bearer {args.token}"response = requests.post(f"{args.server}/v1/chat/completions", json=data, headers=header, stream=True) # 设置 stream=True 参数获取实时数据流if response.status_code != 200:print(response.json())exit()result = ""print("Assistant: ", end = "", flush = True)for part in response.iter_lines():if part:if "content" in part.decode("utf-8"):content = json.loads(part.decode("utf-8")[5:])["choices"][0]["delta"]["content"] # 字符串过滤 data: 之后转成 json 格式再取文本result += contentprint(content, end = "", flush = True)print("\\n")return resultif __name__ == "__main__":parser = argparse.ArgumentParser(description="Chat CLI Demo.")parser.add_argument("--server", type=str, default="http://127.0.0.1:8501")parser.add_argument("--max-tokens", type=int, default=512)parser.add_argument("--temperature", type=float, default=0.7)parser.add_argument("--top_p", type=float, default=1.0)parser.add_argument("--system", type=str, default=None)parser.add_argument("--token", type=str, default=None)args = parser.parse_args()messages = []if args.system:messages.append({"role": "system", "content": args.system})while True:user_input = input("User: ")messages.append({"role": "user", "content": user_input})response = chat(messages)messages.append({"role": "assistant", "content": response})
文档反馈